Revision: 11517
Author: [email protected]
Date: Fri May 4 08:50:43 2012
Log: Handle negative number in Math.floor,ia32,non-SSE4.1 code path.
Zheng Liu
[email protected]
Review URL: https://chromiumcodereview.appspot.com/10168001
Patch from Zheng Liu <[email protected]>.
http://code.google.com/p/v8/source/detail?r=11517
Modified:
/branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Mon Apr 30
07:59:13 2012
+++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Fri May 4
08:50:43 2012
@@ -2925,11 +2925,13 @@
__ cmp(output_reg, 0x80000000u);
DeoptimizeIf(equal, instr->environment());
} else {
+ Label negative_sign;
Label done;
- // Deoptimize on negative numbers.
+ // Deoptimize on unordered.
__ xorps(xmm_scratch, xmm_scratch); // Zero the register.
__ ucomisd(input_reg, xmm_scratch);
- DeoptimizeIf(below, instr->environment());
+ DeoptimizeIf(parity_even, instr->environment());
+ __ j(below, &negative_sign, Label::kNear);
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
// Check for negative zero.
@@ -2945,10 +2947,21 @@
// Use truncating instruction (OK because input is positive).
__ cvttsd2si(output_reg, Operand(input_reg));
-
// Overflow is signalled with minint.
__ cmp(output_reg, 0x80000000u);
DeoptimizeIf(equal, instr->environment());
+ __ jmp(&done, Label::kNear);
+
+ // Non-zero negative reaches here
+ __ bind(&negative_sign);
+ // Truncate, then compare and compensate
+ __ cvttsd2si(output_reg, Operand(input_reg));
+ __ cvtsi2sd(xmm_scratch, output_reg);
+ __ ucomisd(input_reg, xmm_scratch);
+ __ j(equal, &done, Label::kNear);
+ __ sub(output_reg, Immediate(1));
+ DeoptimizeIf(overflow, instr->environment());
+
__ bind(&done);
}
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev