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_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
8 | 8 |
9 #include "src/base/division-by-constant.h" | 9 #include "src/base/division-by-constant.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
11 #include "src/codegen.h" | 11 #include "src/codegen.h" |
12 #include "src/cpu-profiler.h" | 12 #include "src/cpu-profiler.h" |
13 #include "src/debug/debug.h" | 13 #include "src/debug/debug.h" |
14 #include "src/mips64/macro-assembler-mips64.h" | 14 #include "src/mips64/macro-assembler-mips64.h" |
| 15 #include "src/register-configuration.h" |
15 #include "src/runtime/runtime.h" | 16 #include "src/runtime/runtime.h" |
16 | 17 |
17 namespace v8 { | 18 namespace v8 { |
18 namespace internal { | 19 namespace internal { |
19 | 20 |
20 MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size) | 21 MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size) |
21 : Assembler(arg_isolate, buffer, size), | 22 : Assembler(arg_isolate, buffer, size), |
22 generating_stub_(false), | 23 generating_stub_(false), |
23 has_frame_(false), | 24 has_frame_(false), |
24 has_double_zero_reg_set_(false) { | 25 has_double_zero_reg_set_(false) { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 | 143 |
143 | 144 |
144 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { | 145 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { |
145 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); | 146 return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); |
146 } | 147 } |
147 | 148 |
148 | 149 |
149 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { | 150 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { |
150 UNIMPLEMENTED_MIPS(); | 151 UNIMPLEMENTED_MIPS(); |
151 // General purpose registers are pushed last on the stack. | 152 // General purpose registers are pushed last on the stack. |
152 int doubles_size = FPURegister::NumAllocatableRegisters() * kDoubleSize; | 153 int doubles_size = DoubleRegister::kMaxNumRegisters * kDoubleSize; |
153 int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; | 154 int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; |
154 return MemOperand(sp, doubles_size + register_offset); | 155 return MemOperand(sp, doubles_size + register_offset); |
155 } | 156 } |
156 | 157 |
157 | 158 |
158 void MacroAssembler::InNewSpace(Register object, | 159 void MacroAssembler::InNewSpace(Register object, |
159 Register scratch, | 160 Register scratch, |
160 Condition cc, | 161 Condition cc, |
161 Label* branch) { | 162 Label* branch) { |
162 DCHECK(cc == eq || cc == ne); | 163 DCHECK(cc == eq || cc == ne); |
(...skipping 3561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3724 RegList temps, | 3725 RegList temps, |
3725 int field_count) { | 3726 int field_count) { |
3726 DCHECK((temps & dst.bit()) == 0); | 3727 DCHECK((temps & dst.bit()) == 0); |
3727 DCHECK((temps & src.bit()) == 0); | 3728 DCHECK((temps & src.bit()) == 0); |
3728 // Primitive implementation using only one temporary register. | 3729 // Primitive implementation using only one temporary register. |
3729 | 3730 |
3730 Register tmp = no_reg; | 3731 Register tmp = no_reg; |
3731 // Find a temp register in temps list. | 3732 // Find a temp register in temps list. |
3732 for (int i = 0; i < kNumRegisters; i++) { | 3733 for (int i = 0; i < kNumRegisters; i++) { |
3733 if ((temps & (1 << i)) != 0) { | 3734 if ((temps & (1 << i)) != 0) { |
3734 tmp.code_ = i; | 3735 tmp.reg_code = i; |
3735 break; | 3736 break; |
3736 } | 3737 } |
3737 } | 3738 } |
3738 DCHECK(!tmp.is(no_reg)); | 3739 DCHECK(!tmp.is(no_reg)); |
3739 | 3740 |
3740 for (int i = 0; i < field_count; i++) { | 3741 for (int i = 0; i < field_count; i++) { |
3741 ld(tmp, FieldMemOperand(src, i * kPointerSize)); | 3742 ld(tmp, FieldMemOperand(src, i * kPointerSize)); |
3742 sd(tmp, FieldMemOperand(dst, i * kPointerSize)); | 3743 sd(tmp, FieldMemOperand(dst, i * kPointerSize)); |
3743 } | 3744 } |
3744 } | 3745 } |
(...skipping 2294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6039 Register reg5, | 6040 Register reg5, |
6040 Register reg6) { | 6041 Register reg6) { |
6041 RegList regs = 0; | 6042 RegList regs = 0; |
6042 if (reg1.is_valid()) regs |= reg1.bit(); | 6043 if (reg1.is_valid()) regs |= reg1.bit(); |
6043 if (reg2.is_valid()) regs |= reg2.bit(); | 6044 if (reg2.is_valid()) regs |= reg2.bit(); |
6044 if (reg3.is_valid()) regs |= reg3.bit(); | 6045 if (reg3.is_valid()) regs |= reg3.bit(); |
6045 if (reg4.is_valid()) regs |= reg4.bit(); | 6046 if (reg4.is_valid()) regs |= reg4.bit(); |
6046 if (reg5.is_valid()) regs |= reg5.bit(); | 6047 if (reg5.is_valid()) regs |= reg5.bit(); |
6047 if (reg6.is_valid()) regs |= reg6.bit(); | 6048 if (reg6.is_valid()) regs |= reg6.bit(); |
6048 | 6049 |
6049 for (int i = 0; i < Register::NumAllocatableRegisters(); i++) { | 6050 const RegisterConfiguration* config = RegisterConfiguration::ArchDefault(); |
6050 Register candidate = Register::FromAllocationIndex(i); | 6051 for (int i = 0; i < config->num_allocatable_general_registers(); ++i) { |
| 6052 int code = config->GetAllocatableGeneralCode(i); |
| 6053 Register candidate = Register::from_code(code); |
6051 if (regs & candidate.bit()) continue; | 6054 if (regs & candidate.bit()) continue; |
6052 return candidate; | 6055 return candidate; |
6053 } | 6056 } |
6054 UNREACHABLE(); | 6057 UNREACHABLE(); |
6055 return no_reg; | 6058 return no_reg; |
6056 } | 6059 } |
6057 | 6060 |
6058 | 6061 |
6059 void MacroAssembler::JumpIfDictionaryInPrototypeChain( | 6062 void MacroAssembler::JumpIfDictionaryInPrototypeChain( |
6060 Register object, | 6063 Register object, |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6193 if (mag.shift > 0) sra(result, result, mag.shift); | 6196 if (mag.shift > 0) sra(result, result, mag.shift); |
6194 srl(at, dividend, 31); | 6197 srl(at, dividend, 31); |
6195 Addu(result, result, Operand(at)); | 6198 Addu(result, result, Operand(at)); |
6196 } | 6199 } |
6197 | 6200 |
6198 | 6201 |
6199 } // namespace internal | 6202 } // namespace internal |
6200 } // namespace v8 | 6203 } // namespace v8 |
6201 | 6204 |
6202 #endif // V8_TARGET_ARCH_MIPS64 | 6205 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |