Bug 1272939 - IonMonkey: MIPS: Refactor MacroAssembler::convertFloat32/DoubleToInt32. r=arai

---
 js/src/jit/mips32/MacroAssembler-mips32.cpp | 34 ++++++++++-------------------
 js/src/jit/mips64/MacroAssembler-mips64.cpp | 33 ++++++++++------------------
 2 files changed, 23 insertions(+), 44 deletions(-)
This commit is contained in:
Heiher 2016-06-27 16:39:57 +08:00
Родитель 05d76a6ef9
Коммит c66e207696
2 изменённых файлов: 23 добавлений и 44 удалений

Просмотреть файл

@ -120,23 +120,19 @@ void
MacroAssemblerMIPSCompat::convertDoubleToInt32(FloatRegister src, Register dest, MacroAssemblerMIPSCompat::convertDoubleToInt32(FloatRegister src, Register dest,
Label* fail, bool negativeZeroCheck) Label* fail, bool negativeZeroCheck)
{ {
if (negativeZeroCheck) {
moveFromDoubleHi(src, dest);
moveFromDoubleLo(src, ScratchRegister);
as_movn(dest, zero, ScratchRegister);
ma_b(dest, Imm32(INT32_MIN), fail, Assembler::Equal);
}
// Convert double to int, then convert back and check if we have the // Convert double to int, then convert back and check if we have the
// same number. // same number.
as_cvtwd(ScratchDoubleReg, src); as_cvtwd(ScratchDoubleReg, src);
as_mfc1(dest, ScratchDoubleReg); as_mfc1(dest, ScratchDoubleReg);
as_cvtdw(ScratchDoubleReg, ScratchDoubleReg); as_cvtdw(ScratchDoubleReg, ScratchDoubleReg);
ma_bc1d(src, ScratchDoubleReg, fail, Assembler::DoubleNotEqualOrUnordered); ma_bc1d(src, ScratchDoubleReg, fail, Assembler::DoubleNotEqualOrUnordered);
if (negativeZeroCheck) {
Label notZero;
ma_b(dest, Imm32(0), &notZero, Assembler::NotEqual, ShortJump);
// Test and bail for -0.0, when integer result is 0
// Move the top word of the double into the output reg, if it is
// non-zero, then the original value was -0.0
moveFromDoubleHi(src, dest);
ma_b(dest, Imm32(INT32_MIN), fail, Assembler::Equal);
bind(&notZero);
}
} }
// Checks whether a float32 is representable as a 32-bit integer. If so, the // Checks whether a float32 is representable as a 32-bit integer. If so, the
@ -146,6 +142,11 @@ void
MacroAssemblerMIPSCompat::convertFloat32ToInt32(FloatRegister src, Register dest, MacroAssemblerMIPSCompat::convertFloat32ToInt32(FloatRegister src, Register dest,
Label* fail, bool negativeZeroCheck) Label* fail, bool negativeZeroCheck)
{ {
if (negativeZeroCheck) {
moveFromFloat32(src, dest);
ma_b(dest, Imm32(INT32_MIN), fail, Assembler::Equal);
}
// Converting the floating point value to an integer and then converting it // Converting the floating point value to an integer and then converting it
// back to a float32 would not work, as float to int32 conversions are // back to a float32 would not work, as float to int32 conversions are
// clamping (e.g. float(INT32_MAX + 1) would get converted into INT32_MAX // clamping (e.g. float(INT32_MAX + 1) would get converted into INT32_MAX
@ -158,17 +159,6 @@ MacroAssemblerMIPSCompat::convertFloat32ToInt32(FloatRegister src, Register dest
// Bail out in the clamped cases. // Bail out in the clamped cases.
ma_b(dest, Imm32(INT32_MAX), fail, Assembler::Equal); ma_b(dest, Imm32(INT32_MAX), fail, Assembler::Equal);
if (negativeZeroCheck) {
Label notZero;
ma_b(dest, Imm32(0), &notZero, Assembler::NotEqual, ShortJump);
// Test and bail for -0.0, when integer result is 0
// Move the top word of the double into the output reg,
// if it is non-zero, then the original value was -0.0
moveFromDoubleHi(src, dest);
ma_b(dest, Imm32(INT32_MIN), fail, Assembler::Equal);
bind(&notZero);
}
} }
void void

Просмотреть файл

@ -129,23 +129,18 @@ void
MacroAssemblerMIPS64Compat::convertDoubleToInt32(FloatRegister src, Register dest, MacroAssemblerMIPS64Compat::convertDoubleToInt32(FloatRegister src, Register dest,
Label* fail, bool negativeZeroCheck) Label* fail, bool negativeZeroCheck)
{ {
if (negativeZeroCheck) {
moveFromDouble(src, dest);
ma_drol(dest, dest, Imm32(1));
ma_b(dest, Imm32(1), fail, Assembler::Equal);
}
// Convert double to int, then convert back and check if we have the // Convert double to int, then convert back and check if we have the
// same number. // same number.
as_cvtwd(ScratchDoubleReg, src); as_cvtwd(ScratchDoubleReg, src);
as_mfc1(dest, ScratchDoubleReg); as_mfc1(dest, ScratchDoubleReg);
as_cvtdw(ScratchDoubleReg, ScratchDoubleReg); as_cvtdw(ScratchDoubleReg, ScratchDoubleReg);
ma_bc1d(src, ScratchDoubleReg, fail, Assembler::DoubleNotEqualOrUnordered); ma_bc1d(src, ScratchDoubleReg, fail, Assembler::DoubleNotEqualOrUnordered);
if (negativeZeroCheck) {
Label notZero;
ma_b(dest, Imm32(0), &notZero, Assembler::NotEqual, ShortJump);
// Test and bail for -0.0, when integer result is 0
// Move the top word of the double into the output reg, if it is
// non-zero, then the original value was -0.0
moveFromDoubleHi(src, dest);
ma_b(dest, Imm32(INT32_MIN), fail, Assembler::Equal);
bind(&notZero);
}
} }
// Checks whether a float32 is representable as a 32-bit integer. If so, the // Checks whether a float32 is representable as a 32-bit integer. If so, the
@ -155,6 +150,11 @@ void
MacroAssemblerMIPS64Compat::convertFloat32ToInt32(FloatRegister src, Register dest, MacroAssemblerMIPS64Compat::convertFloat32ToInt32(FloatRegister src, Register dest,
Label* fail, bool negativeZeroCheck) Label* fail, bool negativeZeroCheck)
{ {
if (negativeZeroCheck) {
moveFromFloat32(src, dest);
ma_b(dest, Imm32(INT32_MIN), fail, Assembler::Equal);
}
// Converting the floating point value to an integer and then converting it // Converting the floating point value to an integer and then converting it
// back to a float32 would not work, as float to int32 conversions are // back to a float32 would not work, as float to int32 conversions are
// clamping (e.g. float(INT32_MAX + 1) would get converted into INT32_MAX // clamping (e.g. float(INT32_MAX + 1) would get converted into INT32_MAX
@ -167,17 +167,6 @@ MacroAssemblerMIPS64Compat::convertFloat32ToInt32(FloatRegister src, Register de
// Bail out in the clamped cases. // Bail out in the clamped cases.
ma_b(dest, Imm32(INT32_MAX), fail, Assembler::Equal); ma_b(dest, Imm32(INT32_MAX), fail, Assembler::Equal);
if (negativeZeroCheck) {
Label notZero;
ma_b(dest, Imm32(0), &notZero, Assembler::NotEqual, ShortJump);
// Test and bail for -0.0, when integer result is 0
// Move the top word of the double into the output reg,
// if it is non-zero, then the original value was -0.0
moveFromDoubleHi(src, dest);
ma_b(dest, Imm32(INT32_MIN), fail, Assembler::Equal);
bind(&notZero);
}
} }
void void