mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
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:
parent
28919a5971
commit
b192b55c0a
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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_;
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user