| Index: src/arm/macro-assembler-arm.cc
|
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
|
| index 114a7a0026b2883b2d49d17c514f178e5ddb7236..0dd37dd4aebdf3e113bdf385cc201024dea01506 100644
|
| --- a/src/arm/macro-assembler-arm.cc
|
| +++ b/src/arm/macro-assembler-arm.cc
|
| @@ -89,17 +89,6 @@ int MacroAssembler::CallStubSize(
|
| }
|
|
|
|
|
| -int MacroAssembler::CallSizeNotPredictableCodeSize(Isolate* isolate,
|
| - Address target,
|
| - RelocInfo::Mode rmode,
|
| - Condition cond) {
|
| - Instr mov_instr = cond | MOV | LeaveCC;
|
| - Operand mov_operand = Operand(reinterpret_cast<intptr_t>(target), rmode);
|
| - return kInstrSize +
|
| - mov_operand.instructions_required(NULL, mov_instr) * kInstrSize;
|
| -}
|
| -
|
| -
|
| void MacroAssembler::Call(Address target,
|
| RelocInfo::Mode rmode,
|
| Condition cond,
|
| @@ -173,6 +162,40 @@ void MacroAssembler::Call(Handle<Code> code,
|
| Call(reinterpret_cast<Address>(code.location()), rmode, cond, mode);
|
| }
|
|
|
| +void MacroAssembler::CallDeoptimizer(Address target) {
|
| + BlockConstPoolScope block_const_pool(this);
|
| +
|
| + uintptr_t target_raw = reinterpret_cast<uintptr_t>(target);
|
| +
|
| + // We use blx, like a call, but it does not return here. The link register is
|
| + // used by the deoptimizer to work out what called it.
|
| + if (CpuFeatures::IsSupported(ARMv7)) {
|
| + CpuFeatureScope scope(this, ARMv7);
|
| + movw(ip, target_raw & 0xffff);
|
| + movt(ip, (target_raw >> 16) & 0xffff);
|
| + blx(ip);
|
| + } else {
|
| + // We need to load a literal, but we can't use the usual constant pool
|
| + // because we call this from a patcher, and cannot afford the guard
|
| + // instruction and other administrative overhead.
|
| + ldr(ip, MemOperand(pc, (2 * kInstrSize) - kPcLoadDelta));
|
| + blx(ip);
|
| + dd(target_raw);
|
| + }
|
| +}
|
| +
|
| +int MacroAssembler::CallDeoptimizerSize() {
|
| + // ARMv7+:
|
| + // movw ip, ...
|
| + // movt ip, ...
|
| + // blx ip @ This never returns.
|
| + //
|
| + // ARMv6:
|
| + // ldr ip, =address
|
| + // blx ip @ This never returns.
|
| + // .word address
|
| + return 3 * kInstrSize;
|
| +}
|
|
|
| void MacroAssembler::Ret(Condition cond) {
|
| bx(lr, cond);
|
| @@ -3964,6 +3987,10 @@ CodePatcher::~CodePatcher() {
|
| Assembler::FlushICache(masm_.isolate(), address_, size_);
|
| }
|
|
|
| + // Check that we don't have any pending constant pools.
|
| + DCHECK(masm_.num_pending_32_bit_constants_ == 0);
|
| + DCHECK(masm_.num_pending_64_bit_constants_ == 0);
|
| +
|
| // Check that the code was patched as expected.
|
| DCHECK(masm_.pc_ == address_ + size_);
|
| DCHECK(masm_.reloc_info_writer.pos() == address_ + size_ + Assembler::kGap);
|
|
|