зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1515704 - ARM64: Generate code for LPowHalfD. r=sstangl
This commit is contained in:
Родитель
cb858a95bf
Коммит
6b584f7dd8
|
@ -37,15 +37,23 @@ static constexpr ARMRegister ScratchReg64 = {ScratchReg, 64};
|
|||
static constexpr Register ScratchReg2{Registers::ip1};
|
||||
static constexpr ARMRegister ScratchReg2_64 = {ScratchReg2, 64};
|
||||
|
||||
static constexpr FloatRegister ScratchDoubleReg = {FloatRegisters::d31,
|
||||
FloatRegisters::Double};
|
||||
static constexpr FloatRegister ReturnDoubleReg = {FloatRegisters::d0,
|
||||
FloatRegisters::Double};
|
||||
static constexpr FloatRegister ScratchDoubleReg = {FloatRegisters::d31,
|
||||
FloatRegisters::Double};
|
||||
struct ScratchDoubleScope : public AutoFloatRegisterScope {
|
||||
explicit ScratchDoubleScope(MacroAssembler& masm)
|
||||
: AutoFloatRegisterScope(masm, ScratchDoubleReg) {}
|
||||
};
|
||||
|
||||
static constexpr FloatRegister ReturnFloat32Reg = {FloatRegisters::s0,
|
||||
FloatRegisters::Single};
|
||||
static constexpr FloatRegister ScratchFloat32Reg = {FloatRegisters::s31,
|
||||
FloatRegisters::Single};
|
||||
struct ScratchFloat32Scope : public AutoFloatRegisterScope {
|
||||
explicit ScratchFloat32Scope(MacroAssembler& masm)
|
||||
: AutoFloatRegisterScope(masm, ScratchFloat32Reg) {}
|
||||
};
|
||||
|
||||
static constexpr Register InvalidReg{Registers::invalid_reg};
|
||||
static constexpr FloatRegister InvalidFloatReg = {FloatRegisters::invalid_fpreg,
|
||||
|
|
|
@ -744,7 +744,42 @@ void CodeGenerator::visitUrshD(LUrshD* ins) {
|
|||
}
|
||||
|
||||
void CodeGenerator::visitPowHalfD(LPowHalfD* ins) {
|
||||
MOZ_CRASH("visitPowHalfD");
|
||||
FloatRegister input = ToFloatRegister(ins->input());
|
||||
FloatRegister output = ToFloatRegister(ins->output());
|
||||
|
||||
ScratchDoubleScope scratch(masm);
|
||||
|
||||
Label done, sqrt;
|
||||
|
||||
if (!ins->mir()->operandIsNeverNegativeInfinity()) {
|
||||
// Branch if not -Infinity.
|
||||
masm.loadConstantDouble(NegativeInfinity<double>(), scratch);
|
||||
|
||||
Assembler::DoubleCondition cond = Assembler::DoubleNotEqualOrUnordered;
|
||||
if (ins->mir()->operandIsNeverNaN()) {
|
||||
cond = Assembler::DoubleNotEqual;
|
||||
}
|
||||
masm.branchDouble(cond, input, scratch, &sqrt);
|
||||
|
||||
// Math.pow(-Infinity, 0.5) == Infinity.
|
||||
masm.zeroDouble(output);
|
||||
masm.subDouble(scratch, output);
|
||||
masm.jump(&done);
|
||||
|
||||
masm.bind(&sqrt);
|
||||
}
|
||||
|
||||
if (!ins->mir()->operandIsNeverNegativeZero()) {
|
||||
// Math.pow(-0, 0.5) == 0 == Math.pow(0, 0.5).
|
||||
// Adding 0 converts any -0 to 0.
|
||||
masm.zeroDouble(scratch);
|
||||
masm.addDouble(input, scratch);
|
||||
masm.sqrtDouble(scratch, output);
|
||||
} else {
|
||||
masm.sqrtDouble(input, output);
|
||||
}
|
||||
|
||||
masm.bind(&done);
|
||||
}
|
||||
|
||||
MoveOperand CodeGeneratorARM64::toMoveOperand(const LAllocation a) const {
|
||||
|
|
|
@ -755,8 +755,8 @@ void CodeGenerator::visitPowHalfD(LPowHalfD* ins) {
|
|||
}
|
||||
|
||||
if (!ins->mir()->operandIsNeverNegativeZero()) {
|
||||
// Math.pow(-0, 0.5) == 0 == Math.pow(0, 0.5). Adding 0 converts any -0 to
|
||||
// 0.
|
||||
// Math.pow(-0, 0.5) == 0 == Math.pow(0, 0.5).
|
||||
// Adding 0 converts any -0 to 0.
|
||||
masm.zeroDouble(scratch);
|
||||
masm.addDouble(input, scratch);
|
||||
masm.vsqrtsd(scratch, output, output);
|
||||
|
|
Загрузка…
Ссылка в новой задаче