void CodeGeneratorX64::visitWasmTruncateToInt64(LWasmTruncateToInt64* lir) { FloatRegister input = ToFloatRegister(lir->input()); Register64 output = ToOutRegister64(lir); MWasmTruncateToInt64* mir = lir->mir(); MIRType inputType = mir->input()->type(); MOZ_ASSERT(inputType == MIRType::Double || inputType == MIRType::Float32); auto* ool = new(alloc()) OutOfLineWasmTruncateCheck(mir, input); addOutOfLineCode(ool, mir); FloatRegister temp = mir->isUnsigned() ? ToFloatRegister(lir->temp()) : InvalidFloatReg; Label* oolEntry = ool->entry(); Label* oolRejoin = ool->rejoin(); if (inputType == MIRType::Double) { if (mir->isUnsigned()) masm.wasmTruncateDoubleToUInt64(input, output, oolEntry, oolRejoin, temp); else masm.wasmTruncateDoubleToInt64(input, output, oolEntry, oolRejoin, temp); } else { if (mir->isUnsigned()) masm.wasmTruncateFloat32ToUInt64(input, output, oolEntry, oolRejoin, temp); else masm.wasmTruncateFloat32ToInt64(input, output, oolEntry, oolRejoin, temp); } }
void CodeGeneratorX86::visitWasmTruncateToInt64(LWasmTruncateToInt64* lir) { FloatRegister input = ToFloatRegister(lir->input()); Register64 output = ToOutRegister64(lir); MWasmTruncateToInt64* mir = lir->mir(); FloatRegister floatTemp = ToFloatRegister(lir->temp()); Label fail, convert; MOZ_ASSERT (mir->input()->type() == MIRType::Double || mir->input()->type() == MIRType::Float32); auto* ool = new(alloc()) OutOfLineWasmTruncateCheck(mir, input); addOutOfLineCode(ool, mir); if (mir->input()->type() == MIRType::Float32) { if (mir->isUnsigned()) masm.wasmTruncateFloat32ToUInt64(input, output, ool->entry(), ool->rejoin(), floatTemp); else masm.wasmTruncateFloat32ToInt64(input, output, ool->entry(), ool->rejoin(), floatTemp); } else { if (mir->isUnsigned()) masm.wasmTruncateDoubleToUInt64(input, output, ool->entry(), ool->rejoin(), floatTemp); else masm.wasmTruncateDoubleToInt64(input, output, ool->entry(), ool->rejoin(), floatTemp); } }