| 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..8cc2e4116b6bdf3dff72a8345282b4fb96fb93b8 100644
|
| --- a/src/ia32/macro-assembler-ia32.cc
|
| +++ b/src/ia32/macro-assembler-ia32.cc
|
| @@ -214,16 +214,15 @@ 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);
|
| + movzx_b(result_reg, result_reg);
|
| jmp(&done, Label::kNear);
|
| bind(&conv_failure);
|
| Set(result_reg, Immediate(0));
|
| @@ -238,8 +237,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);
|
| bind(&done);
|
| }
|
|
|
| @@ -256,8 +255,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 +373,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();
|
|
|