| Index: src/ia32/macro-assembler-ia32.cc
|
| ===================================================================
|
| --- src/ia32/macro-assembler-ia32.cc (revision 12749)
|
| +++ src/ia32/macro-assembler-ia32.cc (working copy)
|
| @@ -129,14 +129,22 @@
|
| XMMRegister scratch_reg,
|
| Register result_reg) {
|
| Label done;
|
| - ExternalReference zero_ref = ExternalReference::address_of_zero();
|
| - movdbl(scratch_reg, Operand::StaticVariable(zero_ref));
|
| + Label conv_failure;
|
| + pxor(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));
|
| + jmp(&done, Label::kNear);
|
| + bind(&conv_failure);
|
| Set(result_reg, Immediate(0));
|
| ucomisd(input_reg, scratch_reg);
|
| j(below, &done, Label::kNear);
|
| - cvtsd2si(result_reg, input_reg);
|
| - test(result_reg, Immediate(0xFFFFFF00));
|
| - j(zero, &done, Label::kNear);
|
| Set(result_reg, Immediate(255));
|
| bind(&done);
|
| }
|
|
|