Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| =================================================================== |
| --- src/ia32/lithium-codegen-ia32.cc (revision 8868) |
| +++ src/ia32/lithium-codegen-ia32.cc (working copy) |
| @@ -2756,13 +2756,23 @@ |
| XMMRegister xmm_scratch = xmm0; |
| Register output_reg = ToRegister(instr->result()); |
| XMMRegister input_reg = ToDoubleRegister(instr->value()); |
| + Label done; |
| + |
| + // Deoptimize on negative numbers. |
| __ xorps(xmm_scratch, xmm_scratch); // Zero the register. |
| __ ucomisd(input_reg, xmm_scratch); |
| + DeoptimizeIf(below, instr->environment()); |
| if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
| - DeoptimizeIf(below_equal, instr->environment()); |
| - } else { |
| - DeoptimizeIf(below, instr->environment()); |
| + // Check for negative zero. |
| + Label positive_sign; |
| + __ j(above, &positive_sign, Label::kNear); |
| + __ movmskpd(output_reg, input_reg); |
|
Kevin Millikin (Chromium)
2011/08/10 12:03:53
Gesundheit.
fschneider
2011/08/10 12:33:16
Danke!
|
| + __ test(output_reg, Immediate(1)); |
| + DeoptimizeIf(not_zero, instr->environment()); |
| + __ Set(output_reg, Immediate(0)); |
| + __ jmp(&done, Label::kNear); |
| + __ bind(&positive_sign); |
| } |
| // Use truncating instruction (OK because input is positive). |
| @@ -2771,6 +2781,7 @@ |
| // Overflow is signalled with minint. |
| __ cmp(output_reg, 0x80000000u); |
| DeoptimizeIf(equal, instr->environment()); |
| + __ bind(&done); |
| } |