Index: src/x64/lithium-x64.cc |
diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc |
index aad9597f1148c9396da9220feb0da202873ef123..13df32c660f2f7aa55820a8db0b7318d368bf194 100644 |
--- a/src/x64/lithium-x64.cc |
+++ b/src/x64/lithium-x64.cc |
@@ -1349,24 +1349,30 @@ LInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { |
int32_t divisor = instr->right()->GetInteger32Constant(); |
LOperand* temp1 = FixedTemp(rax); |
LOperand* temp2 = FixedTemp(rdx); |
+ LOperand* temp3 = |
+ ((divisor > 0 && !instr->CheckFlag(HValue::kLeftCanBeNegative)) || |
+ (divisor < 0 && !instr->CheckFlag(HValue::kLeftCanBePositive))) ? |
+ NULL : TempRegister(); |
LInstruction* result = |
DefineFixed(new(zone()) LFlooringDivByConstI(dividend, |
divisor, |
temp1, |
- temp2), |
+ temp2, |
+ temp3), |
rdx); |
- bool can_deopt = |
- divisor == 0 || |
- (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0); |
- return can_deopt ? AssignEnvironment(result) : result; |
+ if (divisor == 0 || |
+ (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0)) { |
+ result = AssignEnvironment(result); |
+ } |
+ return result; |
} |
LInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { |
if (instr->RightIsPowerOf2()) { |
return DoFlooringDivByPowerOf2I(instr); |
- } else if (false && instr->right()->IsConstant()) { |
- return DoFlooringDivByConstI(instr); // TODO(svenpanne) Fix and re-enable. |
+ } else if (instr->right()->IsConstant()) { |
+ return DoFlooringDivByConstI(instr); |
} else { |
return DoDivI(instr); |
} |