Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: src/x64/macro-assembler-x64.cc

Issue 238253013: Introduce PushQuad and PopQuad for x64 port. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 963 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 974
975 void MacroAssembler::Set(const Operand& dst, intptr_t x) { 975 void MacroAssembler::Set(const Operand& dst, intptr_t x) {
976 if (kPointerSize == kInt64Size) { 976 if (kPointerSize == kInt64Size) {
977 if (is_int32(x)) { 977 if (is_int32(x)) {
978 movp(dst, Immediate(static_cast<int32_t>(x))); 978 movp(dst, Immediate(static_cast<int32_t>(x)));
979 } else { 979 } else {
980 Set(kScratchRegister, x); 980 Set(kScratchRegister, x);
981 movp(dst, kScratchRegister); 981 movp(dst, kScratchRegister);
982 } 982 }
983 } else { 983 } else {
984 ASSERT(kPointerSize == kInt32Size);
985 movp(dst, Immediate(static_cast<int32_t>(x))); 984 movp(dst, Immediate(static_cast<int32_t>(x)));
986 } 985 }
987 } 986 }
988 987
989 988
990 // ---------------------------------------------------------------------------- 989 // ----------------------------------------------------------------------------
991 // Smi tagging, untagging and tag detection. 990 // Smi tagging, untagging and tag detection.
992 991
993 bool MacroAssembler::IsUnsafeInt(const int32_t x) { 992 bool MacroAssembler::IsUnsafeInt(const int32_t x) {
994 static const int kMaxBits = 17; 993 static const int kMaxBits = 17;
(...skipping 1620 matching lines...) Expand 10 before | Expand all | Expand 10 after
2615 if (stack_elements > 0) { 2614 if (stack_elements > 0) {
2616 addp(rsp, Immediate(stack_elements * kPointerSize)); 2615 addp(rsp, Immediate(stack_elements * kPointerSize));
2617 } 2616 }
2618 } 2617 }
2619 2618
2620 2619
2621 void MacroAssembler::Push(Register src) { 2620 void MacroAssembler::Push(Register src) {
2622 if (kPointerSize == kInt64Size) { 2621 if (kPointerSize == kInt64Size) {
2623 pushq(src); 2622 pushq(src);
2624 } else { 2623 } else {
2625 ASSERT(kPointerSize == kInt32Size);
2626 // x32 uses 64-bit push for rbp in the prologue. 2624 // x32 uses 64-bit push for rbp in the prologue.
2627 ASSERT(src.code() != rbp.code()); 2625 ASSERT(src.code() != rbp.code());
2628 leal(rsp, Operand(rsp, -4)); 2626 leal(rsp, Operand(rsp, -4));
2629 movp(Operand(rsp, 0), src); 2627 movp(Operand(rsp, 0), src);
2630 } 2628 }
2631 } 2629 }
2632 2630
2633 2631
2634 void MacroAssembler::Push(const Operand& src) { 2632 void MacroAssembler::Push(const Operand& src) {
2635 if (kPointerSize == kInt64Size) { 2633 if (kPointerSize == kInt64Size) {
2636 pushq(src); 2634 pushq(src);
2637 } else { 2635 } else {
2638 ASSERT(kPointerSize == kInt32Size);
2639 movp(kScratchRegister, src); 2636 movp(kScratchRegister, src);
2640 leal(rsp, Operand(rsp, -4)); 2637 leal(rsp, Operand(rsp, -4));
2641 movp(Operand(rsp, 0), kScratchRegister); 2638 movp(Operand(rsp, 0), kScratchRegister);
2642 } 2639 }
2643 } 2640 }
2644 2641
2645 2642
2643 void MacroAssembler::PushQuad(const Operand& src) {
2644 if (kPointerSize == kInt64Size) {
2645 pushq(src);
2646 } else {
2647 movp(kScratchRegister, src);
2648 pushq(kScratchRegister);
2649 }
2650 }
2651
2652
2646 void MacroAssembler::Push(Immediate value) { 2653 void MacroAssembler::Push(Immediate value) {
2647 if (kPointerSize == kInt64Size) { 2654 if (kPointerSize == kInt64Size) {
2648 pushq(value); 2655 pushq(value);
2649 } else { 2656 } else {
2650 ASSERT(kPointerSize == kInt32Size);
2651 leal(rsp, Operand(rsp, -4)); 2657 leal(rsp, Operand(rsp, -4));
2652 movp(Operand(rsp, 0), value); 2658 movp(Operand(rsp, 0), value);
2653 } 2659 }
2654 } 2660 }
2655 2661
2656 2662
2657 void MacroAssembler::PushImm32(int32_t imm32) { 2663 void MacroAssembler::PushImm32(int32_t imm32) {
2658 if (kPointerSize == kInt64Size) { 2664 if (kPointerSize == kInt64Size) {
2659 pushq_imm32(imm32); 2665 pushq_imm32(imm32);
2660 } else { 2666 } else {
2661 ASSERT(kPointerSize == kInt32Size);
2662 leal(rsp, Operand(rsp, -4)); 2667 leal(rsp, Operand(rsp, -4));
2663 movp(Operand(rsp, 0), Immediate(imm32)); 2668 movp(Operand(rsp, 0), Immediate(imm32));
2664 } 2669 }
2665 } 2670 }
2666 2671
2667 2672
2668 void MacroAssembler::Pop(Register dst) { 2673 void MacroAssembler::Pop(Register dst) {
2669 if (kPointerSize == kInt64Size) { 2674 if (kPointerSize == kInt64Size) {
2670 popq(dst); 2675 popq(dst);
2671 } else { 2676 } else {
2672 ASSERT(kPointerSize == kInt32Size);
2673 // x32 uses 64-bit pop for rbp in the epilogue. 2677 // x32 uses 64-bit pop for rbp in the epilogue.
2674 ASSERT(dst.code() != rbp.code()); 2678 ASSERT(dst.code() != rbp.code());
2675 movp(dst, Operand(rsp, 0)); 2679 movp(dst, Operand(rsp, 0));
2676 leal(rsp, Operand(rsp, 4)); 2680 leal(rsp, Operand(rsp, 4));
2677 } 2681 }
2678 } 2682 }
2679 2683
2680 2684
2681 void MacroAssembler::Pop(const Operand& dst) { 2685 void MacroAssembler::Pop(const Operand& dst) {
2682 if (kPointerSize == kInt64Size) { 2686 if (kPointerSize == kInt64Size) {
2683 popq(dst); 2687 popq(dst);
2684 } else { 2688 } else {
2685 ASSERT(kPointerSize == kInt32Size);
2686 Register scratch = dst.AddressUsesRegister(kScratchRegister) 2689 Register scratch = dst.AddressUsesRegister(kScratchRegister)
2687 ? kSmiConstantRegister : kScratchRegister; 2690 ? kSmiConstantRegister : kScratchRegister;
2688 movp(scratch, Operand(rsp, 0)); 2691 movp(scratch, Operand(rsp, 0));
2689 movp(dst, scratch); 2692 movp(dst, scratch);
2690 leal(rsp, Operand(rsp, 4)); 2693 leal(rsp, Operand(rsp, 4));
2691 if (scratch.is(kSmiConstantRegister)) { 2694 if (scratch.is(kSmiConstantRegister)) {
2692 // Restore kSmiConstantRegister. 2695 // Restore kSmiConstantRegister.
2693 movp(kSmiConstantRegister, 2696 movp(kSmiConstantRegister,
2694 reinterpret_cast<void*>(Smi::FromInt(kSmiConstantRegisterValue)), 2697 reinterpret_cast<void*>(Smi::FromInt(kSmiConstantRegisterValue)),
2695 Assembler::RelocInfoNone()); 2698 Assembler::RelocInfoNone());
2696 } 2699 }
2697 } 2700 }
2698 } 2701 }
2699 2702
2700 2703
2704 void MacroAssembler::PopQuad(const Operand& dst) {
2705 if (kPointerSize == kInt64Size) {
2706 popq(dst);
2707 } else {
2708 popq(kScratchRegister);
2709 movp(dst, kScratchRegister);
2710 }
2711 }
2712
2713
2701 void MacroAssembler::LoadSharedFunctionInfoSpecialField(Register dst, 2714 void MacroAssembler::LoadSharedFunctionInfoSpecialField(Register dst,
2702 Register base, 2715 Register base,
2703 int offset) { 2716 int offset) {
2704 ASSERT(offset > SharedFunctionInfo::kLengthOffset && 2717 ASSERT(offset > SharedFunctionInfo::kLengthOffset &&
2705 offset <= SharedFunctionInfo::kSize && 2718 offset <= SharedFunctionInfo::kSize &&
2706 (((offset - SharedFunctionInfo::kLengthOffset) / kIntSize) % 2 == 1)); 2719 (((offset - SharedFunctionInfo::kLengthOffset) / kIntSize) % 2 == 1));
2707 if (kPointerSize == kInt64Size) { 2720 if (kPointerSize == kInt64Size) {
2708 movsxlq(dst, FieldOperand(base, offset)); 2721 movsxlq(dst, FieldOperand(base, offset));
2709 } else { 2722 } else {
2710 movp(dst, FieldOperand(base, offset)); 2723 movp(dst, FieldOperand(base, offset));
(...skipping 21 matching lines...) Expand all
2732 void MacroAssembler::Jump(ExternalReference ext) { 2745 void MacroAssembler::Jump(ExternalReference ext) {
2733 LoadAddress(kScratchRegister, ext); 2746 LoadAddress(kScratchRegister, ext);
2734 jmp(kScratchRegister); 2747 jmp(kScratchRegister);
2735 } 2748 }
2736 2749
2737 2750
2738 void MacroAssembler::Jump(const Operand& op) { 2751 void MacroAssembler::Jump(const Operand& op) {
2739 if (kPointerSize == kInt64Size) { 2752 if (kPointerSize == kInt64Size) {
2740 jmp(op); 2753 jmp(op);
2741 } else { 2754 } else {
2742 ASSERT(kPointerSize == kInt32Size);
2743 movp(kScratchRegister, op); 2755 movp(kScratchRegister, op);
2744 jmp(kScratchRegister); 2756 jmp(kScratchRegister);
2745 } 2757 }
2746 } 2758 }
2747 2759
2748 2760
2749 void MacroAssembler::Jump(Address destination, RelocInfo::Mode rmode) { 2761 void MacroAssembler::Jump(Address destination, RelocInfo::Mode rmode) {
2750 Move(kScratchRegister, destination, rmode); 2762 Move(kScratchRegister, destination, rmode);
2751 jmp(kScratchRegister); 2763 jmp(kScratchRegister);
2752 } 2764 }
(...skipping 21 matching lines...) Expand all
2774 #ifdef DEBUG 2786 #ifdef DEBUG
2775 CHECK_EQ(end_position, pc_offset()); 2787 CHECK_EQ(end_position, pc_offset());
2776 #endif 2788 #endif
2777 } 2789 }
2778 2790
2779 2791
2780 void MacroAssembler::Call(const Operand& op) { 2792 void MacroAssembler::Call(const Operand& op) {
2781 if (kPointerSize == kInt64Size) { 2793 if (kPointerSize == kInt64Size) {
2782 call(op); 2794 call(op);
2783 } else { 2795 } else {
2784 ASSERT(kPointerSize == kInt32Size);
2785 movp(kScratchRegister, op); 2796 movp(kScratchRegister, op);
2786 call(kScratchRegister); 2797 call(kScratchRegister);
2787 } 2798 }
2788 } 2799 }
2789 2800
2790 2801
2791 void MacroAssembler::Call(Address destination, RelocInfo::Mode rmode) { 2802 void MacroAssembler::Call(Address destination, RelocInfo::Mode rmode) {
2792 #ifdef DEBUG 2803 #ifdef DEBUG
2793 int end_position = pc_offset() + CallSize(destination); 2804 int end_position = pc_offset() + CallSize(destination);
2794 #endif 2805 #endif
(...skipping 2360 matching lines...) Expand 10 before | Expand all | Expand 10 after
5155 if (ms.shift() > 0) sarl(rdx, Immediate(ms.shift())); 5166 if (ms.shift() > 0) sarl(rdx, Immediate(ms.shift()));
5156 movl(rax, dividend); 5167 movl(rax, dividend);
5157 shrl(rax, Immediate(31)); 5168 shrl(rax, Immediate(31));
5158 addl(rdx, rax); 5169 addl(rdx, rax);
5159 } 5170 }
5160 5171
5161 5172
5162 } } // namespace v8::internal 5173 } } // namespace v8::internal
5163 5174
5164 #endif // V8_TARGET_ARCH_X64 5175 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/x64/macro-assembler-x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698