diff options
Diffstat (limited to 'deps/v8/src/mips64/macro-assembler-mips64.cc')
-rw-r--r-- | deps/v8/src/mips64/macro-assembler-mips64.cc | 70 |
1 files changed, 27 insertions, 43 deletions
diff --git a/deps/v8/src/mips64/macro-assembler-mips64.cc b/deps/v8/src/mips64/macro-assembler-mips64.cc index f7a77dd1b1..006f15b967 100644 --- a/deps/v8/src/mips64/macro-assembler-mips64.cc +++ b/deps/v8/src/mips64/macro-assembler-mips64.cc @@ -4,15 +4,13 @@ #include <limits.h> // For LONG_MIN, LONG_MAX. -#include "src/v8.h" - #if V8_TARGET_ARCH_MIPS64 #include "src/base/division-by-constant.h" #include "src/bootstrapper.h" #include "src/codegen.h" #include "src/cpu-profiler.h" -#include "src/debug.h" +#include "src/debug/debug.h" #include "src/runtime/runtime.h" namespace v8 { @@ -167,6 +165,9 @@ void MacroAssembler::InNewSpace(Register object, } +// Clobbers object, dst, value, and ra, if (ra_status == kRAHasBeenSaved) +// The register 'object' contains a heap object pointer. The heap object +// tag is shifted away. void MacroAssembler::RecordWriteField( Register object, int offset, @@ -220,8 +221,7 @@ void MacroAssembler::RecordWriteField( } -// Will clobber 4 registers: object, map, dst, ip. The -// register 'object' contains a heap object pointer. +// Clobbers object, dst, map, and ra, if (ra_status == kRAHasBeenSaved) void MacroAssembler::RecordWriteForMap(Register object, Register map, Register dst, @@ -295,8 +295,8 @@ void MacroAssembler::RecordWriteForMap(Register object, } -// Will clobber 4 registers: object, address, scratch, ip. The -// register 'object' contains a heap object pointer. The heap object +// Clobbers object, address, value, and ra, if (ra_status == kRAHasBeenSaved) +// The register 'object' contains a heap object pointer. The heap object // tag is shifted away. void MacroAssembler::RecordWrite( Register object, @@ -2755,7 +2755,7 @@ void MacroAssembler::BranchAndLink(Label* L, Condition cond, Register rs, Label skip; Condition neg_cond = NegateCondition(cond); BranchShort(&skip, neg_cond, rs, rt); - J(L, bdslot); + Jal(L, bdslot); bind(&skip); } } else { @@ -3193,15 +3193,12 @@ void MacroAssembler::Ret(Condition cond, void MacroAssembler::J(Label* L, BranchDelaySlot bdslot) { BlockTrampolinePoolScope block_trampoline_pool(this); - - uint64_t imm28; - imm28 = jump_address(L); { BlockGrowBufferScope block_buf_growth(this); // Buffer growth (and relocation) must be blocked for internal references // until associated instructions are emitted and available to be patched. RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); - j(imm28); + j(L); } // Emit a nop in the branch delay slot if required. if (bdslot == PROTECT) nop(); @@ -3210,15 +3207,12 @@ void MacroAssembler::J(Label* L, BranchDelaySlot bdslot) { void MacroAssembler::Jal(Label* L, BranchDelaySlot bdslot) { BlockTrampolinePoolScope block_trampoline_pool(this); - - uint64_t imm28; - imm28 = jump_address(L); { BlockGrowBufferScope block_buf_growth(this); // Buffer growth (and relocation) must be blocked for internal references // until associated instructions are emitted and available to be patched. RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE_ENCODED); - jal(imm28); + jal(L); } // Emit a nop in the branch delay slot if required. if (bdslot == PROTECT) nop(); @@ -3361,10 +3355,11 @@ void MacroAssembler::PopRegisterAsTwoSmis(Register dst, Register scratch) { void MacroAssembler::DebugBreak() { PrepareCEntryArgs(0); - PrepareCEntryFunction(ExternalReference(Runtime::kDebugBreak, isolate())); + PrepareCEntryFunction( + ExternalReference(Runtime::kHandleDebuggerStatement, isolate())); CEntryStub ces(isolate(), 1); DCHECK(AllowThisStubCall(&ces)); - Call(ces.GetCode(), RelocInfo::DEBUG_BREAK); + Call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT); } @@ -3569,26 +3564,6 @@ void MacroAssembler::Allocate(Register object_size, } -void MacroAssembler::UndoAllocationInNewSpace(Register object, - Register scratch) { - ExternalReference new_space_allocation_top = - ExternalReference::new_space_allocation_top_address(isolate()); - - // Make sure the object has no tag before resetting top. - And(object, object, Operand(~kHeapObjectTagMask)); -#ifdef DEBUG - // Check that the object un-allocated is below the current top. - li(scratch, Operand(new_space_allocation_top)); - ld(scratch, MemOperand(scratch)); - Check(less, kUndoAllocationOfNonAllocatedMemory, - object, Operand(scratch)); -#endif - // Write the address of the object to un-allocate as the current top. - li(scratch, Operand(new_space_allocation_top)); - sd(object, MemOperand(scratch)); -} - - void MacroAssembler::AllocateTwoByteString(Register result, Register length, Register scratch1, @@ -4716,9 +4691,9 @@ void MacroAssembler::DsubuAndCheckForOverflow(Register dst, Register left, } } -void MacroAssembler::CallRuntime(const Runtime::Function* f, - int num_arguments, - SaveFPRegsMode save_doubles) { +void MacroAssembler::CallRuntime(const Runtime::Function* f, int num_arguments, + SaveFPRegsMode save_doubles, + BranchDelaySlot bd) { // All parameters are on the stack. v0 has the return value after call. // If the expected number of arguments of the runtime function is @@ -4733,7 +4708,7 @@ void MacroAssembler::CallRuntime(const Runtime::Function* f, PrepareCEntryArgs(num_arguments); PrepareCEntryFunction(ExternalReference(f, isolate())); CEntryStub stub(isolate(), 1, save_doubles); - CallStub(&stub); + CallStub(&stub, TypeFeedbackId::None(), al, zero_reg, Operand(zero_reg), bd); } @@ -6236,19 +6211,28 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain( DCHECK(!scratch1.is(scratch0)); Factory* factory = isolate()->factory(); Register current = scratch0; - Label loop_again; + Label loop_again, end; // Scratch contained elements pointer. Move(current, object); + ld(current, FieldMemOperand(current, HeapObject::kMapOffset)); + ld(current, FieldMemOperand(current, Map::kPrototypeOffset)); + Branch(&end, eq, current, Operand(factory->null_value())); // Loop based on the map going up the prototype chain. bind(&loop_again); ld(current, FieldMemOperand(current, HeapObject::kMapOffset)); + lbu(scratch1, FieldMemOperand(current, Map::kInstanceTypeOffset)); + STATIC_ASSERT(JS_VALUE_TYPE < JS_OBJECT_TYPE); + STATIC_ASSERT(JS_PROXY_TYPE < JS_OBJECT_TYPE); + Branch(found, lo, scratch1, Operand(JS_OBJECT_TYPE)); lb(scratch1, FieldMemOperand(current, Map::kBitField2Offset)); DecodeField<Map::ElementsKindBits>(scratch1); Branch(found, eq, scratch1, Operand(DICTIONARY_ELEMENTS)); ld(current, FieldMemOperand(current, Map::kPrototypeOffset)); Branch(&loop_again, ne, current, Operand(factory->null_value())); + + bind(&end); } |