void CodeGeneratorX86::postAsmJSCall(LAsmJSCall *lir) { MAsmJSCall *mir = lir->mir(); if (mir->type() != MIRType_Double || mir->callee().which() != MAsmJSCall::Callee::Builtin) return; masm.reserveStack(sizeof(double)); masm.fstp(Operand(esp, 0)); masm.movsd(Operand(esp, 0), ReturnFloatReg); masm.freeStack(sizeof(double)); }
void CodeGeneratorX86::visitAsmJSCall(LAsmJSCall* ins) { MAsmJSCall* mir = ins->mir(); emitAsmJSCall(ins); if (IsFloatingPointType(mir->type()) && mir->callee().which() == MAsmJSCall::Callee::Builtin) { if (mir->type() == MIRType_Float32) { masm.reserveStack(sizeof(float)); Operand op(esp, 0); masm.fstp32(op); masm.loadFloat32(op, ReturnFloat32Reg); masm.freeStack(sizeof(float)); } else { MOZ_ASSERT(mir->type() == MIRType_Double); masm.reserveStack(sizeof(double)); Operand op(esp, 0); masm.fstp(op); masm.loadDouble(op, ReturnDoubleReg); masm.freeStack(sizeof(double)); } } }