| 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" |  | 
| 18 #include "src/runtime/runtime.h" | 17 #include "src/runtime/runtime.h" | 
| 19 | 18 | 
| 20 namespace v8 { | 19 namespace v8 { | 
| 21 namespace internal { | 20 namespace internal { | 
| 22 | 21 | 
| 23 MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size) | 22 MacroAssembler::MacroAssembler(Isolate* arg_isolate, void* buffer, int size) | 
| 24     : Assembler(arg_isolate, buffer, size), | 23     : Assembler(arg_isolate, buffer, size), | 
| 25       generating_stub_(false), | 24       generating_stub_(false), | 
| 26       has_frame_(false), | 25       has_frame_(false), | 
| 27       has_double_zero_reg_set_(false) { | 26       has_double_zero_reg_set_(false) { | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 141 | 140 | 
| 142 | 141 | 
| 143 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { | 142 MemOperand MacroAssembler::SafepointRegisterSlot(Register reg) { | 
| 144   return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); | 143   return MemOperand(sp, SafepointRegisterStackIndex(reg.code()) * kPointerSize); | 
| 145 } | 144 } | 
| 146 | 145 | 
| 147 | 146 | 
| 148 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { | 147 MemOperand MacroAssembler::SafepointRegistersAndDoublesSlot(Register reg) { | 
| 149   UNIMPLEMENTED_MIPS(); | 148   UNIMPLEMENTED_MIPS(); | 
| 150   // General purpose registers are pushed last on the stack. | 149   // General purpose registers are pushed last on the stack. | 
| 151   int doubles_size = DoubleRegister::kMaxNumRegisters * kDoubleSize; | 150   int doubles_size = FPURegister::NumAllocatableRegisters() * kDoubleSize; | 
| 152   int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; | 151   int register_offset = SafepointRegisterStackIndex(reg.code()) * kPointerSize; | 
| 153   return MemOperand(sp, doubles_size + register_offset); | 152   return MemOperand(sp, doubles_size + register_offset); | 
| 154 } | 153 } | 
| 155 | 154 | 
| 156 | 155 | 
| 157 void MacroAssembler::InNewSpace(Register object, | 156 void MacroAssembler::InNewSpace(Register object, | 
| 158                                 Register scratch, | 157                                 Register scratch, | 
| 159                                 Condition cc, | 158                                 Condition cc, | 
| 160                                 Label* branch) { | 159                                 Label* branch) { | 
| 161   DCHECK(cc == eq || cc == ne); | 160   DCHECK(cc == eq || cc == ne); | 
| (...skipping 3514 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3676                                 RegList temps, | 3675                                 RegList temps, | 
| 3677                                 int field_count) { | 3676                                 int field_count) { | 
| 3678   DCHECK((temps & dst.bit()) == 0); | 3677   DCHECK((temps & dst.bit()) == 0); | 
| 3679   DCHECK((temps & src.bit()) == 0); | 3678   DCHECK((temps & src.bit()) == 0); | 
| 3680   // Primitive implementation using only one temporary register. | 3679   // Primitive implementation using only one temporary register. | 
| 3681 | 3680 | 
| 3682   Register tmp = no_reg; | 3681   Register tmp = no_reg; | 
| 3683   // Find a temp register in temps list. | 3682   // Find a temp register in temps list. | 
| 3684   for (int i = 0; i < kNumRegisters; i++) { | 3683   for (int i = 0; i < kNumRegisters; i++) { | 
| 3685     if ((temps & (1 << i)) != 0) { | 3684     if ((temps & (1 << i)) != 0) { | 
| 3686       tmp.reg_code = i; | 3685       tmp.code_ = i; | 
| 3687       break; | 3686       break; | 
| 3688     } | 3687     } | 
| 3689   } | 3688   } | 
| 3690   DCHECK(!tmp.is(no_reg)); | 3689   DCHECK(!tmp.is(no_reg)); | 
| 3691 | 3690 | 
| 3692   for (int i = 0; i < field_count; i++) { | 3691   for (int i = 0; i < field_count; i++) { | 
| 3693     lw(tmp, FieldMemOperand(src, i * kPointerSize)); | 3692     lw(tmp, FieldMemOperand(src, i * kPointerSize)); | 
| 3694     sw(tmp, FieldMemOperand(dst, i * kPointerSize)); | 3693     sw(tmp, FieldMemOperand(dst, i * kPointerSize)); | 
| 3695   } | 3694   } | 
| 3696 } | 3695 } | 
| (...skipping 2068 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5765                                    Register reg5, | 5764                                    Register reg5, | 
| 5766                                    Register reg6) { | 5765                                    Register reg6) { | 
| 5767   RegList regs = 0; | 5766   RegList regs = 0; | 
| 5768   if (reg1.is_valid()) regs |= reg1.bit(); | 5767   if (reg1.is_valid()) regs |= reg1.bit(); | 
| 5769   if (reg2.is_valid()) regs |= reg2.bit(); | 5768   if (reg2.is_valid()) regs |= reg2.bit(); | 
| 5770   if (reg3.is_valid()) regs |= reg3.bit(); | 5769   if (reg3.is_valid()) regs |= reg3.bit(); | 
| 5771   if (reg4.is_valid()) regs |= reg4.bit(); | 5770   if (reg4.is_valid()) regs |= reg4.bit(); | 
| 5772   if (reg5.is_valid()) regs |= reg5.bit(); | 5771   if (reg5.is_valid()) regs |= reg5.bit(); | 
| 5773   if (reg6.is_valid()) regs |= reg6.bit(); | 5772   if (reg6.is_valid()) regs |= reg6.bit(); | 
| 5774 | 5773 | 
| 5775   const RegisterConfiguration* config = RegisterConfiguration::ArchDefault(); | 5774   for (int i = 0; i < Register::NumAllocatableRegisters(); i++) { | 
| 5776   for (int i = 0; i < config->num_allocatable_general_registers(); ++i) { | 5775     Register candidate = Register::FromAllocationIndex(i); | 
| 5777     int code = config->GetAllocatableGeneralCode(i); |  | 
| 5778     Register candidate = Register::from_code(code); |  | 
| 5779     if (regs & candidate.bit()) continue; | 5776     if (regs & candidate.bit()) continue; | 
| 5780     return candidate; | 5777     return candidate; | 
| 5781   } | 5778   } | 
| 5782   UNREACHABLE(); | 5779   UNREACHABLE(); | 
| 5783   return no_reg; | 5780   return no_reg; | 
| 5784 } | 5781 } | 
| 5785 | 5782 | 
| 5786 | 5783 | 
| 5787 void MacroAssembler::JumpIfDictionaryInPrototypeChain( | 5784 void MacroAssembler::JumpIfDictionaryInPrototypeChain( | 
| 5788     Register object, | 5785     Register object, | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5922   if (mag.shift > 0) sra(result, result, mag.shift); | 5919   if (mag.shift > 0) sra(result, result, mag.shift); | 
| 5923   srl(at, dividend, 31); | 5920   srl(at, dividend, 31); | 
| 5924   Addu(result, result, Operand(at)); | 5921   Addu(result, result, Operand(at)); | 
| 5925 } | 5922 } | 
| 5926 | 5923 | 
| 5927 | 5924 | 
| 5928 }  // namespace internal | 5925 }  // namespace internal | 
| 5929 }  // namespace v8 | 5926 }  // namespace v8 | 
| 5930 | 5927 | 
| 5931 #endif  // V8_TARGET_ARCH_MIPS | 5928 #endif  // V8_TARGET_ARCH_MIPS | 
| OLD | NEW | 
|---|