| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_ARM | 9 #if V8_TARGET_ARCH_ARM |
| 10 | 10 |
| (...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 void MacroAssembler::PopFixedFrame(Register marker_reg) { | 700 void MacroAssembler::PopFixedFrame(Register marker_reg) { |
| 701 DCHECK(!marker_reg.is_valid() || marker_reg.code() < cp.code()); | 701 DCHECK(!marker_reg.is_valid() || marker_reg.code() < cp.code()); |
| 702 ldm(ia_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | cp.bit() | | 702 ldm(ia_w, sp, (marker_reg.is_valid() ? marker_reg.bit() : 0) | cp.bit() | |
| 703 (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | | 703 (FLAG_enable_embedded_constant_pool ? pp.bit() : 0) | |
| 704 fp.bit() | lr.bit()); | 704 fp.bit() | lr.bit()); |
| 705 } | 705 } |
| 706 | 706 |
| 707 | 707 |
| 708 // Push and pop all registers that can hold pointers. | 708 // Push and pop all registers that can hold pointers. |
| 709 void MacroAssembler::PushSafepointRegisters() { | 709 void MacroAssembler::PushSafepointRegisters() { |
| 710 // Safepoints expect a block of contiguous register values starting with r0: | 710 // Safepoints expect a block of contiguous register values starting with r0. |
| 711 DCHECK(((1 << kNumSafepointSavedRegisters) - 1) == kSafepointSavedRegisters); | 711 // except when FLAG_enable_embedded_constant_pool, which omits pp. |
| 712 DCHECK(FLAG_enable_embedded_constant_pool || |
| 713 ((1 << kNumSafepointSavedRegisters) - 1) == kSafepointSavedRegisters); |
| 712 // Safepoints expect a block of kNumSafepointRegisters values on the | 714 // Safepoints expect a block of kNumSafepointRegisters values on the |
| 713 // stack, so adjust the stack for unsaved registers. | 715 // stack, so adjust the stack for unsaved registers. |
| 714 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; | 716 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; |
| 715 DCHECK(num_unsaved >= 0); | 717 DCHECK(num_unsaved >= 0); |
| 716 sub(sp, sp, Operand(num_unsaved * kPointerSize)); | 718 sub(sp, sp, Operand(num_unsaved * kPointerSize)); |
| 717 stm(db_w, sp, kSafepointSavedRegisters); | 719 stm(db_w, sp, kSafepointSavedRegisters); |
| 718 } | 720 } |
| 719 | 721 |
| 720 | 722 |
| 721 void MacroAssembler::PopSafepointRegisters() { | 723 void MacroAssembler::PopSafepointRegisters() { |
| 722 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; | 724 const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; |
| 723 ldm(ia_w, sp, kSafepointSavedRegisters); | 725 ldm(ia_w, sp, kSafepointSavedRegisters); |
| 724 add(sp, sp, Operand(num_unsaved * kPointerSize)); | 726 add(sp, sp, Operand(num_unsaved * kPointerSize)); |
| 725 } | 727 } |
| 726 | 728 |
| 727 | 729 |
| 728 void MacroAssembler::StoreToSafepointRegisterSlot(Register src, Register dst) { | 730 void MacroAssembler::StoreToSafepointRegisterSlot(Register src, Register dst) { |
| 729 str(src, SafepointRegisterSlot(dst)); | 731 str(src, SafepointRegisterSlot(dst)); |
| 730 } | 732 } |
| 731 | 733 |
| 732 | 734 |
| 733 void MacroAssembler::LoadFromSafepointRegisterSlot(Register dst, Register src) { | 735 void MacroAssembler::LoadFromSafepointRegisterSlot(Register dst, Register src) { |
| 734 ldr(dst, SafepointRegisterSlot(src)); | 736 ldr(dst, SafepointRegisterSlot(src)); |
| 735 } | 737 } |
| 736 | 738 |
| 737 | 739 |
| 738 int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { | 740 int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { |
| 739 // The registers are pushed starting with the highest encoding, | 741 // The registers are pushed starting with the highest encoding, |
| 740 // which means that lowest encodings are closest to the stack pointer. | 742 // which means that lowest encodings are closest to the stack pointer. |
| 743 if (FLAG_enable_embedded_constant_pool && reg_code > pp.code()) { |
| 744 // RegList omits pp. |
| 745 reg_code -= 1; |
| 746 } |
| 741 DCHECK(reg_code >= 0 && reg_code < kNumSafepointRegisters); | 747 DCHECK(reg_code >= 0 && reg_code < kNumSafepointRegisters); |
| 742 return reg_code; | 748 return reg_code; |
| 743 } | 749 } |
| 744 | 750 |
| 745 | 751 |
| 746 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { | 752 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { |
| 747 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); | 753 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); |
| 748 } | 754 } |
| 749 | 755 |
| 750 | 756 |
| (...skipping 3161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3912 } | 3918 } |
| 3913 } | 3919 } |
| 3914 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); | 3920 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); |
| 3915 add(result, result, Operand(dividend, LSR, 31)); | 3921 add(result, result, Operand(dividend, LSR, 31)); |
| 3916 } | 3922 } |
| 3917 | 3923 |
| 3918 } // namespace internal | 3924 } // namespace internal |
| 3919 } // namespace v8 | 3925 } // namespace v8 |
| 3920 | 3926 |
| 3921 #endif // V8_TARGET_ARCH_ARM | 3927 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |