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 #if V8_TARGET_ARCH_ARM | 7 #if V8_TARGET_ARCH_ARM |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/division-by-constant.h" | 10 #include "src/base/division-by-constant.h" |
11 #include "src/bootstrapper.h" | 11 #include "src/bootstrapper.h" |
12 #include "src/codegen.h" | 12 #include "src/codegen.h" |
13 #include "src/cpu-profiler.h" | 13 #include "src/cpu-profiler.h" |
14 #include "src/debug/debug.h" | 14 #include "src/debug/debug.h" |
| 15 #include "src/register-configuration.h" |
15 #include "src/runtime/runtime.h" | 16 #include "src/runtime/runtime.h" |
16 | 17 |
17 #include "src/arm/macro-assembler-arm.h" | 18 #include "src/arm/macro-assembler-arm.h" |
18 | 19 |
19 namespace v8 { | 20 namespace v8 { |
20 namespace internal { | 21 namespace internal { |
21 | 22 |
22 MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size) | 23 MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size) |
23 : Assembler(arg_isolate, buffer, size), | 24 : Assembler(arg_isolate, buffer, size), |
24 generating_stub_(false), | 25 generating_stub_(false), |
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 | 754 |
754 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { | 755 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { |
755 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); | 756 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); |
756 } | 757 } |
757 | 758 |
758 | 759 |
759 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { | 760 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { |
760 // Number of d-regs not known at snapshot time. | 761 // Number of d-regs not known at snapshot time. |
761 DCHECK(!serializer_enabled()); | 762 DCHECK(!serializer_enabled()); |
762 // General purpose registers are pushed last on the stack. | 763 // General purpose registers are pushed last on the stack. |
763 int doubles_size = DwVfpRegister::NumAllocatableRegisters() * kDoubleSize; | 764 const RegisterConfiguration* config = RegisterConfiguration::ArchDefault(); |
| 765 int doubles_size = config->num_allocatable_double_registers() * kDoubleSize; |
764 int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; | 766 int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; |
765 return MemOperand(sp, doubles_size + register_offset); | 767 return MemOperand(sp, doubles_size + register_offset); |
766 } | 768 } |
767 | 769 |
768 | 770 |
769 void MacroAssembler::Ldrd(Register dst1, Register dst2, | 771 void MacroAssembler::Ldrd(Register dst1, Register dst2, |
770 const MemOperand& src, Condition cond) { | 772 const MemOperand& src, Condition cond) { |
771 DCHECK(src.rm().is(no_reg)); | 773 DCHECK(src.rm().is(no_reg)); |
772 DCHECK(!dst1.is(lr)); // r14. | 774 DCHECK(!dst1.is(lr)); // r14. |
773 | 775 |
(...skipping 2872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3646 Register reg5, | 3648 Register reg5, |
3647 Register reg6) { | 3649 Register reg6) { |
3648 RegList regs = 0; | 3650 RegList regs = 0; |
3649 if (reg1.is_valid()) regs |= reg1.bit(); | 3651 if (reg1.is_valid()) regs |= reg1.bit(); |
3650 if (reg2.is_valid()) regs |= reg2.bit(); | 3652 if (reg2.is_valid()) regs |= reg2.bit(); |
3651 if (reg3.is_valid()) regs |= reg3.bit(); | 3653 if (reg3.is_valid()) regs |= reg3.bit(); |
3652 if (reg4.is_valid()) regs |= reg4.bit(); | 3654 if (reg4.is_valid()) regs |= reg4.bit(); |
3653 if (reg5.is_valid()) regs |= reg5.bit(); | 3655 if (reg5.is_valid()) regs |= reg5.bit(); |
3654 if (reg6.is_valid()) regs |= reg6.bit(); | 3656 if (reg6.is_valid()) regs |= reg6.bit(); |
3655 | 3657 |
3656 for (int i = 0; i < Register::NumAllocatableRegisters(); i++) { | 3658 const RegisterConfiguration* config = RegisterConfiguration::ArchDefault(); |
3657 Register candidate = Register::FromAllocationIndex(i); | 3659 for (int i = 0; i < config->num_allocatable_general_registers(); ++i) { |
| 3660 int code = config->GetAllocatableGeneralCode(i); |
| 3661 Register candidate = Register::from_code(code); |
3658 if (regs & candidate.bit()) continue; | 3662 if (regs & candidate.bit()) continue; |
3659 return candidate; | 3663 return candidate; |
3660 } | 3664 } |
3661 UNREACHABLE(); | 3665 UNREACHABLE(); |
3662 return no_reg; | 3666 return no_reg; |
3663 } | 3667 } |
3664 | 3668 |
3665 | 3669 |
3666 void MacroAssembler::JumpIfDictionaryInPrototypeChain( | 3670 void MacroAssembler::JumpIfDictionaryInPrototypeChain( |
3667 Register object, | 3671 Register object, |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3792 } | 3796 } |
3793 } | 3797 } |
3794 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); | 3798 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); |
3795 add(result, result, Operand(dividend, LSR, 31)); | 3799 add(result, result, Operand(dividend, LSR, 31)); |
3796 } | 3800 } |
3797 | 3801 |
3798 } // namespace internal | 3802 } // namespace internal |
3799 } // namespace v8 | 3803 } // namespace v8 |
3800 | 3804 |
3801 #endif // V8_TARGET_ARCH_ARM | 3805 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |