Reviewers: fschneider, Yang, Message: Please help review this patch. Thanks.
Description: Handle negative number in Math.floor,ia32,non-SSE4.1 code path. Zheng Liu [email protected] Please review this at http://codereview.chromium.org/10168001/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/ia32/lithium-codegen-ia32.cc Index: src/ia32/lithium-codegen-ia32.cc =================================================================== --- src/ia32/lithium-codegen-ia32.cc (revision 11394) +++ src/ia32/lithium-codegen-ia32.cc (working copy) @@ -2924,11 +2924,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. @@ -2944,10 +2946,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
