Bug 1229057 - Part 7: Move MacroAssembler::addConstantDouble into generic macro assembler. r=jandem

--HG--
extra : rebase_source : c15b6f9a6256e08367faf6809cf2d8e01299828e
This commit is contained in:
Tooru Fujisawa 2015-12-01 17:02:59 +09:00
parent d3eeca5f43
commit eb5bd433fb
5 changed files with 36 additions and 27 deletions

View File

@ -752,6 +752,7 @@ class MacroAssembler : public MacroAssemblerSpecific
inline void addFloat32(FloatRegister src, FloatRegister dest) DEFINED_ON(x86_shared);
inline void addDouble(FloatRegister src, FloatRegister dest) PER_SHARED_ARCH;
inline void addConstantDouble(double d, FloatRegister dest) DEFINED_ON(x86);
inline void sub32(const Address& src, Register dest) PER_SHARED_ARCH;
inline void sub32(Register src, Register dest) PER_SHARED_ARCH;

View File

@ -409,7 +409,6 @@ class MacroAssemblerNone : public Assembler
void int32ValueToFloat32(ValueOperand, FloatRegister) { MOZ_CRASH(); }
void loadConstantDouble(double, FloatRegister) { MOZ_CRASH(); }
void addConstantDouble(double, FloatRegister) { MOZ_CRASH(); }
void loadConstantFloat32(float, FloatRegister) { MOZ_CRASH(); }
Condition testInt32Truthy(bool, ValueOperand) { MOZ_CRASH(); }
Condition testStringTruthy(bool, ValueOperand) { MOZ_CRASH(); }

View File

@ -128,6 +128,16 @@ MacroAssembler::add64(Imm32 imm, Register64 dest)
adcl(Imm32(0), dest.high);
}
void
MacroAssembler::addConstantDouble(double d, FloatRegister dest)
{
Double* dbl = getDouble(d);
if (!dbl)
return;
masm.vaddsd_mr(nullptr, dest.encoding(), dest.encoding());
propagateOOM(dbl->uses.append(CodeOffset(masm.size())));
}
// ===============================================================
// Shift functions
@ -166,6 +176,29 @@ MacroAssembler::rshift64(Imm32 imm, Register64 dest)
//}}} check_macroassembler_style
// ===============================================================
// Note: this function clobbers the source register.
void
MacroAssemblerX86::convertUInt32ToDouble(Register src, FloatRegister dest)
{
// src is [0, 2^32-1]
subl(Imm32(0x80000000), src);
// Now src is [-2^31, 2^31-1] - int range, but not the same value.
convertInt32ToDouble(src, dest);
// dest is now a double with the int range.
// correct the double value by adding 0x80000000.
asMasm().addConstantDouble(2147483648.0, dest);
}
// Note: this function clobbers the source register.
void
MacroAssemblerX86::convertUInt32ToFloat32(Register src, FloatRegister dest)
{
convertUInt32ToDouble(src, dest);
convertDoubleToFloat32(dest, dest);
}
} // namespace jit
} // namespace js

View File

@ -102,16 +102,6 @@ MacroAssemblerX86::loadConstantDouble(double d, FloatRegister dest)
propagateOOM(dbl->uses.append(CodeOffset(masm.size())));
}
void
MacroAssemblerX86::addConstantDouble(double d, FloatRegister dest)
{
Double* dbl = getDouble(d);
if (!dbl)
return;
masm.vaddsd_mr(nullptr, dest.encoding(), dest.encoding());
propagateOOM(dbl->uses.append(CodeOffset(masm.size())));
}
void
MacroAssemblerX86::loadConstantFloat32(float f, FloatRegister dest)
{

View File

@ -986,7 +986,6 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
}
void loadConstantDouble(double d, FloatRegister dest);
void addConstantDouble(double d, FloatRegister dest);
void loadConstantFloat32(float f, FloatRegister dest);
void loadConstantInt32x4(const SimdConstant& v, FloatRegister dest);
void loadConstantFloat32x4(const SimdConstant& v, FloatRegister dest);
@ -1072,23 +1071,10 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared
}
// Note: this function clobbers the source register.
void convertUInt32ToDouble(Register src, FloatRegister dest) {
// src is [0, 2^32-1]
subl(Imm32(0x80000000), src);
// Now src is [-2^31, 2^31-1] - int range, but not the same value.
convertInt32ToDouble(src, dest);
// dest is now a double with the int range.
// correct the double value by adding 0x80000000.
addConstantDouble(2147483648.0, dest);
}
inline void convertUInt32ToDouble(Register src, FloatRegister dest);
// Note: this function clobbers the source register.
void convertUInt32ToFloat32(Register src, FloatRegister dest) {
convertUInt32ToDouble(src, dest);
convertDoubleToFloat32(dest, dest);
}
inline void convertUInt32ToFloat32(Register src, FloatRegister dest);
void convertUInt64ToDouble(Register64 src, Register temp, FloatRegister dest);