diff options
Diffstat (limited to 'deps/v8/src/mips/macro-assembler-mips.cc')
-rw-r--r-- | deps/v8/src/mips/macro-assembler-mips.cc | 284 |
1 files changed, 29 insertions, 255 deletions
diff --git a/deps/v8/src/mips/macro-assembler-mips.cc b/deps/v8/src/mips/macro-assembler-mips.cc index caf6b85cc7..de5de02f09 100644 --- a/deps/v8/src/mips/macro-assembler-mips.cc +++ b/deps/v8/src/mips/macro-assembler-mips.cc @@ -10,7 +10,7 @@ #include "src/base/division-by-constant.h" #include "src/bootstrapper.h" #include "src/callable.h" -#include "src/codegen.h" +#include "src/code-stubs.h" #include "src/debug/debug.h" #include "src/external-reference-table.h" #include "src/frames-inl.h" @@ -153,7 +153,7 @@ void MacroAssembler::PushSafepointRegisters() { // Safepoints expect a block of kNumSafepointRegisters values on the // stack, so adjust the stack for unsaved registers. const int num_unsaved = kNumSafepointRegisters - kNumSafepointSavedRegisters; - DCHECK(num_unsaved >= 0); + DCHECK_GE(num_unsaved, 0); if (num_unsaved > 0) { Subu(sp, sp, Operand(num_unsaved * kPointerSize)); } @@ -176,15 +176,6 @@ int MacroAssembler::SafepointRegisterStackIndex(int reg_code) { } -void MacroAssembler::InNewSpace(Register object, - Register scratch, - Condition cc, - Label* branch) { - DCHECK(cc == eq || cc == ne); - CheckPageFlag(object, scratch, MemoryChunk::kIsInNewSpaceMask, cc, branch); -} - - // 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. @@ -231,7 +222,7 @@ void MacroAssembler::RecordWriteField(Register object, int offset, } void TurboAssembler::SaveRegisters(RegList registers) { - DCHECK(NumRegs(registers) > 0); + DCHECK_GT(NumRegs(registers), 0); RegList regs = 0; for (int i = 0; i < Register::kNumRegisters; ++i) { if ((registers >> i) & 1u) { @@ -242,7 +233,7 @@ void TurboAssembler::SaveRegisters(RegList registers) { } void TurboAssembler::RestoreRegisters(RegList registers) { - DCHECK(NumRegs(registers) > 0); + DCHECK_GT(NumRegs(registers), 0); RegList regs = 0; for (int i = 0; i < Register::kNumRegisters; ++i) { if ((registers >> i) & 1u) { @@ -336,13 +327,7 @@ void MacroAssembler::RecordWrite(Register object, Register address, if (ra_status == kRAHasNotBeenSaved) { push(ra); } -#ifdef V8_CSA_WRITE_BARRIER CallRecordWriteStub(object, address, remembered_set_action, fp_mode); -#else - RecordWriteStub stub(isolate(), object, value, address, remembered_set_action, - fp_mode); - CallStub(&stub); -#endif if (ra_status == kRAHasNotBeenSaved) { pop(ra); } @@ -366,39 +351,6 @@ void MacroAssembler::RecordWrite(Register object, Register address, } } -void MacroAssembler::RememberedSetHelper(Register object, // For debug tests. - Register address, Register scratch, - SaveFPRegsMode fp_mode) { - Label done; - if (emit_debug_code()) { - Label ok; - JumpIfNotInNewSpace(object, scratch, &ok); - stop("Remembered set pointer is in new space"); - bind(&ok); - } - // Load store buffer top. - ExternalReference store_buffer = - ExternalReference::store_buffer_top(isolate()); - li(t8, Operand(store_buffer)); - lw(scratch, MemOperand(t8)); - // Store pointer to buffer and increment buffer top. - sw(address, MemOperand(scratch)); - Addu(scratch, scratch, kPointerSize); - // Write back new top of buffer. - sw(scratch, MemOperand(t8)); - // Call stub on end of buffer. - // Check for end of buffer. - And(t8, scratch, Operand(StoreBuffer::kStoreBufferMask)); - Ret(ne, t8, Operand(zero_reg)); - push(ra); - StoreBufferOverflowStub store_buffer_overflow(isolate(), fp_mode); - CallStub(&store_buffer_overflow); - pop(ra); - bind(&done); - Ret(); -} - - // --------------------------------------------------------------------------- // Instruction macros. @@ -1564,8 +1516,8 @@ void TurboAssembler::SarPair(Register dst_low, Register dst_high, void TurboAssembler::Ext(Register rt, Register rs, uint16_t pos, uint16_t size) { - DCHECK(pos < 32); - DCHECK(pos + size < 33); + DCHECK_LT(pos, 32); + DCHECK_LT(pos + size, 33); if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { ext_(rt, rs, pos, size); @@ -1584,9 +1536,9 @@ void TurboAssembler::Ext(Register rt, Register rs, uint16_t pos, void TurboAssembler::Ins(Register rt, Register rs, uint16_t pos, uint16_t size) { - DCHECK(pos < 32); - DCHECK(pos + size <= 32); - DCHECK(size != 0); + DCHECK_LT(pos, 32); + DCHECK_LE(pos + size, 32); + DCHECK_NE(size, 0); if (IsMipsArchVariant(kMips32r2) || IsMipsArchVariant(kMips32r6)) { ins_(rt, rs, pos, size); @@ -1810,7 +1762,7 @@ void TurboAssembler::Trunc_uw_d(FPURegister fd, Register rs, // Test if scratch > fd. // If fd < 2^31 we can convert it normally. Label simple_convert; - BranchF(&simple_convert, NULL, lt, fd, scratch); + BranchF(&simple_convert, nullptr, lt, fd, scratch); // First we subtract 2^31 from fd, then trunc it to rs // and add 2^31 to rs. @@ -1844,7 +1796,7 @@ void TurboAssembler::Trunc_uw_s(FPURegister fd, Register rs, // Test if scratch > fd. // If fd < 2^31 we can convert it normally. Label simple_convert; - BranchF32(&simple_convert, NULL, lt, fd, scratch); + BranchF32(&simple_convert, nullptr, lt, fd, scratch); // First we subtract 2^31 from fd, then trunc it to rs // and add 2^31 to rs. @@ -2285,7 +2237,7 @@ void TurboAssembler::Movt(Register rd, Register rs, uint16_t cc) { if (IsMipsArchVariant(kLoongson)) { // Tests an FP condition code and then conditionally move rs to rd. // We do not currently use any FPU cc bit other than bit 0. - DCHECK(cc == 0); + DCHECK_EQ(cc, 0); DCHECK(rs != t8 && rd != t8); Label done; Register scratch = t8; @@ -2310,7 +2262,7 @@ void TurboAssembler::Movf(Register rd, Register rs, uint16_t cc) { if (IsMipsArchVariant(kLoongson)) { // Tests an FP condition code and then conditionally move rs to rd. // We do not currently use any FPU cc bit other than bit 0. - DCHECK(cc == 0); + DCHECK_EQ(cc, 0); DCHECK(rs != t8 && rd != t8); Label done; Register scratch = t8; @@ -2377,7 +2329,7 @@ void MacroAssembler::EmitFPUTruncate(FPURoundingMode rounding_mode, cvt_w_d(double_scratch, double_input); mfc1(result, double_scratch); cvt_d_w(double_scratch, double_scratch); - BranchF(&done, NULL, eq, double_input, double_scratch); + BranchF(&done, nullptr, eq, double_input, double_scratch); int32_t except_mask = kFCSRFlagMask; // Assume interested in all exceptions. @@ -2456,7 +2408,7 @@ void TurboAssembler::TruncateDoubleToIDelayed(Zone* zone, Register result, Subu(sp, sp, Operand(kDoubleSize)); // Put input on stack. Sdc1(double_input, MemOperand(sp, 0)); - CallStubDelayed(new (zone) DoubleToIStub(nullptr, sp, result, 0, true, true)); + CallStubDelayed(new (zone) DoubleToIStub(nullptr, result)); Addu(sp, sp, Operand(kDoubleSize)); pop(ra); @@ -2980,7 +2932,7 @@ bool TurboAssembler::BranchShortCheck(int32_t offset, Label* L, Condition cond, return BranchShortHelper(offset, nullptr, cond, rs, rt, bdslot); } } else { - DCHECK(offset == 0); + DCHECK_EQ(offset, 0); if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) { return BranchShortHelperR6(0, L, cond, rs, rt); } else { @@ -3335,7 +3287,7 @@ bool TurboAssembler::BranchAndLinkShortCheck(int32_t offset, Label* L, return BranchAndLinkShortHelper(offset, nullptr, cond, rs, rt, bdslot); } } else { - DCHECK(offset == 0); + DCHECK_EQ(offset, 0); if (IsMipsArchVariant(kMips32r6) && bdslot == PROTECT) { return BranchAndLinkShortHelperR6(0, L, cond, rs, rt); } else { @@ -3836,39 +3788,11 @@ void MacroAssembler::PopStackHandler() { sw(a1, MemOperand(scratch)); } - -void MacroAssembler::JumpIfNotUniqueNameInstanceType(Register reg, - Label* not_unique_name) { - STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0); - Label succeed; - { - UseScratchRegisterScope temps(this); - Register scratch = temps.Acquire(); - And(scratch, reg, Operand(kIsNotStringMask | kIsNotInternalizedMask)); - Branch(&succeed, eq, scratch, Operand(zero_reg)); - } - Branch(not_unique_name, ne, reg, Operand(SYMBOL_TYPE)); - - bind(&succeed); -} - void TurboAssembler::FPUCanonicalizeNaN(const DoubleRegister dst, const DoubleRegister src) { sub_d(dst, src, kDoubleRegZero); } -void MacroAssembler::GetWeakValue(Register value, Handle<WeakCell> cell) { - li(value, Operand(cell)); - lw(value, FieldMemOperand(value, WeakCell::kValueOffset)); -} - - -void MacroAssembler::LoadWeakValue(Register value, Handle<WeakCell> cell, - Label* miss) { - GetWeakValue(value, cell); - JumpIfSmi(value, miss); -} - void TurboAssembler::MovFromFloatResult(DoubleRegister dst) { if (IsMipsSoftFloatABI) { if (kArchEndian == kLittle) { @@ -4190,24 +4114,11 @@ void MacroAssembler::InvokeFunction(Handle<JSFunction> function, // --------------------------------------------------------------------------- // Support functions. -void MacroAssembler::GetMapConstructor(Register result, Register map, - Register temp, Register temp2) { - Label done, loop; - lw(result, FieldMemOperand(map, Map::kConstructorOrBackPointerOffset)); - bind(&loop); - JumpIfSmi(result, &done); - GetObjectType(result, temp, temp2); - Branch(&done, ne, temp2, Operand(MAP_TYPE)); - lw(result, FieldMemOperand(result, Map::kConstructorOrBackPointerOffset)); - Branch(&loop); - bind(&done); -} - void MacroAssembler::GetObjectType(Register object, Register map, Register type_reg) { lw(map, FieldMemOperand(object, HeapObject::kMapOffset)); - lbu(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset)); + lhu(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset)); } @@ -4555,7 +4466,7 @@ void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin, void MacroAssembler::IncrementCounter(StatsCounter* counter, int value, Register scratch1, Register scratch2) { - DCHECK(value > 0); + DCHECK_GT(value, 0); if (FLAG_native_code_counters && counter->Enabled()) { li(scratch2, Operand(ExternalReference(counter))); lw(scratch1, MemOperand(scratch2)); @@ -4567,7 +4478,7 @@ void MacroAssembler::IncrementCounter(StatsCounter* counter, int value, void MacroAssembler::DecrementCounter(StatsCounter* counter, int value, Register scratch1, Register scratch2) { - DCHECK(value > 0); + DCHECK_GT(value, 0); if (FLAG_native_code_counters && counter->Enabled()) { li(scratch2, Operand(ExternalReference(counter))); lw(scratch1, MemOperand(scratch2)); @@ -4600,7 +4511,7 @@ void TurboAssembler::Abort(BailoutReason reason) { bind(&abort_start); #ifdef DEBUG const char* msg = GetBailoutReason(reason); - if (msg != NULL) { + if (msg != nullptr) { RecordComment("Abort message: "); RecordComment(msg); } @@ -4631,7 +4542,7 @@ void TurboAssembler::Abort(BailoutReason reason) { // generated instructions is 10, so we use this as a maximum value. static const int kExpectedAbortInstructions = 10; int abort_instructions = InstructionsGeneratedSince(&abort_start); - DCHECK(abort_instructions <= kExpectedAbortInstructions); + DCHECK_LE(abort_instructions, kExpectedAbortInstructions); while (abort_instructions++ < kExpectedAbortInstructions) { nop(); } @@ -4751,7 +4662,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space, const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); if (save_doubles) { // The stack must be align to 0 modulo 8 for stores with sdc1. - DCHECK(kDoubleSize == frame_alignment); + DCHECK_EQ(kDoubleSize, frame_alignment); if (frame_alignment > 0) { DCHECK(base::bits::IsPowerOfTwo(frame_alignment)); And(sp, sp, Operand(-frame_alignment)); // Align stack. @@ -4768,7 +4679,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space, // Reserve place for the return address, stack space and an optional slot // (used by the DirectCEntryStub to hold the return value if a struct is // returned) and align the frame preparing for calling the runtime function. - DCHECK(stack_space >= 0); + DCHECK_GE(stack_space, 0); Subu(sp, sp, Operand((stack_space + 2) * kPointerSize)); if (frame_alignment > 0) { DCHECK(base::bits::IsPowerOfTwo(frame_alignment)); @@ -4783,9 +4694,8 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space, sw(scratch, MemOperand(fp, ExitFrameConstants::kSPOffset)); } - void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, - bool restore_context, bool do_return, + bool do_return, bool argument_count_is_length) { // Optionally restore all double registers. if (save_doubles) { @@ -4803,11 +4713,10 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, sw(zero_reg, MemOperand(t8)); // Restore current context from top and clear it in debug mode. - if (restore_context) { - li(t8, Operand(ExternalReference(IsolateAddressId::kContextAddress, - isolate()))); - lw(cp, MemOperand(t8)); - } + li(t8, + Operand(ExternalReference(IsolateAddressId::kContextAddress, isolate()))); + lw(cp, MemOperand(t8)); + #ifdef DEBUG li(t8, Operand(ExternalReference(IsolateAddressId::kContextAddress, isolate()))); @@ -5311,98 +5220,6 @@ void TurboAssembler::CheckPageFlag(Register object, Register scratch, int mask, Branch(condition_met, cc, scratch, Operand(zero_reg)); } - -void MacroAssembler::JumpIfBlack(Register object, - Register scratch0, - Register scratch1, - Label* on_black) { - HasColor(object, scratch0, scratch1, on_black, 1, 1); // kBlackBitPattern. - DCHECK(strcmp(Marking::kBlackBitPattern, "11") == 0); -} - - -void MacroAssembler::HasColor(Register object, - Register bitmap_scratch, - Register mask_scratch, - Label* has_color, - int first_bit, - int second_bit) { - DCHECK(!AreAliased(object, bitmap_scratch, mask_scratch, t8)); - DCHECK(!AreAliased(object, bitmap_scratch, mask_scratch, t9)); - - GetMarkBits(object, bitmap_scratch, mask_scratch); - - Label other_color, word_boundary; - lw(t9, MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize)); - And(t8, t9, Operand(mask_scratch)); - Branch(&other_color, first_bit == 1 ? eq : ne, t8, Operand(zero_reg)); - // Shift left 1 by adding. - Addu(mask_scratch, mask_scratch, Operand(mask_scratch)); - Branch(&word_boundary, eq, mask_scratch, Operand(zero_reg)); - And(t8, t9, Operand(mask_scratch)); - Branch(has_color, second_bit == 1 ? ne : eq, t8, Operand(zero_reg)); - jmp(&other_color); - - bind(&word_boundary); - lw(t9, MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize + kPointerSize)); - And(t9, t9, Operand(1)); - Branch(has_color, second_bit == 1 ? ne : eq, t9, Operand(zero_reg)); - bind(&other_color); -} - - -void MacroAssembler::GetMarkBits(Register addr_reg, - Register bitmap_reg, - Register mask_reg) { - DCHECK(!AreAliased(addr_reg, bitmap_reg, mask_reg, no_reg)); - And(bitmap_reg, addr_reg, Operand(~Page::kPageAlignmentMask)); - Ext(mask_reg, addr_reg, kPointerSizeLog2, Bitmap::kBitsPerCellLog2); - const int kLowBits = kPointerSizeLog2 + Bitmap::kBitsPerCellLog2; - Ext(t8, addr_reg, kLowBits, kPageSizeBits - kLowBits); - Lsa(bitmap_reg, bitmap_reg, t8, kPointerSizeLog2, t8); - li(t8, Operand(1)); - sllv(mask_reg, t8, mask_reg); -} - - -void MacroAssembler::JumpIfWhite(Register value, Register bitmap_scratch, - Register mask_scratch, Register load_scratch, - Label* value_is_white) { - DCHECK(!AreAliased(value, bitmap_scratch, mask_scratch, t8)); - GetMarkBits(value, bitmap_scratch, mask_scratch); - - // If the value is black or grey we don't need to do anything. - DCHECK(strcmp(Marking::kWhiteBitPattern, "00") == 0); - DCHECK(strcmp(Marking::kBlackBitPattern, "11") == 0); - DCHECK(strcmp(Marking::kGreyBitPattern, "10") == 0); - DCHECK(strcmp(Marking::kImpossibleBitPattern, "01") == 0); - - // Since both black and grey have a 1 in the first position and white does - // not have a 1 there we only need to check one bit. - lw(load_scratch, MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize)); - And(t8, mask_scratch, load_scratch); - Branch(value_is_white, eq, t8, Operand(zero_reg)); -} - - -void MacroAssembler::LoadInstanceDescriptors(Register map, - Register descriptors) { - lw(descriptors, FieldMemOperand(map, Map::kDescriptorsOffset)); -} - - -void MacroAssembler::LoadAccessor(Register dst, Register holder, - int accessor_index, - AccessorComponent accessor) { - lw(dst, FieldMemOperand(holder, HeapObject::kMapOffset)); - LoadInstanceDescriptors(dst, dst); - lw(dst, - FieldMemOperand(dst, DescriptorArray::GetValueOffset(accessor_index))); - int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset - : AccessorPair::kSetterOffset; - lw(dst, FieldMemOperand(dst, offset)); -} - Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2, Register reg3, @@ -5451,49 +5268,6 @@ bool AreAliased(Register reg1, Register reg2, Register reg3, Register reg4, return n_of_valid_regs != n_of_non_aliasing_regs; } - -CodePatcher::CodePatcher(Isolate* isolate, byte* address, int instructions, - FlushICache flush_cache) - : address_(address), - size_(instructions * Assembler::kInstrSize), - masm_(isolate, address, size_ + Assembler::kGap, CodeObjectRequired::kNo), - flush_cache_(flush_cache) { - // Create a new macro assembler pointing to the address of the code to patch. - // The size is adjusted with kGap on order for the assembler to generate size - // bytes of instructions without failing with buffer size constraints. - DCHECK(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); -} - - -CodePatcher::~CodePatcher() { - // Indicate that code has changed. - if (flush_cache_ == FLUSH) { - Assembler::FlushICache(masm_.isolate(), address_, size_); - } - - // Check that the code was patched as expected. - - DCHECK(masm_.pc_ == address_ + size_); - DCHECK(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap); -} - - -void CodePatcher::Emit(Instr instr) { - masm()->emit(instr); -} - - -void CodePatcher::Emit(Address addr) { - masm()->emit(reinterpret_cast<Instr>(addr)); -} - - -void CodePatcher::ChangeBranchCondition(Instr current_instr, - uint32_t new_opcode) { - current_instr = (current_instr & ~kOpcodeMask) | new_opcode; - masm_.emit(current_instr); -} - } // namespace internal } // namespace v8 |