diff options
Diffstat (limited to 'deps/v8/src/arm/macro-assembler-arm.cc')
-rw-r--r-- | deps/v8/src/arm/macro-assembler-arm.cc | 280 |
1 files changed, 20 insertions, 260 deletions
diff --git a/deps/v8/src/arm/macro-assembler-arm.cc b/deps/v8/src/arm/macro-assembler-arm.cc index 2950de0a0c..8575b0336c 100644 --- a/deps/v8/src/arm/macro-assembler-arm.cc +++ b/deps/v8/src/arm/macro-assembler-arm.cc @@ -12,7 +12,7 @@ #include "src/base/utils/random-number-generator.h" #include "src/bootstrapper.h" #include "src/callable.h" -#include "src/codegen.h" +#include "src/code-stubs.h" #include "src/counters.h" #include "src/debug/debug.h" #include "src/double.h" @@ -352,8 +352,8 @@ void TurboAssembler::Swap(DwVfpRegister srcdst0, DwVfpRegister srcdst1) { if (CpuFeatures::IsSupported(NEON)) { vswp(srcdst0, srcdst1); } else { - DCHECK(srcdst0 != kScratchDoubleReg); - DCHECK(srcdst1 != kScratchDoubleReg); + DCHECK_NE(srcdst0, kScratchDoubleReg); + DCHECK_NE(srcdst1, kScratchDoubleReg); vmov(kScratchDoubleReg, srcdst0); vmov(srcdst0, srcdst1); vmov(srcdst1, kScratchDoubleReg); @@ -401,7 +401,7 @@ void MacroAssembler::And(Register dst, Register src1, const Operand& src2, void MacroAssembler::Ubfx(Register dst, Register src1, int lsb, int width, Condition cond) { - DCHECK(lsb < 32); + DCHECK_LT(lsb, 32); if (!CpuFeatures::IsSupported(ARMv7) || predictable_code_size()) { int mask = (1 << (width + lsb)) - 1 - ((1 << lsb) - 1); and_(dst, src1, Operand(mask), LeaveCC, cond); @@ -417,7 +417,7 @@ void MacroAssembler::Ubfx(Register dst, Register src1, int lsb, int width, void MacroAssembler::Sbfx(Register dst, Register src1, int lsb, int width, Condition cond) { - DCHECK(lsb < 32); + DCHECK_LT(lsb, 32); if (!CpuFeatures::IsSupported(ARMv7) || predictable_code_size()) { int mask = (1 << (width + lsb)) - 1 - ((1 << lsb) - 1); and_(dst, src1, Operand(mask), LeaveCC, cond); @@ -438,7 +438,7 @@ void MacroAssembler::Sbfx(Register dst, Register src1, int lsb, int width, void TurboAssembler::Bfc(Register dst, Register src, int lsb, int width, Condition cond) { - DCHECK(lsb < 32); + DCHECK_LT(lsb, 32); if (!CpuFeatures::IsSupported(ARMv7) || predictable_code_size()) { int mask = (1 << (width + lsb)) - 1 - ((1 << lsb) - 1); bic(dst, src, Operand(mask)); @@ -490,14 +490,6 @@ void TurboAssembler::LoadRoot(Register destination, Heap::RootListIndex index, } -void MacroAssembler::InNewSpace(Register object, - Register scratch, - Condition cond, - Label* branch) { - DCHECK(cond == eq || cond == ne); - CheckPageFlag(object, scratch, MemoryChunk::kIsInNewSpaceMask, cond, branch); -} - void MacroAssembler::RecordWriteField(Register object, int offset, Register value, Register dst, LinkRegisterStatus lr_status, @@ -540,7 +532,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) { @@ -552,7 +544,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) { @@ -645,13 +637,7 @@ void MacroAssembler::RecordWrite(Register object, Register address, if (lr_status == kLRHasNotBeenSaved) { push(lr); } -#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 (lr_status == kLRHasNotBeenSaved) { pop(lr); } @@ -674,39 +660,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. - { - UseScratchRegisterScope temps(this); - Register store_buffer = temps.Acquire(); - mov(store_buffer, Operand(ExternalReference::store_buffer_top(isolate()))); - ldr(scratch, MemOperand(store_buffer)); - // Store pointer to buffer and increment buffer top. - str(address, MemOperand(scratch, kPointerSize, PostIndex)); - // Write back new top of buffer. - str(scratch, MemOperand(store_buffer)); - } - // Call stub on end of buffer. - // Check for end of buffer. - tst(scratch, Operand(StoreBuffer::kStoreBufferMask)); - Ret(ne); - push(lr); - StoreBufferOverflowStub store_buffer_overflow(isolate(), fp_mode); - CallStub(&store_buffer_overflow); - pop(lr); - bind(&done); - Ret(); -} - void TurboAssembler::PushCommonFrame(Register marker_reg) { if (marker_reg.is_valid()) { if (marker_reg.code() > fp.code()) { @@ -736,11 +689,11 @@ void TurboAssembler::PushStandardFrame(Register function_reg) { // Push and pop all registers that can hold pointers. void MacroAssembler::PushSafepointRegisters() { // Safepoints expect a block of contiguous register values starting with r0. - DCHECK(kSafepointSavedRegisters == (1 << kNumSafepointSavedRegisters) - 1); + DCHECK_EQ(kSafepointSavedRegisters, (1 << kNumSafepointSavedRegisters) - 1); // 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); sub(sp, sp, Operand(num_unsaved * kPointerSize)); stm(db_w, sp, kSafepointSavedRegisters); } @@ -1267,7 +1220,6 @@ int TurboAssembler::ActivationFrameAlignment() { void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, - bool restore_context, bool argument_count_is_length) { ConstantPoolUnavailableScope constant_pool_unavailable(this); UseScratchRegisterScope temps(this); @@ -1288,11 +1240,9 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count, str(r3, MemOperand(scratch)); // Restore current context from top and clear it in debug mode. - if (restore_context) { - mov(scratch, Operand(ExternalReference(IsolateAddressId::kContextAddress, - isolate()))); - ldr(cp, MemOperand(scratch)); - } + mov(scratch, + Operand(ExternalReference(IsolateAddressId::kContextAddress, isolate()))); + ldr(cp, MemOperand(scratch)); #ifdef DEBUG mov(scratch, Operand(ExternalReference(IsolateAddressId::kContextAddress, isolate()))); @@ -1630,7 +1580,7 @@ void MacroAssembler::CompareObjectType(Register object, void MacroAssembler::CompareInstanceType(Register map, Register type_reg, InstanceType type) { - ldrb(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset)); + ldrh(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset)); cmp(type_reg, Operand(type)); } @@ -1644,31 +1594,6 @@ void MacroAssembler::CompareRoot(Register obj, cmp(obj, scratch); } -void MacroAssembler::GetWeakValue(Register value, Handle<WeakCell> cell) { - mov(value, Operand(cell)); - ldr(value, FieldMemOperand(value, WeakCell::kValueOffset)); -} - - -void MacroAssembler::LoadWeakValue(Register value, Handle<WeakCell> cell, - Label* miss) { - GetWeakValue(value, cell); - JumpIfSmi(value, miss); -} - -void MacroAssembler::GetMapConstructor(Register result, Register map, - Register temp, Register temp2) { - Label done, loop; - ldr(result, FieldMemOperand(map, Map::kConstructorOrBackPointerOffset)); - bind(&loop); - JumpIfSmi(result, &done); - CompareObjectType(result, temp, temp2, MAP_TYPE); - b(ne, &done); - ldr(result, FieldMemOperand(result, Map::kConstructorOrBackPointerOffset)); - b(&loop); - bind(&done); -} - void MacroAssembler::CallStub(CodeStub* stub, Condition cond) { DCHECK(AllowThisStubCall(stub)); // Stub calls are not allowed in some stubs. @@ -1715,20 +1640,6 @@ bool TurboAssembler::AllowThisStubCall(CodeStub* stub) { return has_frame() || !stub->SometimesSetsUpAFrame(); } -void MacroAssembler::SmiToDouble(LowDwVfpRegister value, Register smi) { - if (CpuFeatures::IsSupported(VFPv3)) { - CpuFeatureScope scope(this, VFPv3); - vmov(value.low(), smi); - vcvt_f64_s32(value, 1); - } else { - UseScratchRegisterScope temps(this); - Register scratch = temps.Acquire(); - SmiUntag(scratch, smi); - vmov(value.low(), scratch); - vcvt_f64_s32(value, value.low()); - } -} - void MacroAssembler::TryDoubleToInt32Exact(Register result, DwVfpRegister double_input, LowDwVfpRegister double_scratch) { @@ -1766,7 +1677,7 @@ void TurboAssembler::TruncateDoubleToIDelayed(Zone* zone, Register result, sub(sp, sp, Operand(kDoubleSize)); // Put input on stack. vstr(double_input, MemOperand(sp, 0)); - CallStubDelayed(new (zone) DoubleToIStub(nullptr, sp, result, 0, true, true)); + CallStubDelayed(new (zone) DoubleToIStub(nullptr, result)); add(sp, sp, Operand(kDoubleSize)); pop(lr); @@ -1823,7 +1734,7 @@ void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin, bool builtin_exit_frame) { #if defined(__thumb__) // Thumb mode builtin. - DCHECK((reinterpret_cast<intptr_t>(builtin.address()) & 1) == 1); + DCHECK_EQ(reinterpret_cast<intptr_t>(builtin.address()) & 1, 1); #endif mov(r1, Operand(builtin)); CEntryStub stub(isolate(), 1, kDontSaveFPRegs, kArgvOnStack, @@ -1833,7 +1744,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()) { mov(scratch2, Operand(ExternalReference(counter))); ldr(scratch1, MemOperand(scratch2)); @@ -1845,7 +1756,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()) { mov(scratch2, Operand(ExternalReference(counter))); ldr(scratch1, MemOperand(scratch2)); @@ -1872,7 +1783,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); } @@ -1901,7 +1812,7 @@ void TurboAssembler::Abort(BailoutReason reason) { // of the Abort macro constant. static const int kExpectedAbortInstructions = 7; int abort_instructions = InstructionsGeneratedSince(&abort_start); - DCHECK(abort_instructions <= kExpectedAbortInstructions); + DCHECK_LE(abort_instructions, kExpectedAbortInstructions); while (abort_instructions++ < kExpectedAbortInstructions) { nop(); } @@ -2052,18 +1963,6 @@ void MacroAssembler::AssertUndefinedOrAllocationSite(Register object, } -void MacroAssembler::JumpIfNotUniqueNameInstanceType(Register reg, - Label* not_unique_name) { - STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0); - Label succeed; - tst(reg, Operand(kIsNotStringMask | kIsNotInternalizedMask)); - b(eq, &succeed); - cmp(reg, Operand(SYMBOL_TYPE)); - b(ne, not_unique_name); - - bind(&succeed); -} - void TurboAssembler::CheckFor32DRegs(Register scratch) { mov(scratch, Operand(ExternalReference::cpu_features())); ldr(scratch, MemOperand(scratch)); @@ -2362,100 +2261,6 @@ void TurboAssembler::CheckPageFlag(Register object, Register scratch, int mask, b(cc, condition_met); } - -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, no_reg)); - - GetMarkBits(object, bitmap_scratch, mask_scratch); - - Label other_color, word_boundary; - UseScratchRegisterScope temps(this); - Register scratch = temps.Acquire(); - ldr(scratch, MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize)); - tst(scratch, Operand(mask_scratch)); - b(first_bit == 1 ? eq : ne, &other_color); - // Shift left 1 by adding. - add(mask_scratch, mask_scratch, Operand(mask_scratch), SetCC); - b(eq, &word_boundary); - tst(scratch, Operand(mask_scratch)); - b(second_bit == 1 ? ne : eq, has_color); - jmp(&other_color); - - bind(&word_boundary); - ldr(scratch, - MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize + kPointerSize)); - tst(scratch, Operand(1)); - b(second_bit == 1 ? ne : eq, has_color); - 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)); - Ubfx(mask_reg, addr_reg, kPointerSizeLog2, Bitmap::kBitsPerCellLog2); - const int kLowBits = kPointerSizeLog2 + Bitmap::kBitsPerCellLog2; - UseScratchRegisterScope temps(this); - Register scratch = temps.Acquire(); - Ubfx(scratch, addr_reg, kLowBits, kPageSizeBits - kLowBits); - add(bitmap_reg, bitmap_reg, Operand(scratch, LSL, kPointerSizeLog2)); - mov(scratch, Operand(1)); - mov(mask_reg, Operand(scratch, LSL, 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)); - 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. - ldr(load_scratch, MemOperand(bitmap_scratch, MemoryChunk::kHeaderSize)); - tst(mask_scratch, load_scratch); - b(eq, value_is_white); -} - -void MacroAssembler::LoadInstanceDescriptors(Register map, - Register descriptors) { - ldr(descriptors, FieldMemOperand(map, Map::kDescriptorsOffset)); -} - -void MacroAssembler::LoadAccessor(Register dst, Register holder, - int accessor_index, - AccessorComponent accessor) { - ldr(dst, FieldMemOperand(holder, HeapObject::kMapOffset)); - LoadInstanceDescriptors(dst, dst); - ldr(dst, - FieldMemOperand(dst, DescriptorArray::GetValueOffset(accessor_index))); - int offset = accessor == ACCESSOR_GETTER ? AccessorPair::kGetterOffset - : AccessorPair::kSetterOffset; - ldr(dst, FieldMemOperand(dst, offset)); -} - Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2, Register reg3, @@ -2508,51 +2313,6 @@ bool AreAliased(Register reg1, } #endif -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 we don't have any pending constant pools. - DCHECK(masm_.pending_32_bit_constants_.empty()); - DCHECK(masm_.pending_64_bit_constants_.empty()); - - // 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::EmitCondition(Condition cond) { - Instr instr = Assembler::instr_at(masm_.pc_); - instr = (instr & ~kCondMask) | cond; - masm_.emit(instr); -} - } // namespace internal } // namespace v8 |