Commit a392dafd authored by Benjamin Bouvier's avatar Benjamin Bouvier
Browse files

Bug 1499198 - Use a constant memory load instead of a word reference in...

Bug 1499198 - Use a constant memory load instead of a word reference in convertUint64ToDouble. r=luke, a=RyanVM

--HG--
extra : source : 01368a04b48aeca172e2153cd0f8401e5162226a
parent a48467f0
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -473,20 +473,11 @@ class Assembler : public AssemblerX86Shared
        MOZ_ASSERT(dest.size() == 16);
        masm.vhaddpd_rr(src.encoding(), dest.encoding());
    }
    void vsubpd(const Operand& src1, FloatRegister src0, FloatRegister dest) {
    void vsubpd(FloatRegister src1, FloatRegister src0, FloatRegister dest) {
        MOZ_ASSERT(HasSSE2());
        MOZ_ASSERT(src0.size() == 16);
        MOZ_ASSERT(dest.size() == 16);
        switch (src1.kind()) {
          case Operand::MEM_REG_DISP:
            masm.vsubpd_mr(src1.disp(), src1.base(), src0.encoding(), dest.encoding());
            break;
          case Operand::MEM_ADDRESS32:
            masm.vsubpd_mr(src1.address(), src0.encoding(), dest.encoding());
            break;
          default:
            MOZ_CRASH("unexpected operand kind");
        }
        masm.vsubpd_rr(src1.encoding(), src0.encoding(), dest.encoding());
    }

    void vpunpckldq(FloatRegister src1, FloatRegister src0, FloatRegister dest) {
+0 −8
Original line number Diff line number Diff line
@@ -176,14 +176,6 @@ class BaseAssemblerX86 : public BaseAssembler
    {
        twoByteOpSimd("vsubpd", VEX_PD, OP2_SUBPS_VpsWps, src1, src0, dst);
    }
    void vsubpd_mr(int32_t offset, RegisterID base, XMMRegisterID src0, XMMRegisterID dst)
    {
        twoByteOpSimd("vsubpd", VEX_PD, OP2_SUBPS_VpsWps, offset, base, src0, dst);
    }
    void vsubpd_mr(const void* address, XMMRegisterID src0, XMMRegisterID dst)
    {
        twoByteOpSimd("vsubpd", VEX_PD, OP2_SUBPS_VpsWps, address, src0, dst);
    }

    void vpunpckldq_rr(XMMRegisterID src1, XMMRegisterID src0, XMMRegisterID dst) {
        twoByteOpSimd("vpunpckldq", VEX_PD, OP2_PUNPCKLDQ, src1, src0, dst);
+19 −12
Original line number Diff line number Diff line
@@ -1147,15 +1147,6 @@ MacroAssembler::wasmTruncateFloat32ToUInt64(FloatRegister input, Register64 outp
// ========================================================================
// Convert floating point.

// vpunpckldq requires 16-byte boundary for memory operand.
// See convertUInt64ToDouble for the details.
MOZ_ALIGNED_DECL(static const uint64_t, 16) TO_DOUBLE[4] = {
    0x4530000043300000LL,
    0x0LL,
    0x4330000000000000LL,
    0x4530000000000000LL
};

bool
MacroAssembler::convertUInt64ToDoubleNeedsTemp()
{
@@ -1214,8 +1205,16 @@ MacroAssembler::convertUInt64ToDouble(Register64 src, FloatRegister dest, Regist
    // here, each 64-bit part of dest represents following double:
    //   HI(dest) = 0x 1.00000HHHHHHHH * 2**84 == 2**84 + 0x HHHHHHHH 00000000
    //   LO(dest) = 0x 1.00000LLLLLLLL * 2**52 == 2**52 + 0x 00000000 LLLLLLLL
    movePtr(ImmWord((uintptr_t)TO_DOUBLE), temp);
    vpunpckldq(Operand(temp, 0), dest128, dest128);
    // See convertUInt64ToDouble for the details.
    static const int32_t CST1[4] = {
        0x43300000,
        0x45300000,
        0x0,
        0x0,
    };

    loadConstantSimd128Int(SimdConstant::CreateX4(CST1), ScratchSimd128Reg);
    vpunpckldq(ScratchSimd128Reg, dest128, dest128);

    // Subtract a constant C2 from dest, for each 64-bit part:
    //   C2       = 0x 45300000 00000000  43300000 00000000
@@ -1225,7 +1224,15 @@ MacroAssembler::convertUInt64ToDouble(Register64 src, FloatRegister dest, Regist
    // after the operation each 64-bit part of dest represents following:
    //   HI(dest) = double(0x HHHHHHHH 00000000)
    //   LO(dest) = double(0x 00000000 LLLLLLLL)
    vsubpd(Operand(temp, sizeof(uint64_t) * 2), dest128, dest128);
    static const int32_t CST2[4] = {
        0x0,
        0x43300000,
        0x0,
        0x45300000,
    };

    loadConstantSimd128Int(SimdConstant::CreateX4(CST2), ScratchSimd128Reg);
    vsubpd(ScratchSimd128Reg, dest128, dest128);

    // Add HI(dest) and LO(dest) in double and store it into LO(dest),
    //   LO(dest) = double(0x HHHHHHHH 00000000) + double(0x 00000000 LLLLLLLL)