Source/JavaScriptCore: https://bugs.webkit.org/show_bug.cgi?id=67486
This reverts r65993 which gives wrong results for rshift
in some corner cases (see the test).
Patch by Yong Li <yoli@rim.com> on 2011-09-06
Reviewed by Gavin Barraclough.
New test: fast/js/floating-point-truncate-rshift.html
* assembler/ARMAssembler.h:
* assembler/MacroAssemblerARM.h:
(JSC::MacroAssemblerARM::supportsFloatingPointTruncate):
(JSC::MacroAssemblerARM::branchTruncateDoubleToInt32):
LayoutTests: https://bugs.webkit.org/show_bug.cgi?id=67486
Add a test case for branchTruncateDoubleToInt32() which is
used in right shift optimization when the assembler
"supportsFloatingPointTruncate".
Patch by Yong Li <yoli@rim.com> on 2011-09-06
Reviewed by Gavin Barraclough.
* fast/js/floating-point-truncate-rshift-expected.txt: Added.
* fast/js/floating-point-truncate-rshift.html: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@94622 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerARM.h b/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
index 7210ac2..8cf3808 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
@@ -787,7 +787,7 @@
bool supportsFloatingPointTruncate() const
{
- return s_isVFPPresent;
+ return false;
}
bool supportsFloatingPointSqrt() const
@@ -902,17 +902,13 @@
// Truncates 'src' to an integer, and places the resulting 'dest'.
// If the result is not representable as a 32 bit value, branch.
// May also branch for some values that are representable in 32 bits
- // (specifically, in this case, INT_MIN and INT_MAX).
+ // (specifically, in this case, INT_MIN).
Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest)
{
- m_assembler.vcvtr_s32_f64_r(ARMRegisters::SD0 << 1, src);
- // If VCVTR.S32.F64 can't fit the result into a 32-bit
- // integer, it saturates at INT_MAX or INT_MIN. Testing this is
- // probably quicker than testing FPSCR for exception.
- m_assembler.vmov_arm_r(dest, ARMRegisters::SD0 << 1);
- m_assembler.sub_r(ARMRegisters::S0, dest, ARMAssembler::getOp2(0x80000000));
- m_assembler.cmn_r(ARMRegisters::S0, ARMAssembler::getOp2(1), ARMCondition(NotEqual));
- return Jump(m_assembler.jmp(ARMCondition(Equal)));
+ UNUSED_PARAM(src);
+ UNUSED_PARAM(dest);
+ ASSERT_NOT_REACHED();
+ return jump();
}
// Convert 'src' to an integer, and places the resulting 'dest'.