summaryrefslogtreecommitdiff
path: root/deps/v8/src/arm/macro-assembler-arm.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/arm/macro-assembler-arm.cc')
-rw-r--r--deps/v8/src/arm/macro-assembler-arm.cc280
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