Bug 1178770 - Move MacroAssemblerSpecific::call to the MacroAssembler. r=h4writer

This commit is contained in:
Nicolas B. Pierron 2015-07-06 16:12:48 +02:00
parent 5af5a80eb6
commit 5b4a36245b
17 changed files with 283 additions and 180 deletions

View File

@ -59,7 +59,7 @@ MacroAssembler::PushWithPatch(ImmPtr imm)
}
// ===============================================================
// Call functions.
// Simple call functions.
void
MacroAssembler::call(const CallSiteDesc& desc, const Register reg)

View File

@ -350,9 +350,17 @@ class MacroAssembler : public MacroAssemblerSpecific
public:
// ===============================================================
// Call functions.
// Simple call functions.
using MacroAssemblerSpecific::call; // legacy
void call(Register reg) PER_ARCH;
void call(const Address& addr) PER_ARCH ONLY_X86_X64;
void call(Label* label) PER_ARCH;
void call(ImmWord imm) PER_ARCH;
// Call a target native function, which is neither traceable nor movable.
void call(ImmPtr imm) PER_ARCH;
void call(AsmJSImmPtr imm) PER_ARCH;
// Call a target JitCode, which must be traceable, and may be movable.
void call(JitCode* c) PER_ARCH;
inline void call(const CallSiteDesc& desc, const Register reg);
inline void call(const CallSiteDesc& desc, Label* label);

View File

@ -1638,9 +1638,6 @@ class Assembler : public AssemblerShared
return actualOffset(offset);
}
void call(Label* label);
void call(void* target);
void as_bkpt();
public:

View File

@ -4122,7 +4122,7 @@ MacroAssemblerARMCompat::callWithABI(AsmJSImmPtr imm, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust, /* callFromAsmJS = */ true);
call(imm);
asMasm().call(imm);
callWithABIPost(stackAdjust, result);
}
@ -4135,7 +4135,7 @@ MacroAssemblerARMCompat::callWithABI(const Address& fun, MoveOp::Type result)
ma_ldr(fun, r12);
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(r12);
asMasm().call(r12);
callWithABIPost(stackAdjust, result);
}
@ -4146,7 +4146,7 @@ MacroAssemblerARMCompat::callWithABI(Register fun, MoveOp::Type result)
ma_mov(fun, r12);
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(r12);
asMasm().call(r12);
callWithABIPost(stackAdjust, result);
}
@ -5090,6 +5090,14 @@ MacroAssemblerARMCompat::profilerExitFrame()
branch(GetJitContext()->runtime->jitRuntime()->getProfilerExitFrameTail());
}
void
MacroAssemblerARMCompat::callAndPushReturnAddress(Label* label)
{
AutoForbidPools afp(this, 2);
ma_push(pc);
asMasm().call(label);
}
MacroAssembler&
MacroAssemblerARMCompat::asMasm()
{
@ -5240,3 +5248,55 @@ MacroAssembler::reserveStack(uint32_t amount)
ma_sub(Imm32(amount), sp);
adjustFrame(amount);
}
// ===============================================================
// Simple call functions.
void
MacroAssembler::call(Register reg)
{
as_blx(reg);
}
void
MacroAssembler::call(Label* label)
{
// For now, assume that it'll be nearby?
as_bl(label, Always);
}
void
MacroAssembler::call(ImmWord imm)
{
call(ImmPtr((void*)imm.value));
}
void
MacroAssembler::call(ImmPtr imm)
{
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, imm, Relocation::HARDCODED);
ma_call(imm);
}
void
MacroAssembler::call(AsmJSImmPtr imm)
{
movePtr(imm, CallReg);
call(CallReg);
}
void
MacroAssembler::call(JitCode* c)
{
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, ImmPtr(c->raw()), Relocation::JITCODE);
RelocStyle rs;
if (HasMOVWT())
rs = L_MOVWT;
else
rs = L_LDR;
ma_movPatchable(ImmPtr(c->raw()), ScratchRegister, Always, rs);
ma_callJitHalfPush(ScratchRegister);
}

View File

@ -538,7 +538,6 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
{ }
public:
using MacroAssemblerARM::call;
// Jumps + other functions that should be called from non-arm specific
// code. Basically, an x86 front end on top of the ARM code.
@ -567,42 +566,7 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
MOZ_CRASH("NYI-IC");
}
void call(const Register reg) {
as_blx(reg);
}
void call(Label* label) {
// For now, assume that it'll be nearby?
as_bl(label, Always);
}
void call(ImmWord imm) {
call(ImmPtr((void*)imm.value));
}
void call(ImmPtr imm) {
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, imm, Relocation::HARDCODED);
ma_call(imm);
}
void call(AsmJSImmPtr imm) {
movePtr(imm, CallReg);
call(CallReg);
}
void call(JitCode* c) {
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, ImmPtr(c->raw()), Relocation::JITCODE);
RelocStyle rs;
if (HasMOVWT())
rs = L_MOVWT;
else
rs = L_LDR;
ma_movPatchable(ImmPtr(c->raw()), ScratchRegister, Always, rs);
ma_callJitHalfPush(ScratchRegister);
}
void callAndPushReturnAddress(Label* label) {
AutoForbidPools afp(this, 2);
ma_push(pc);
call(label);
}
void callAndPushReturnAddress(Label* label);
void branch(JitCode* c) {
BufferOffset bo = m_buffer.nextOffset();

View File

@ -55,12 +55,29 @@ MacroAssemblerCompat::buildFakeExitFrame(Register scratch, uint32_t* offset)
*offset = pseudoReturnOffset;
}
void
MacroAssemblerCompat::callWithExitFrame(Label* target)
{
uint32_t descriptor = MakeFrameDescriptor(framePushed(), JitFrame_IonJS);
Push(Imm32(descriptor)); // descriptor
asMasm().call(target);
}
void
MacroAssemblerCompat::callWithExitFrame(JitCode* target)
{
uint32_t descriptor = MakeFrameDescriptor(framePushed(), JitFrame_IonJS);
asMasm().Push(Imm32(descriptor));
call(target);
asMasm().call(target);
}
void
MacroAssemblerCompat::callWithExitFrame(JitCode* target, Register dynStack)
{
add32(Imm32(framePushed()), dynStack);
makeFrameDescriptor(dynStack, JitFrame_IonJS);
Push(dynStack); // descriptor
asMasm().call(target);
}
void
@ -441,7 +458,7 @@ MacroAssemblerCompat::callWithABI(void* fun, MoveOp::Type result)
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(ImmPtr(fun));
asMasm().call(ImmPtr(fun));
callWithABIPost(stackAdjust, result);
}
@ -452,7 +469,7 @@ MacroAssemblerCompat::callWithABI(Register fun, MoveOp::Type result)
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(ip0);
asMasm().call(ip0);
callWithABIPost(stackAdjust, result);
}
@ -461,7 +478,7 @@ MacroAssemblerCompat::callWithABI(AsmJSImmPtr imm, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(imm);
asMasm().call(imm);
callWithABIPost(stackAdjust, result);
}
@ -472,7 +489,7 @@ MacroAssemblerCompat::callWithABI(Address fun, MoveOp::Type result)
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(ip0);
asMasm().call(ip0);
callWithABIPost(stackAdjust, result);
}
@ -684,5 +701,57 @@ MacroAssembler::Pop(const ValueOperand& val)
adjustFrame(-1 * int64_t(sizeof(int64_t)));
}
// ===============================================================
// Simple call functions.
void
MacroAssembler::call(Register reg)
{
syncStackPtr();
Blr(ARMRegister(reg, 64));
}
void
MacroAssembler::call(Label* label)
{
syncStackPtr();
Bl(label);
}
void
MacroAssembler::call(ImmWord imm)
{
call(ImmPtr((void*)imm.value));
}
void
MacroAssembler::call(ImmPtr imm)
{
syncStackPtr();
movePtr(imm, ip0);
Blr(vixl::ip0);
}
void
MacroAssembler::call(AsmJSImmPtr imm)
{
vixl::UseScratchRegisterScope temps(this);
const Register scratch = temps.AcquireX().asUnsized();
syncStackPtr();
movePtr(imm, scratch);
call(scratch);
}
void
MacroAssembler::call(JitCode* c)
{
vixl::UseScratchRegisterScope temps(this);
const ARMRegister scratch64 = temps.AcquireX();
syncStackPtr();
BufferOffset off = immPool64(scratch64, uint64_t(c->raw()));
addPendingJump(off, ImmPtr(c->raw()), Relocation::JITCODE);
blr(scratch64);
}
} // namespace jit
} // namespace js

View File

@ -2706,14 +2706,6 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
orPtr(Imm32(type), frameSizeReg);
}
void callWithExitFrame(JitCode* target, Register dynStack) {
add32(Imm32(framePushed()), dynStack);
makeFrameDescriptor(dynStack, JitFrame_IonJS);
Push(dynStack); // descriptor
call(target);
}
// FIXME: See CodeGeneratorX64 calls to noteAsmJSGlobalAccess.
void patchAsmJSGlobalAccess(CodeOffsetLabel patchAt, uint8_t* code,
uint8_t* globalData, unsigned globalDataOffset)
@ -2737,14 +2729,9 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
// non-function. Returns offset to be passed to markSafepointAt().
void buildFakeExitFrame(Register scratch, uint32_t* offset);
void callWithExitFrame(Label* target) {
uint32_t descriptor = MakeFrameDescriptor(framePushed(), JitFrame_IonJS);
Push(Imm32(descriptor)); // descriptor
call(target);
}
void callWithExitFrame(Label* target);
void callWithExitFrame(JitCode* target);
void callWithExitFrame(JitCode* target, Register dynStack);
void callJit(Register callee) {
// AArch64 cannot read from the PC, so pushing must be handled callee-side.
@ -2756,53 +2743,6 @@ class MacroAssemblerCompat : public vixl::MacroAssembler
MOZ_CRASH("appendCallSite");
}
void call(const CallSiteDesc& desc, Label* label) {
syncStackPtr();
call(label);
append(desc, currentOffset(), framePushed_);
}
void call(const CallSiteDesc& desc, Register reg) {
syncStackPtr();
call(reg);
append(desc, currentOffset(), framePushed_);
}
void call(const CallSiteDesc& desc, AsmJSImmPtr imm) {
syncStackPtr();
call(imm);
append(desc, currentOffset(), framePushed_);
}
void call(AsmJSImmPtr imm) {
vixl::UseScratchRegisterScope temps(this);
const Register scratch = temps.AcquireX().asUnsized();
syncStackPtr();
movePtr(imm, scratch);
call(scratch);
}
void call(Register target) {
syncStackPtr();
Blr(ARMRegister(target, 64));
}
// Call a target JitCode, which must be traceable, and may be movable.
void call(JitCode* target) {
vixl::UseScratchRegisterScope temps(this);
const ARMRegister scratch64 = temps.AcquireX();
syncStackPtr();
BufferOffset off = immPool64(scratch64, uint64_t(target->raw()));
addPendingJump(off, ImmPtr(target->raw()), Relocation::JITCODE);
blr(scratch64);
}
// Call a target native function, which is neither traceable nor movable.
void call(ImmPtr target) {
syncStackPtr();
movePtr(target, ip0);
Blr(vixl::ip0);
}
void call(Label* target) {
syncStackPtr();
Bl(target);
}
void callExit(AsmJSImmPtr imm, uint32_t stackArgBytes) {
MOZ_CRASH("callExit");
}

View File

@ -3445,7 +3445,7 @@ MacroAssemblerMIPSCompat::callWithABI(AsmJSImmPtr imm, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust, /* callFromAsmJS = */ true);
call(imm);
asMasm().call(imm);
callWithABIPost(stackAdjust, result);
}
@ -3458,7 +3458,7 @@ MacroAssemblerMIPSCompat::callWithABI(const Address& fun, MoveOp::Type result)
ma_lw(t9, Address(fun.base, fun.offset));
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(t9);
asMasm().call(t9);
callWithABIPost(stackAdjust, result);
}
@ -3470,7 +3470,7 @@ MacroAssemblerMIPSCompat::callWithABI(Register fun, MoveOp::Type result)
ma_move(t9, fun);
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(t9);
asMasm().call(t9);
callWithABIPost(stackAdjust, result);
}
@ -3776,3 +3776,49 @@ MacroAssembler::reserveStack(uint32_t amount)
ma_subu(StackPointer, StackPointer, Imm32(amount));
adjustFrame(amount);
}
// ===============================================================
// Simple call functions.
void
MacroAssembler::call(Register reg)
{
as_jalr(reg);
as_nop();
}
void
MacroAssembler::call(Label* label)
{
ma_bal(label);
}
void
MacroAssembler::call(AsmJSImmPtr target)
{
movePtr(target, CallReg);
call(CallReg);
}
void
MacroAssembler::call(ImmWord target)
{
call(ImmPtr((void*)target.value));
}
void
MacroAssembler::call(ImmPtr target)
{
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, target, Relocation::HARDCODED);
ma_call(target);
}
void
MacroAssembler::call(JitCode* c)
{
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, ImmPtr(c->raw()), Relocation::JITCODE);
ma_liPatchable(ScratchRegister, Imm32((uint32_t)c->raw()));
ma_callJitHalfPush(ScratchRegister);
}

View File

@ -405,34 +405,6 @@ class MacroAssemblerMIPSCompat : public MacroAssemblerMIPS
MOZ_CRASH("NYI-IC");
}
void call(const Register reg) {
as_jalr(reg);
as_nop();
}
void call(Label* label) {
ma_bal(label);
}
void call(ImmWord imm) {
call(ImmPtr((void*)imm.value));
}
void call(ImmPtr imm) {
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, imm, Relocation::HARDCODED);
ma_call(imm);
}
void call(AsmJSImmPtr imm) {
movePtr(imm, CallReg);
call(CallReg);
}
void call(JitCode* c) {
BufferOffset bo = m_buffer.nextOffset();
addPendingJump(bo, ImmPtr(c->raw()), Relocation::JITCODE);
ma_liPatchable(ScratchRegister, Imm32((uint32_t)c->raw()));
ma_callJitHalfPush(ScratchRegister);
}
void callAndPushReturnAddress(Label* label) {
ma_callJitHalfPush(label);
}

View File

@ -323,7 +323,7 @@ MacroAssemblerX64::callWithABI(void* fun, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(ImmPtr(fun));
asMasm().call(ImmPtr(fun));
callWithABIPost(stackAdjust, result);
}
@ -332,7 +332,7 @@ MacroAssemblerX64::callWithABI(AsmJSImmPtr imm, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(imm);
asMasm().call(imm);
callWithABIPost(stackAdjust, result);
}
@ -361,7 +361,7 @@ MacroAssemblerX64::callWithABI(Address fun, MoveOp::Type result)
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(Operand(fun));
asMasm().call(fun);
callWithABIPost(stackAdjust, result);
}
@ -379,7 +379,7 @@ MacroAssemblerX64::callWithABI(Register fun, MoveOp::Type result)
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(Operand(fun));
asMasm().call(fun);
callWithABIPost(stackAdjust, result);
}
@ -513,7 +513,7 @@ MacroAssemblerX64::callWithExitFrame(JitCode* target, Register dynStack)
addPtr(Imm32(asMasm().framePushed()), dynStack);
makeFrameDescriptor(dynStack, JitFrame_IonJS);
asMasm().Push(dynStack);
call(target);
asMasm().call(target);
}
void

View File

@ -89,7 +89,6 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
MoveResolver moveResolver_;
public:
using MacroAssemblerX86Shared::call;
using MacroAssemblerX86Shared::callWithExitFrame;
using MacroAssemblerX86Shared::branch32;
using MacroAssemblerX86Shared::branchTest32;
@ -108,13 +107,6 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared
/////////////////////////////////////////////////////////////////
// X64 helpers.
/////////////////////////////////////////////////////////////////
void call(ImmWord target) {
mov(target, rax);
call(rax);
}
void call(ImmPtr target) {
call(ImmWord(uintptr_t(target.value)));
}
void writeDataRelocation(const Value& val) {
if (val.isMarkable()) {
gc::Cell* cell = reinterpret_cast<gc::Cell*>(val.toGCThing());

View File

@ -42,7 +42,7 @@ EmitCallIC(CodeOffsetLabel* patchOffset, MacroAssembler& masm)
ICStubReg);
// Call the stubcode.
masm.call(Operand(ICStubReg, ICStub::offsetOfStubCode()));
masm.call(Address(ICStubReg, ICStub::offsetOfStubCode()));
}
inline void
@ -230,7 +230,7 @@ EmitCallTypeUpdateIC(MacroAssembler& masm, JitCode* code, uint32_t objectOffset)
ICStubReg);
// Call the stubcode.
masm.call(Operand(ICStubReg, ICStub::offsetOfStubCode()));
masm.call(Address(ICStubReg, ICStub::offsetOfStubCode()));
// Restore the old stub reg.
masm.pop(ICStubReg);

View File

@ -165,6 +165,24 @@ MacroAssemblerX86Shared::branchNegativeZeroFloat32(FloatRegister reg,
j(Overflow, label);
}
void
MacroAssemblerX86Shared::callJit(Register callee)
{
call(callee);
}
void
MacroAssemblerX86Shared::callJitFromAsmJS(Register callee)
{
call(callee);
}
void
MacroAssemblerX86Shared::callAndPushReturnAddress(Label* label)
{
call(label);
}
MacroAssembler&
MacroAssemblerX86Shared::asMasm()
{
@ -350,3 +368,50 @@ MacroAssembler::Pop(const ValueOperand& val)
popValue(val);
framePushed_ -= sizeof(Value);
}
// ===============================================================
// Simple call functions.
void
MacroAssembler::call(Register reg)
{
Assembler::call(reg);
}
void
MacroAssembler::call(Label* label)
{
Assembler::call(label);
}
void
MacroAssembler::call(const Address& addr)
{
Assembler::call(Operand(addr.base, addr.offset));
}
void
MacroAssembler::call(AsmJSImmPtr target)
{
mov(target, eax);
Assembler::call(eax);
}
void
MacroAssembler::call(ImmWord target)
{
mov(target, eax);
Assembler::call(eax);
}
void
MacroAssembler::call(ImmPtr target)
{
call(ImmWord(uintptr_t(target.value)));
}
void
MacroAssembler::call(JitCode* target)
{
Assembler::call(target);
}

View File

@ -1433,19 +1433,9 @@ class MacroAssemblerX86Shared : public Assembler
void callWithExitFrame(Label* target);
void callWithExitFrame(JitCode* target);
void callJit(Register callee) {
call(callee);
}
void callJitFromAsmJS(Register callee) {
call(callee);
}
void call(AsmJSImmPtr target) {
mov(target, eax);
call(eax);
}
void callAndPushReturnAddress(Label* label) {
call(label);
}
void callJit(Register callee);
void callJitFromAsmJS(Register callee);
void callAndPushReturnAddress(Label* label);
void checkStackAlignment() {
// Exists for ARM compatibility.

View File

@ -328,7 +328,7 @@ MacroAssemblerX86::callWithABI(void* fun, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(ImmPtr(fun));
asMasm().call(ImmPtr(fun));
callWithABIPost(stackAdjust, result);
}
@ -337,7 +337,7 @@ MacroAssemblerX86::callWithABI(AsmJSImmPtr fun, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(fun);
asMasm().call(fun);
callWithABIPost(stackAdjust, result);
}
@ -346,7 +346,7 @@ MacroAssemblerX86::callWithABI(const Address& fun, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(Operand(fun));
asMasm().call(fun);
callWithABIPost(stackAdjust, result);
}
@ -355,7 +355,7 @@ MacroAssemblerX86::callWithABI(Register fun, MoveOp::Type result)
{
uint32_t stackAdjust;
callWithABIPre(&stackAdjust);
call(Operand(fun));
asMasm().call(fun);
callWithABIPost(stackAdjust, result);
}
@ -506,7 +506,7 @@ MacroAssemblerX86::callWithExitFrame(JitCode* target, Register dynStack)
addPtr(ImmWord(asMasm().framePushed()), dynStack);
makeFrameDescriptor(dynStack, JitFrame_IonJS);
asMasm().Push(dynStack);
call(target);
asMasm().call(target);
}
void

View File

@ -43,7 +43,7 @@ EmitCallIC(CodeOffsetLabel* patchOffset, MacroAssembler& masm)
// Load stubcode pointer from BaselineStubEntry into ICTailCallReg
// ICTailCallReg will always be unused in the contexts where ICs are called.
masm.call(Operand(ICStubReg, ICStub::offsetOfStubCode()));
masm.call(Address(ICStubReg, ICStub::offsetOfStubCode()));
}
inline void
@ -236,7 +236,7 @@ EmitCallTypeUpdateIC(MacroAssembler& masm, JitCode* code, uint32_t objectOffset)
ICStubReg);
// Call the stubcode.
masm.call(Operand(ICStubReg, ICStub::offsetOfStubCode()));
masm.call(Address(ICStubReg, ICStub::offsetOfStubCode()));
// Restore the old stub reg.
masm.pop(ICStubReg);

View File

@ -274,7 +274,7 @@ JitRuntime::generateEnterJIT(JSContext* cx, EnterJitType type)
Call passed-in code, get return value and fill in the
passed in return value pointer
***************************************************************/
masm.call(Operand(ebp, ARG_JITCODE));
masm.call(Address(ebp, ARG_JITCODE));
if (type == EnterJitBaseline) {
// Baseline OSR will return here.