Chromium Code Reviews| Index: src/ia32/macro-assembler-ia32.cc |
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc |
| index eef2eddc82ef5f21ed5c0e0ca7f495a12fd59c91..2a9db06e07090190629d95db01cb0025e4ce7659 100644 |
| --- a/src/ia32/macro-assembler-ia32.cc |
| +++ b/src/ia32/macro-assembler-ia32.cc |
| @@ -214,22 +214,20 @@ void MacroAssembler::ClampDoubleToUint8(XMMRegister input_reg, |
| Register result_reg) { |
| Label done; |
| Label conv_failure; |
| - pxor(scratch_reg, scratch_reg); |
| + xorps(scratch_reg, scratch_reg); |
| cvtsd2si(result_reg, input_reg); |
| test(result_reg, Immediate(0xFFFFFF00)); |
| j(zero, &done, Label::kNear); |
| - cmp(result_reg, Immediate(0x80000000)); |
| - j(equal, &conv_failure, Label::kNear); |
| - mov(result_reg, Immediate(0)); |
| - setcc(above, result_reg); |
| - sub(result_reg, Immediate(1)); |
| - and_(result_reg, Immediate(255)); |
| + cmp(result_reg, Immediate(0x1)); |
| + j(overflow, &conv_failure, Label::kNear); |
| + sar(result_reg, 31); |
| + not_(result_reg); // safe not to zero extension |
|
Jakob Kummerow
2014/03/19 12:00:30
This comment doesn't make any sense, unless the re
|
| jmp(&done, Label::kNear); |
| bind(&conv_failure); |
| - Set(result_reg, Immediate(0)); |
| + sar(result_reg, 31); |
| ucomisd(input_reg, scratch_reg); |
| - j(below, &done, Label::kNear); |
| - Set(result_reg, Immediate(255)); |
| + j(above_equal, &done, Label::kNear); |
| + Set(result_reg, Immediate(0)); |
| bind(&done); |
| } |
| @@ -238,8 +236,8 @@ void MacroAssembler::ClampUint8(Register reg) { |
| Label done; |
| test(reg, Immediate(0xFFFFFF00)); |
| j(zero, &done, Label::kNear); |
| - setcc(negative, reg); // 1 if negative, 0 if positive. |
| - dec_b(reg); // 0 if negative, 255 if positive. |
| + sar(reg, 31); |
| + not_(reg); // safe not to zero extension |
| bind(&done); |
| } |
| @@ -256,8 +254,8 @@ void MacroAssembler::TruncateDoubleToI(Register result_reg, |
| XMMRegister input_reg) { |
| Label done; |
| cvttsd2si(result_reg, Operand(input_reg)); |
| - cmp(result_reg, 0x80000000u); |
| - j(not_equal, &done, Label::kNear); |
| + cmp(result_reg, 0x1); |
| + j(no_overflow, &done, Label::kNear); |
| sub(esp, Immediate(kDoubleSize)); |
| movsd(MemOperand(esp, 0), input_reg); |
| @@ -374,8 +372,8 @@ void MacroAssembler::TruncateHeapNumberToI(Register result_reg, |
| CpuFeatureScope scope(this, SSE2); |
| movsd(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset)); |
| cvttsd2si(result_reg, Operand(xmm0)); |
| - cmp(result_reg, 0x80000000u); |
| - j(not_equal, &done, Label::kNear); |
| + cmp(result_reg, 0x1); |
| + j(no_overflow, &done, Label::kNear); |
| // Check if the input was 0x8000000 (kMinInt). |
| // If no, then we got an overflow and we deoptimize. |
| ExternalReference min_int = ExternalReference::address_of_min_int(); |