Bug 861785 - Odinmonkey ARM: use the hard-float ABI for inter-asm.js function calls irrespective of the system ABI. r=luke

This commit is contained in:
Douglas Crosher 2013-12-06 23:00:31 +11:00
parent 28919a5971
commit b192b55c0a
5 changed files with 14 additions and 88 deletions

View File

@ -5598,12 +5598,7 @@ GenerateEntry(ModuleCompiler &m, const AsmJSModule::ExportedFunction &exportedFu
masm.load32(src, iter->gpr());
break;
case ABIArg::FPU:
#if defined(JS_CPU_ARM) and !defined(JS_CPU_ARM_HARDFP)
masm.ma_dataTransferN(IsLoad, 64, true, argv, Imm32(argOffset),
Register::FromCode(iter->fpu().code()*2));
#else
masm.loadDouble(src, iter->fpu());
#endif
break;
case ABIArg::Stack:
if (iter.mirType() == MIRType_Int32) {
@ -5635,9 +5630,6 @@ GenerateEntry(ModuleCompiler &m, const AsmJSModule::ExportedFunction &exportedFu
masm.storeValue(JSVAL_TYPE_INT32, ReturnReg, Address(argv, 0));
break;
case RetType::Double:
#if defined(JS_CPU_ARM) and !defined(JS_CPU_ARM_HARDFP)
masm.ma_vxfer(r0, r1, d0);
#endif
masm.canonicalizeDouble(ReturnFloatReg);
masm.storeDouble(ReturnFloatReg, Address(argv, 0));
break;
@ -5770,11 +5762,6 @@ FillArgumentArray(ModuleCompiler &m, const VarTypeVector &argTypes,
masm.storeValue(JSVAL_TYPE_INT32, i->gpr(), dstAddr);
break;
case ABIArg::FPU: {
#if defined(JS_CPU_ARM) && !defined(JS_CPU_ARM_HARDFP)
FloatRegister fr = i->fpu();
int srcId = fr.code() * 2;
masm.ma_vxfer(Register::FromCode(srcId), Register::FromCode(srcId+1), fr);
#endif
masm.canonicalizeDouble(i->fpu());
masm.storeDouble(i->fpu(), dstAddr);
break;
@ -5935,11 +5922,7 @@ GenerateFFIInterpreterExit(ModuleCompiler &m, const ModuleCompiler::ExitDescript
case RetType::Double:
masm.call(AsmJSImm_InvokeFromAsmJS_ToNumber);
masm.branchTest32(Assembler::Zero, ReturnReg, ReturnReg, throwLabel);
#if defined(JS_CPU_ARM) && !defined(JS_CPU_ARM_HARDFP)
masm.loadValue(argv, softfpReturnOperand);
#else
masm.loadDouble(argv, ReturnFloatReg);
#endif
break;
}
@ -6005,11 +5988,7 @@ GenerateOOLConvert(ModuleCompiler &m, RetType retType, Label *throwLabel)
case RetType::Double:
masm.call(AsmJSImm_CoerceInPlace_ToNumber);
masm.branchTest32(Assembler::Zero, ReturnReg, ReturnReg, throwLabel);
#if defined(JS_CPU_ARM) && !defined(JS_CPU_ARM_HARDFP)
masm.loadValue(Address(StackPointer, offsetToArgv), softfpReturnOperand);
#else
masm.loadDouble(Address(StackPointer, offsetToArgv), ReturnFloatReg);
#endif
break;
default:
MOZ_ASSUME_UNREACHABLE("Unsupported convert type");
@ -6148,9 +6127,6 @@ GenerateFFIIonExit(ModuleCompiler &m, const ModuleCompiler::ExitDescriptor &exit
break;
case RetType::Double:
masm.convertValueToDouble(JSReturnOperand, ReturnFloatReg, &oolConvert);
#if defined(JS_CPU_ARM) && !defined(JS_CPU_ARM_HARDFP)
masm.boxDouble(ReturnFloatReg, softfpReturnOperand);
#endif
break;
}

View File

@ -7685,12 +7685,14 @@ CodeGenerator::visitAsmJSCall(LAsmJSCall *ins)
MAsmJSCall *mir = ins->mir();
#if defined(JS_CPU_ARM) && !defined(JS_CPU_ARM_HARDFP)
for (unsigned i = 0, e = ins->numOperands(); i < e; i++) {
LAllocation *a = ins->getOperand(i);
if (a->isFloatReg()) {
FloatRegister fr = ToFloatRegister(a);
int srcId = fr.code() * 2;
masm.ma_vxfer(fr, Register::FromCode(srcId), Register::FromCode(srcId+1));
if (mir->callee().which() == MAsmJSCall::Callee::Builtin) {
for (unsigned i = 0, e = ins->numOperands(); i < e; i++) {
LAllocation *a = ins->getOperand(i);
if (a->isFloatReg()) {
FloatRegister fr = ToFloatRegister(a);
int srcId = fr.code() * 2;
masm.ma_vxfer(fr, Register::FromCode(srcId), Register::FromCode(srcId+1));
}
}
}
#endif
@ -7730,16 +7732,6 @@ CodeGenerator::visitAsmJSCall(LAsmJSCall *ins)
bool
CodeGenerator::visitAsmJSParameter(LAsmJSParameter *lir)
{
#if defined(JS_CPU_ARM) && !defined(JS_CPU_ARM_HARDFP)
// softfp transfers some double values in gprs.
// undo this.
LAllocation *a = lir->getDef(0)->output();
if (a->isFloatReg()) {
FloatRegister fr = ToFloatRegister(a);
int srcId = fr.code() * 2;
masm.ma_vxfer(Register::FromCode(srcId), Register::FromCode(srcId+1), fr);
}
#endif
return true;
}
@ -7747,10 +7739,6 @@ bool
CodeGenerator::visitAsmJSReturn(LAsmJSReturn *lir)
{
// Don't emit a jump to the return label if this is the last block.
#if defined(JS_CPU_ARM) && !defined(JS_CPU_ARM_HARDFP)
if (lir->getOperand(0)->isFloatReg())
masm.ma_vxfer(d0, r0, r1);
#endif
if (current->mir() != *gen->graph().poBegin())
masm.jump(&returnLabel_);
return true;

View File

@ -22,13 +22,11 @@ using namespace js::jit;
using mozilla::CountLeadingZeroes32;
// Note this is used for inter-AsmJS calls and may pass arguments and results
// in floating point registers even if the system ABI does not.
ABIArgGenerator::ABIArgGenerator() :
#if defined(JS_CPU_ARM_HARDFP)
intRegIndex_(0),
floatRegIndex_(0),
#else
argRegIndex_(0),
#endif
stackOffset_(0),
current_()
{}
@ -36,7 +34,6 @@ ABIArgGenerator::ABIArgGenerator() :
ABIArg
ABIArgGenerator::next(MIRType type)
{
#if defined(JS_CPU_ARM_HARDFP)
switch (type) {
case MIRType_Int32:
case MIRType_Pointer:
@ -62,40 +59,8 @@ ABIArgGenerator::next(MIRType type)
default:
MOZ_ASSUME_UNREACHABLE("Unexpected argument type");
}
return current_;
#else
switch (type) {
case MIRType_Int32:
case MIRType_Pointer:
if (argRegIndex_ == NumIntArgRegs) {
current_ = ABIArg(stackOffset_);
stackOffset_ += sizeof(uint32_t);
break;
}
current_ = ABIArg(Register::FromCode(argRegIndex_));
argRegIndex_++;
break;
case MIRType_Double: {
unsigned alignedArgRegIndex_ = (argRegIndex_ + 1) & ~1;
if (alignedArgRegIndex_ + 1 > NumIntArgRegs) {
static const int align = sizeof(double) - 1;
stackOffset_ = (stackOffset_ + align) & ~align;
current_ = ABIArg(stackOffset_);
stackOffset_ += sizeof(uint64_t);
argRegIndex_ = NumIntArgRegs;
break;
}
argRegIndex_ = alignedArgRegIndex_;
current_ = ABIArg(FloatRegister::FromCode(argRegIndex_ >> 1));
argRegIndex_+=2;
}
break;
default:
MOZ_ASSUME_UNREACHABLE("Unexpected argument type");
}
return current_;
#endif
}
const Register ABIArgGenerator::NonArgReturnVolatileReg0 = r4;
const Register ABIArgGenerator::NonArgReturnVolatileReg1 = r5;

View File

@ -68,12 +68,8 @@ static const uint32_t NumCallTempNonArgRegs =
mozilla::ArrayLength(CallTempNonArgRegs);
class ABIArgGenerator
{
#if defined(JS_CPU_ARM_HARDFP)
unsigned intRegIndex_;
unsigned floatRegIndex_;
#else
unsigned argRegIndex_;
#endif
uint32_t stackOffset_;
ABIArg current_;

View File

@ -177,11 +177,12 @@ class CodeGeneratorARM : public CodeGeneratorShared
protected:
void postAsmJSCall(LAsmJSCall *lir) {
#if !defined(JS_CPU_ARM_HARDFP)
if (lir->mir()->type() == MIRType_Double) {
masm.ma_vxfer(r0, r1, d0);
if (lir->mir()->callee().which() == MAsmJSCall::Callee::Builtin) {
if (lir->mir()->type() == MIRType_Double)
masm.ma_vxfer(r0, r1, d0);
}
#endif
}
}
bool visitEffectiveAddress(LEffectiveAddress *ins);
bool visitUDiv(LUDiv *ins);