| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 332c2ee31f027d8a0b78b9085b733c14942a796c..ec1f8f73172da1115c64c2997c409e7651dd0f7f 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -2240,8 +2240,8 @@ void LCodeGen::DoCompareMinusZeroAndBranch(LCompareMinusZeroAndBranch* instr) {
|
| Handle<Map> map = masm()->isolate()->factory()->heap_number_map();
|
| __ CheckMap(value, map, instr->FalseLabel(chunk()), DO_SMI_CHECK);
|
| __ cmpl(FieldOperand(value, HeapNumber::kExponentOffset),
|
| - Immediate(0x80000000));
|
| - EmitFalseBranch(instr, not_equal);
|
| + Immediate(0x1));
|
| + EmitFalseBranch(instr, no_overflow);
|
| __ cmpl(FieldOperand(value, HeapNumber::kMantissaOffset),
|
| Immediate(0x00000000));
|
| EmitBranch(instr, equal);
|
| @@ -3556,8 +3556,8 @@ void LCodeGen::DoMathFloor(LMathFloor* instr) {
|
| }
|
| __ roundsd(xmm_scratch, input_reg, Assembler::kRoundDown);
|
| __ cvttsd2si(output_reg, xmm_scratch);
|
| - __ cmpl(output_reg, Immediate(0x80000000));
|
| - DeoptimizeIf(equal, instr->environment());
|
| + __ cmpl(output_reg, Immediate(0x1));
|
| + DeoptimizeIf(overflow, instr->environment());
|
| } else {
|
| Label negative_sign, done;
|
| // Deoptimize on unordered.
|
| @@ -3581,8 +3581,8 @@ void LCodeGen::DoMathFloor(LMathFloor* instr) {
|
| // Use truncating instruction (OK because input is positive).
|
| __ cvttsd2si(output_reg, input_reg);
|
| // Overflow is signalled with minint.
|
| - __ cmpl(output_reg, Immediate(0x80000000));
|
| - DeoptimizeIf(equal, instr->environment());
|
| + __ cmpl(output_reg, Immediate(0x1));
|
| + DeoptimizeIf(overflow, instr->environment());
|
| __ jmp(&done, Label::kNear);
|
|
|
| // Non-zero negative reaches here.
|
| @@ -3619,9 +3619,9 @@ void LCodeGen::DoMathRound(LMathRound* instr) {
|
| __ addsd(xmm_scratch, input_reg);
|
| __ cvttsd2si(output_reg, xmm_scratch);
|
| // Overflow is signalled with minint.
|
| - __ cmpl(output_reg, Immediate(0x80000000));
|
| + __ cmpl(output_reg, Immediate(0x1));
|
| __ RecordComment("D2I conversion overflow");
|
| - DeoptimizeIf(equal, instr->environment());
|
| + DeoptimizeIf(overflow, instr->environment());
|
| __ jmp(&done, dist);
|
|
|
| __ bind(&below_one_half);
|
| @@ -3636,9 +3636,9 @@ void LCodeGen::DoMathRound(LMathRound* instr) {
|
| __ subsd(input_temp, xmm_scratch);
|
| __ cvttsd2si(output_reg, input_temp);
|
| // Catch minint due to overflow, and to prevent overflow when compensating.
|
| - __ cmpl(output_reg, Immediate(0x80000000));
|
| + __ cmpl(output_reg, Immediate(0x1));
|
| __ RecordComment("D2I conversion overflow");
|
| - DeoptimizeIf(equal, instr->environment());
|
| + DeoptimizeIf(overflow, instr->environment());
|
|
|
| __ Cvtlsi2sd(xmm_scratch, output_reg);
|
| __ ucomisd(xmm_scratch, input_temp);
|
| @@ -4671,8 +4671,8 @@ void LCodeGen::DoSmiTag(LSmiTag* instr) {
|
| Register output = ToRegister(instr->result());
|
| if (hchange->CheckFlag(HValue::kCanOverflow) &&
|
| hchange->value()->CheckFlag(HValue::kUint32)) {
|
| - __ testl(input, Immediate(0x80000000));
|
| - DeoptimizeIf(not_zero, instr->environment());
|
| + __ testl(input, input);
|
| + DeoptimizeIf(sign, instr->environment());
|
| }
|
| __ Integer32ToSmi(output, input);
|
| if (hchange->CheckFlag(HValue::kCanOverflow) &&
|
| @@ -5067,7 +5067,7 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
| // conversions.
|
| __ Cmp(input_reg, factory()->undefined_value());
|
| DeoptimizeIf(not_equal, instr->environment());
|
| - __ movp(input_reg, Immediate(0));
|
| + __ xorl(input_reg, input_reg);
|
| __ jmp(&done, Label::kNear);
|
|
|
| // Heap number
|
|
|