OLD | NEW |
1 | 1 |
2 // Copyright 2012 the V8 project authors. All rights reserved. | 2 // Copyright 2012 the V8 project authors. All rights reserved. |
3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
5 | 5 |
6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
7 | 7 |
8 #if V8_TARGET_ARCH_MIPS | 8 #if V8_TARGET_ARCH_MIPS |
9 | 9 |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
11 #include "src/base/division-by-constant.h" | 11 #include "src/base/division-by-constant.h" |
12 #include "src/bootstrapper.h" | 12 #include "src/bootstrapper.h" |
13 #include "src/codegen.h" | 13 #include "src/codegen.h" |
14 #include "src/cpu-profiler.h" | 14 #include "src/cpu-profiler.h" |
15 #include "src/debug/debug.h" | 15 #include "src/debug/debug.h" |
16 #include "src/mips/macro-assembler-mips.h" | 16 #include "src/mips/macro-assembler-mips.h" |
| 17 #include "src/register-configuration.h" |
17 #include "src/runtime/runtime.h" | 18 #include "src/runtime/runtime.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), |
25 has_frame_(false), | 26 has_frame_(false), |
26 has_double_zero_reg_set_(false) { | 27 has_double_zero_reg_set_(false) { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 | 141 |
141 | 142 |
142 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { | 143 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { |
143 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); | 144 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); |
144 } | 145 } |
145 | 146 |
146 | 147 |
147 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { | 148 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { |
148 UNIMPLEMENTED_MIPS(); | 149 UNIMPLEMENTED_MIPS(); |
149 // General purpose registers are pushed last on the stack. | 150 // General purpose registers are pushed last on the stack. |
150 int doubles_size = FPURegister::NumAllocatableRegisters() * kDoubleSize; | 151 int doubles_size = DoubleRegister::kMaxNumRegisters * kDoubleSize; |
151 int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; | 152 int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; |
152 return MemOperand(sp, doubles_size + register_offset); | 153 return MemOperand(sp, doubles_size + register_offset); |
153 } | 154 } |
154 | 155 |
155 | 156 |
156 void MacroAssembler::InNewSpace(Register object, | 157 void MacroAssembler::InNewSpace(Register object, |
157 Register scratch, | 158 Register scratch, |
158 Condition cc, | 159 Condition cc, |
159 Label* branch) { | 160 Label* branch) { |
160 DCHECK(cc == eq || cc == ne); | 161 DCHECK(cc == eq || cc == ne); |
(...skipping 3514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3675 RegList temps, | 3676 RegList temps, |
3676 int field_count) { | 3677 int field_count) { |
3677 DCHECK((temps & dst.bit()) == 0); | 3678 DCHECK((temps & dst.bit()) == 0); |
3678 DCHECK((temps & src.bit()) == 0); | 3679 DCHECK((temps & src.bit()) == 0); |
3679 // Primitive implementation using only one temporary register. | 3680 // Primitive implementation using only one temporary register. |
3680 | 3681 |
3681 Register tmp = no_reg; | 3682 Register tmp = no_reg; |
3682 // Find a temp register in temps list. | 3683 // Find a temp register in temps list. |
3683 for (int i = 0; i < kNumRegisters; i++) { | 3684 for (int i = 0; i < kNumRegisters; i++) { |
3684 if ((temps & (1 << i)) != 0) { | 3685 if ((temps & (1 << i)) != 0) { |
3685 tmp.code_ = i; | 3686 tmp.reg_code = i; |
3686 break; | 3687 break; |
3687 } | 3688 } |
3688 } | 3689 } |
3689 DCHECK(!tmp.is(no_reg)); | 3690 DCHECK(!tmp.is(no_reg)); |
3690 | 3691 |
3691 for (int i = 0; i < field_count; i++) { | 3692 for (int i = 0; i < field_count; i++) { |
3692 lw(tmp, FieldMemOperand(src, i * kPointerSize)); | 3693 lw(tmp, FieldMemOperand(src, i * kPointerSize)); |
3693 sw(tmp, FieldMemOperand(dst, i * kPointerSize)); | 3694 sw(tmp, FieldMemOperand(dst, i * kPointerSize)); |
3694 } | 3695 } |
3695 } | 3696 } |
(...skipping 2148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5844 Register reg5, | 5845 Register reg5, |
5845 Register reg6) { | 5846 Register reg6) { |
5846 RegList regs = 0; | 5847 RegList regs = 0; |
5847 if (reg1.is_valid()) regs |= reg1.bit(); | 5848 if (reg1.is_valid()) regs |= reg1.bit(); |
5848 if (reg2.is_valid()) regs |= reg2.bit(); | 5849 if (reg2.is_valid()) regs |= reg2.bit(); |
5849 if (reg3.is_valid()) regs |= reg3.bit(); | 5850 if (reg3.is_valid()) regs |= reg3.bit(); |
5850 if (reg4.is_valid()) regs |= reg4.bit(); | 5851 if (reg4.is_valid()) regs |= reg4.bit(); |
5851 if (reg5.is_valid()) regs |= reg5.bit(); | 5852 if (reg5.is_valid()) regs |= reg5.bit(); |
5852 if (reg6.is_valid()) regs |= reg6.bit(); | 5853 if (reg6.is_valid()) regs |= reg6.bit(); |
5853 | 5854 |
5854 for (int i = 0; i < Register::NumAllocatableRegisters(); i++) { | 5855 const RegisterConfiguration* config = RegisterConfiguration::ArchDefault(); |
5855 Register candidate = Register::FromAllocationIndex(i); | 5856 for (int i = 0; i < config->num_allocatable_general_registers(); ++i) { |
| 5857 int code = config->GetAllocatableGeneralCode(i); |
| 5858 Register candidate = Register::from_code(code); |
5856 if (regs & candidate.bit()) continue; | 5859 if (regs & candidate.bit()) continue; |
5857 return candidate; | 5860 return candidate; |
5858 } | 5861 } |
5859 UNREACHABLE(); | 5862 UNREACHABLE(); |
5860 return no_reg; | 5863 return no_reg; |
5861 } | 5864 } |
5862 | 5865 |
5863 | 5866 |
5864 void MacroAssembler::JumpIfDictionaryInPrototypeChain( | 5867 void MacroAssembler::JumpIfDictionaryInPrototypeChain( |
5865 Register object, | 5868 Register object, |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5999 if (mag.shift > 0) sra(result, result, mag.shift); | 6002 if (mag.shift > 0) sra(result, result, mag.shift); |
6000 srl(at, dividend, 31); | 6003 srl(at, dividend, 31); |
6001 Addu(result, result, Operand(at)); | 6004 Addu(result, result, Operand(at)); |
6002 } | 6005 } |
6003 | 6006 |
6004 | 6007 |
6005 } // namespace internal | 6008 } // namespace internal |
6006 } // namespace v8 | 6009 } // namespace v8 |
6007 | 6010 |
6008 #endif // V8_TARGET_ARCH_MIPS | 6011 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |