OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <assert.h> // For assert | 5 #include <assert.h> // For assert |
6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #if V8_TARGET_ARCH_PPC | 10 #if V8_TARGET_ARCH_PPC |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 | 96 |
97 | 97 |
98 void MacroAssembler::CallJSEntry(Register target) { | 98 void MacroAssembler::CallJSEntry(Register target) { |
99 DCHECK(target.is(ip)); | 99 DCHECK(target.is(ip)); |
100 Call(target); | 100 Call(target); |
101 } | 101 } |
102 | 102 |
103 | 103 |
104 int MacroAssembler::CallSize(Address target, RelocInfo::Mode rmode, | 104 int MacroAssembler::CallSize(Address target, RelocInfo::Mode rmode, |
105 Condition cond) { | 105 Condition cond) { |
106 return (2 + kMovInstructions) * kInstrSize; | 106 Operand mov_operand = Operand(reinterpret_cast<intptr_t>(target), rmode); |
| 107 return (2 + instructions_required_for_mov(ip, mov_operand)) * kInstrSize; |
107 } | 108 } |
108 | 109 |
109 | 110 |
110 int MacroAssembler::CallSizeNotPredictableCodeSize(Address target, | 111 int MacroAssembler::CallSizeNotPredictableCodeSize(Address target, |
111 RelocInfo::Mode rmode, | 112 RelocInfo::Mode rmode, |
112 Condition cond) { | 113 Condition cond) { |
113 return (2 + kMovInstructions) * kInstrSize; | 114 return (2 + kMovInstructionsNoConstantPool) * kInstrSize; |
114 } | 115 } |
115 | 116 |
116 | 117 |
117 void MacroAssembler::Call(Address target, RelocInfo::Mode rmode, | 118 void MacroAssembler::Call(Address target, RelocInfo::Mode rmode, |
118 Condition cond) { | 119 Condition cond) { |
119 BlockTrampolinePoolScope block_trampoline_pool(this); | 120 BlockTrampolinePoolScope block_trampoline_pool(this); |
120 DCHECK(cond == al); | 121 DCHECK(cond == al); |
121 | 122 |
122 #ifdef DEBUG | 123 #ifdef DEBUG |
123 // Check the expected size before generating code to ensure we assume the same | 124 // Check the expected size before generating code to ensure we assume the same |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 mtlr(r0); | 507 mtlr(r0); |
507 bind(&done); | 508 bind(&done); |
508 if (and_then == kReturnAtEnd) { | 509 if (and_then == kReturnAtEnd) { |
509 Ret(); | 510 Ret(); |
510 } | 511 } |
511 } | 512 } |
512 | 513 |
513 | 514 |
514 void MacroAssembler::PushFixedFrame(Register marker_reg) { | 515 void MacroAssembler::PushFixedFrame(Register marker_reg) { |
515 mflr(r0); | 516 mflr(r0); |
516 if (marker_reg.is_valid()) { | 517 if (FLAG_enable_embedded_constant_pool) { |
517 Push(r0, fp, cp, marker_reg); | 518 if (marker_reg.is_valid()) { |
| 519 Push(r0, fp, kConstantPoolRegister, cp, marker_reg); |
| 520 } else { |
| 521 Push(r0, fp, kConstantPoolRegister, cp); |
| 522 } |
518 } else { | 523 } else { |
519 Push(r0, fp, cp); | 524 if (marker_reg.is_valid()) { |
| 525 Push(r0, fp, cp, marker_reg); |
| 526 } else { |
| 527 Push(r0, fp, cp); |
| 528 } |
520 } | 529 } |
521 } | 530 } |
522 | 531 |
523 | 532 |
524 void MacroAssembler::PopFixedFrame(Register marker_reg) { | 533 void MacroAssembler::PopFixedFrame(Register marker_reg) { |
525 if (marker_reg.is_valid()) { | 534 if (FLAG_enable_embedded_constant_pool) { |
526 Pop(r0, fp, cp, marker_reg); | 535 if (marker_reg.is_valid()) { |
| 536 Pop(r0, fp, kConstantPoolRegister, cp, marker_reg); |
| 537 } else { |
| 538 Pop(r0, fp, kConstantPoolRegister, cp); |
| 539 } |
527 } else { | 540 } else { |
528 Pop(r0, fp, cp); | 541 if (marker_reg.is_valid()) { |
| 542 Pop(r0, fp, cp, marker_reg); |
| 543 } else { |
| 544 Pop(r0, fp, cp); |
| 545 } |
529 } | 546 } |
530 mtlr(r0); | 547 mtlr(r0); |
531 } | 548 } |
532 | 549 |
533 | 550 |
534 const RegList MacroAssembler::kSafepointSavedRegisters = Register::kAllocatable; | 551 const RegList MacroAssembler::kSafepointSavedRegisters = Register::kAllocatable; |
535 const int MacroAssembler::kNumSafepointSavedRegisters = | 552 const int MacroAssembler::kNumSafepointSavedRegisters = |
536 Register::kMaxNumAllocatableRegisters; | 553 Register::kMaxNumAllocatableRegisters; |
537 | 554 |
538 // Push and pop all registers that can hold pointers. | 555 // Push and pop all registers that can hold pointers. |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 } | 661 } |
645 | 662 |
646 MovDoubleToInt64( | 663 MovDoubleToInt64( |
647 #if !V8_TARGET_ARCH_PPC64 | 664 #if !V8_TARGET_ARCH_PPC64 |
648 dst_hi, | 665 dst_hi, |
649 #endif | 666 #endif |
650 dst, double_dst); | 667 dst, double_dst); |
651 } | 668 } |
652 | 669 |
653 | 670 |
| 671 void MacroAssembler::LoadConstantPoolPointerRegisterFromCodeTargetAddress( |
| 672 Register code_target_address) { |
| 673 lwz(kConstantPoolRegister, |
| 674 MemOperand(code_target_address, |
| 675 Code::kConstantPoolOffset - Code::kHeaderSize)); |
| 676 add(kConstantPoolRegister, kConstantPoolRegister, code_target_address); |
| 677 } |
| 678 |
| 679 |
| 680 void MacroAssembler::LoadConstantPoolPointerRegister(Register base, |
| 681 int code_start_delta) { |
| 682 add_label_offset(kConstantPoolRegister, base, ConstantPoolPosition(), |
| 683 code_start_delta); |
| 684 } |
| 685 |
| 686 |
| 687 void MacroAssembler::LoadConstantPoolPointerRegister() { |
| 688 mov_label_addr(kConstantPoolRegister, ConstantPoolPosition()); |
| 689 } |
| 690 |
| 691 |
654 void MacroAssembler::StubPrologue(int prologue_offset) { | 692 void MacroAssembler::StubPrologue(int prologue_offset) { |
655 LoadSmiLiteral(r11, Smi::FromInt(StackFrame::STUB)); | 693 LoadSmiLiteral(r11, Smi::FromInt(StackFrame::STUB)); |
656 PushFixedFrame(r11); | 694 PushFixedFrame(r11); |
657 // Adjust FP to point to saved FP. | 695 // Adjust FP to point to saved FP. |
658 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); | 696 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); |
| 697 if (FLAG_enable_embedded_constant_pool) { |
| 698 // ip contains prologue address |
| 699 LoadConstantPoolPointerRegister(ip, -prologue_offset); |
| 700 set_constant_pool_available(true); |
| 701 } |
659 } | 702 } |
660 | 703 |
661 | 704 |
662 void MacroAssembler::Prologue(bool code_pre_aging, int prologue_offset) { | 705 void MacroAssembler::Prologue(bool code_pre_aging, int prologue_offset) { |
663 { | 706 { |
664 PredictableCodeSizeScope predictible_code_size_scope( | 707 PredictableCodeSizeScope predictible_code_size_scope( |
665 this, kNoCodeAgeSequenceLength); | 708 this, kNoCodeAgeSequenceLength); |
666 Assembler::BlockTrampolinePoolScope block_trampoline_pool(this); | 709 Assembler::BlockTrampolinePoolScope block_trampoline_pool(this); |
667 // The following instructions must remain together and unmodified | 710 // The following instructions must remain together and unmodified |
668 // for code aging to work properly. | 711 // for code aging to work properly. |
(...skipping 12 matching lines...) Expand all Loading... |
681 } else { | 724 } else { |
682 // This matches the code found in GetNoCodeAgeSequence() | 725 // This matches the code found in GetNoCodeAgeSequence() |
683 PushFixedFrame(r4); | 726 PushFixedFrame(r4); |
684 // Adjust fp to point to saved fp. | 727 // Adjust fp to point to saved fp. |
685 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); | 728 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); |
686 for (int i = 0; i < kNoCodeAgeSequenceNops; i++) { | 729 for (int i = 0; i < kNoCodeAgeSequenceNops; i++) { |
687 nop(); | 730 nop(); |
688 } | 731 } |
689 } | 732 } |
690 } | 733 } |
| 734 if (FLAG_enable_embedded_constant_pool) { |
| 735 // ip contains prologue address |
| 736 LoadConstantPoolPointerRegister(ip, -prologue_offset); |
| 737 set_constant_pool_available(true); |
| 738 } |
691 } | 739 } |
692 | 740 |
693 | 741 |
694 void MacroAssembler::EnterFrame(StackFrame::Type type, | 742 void MacroAssembler::EnterFrame(StackFrame::Type type, |
695 bool load_constant_pool_pointer_reg) { | 743 bool load_constant_pool_pointer_reg) { |
696 LoadSmiLiteral(ip, Smi::FromInt(type)); | 744 if (FLAG_enable_embedded_constant_pool && load_constant_pool_pointer_reg) { |
697 PushFixedFrame(ip); | 745 PushFixedFrame(); |
| 746 // This path should not rely on ip containing code entry. |
| 747 LoadConstantPoolPointerRegister(); |
| 748 LoadSmiLiteral(ip, Smi::FromInt(type)); |
| 749 push(ip); |
| 750 } else { |
| 751 LoadSmiLiteral(ip, Smi::FromInt(type)); |
| 752 PushFixedFrame(ip); |
| 753 } |
698 // Adjust FP to point to saved FP. | 754 // Adjust FP to point to saved FP. |
699 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); | 755 addi(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp)); |
700 | 756 |
701 mov(r0, Operand(CodeObject())); | 757 mov(r0, Operand(CodeObject())); |
702 push(r0); | 758 push(r0); |
703 } | 759 } |
704 | 760 |
705 | 761 |
706 int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) { | 762 int MacroAssembler::LeaveFrame(StackFrame::Type type, int stack_adjustment) { |
| 763 ConstantPoolUnavailableScope constant_pool_unavailable(this); |
707 // r3: preserved | 764 // r3: preserved |
708 // r4: preserved | 765 // r4: preserved |
709 // r5: preserved | 766 // r5: preserved |
710 | 767 |
711 // Drop the execution stack down to the frame pointer and restore | 768 // Drop the execution stack down to the frame pointer and restore |
712 // the caller's state. | 769 // the caller's state. |
713 int frame_ends; | 770 int frame_ends; |
714 LoadP(r0, MemOperand(fp, StandardFrameConstants::kCallerPCOffset)); | 771 LoadP(r0, MemOperand(fp, StandardFrameConstants::kCallerPCOffset)); |
715 LoadP(ip, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | 772 LoadP(ip, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); |
| 773 if (FLAG_enable_embedded_constant_pool) { |
| 774 const int exitOffset = ExitFrameConstants::kConstantPoolOffset; |
| 775 const int standardOffset = StandardFrameConstants::kConstantPoolOffset; |
| 776 const int offset = |
| 777 ((type == StackFrame::EXIT) ? exitOffset : standardOffset); |
| 778 LoadP(kConstantPoolRegister, MemOperand(fp, offset)); |
| 779 } |
716 mtlr(r0); | 780 mtlr(r0); |
717 frame_ends = pc_offset(); | 781 frame_ends = pc_offset(); |
718 Add(sp, fp, StandardFrameConstants::kCallerSPOffset + stack_adjustment, r0); | 782 Add(sp, fp, StandardFrameConstants::kCallerSPOffset + stack_adjustment, r0); |
719 mr(fp, ip); | 783 mr(fp, ip); |
720 return frame_ends; | 784 return frame_ends; |
721 } | 785 } |
722 | 786 |
723 | 787 |
724 // ExitFrame layout (probably wrongish.. needs updating) | 788 // ExitFrame layout (probably wrongish.. needs updating) |
725 // | 789 // |
(...skipping 26 matching lines...) Expand all Loading... |
752 mflr(r0); | 816 mflr(r0); |
753 Push(r0, fp); | 817 Push(r0, fp); |
754 mr(fp, sp); | 818 mr(fp, sp); |
755 // Reserve room for saved entry sp and code object. | 819 // Reserve room for saved entry sp and code object. |
756 subi(sp, sp, Operand(ExitFrameConstants::kFrameSize)); | 820 subi(sp, sp, Operand(ExitFrameConstants::kFrameSize)); |
757 | 821 |
758 if (emit_debug_code()) { | 822 if (emit_debug_code()) { |
759 li(r8, Operand::Zero()); | 823 li(r8, Operand::Zero()); |
760 StoreP(r8, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 824 StoreP(r8, MemOperand(fp, ExitFrameConstants::kSPOffset)); |
761 } | 825 } |
| 826 if (FLAG_enable_embedded_constant_pool) { |
| 827 StoreP(kConstantPoolRegister, |
| 828 MemOperand(fp, ExitFrameConstants::kConstantPoolOffset)); |
| 829 } |
762 mov(r8, Operand(CodeObject())); | 830 mov(r8, Operand(CodeObject())); |
763 StoreP(r8, MemOperand(fp, ExitFrameConstants::kCodeOffset)); | 831 StoreP(r8, MemOperand(fp, ExitFrameConstants::kCodeOffset)); |
764 | 832 |
765 // Save the frame pointer and the context in top. | 833 // Save the frame pointer and the context in top. |
766 mov(r8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); | 834 mov(r8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); |
767 StoreP(fp, MemOperand(r8)); | 835 StoreP(fp, MemOperand(r8)); |
768 mov(r8, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); | 836 mov(r8, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); |
769 StoreP(cp, MemOperand(r8)); | 837 StoreP(cp, MemOperand(r8)); |
770 | 838 |
771 // Optionally save all volatile double registers. | 839 // Optionally save all volatile double registers. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 // if the target platform will need alignment, so this is controlled from a | 889 // if the target platform will need alignment, so this is controlled from a |
822 // flag. | 890 // flag. |
823 return FLAG_sim_stack_alignment; | 891 return FLAG_sim_stack_alignment; |
824 #endif | 892 #endif |
825 } | 893 } |
826 | 894 |
827 | 895 |
828 void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, | 896 void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, |
829 bool restore_context, | 897 bool restore_context, |
830 bool argument_count_is_length) { | 898 bool argument_count_is_length) { |
| 899 ConstantPoolUnavailableScope constant_pool_unavailable(this); |
831 // Optionally restore all double registers. | 900 // Optionally restore all double registers. |
832 if (save_doubles) { | 901 if (save_doubles) { |
833 // Calculate the stack location of the saved doubles and restore them. | 902 // Calculate the stack location of the saved doubles and restore them. |
834 const int kNumRegs = DoubleRegister::kNumVolatileRegisters; | 903 const int kNumRegs = DoubleRegister::kNumVolatileRegisters; |
835 const int offset = | 904 const int offset = |
836 (ExitFrameConstants::kFrameSize + kNumRegs * kDoubleSize); | 905 (ExitFrameConstants::kFrameSize + kNumRegs * kDoubleSize); |
837 addi(r6, fp, Operand(-offset)); | 906 addi(r6, fp, Operand(-offset)); |
838 RestoreFPRegs(r6, 0, kNumRegs); | 907 RestoreFPRegs(r6, 0, kNumRegs); |
839 } | 908 } |
840 | 909 |
(...skipping 2329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3170 isync(); | 3239 isync(); |
3171 | 3240 |
3172 bind(&done); | 3241 bind(&done); |
3173 } | 3242 } |
3174 | 3243 |
3175 | 3244 |
3176 void MacroAssembler::SetRelocatedValue(Register location, Register scratch, | 3245 void MacroAssembler::SetRelocatedValue(Register location, Register scratch, |
3177 Register new_value) { | 3246 Register new_value) { |
3178 lwz(scratch, MemOperand(location)); | 3247 lwz(scratch, MemOperand(location)); |
3179 | 3248 |
| 3249 if (FLAG_enable_embedded_constant_pool) { |
| 3250 if (emit_debug_code()) { |
| 3251 // Check that the instruction sequence is a load from the constant pool |
| 3252 ExtractBitMask(scratch, scratch, 0x1f * B16); |
| 3253 cmpi(scratch, Operand(kConstantPoolRegister.code())); |
| 3254 Check(eq, kTheInstructionToPatchShouldBeALoadFromConstantPool); |
| 3255 // Scratch was clobbered. Restore it. |
| 3256 lwz(scratch, MemOperand(location)); |
| 3257 } |
| 3258 // Get the address of the constant and patch it. |
| 3259 andi(scratch, scratch, Operand(kImm16Mask)); |
| 3260 StorePX(new_value, MemOperand(kConstantPoolRegister, scratch)); |
| 3261 return; |
| 3262 } |
| 3263 |
3180 // This code assumes a FIXED_SEQUENCE for lis/ori | 3264 // This code assumes a FIXED_SEQUENCE for lis/ori |
3181 | 3265 |
3182 // At this point scratch is a lis instruction. | 3266 // At this point scratch is a lis instruction. |
3183 if (emit_debug_code()) { | 3267 if (emit_debug_code()) { |
3184 And(scratch, scratch, Operand(kOpcodeMask | (0x1f * B16))); | 3268 And(scratch, scratch, Operand(kOpcodeMask | (0x1f * B16))); |
3185 Cmpi(scratch, Operand(ADDIS), r0); | 3269 Cmpi(scratch, Operand(ADDIS), r0); |
3186 Check(eq, kTheInstructionToPatchShouldBeALis); | 3270 Check(eq, kTheInstructionToPatchShouldBeALis); |
3187 lwz(scratch, MemOperand(location)); | 3271 lwz(scratch, MemOperand(location)); |
3188 } | 3272 } |
3189 | 3273 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3253 #else | 3337 #else |
3254 FlushICache(location, 2 * kInstrSize, scratch); | 3338 FlushICache(location, 2 * kInstrSize, scratch); |
3255 #endif | 3339 #endif |
3256 } | 3340 } |
3257 | 3341 |
3258 | 3342 |
3259 void MacroAssembler::GetRelocatedValue(Register location, Register result, | 3343 void MacroAssembler::GetRelocatedValue(Register location, Register result, |
3260 Register scratch) { | 3344 Register scratch) { |
3261 lwz(result, MemOperand(location)); | 3345 lwz(result, MemOperand(location)); |
3262 | 3346 |
| 3347 if (FLAG_enable_embedded_constant_pool) { |
| 3348 if (emit_debug_code()) { |
| 3349 // Check that the instruction sequence is a load from the constant pool |
| 3350 ExtractBitMask(result, result, 0x1f * B16); |
| 3351 cmpi(result, Operand(kConstantPoolRegister.code())); |
| 3352 Check(eq, kTheInstructionToPatchShouldBeALoadFromConstantPool); |
| 3353 lwz(result, MemOperand(location)); |
| 3354 } |
| 3355 // Get the address of the constant and retrieve it. |
| 3356 andi(result, result, Operand(kImm16Mask)); |
| 3357 LoadPX(result, MemOperand(kConstantPoolRegister, result)); |
| 3358 return; |
| 3359 } |
| 3360 |
3263 // This code assumes a FIXED_SEQUENCE for lis/ori | 3361 // This code assumes a FIXED_SEQUENCE for lis/ori |
3264 if (emit_debug_code()) { | 3362 if (emit_debug_code()) { |
3265 And(result, result, Operand(kOpcodeMask | (0x1f * B16))); | 3363 And(result, result, Operand(kOpcodeMask | (0x1f * B16))); |
3266 Cmpi(result, Operand(ADDIS), r0); | 3364 Cmpi(result, Operand(ADDIS), r0); |
3267 Check(eq, kTheInstructionShouldBeALis); | 3365 Check(eq, kTheInstructionShouldBeALis); |
3268 lwz(result, MemOperand(location)); | 3366 lwz(result, MemOperand(location)); |
3269 } | 3367 } |
3270 | 3368 |
3271 // result now holds a lis instruction. Extract the immediate. | 3369 // result now holds a lis instruction. Extract the immediate. |
3272 slwi(result, result, Operand(16)); | 3370 slwi(result, result, Operand(16)); |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3690 } | 3788 } |
3691 | 3789 |
3692 | 3790 |
3693 void MacroAssembler::LoadSmiLiteral(Register dst, Smi* smi) { | 3791 void MacroAssembler::LoadSmiLiteral(Register dst, Smi* smi) { |
3694 mov(dst, Operand(smi)); | 3792 mov(dst, Operand(smi)); |
3695 } | 3793 } |
3696 | 3794 |
3697 | 3795 |
3698 void MacroAssembler::LoadDoubleLiteral(DoubleRegister result, double value, | 3796 void MacroAssembler::LoadDoubleLiteral(DoubleRegister result, double value, |
3699 Register scratch) { | 3797 Register scratch) { |
| 3798 if (FLAG_enable_embedded_constant_pool && is_constant_pool_available() && |
| 3799 !(scratch.is(r0) && ConstantPoolAccessIsInOverflow())) { |
| 3800 ConstantPoolEntry::Access access = ConstantPoolAddEntry(value); |
| 3801 if (access == ConstantPoolEntry::OVERFLOWED) { |
| 3802 addis(scratch, kConstantPoolRegister, Operand::Zero()); |
| 3803 lfd(result, MemOperand(scratch, 0)); |
| 3804 } else { |
| 3805 lfd(result, MemOperand(kConstantPoolRegister, 0)); |
| 3806 } |
| 3807 return; |
| 3808 } |
| 3809 |
3700 // avoid gcc strict aliasing error using union cast | 3810 // avoid gcc strict aliasing error using union cast |
3701 union { | 3811 union { |
3702 double dval; | 3812 double dval; |
3703 #if V8_TARGET_ARCH_PPC64 | 3813 #if V8_TARGET_ARCH_PPC64 |
3704 intptr_t ival; | 3814 intptr_t ival; |
3705 #else | 3815 #else |
3706 intptr_t ival[2]; | 3816 intptr_t ival[2]; |
3707 #endif | 3817 #endif |
3708 } litVal; | 3818 } litVal; |
3709 | 3819 |
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4525 } | 4635 } |
4526 if (mag.shift > 0) srawi(result, result, mag.shift); | 4636 if (mag.shift > 0) srawi(result, result, mag.shift); |
4527 ExtractBit(r0, dividend, 31); | 4637 ExtractBit(r0, dividend, 31); |
4528 add(result, result, r0); | 4638 add(result, result, r0); |
4529 } | 4639 } |
4530 | 4640 |
4531 } // namespace internal | 4641 } // namespace internal |
4532 } // namespace v8 | 4642 } // namespace v8 |
4533 | 4643 |
4534 #endif // V8_TARGET_ARCH_PPC | 4644 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |