зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1051595 - OdinMonkey: Bias the global-register to improve instruction encoding efficiency. r=luke
This commit is contained in:
Родитель
97d9edf21c
Коммит
4bee9bcff8
|
@ -5965,9 +5965,11 @@ GenerateEntry(ModuleCompiler &m, unsigned exportIndex)
|
|||
JS_ASSERT(masm.framePushed() == FramePushedAfterSave);
|
||||
|
||||
// ARM and MIPS have a globally-pinned GlobalReg (x64 uses RIP-relative
|
||||
// addressing, x86 uses immediates in effective addresses).
|
||||
// addressing, x86 uses immediates in effective addresses). For the
|
||||
// AsmJSGlobalRegBias addition, see Assembler-(mips,arm).h.
|
||||
#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS)
|
||||
masm.movePtr(IntArgReg1, GlobalReg);
|
||||
masm.addPtr(Imm32(AsmJSGlobalRegBias), GlobalReg);
|
||||
#endif
|
||||
|
||||
// ARM, MIPS and x64 have a globally-pinned HeapReg (x86 uses immediates in
|
||||
|
@ -6254,7 +6256,7 @@ GenerateFFIIonExit(ModuleCompiler &m, const ModuleCompiler::ExitDescriptor &exit
|
|||
#elif defined(JS_CODEGEN_X86)
|
||||
m.masm().append(AsmJSGlobalAccess(masm.movlWithPatch(Imm32(0), callee), globalDataOffset));
|
||||
#else
|
||||
masm.computeEffectiveAddress(Address(GlobalReg, globalDataOffset), callee);
|
||||
masm.computeEffectiveAddress(Address(GlobalReg, globalDataOffset - AsmJSGlobalRegBias), callee);
|
||||
#endif
|
||||
|
||||
// 2.2. Get callee
|
||||
|
|
|
@ -102,6 +102,11 @@ static MOZ_CONSTEXPR_VAR FloatRegister ScratchSimdReg = InvalidFloatReg;
|
|||
static MOZ_CONSTEXPR_VAR FloatRegister ScratchUIntReg = { FloatRegisters::d15, VFPRegister::UInt };
|
||||
static MOZ_CONSTEXPR_VAR FloatRegister ScratchIntReg = { FloatRegisters::d15, VFPRegister::Int };
|
||||
|
||||
// A bias applied to the GlobalReg to allow the use of instructions with small
|
||||
// negative immediate offsets which doubles the range of global data that can be
|
||||
// accessed with a single instruction.
|
||||
static const int32_t AsmJSGlobalRegBias = 1024;
|
||||
|
||||
// Registers used in the GenerateFFIIonExit Enable Activation block.
|
||||
static MOZ_CONSTEXPR_VAR Register AsmJSIonExitRegCallee = r4;
|
||||
static MOZ_CONSTEXPR_VAR Register AsmJSIonExitRegE0 = r0;
|
||||
|
|
|
@ -1763,17 +1763,6 @@ DispatchIonCache::initializeAddCacheState(LInstruction *ins, AddCacheState *addS
|
|||
addState->dispatchScratch = ScratchRegister;
|
||||
}
|
||||
|
||||
template <class U>
|
||||
Register
|
||||
getBase(U *mir)
|
||||
{
|
||||
switch (mir->base()) {
|
||||
case U::Heap: return HeapReg;
|
||||
case U::Global: return GlobalReg;
|
||||
}
|
||||
return InvalidReg;
|
||||
}
|
||||
|
||||
bool
|
||||
CodeGeneratorARM::visitLoadTypedArrayElementStatic(LLoadTypedArrayElementStatic *ins)
|
||||
{
|
||||
|
@ -1845,10 +1834,12 @@ CodeGeneratorARM::visitAsmJSLoadHeap(LAsmJSLoadHeap *ins)
|
|||
FloatRegister dst = ToFloatRegister(ins->output());
|
||||
VFPRegister vd(dst);
|
||||
if (size == 32) {
|
||||
masm.ma_vldr(Operand(GlobalReg, AsmJSNaN32GlobalDataOffset), vd.singleOverlay(), Assembler::AboveOrEqual);
|
||||
masm.ma_vldr(Operand(GlobalReg, AsmJSNaN32GlobalDataOffset - AsmJSGlobalRegBias),
|
||||
vd.singleOverlay(), Assembler::AboveOrEqual);
|
||||
masm.ma_vldr(vd.singleOverlay(), HeapReg, ptrReg, 0, Assembler::Below);
|
||||
} else {
|
||||
masm.ma_vldr(Operand(GlobalReg, AsmJSNaN64GlobalDataOffset), vd, Assembler::AboveOrEqual);
|
||||
masm.ma_vldr(Operand(GlobalReg, AsmJSNaN64GlobalDataOffset - AsmJSGlobalRegBias),
|
||||
vd, Assembler::AboveOrEqual);
|
||||
masm.ma_vldr(vd, HeapReg, ptrReg, 0, Assembler::Below);
|
||||
}
|
||||
} else {
|
||||
|
@ -2068,7 +2059,7 @@ bool
|
|||
CodeGeneratorARM::visitAsmJSLoadGlobalVar(LAsmJSLoadGlobalVar *ins)
|
||||
{
|
||||
const MAsmJSLoadGlobalVar *mir = ins->mir();
|
||||
unsigned addr = mir->globalDataOffset();
|
||||
unsigned addr = mir->globalDataOffset() - AsmJSGlobalRegBias;
|
||||
if (mir->type() == MIRType_Int32) {
|
||||
masm.ma_dtr(IsLoad, GlobalReg, Imm32(addr), ToRegister(ins->output()));
|
||||
} else if (mir->type() == MIRType_Float32) {
|
||||
|
@ -2087,7 +2078,7 @@ CodeGeneratorARM::visitAsmJSStoreGlobalVar(LAsmJSStoreGlobalVar *ins)
|
|||
|
||||
MIRType type = mir->value()->type();
|
||||
JS_ASSERT(IsNumberType(type));
|
||||
unsigned addr = mir->globalDataOffset();
|
||||
unsigned addr = mir->globalDataOffset() - AsmJSGlobalRegBias;
|
||||
if (mir->value()->type() == MIRType_Int32) {
|
||||
masm.ma_dtr(IsStore, GlobalReg, Imm32(addr), ToRegister(ins->value()));
|
||||
} else if (mir->value()->type() == MIRType_Float32) {
|
||||
|
@ -2108,7 +2099,7 @@ CodeGeneratorARM::visitAsmJSLoadFuncPtr(LAsmJSLoadFuncPtr *ins)
|
|||
Register tmp = ToRegister(ins->temp());
|
||||
Register out = ToRegister(ins->output());
|
||||
unsigned addr = mir->globalDataOffset();
|
||||
masm.ma_mov(Imm32(addr), tmp);
|
||||
masm.ma_mov(Imm32(addr - AsmJSGlobalRegBias), tmp);
|
||||
masm.as_add(tmp, tmp, lsl(index, 2));
|
||||
masm.ma_ldr(DTRAddr(GlobalReg, DtrRegImmShift(tmp, LSL, 0)), out);
|
||||
|
||||
|
@ -2120,7 +2111,8 @@ CodeGeneratorARM::visitAsmJSLoadFFIFunc(LAsmJSLoadFFIFunc *ins)
|
|||
{
|
||||
const MAsmJSLoadFFIFunc *mir = ins->mir();
|
||||
|
||||
masm.ma_ldr(Operand(GlobalReg, mir->globalDataOffset()), ToRegister(ins->output()));
|
||||
masm.ma_ldr(Operand(GlobalReg, mir->globalDataOffset() - AsmJSGlobalRegBias),
|
||||
ToRegister(ins->output()));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1627,7 +1627,7 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM
|
|||
#endif
|
||||
|
||||
void loadAsmJSActivation(Register dest) {
|
||||
loadPtr(Address(GlobalReg, AsmJSActivationGlobalDataOffset), dest);
|
||||
loadPtr(Address(GlobalReg, AsmJSActivationGlobalDataOffset - AsmJSGlobalRegBias), dest);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче