Index: src/ia32/lithium-ia32.cc |
diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc |
index c4ad7e8020d8f2aea6e15110f87245320189e055..cea47831fdbbceccf1205ec5dc1eb13c81f43dd1 100644 |
--- a/src/ia32/lithium-ia32.cc |
+++ b/src/ia32/lithium-ia32.cc |
@@ -1327,16 +1327,15 @@ LInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { |
ASSERT(instr->right()->representation().Equals(instr->representation())); |
LOperand* dividend = UseRegister(instr->left()); |
int32_t divisor = instr->right()->GetInteger32Constant(); |
- LInstruction* result = |
- DefineAsRegister(new(zone()) LDivByPowerOf2I(dividend, divisor)); |
- bool can_deopt = |
- (instr->CheckFlag(HValue::kBailoutOnMinusZero) && |
- instr->left()->RangeCanInclude(0) && divisor < 0) || |
- (instr->CheckFlag(HValue::kCanOverflow) && |
- instr->left()->RangeCanInclude(kMinInt) && divisor == -1) || |
+ LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( |
+ dividend, divisor)); |
+ if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || |
+ (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || |
(!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && |
- divisor != 1 && divisor != -1); |
- return can_deopt ? AssignEnvironment(result) : result; |
+ divisor != 1 && divisor != -1)) { |
+ result = AssignEnvironment(result); |
+ } |
+ return result; |
} |
@@ -1348,15 +1347,14 @@ LInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { |
int32_t divisor = instr->right()->GetInteger32Constant(); |
LOperand* temp1 = FixedTemp(eax); |
LOperand* temp2 = FixedTemp(edx); |
- LInstruction* result = |
- DefineFixed( |
- new(zone()) LDivByConstI(dividend, divisor, temp1, temp2), edx); |
- bool can_deopt = |
- divisor == 0 || |
- (instr->CheckFlag(HValue::kBailoutOnMinusZero) && |
- instr->left()->RangeCanInclude(0) && divisor < 0) || |
- !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32); |
- return can_deopt ? AssignEnvironment(result) : result; |
+ LInstruction* result = DefineFixed(new(zone()) LDivByConstI( |
+ dividend, divisor, temp1, temp2), edx); |
+ if (divisor == 0 || |
+ (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || |
+ !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { |
+ result = AssignEnvironment(result); |
+ } |
+ return result; |
} |
@@ -1367,9 +1365,16 @@ LInstruction* LChunkBuilder::DoDivI(HBinaryOperation* instr) { |
LOperand* dividend = UseFixed(instr->left(), eax); |
LOperand* divisor = UseRegister(instr->right()); |
LOperand* temp = FixedTemp(edx); |
- LInstruction* result = |
- DefineFixed(new(zone()) LDivI(dividend, divisor, temp), eax); |
- return AssignEnvironment(result); |
+ LInstruction* result = DefineFixed(new(zone()) LDivI( |
+ dividend, divisor, temp), eax); |
+ if (instr->CheckFlag(HValue::kCanBeDivByZero) || |
+ instr->CheckFlag(HValue::kBailoutOnMinusZero) || |
+ instr->CheckFlag(HValue::kCanOverflow) || |
+ (!instr->IsMathFloorOfDiv() && |
+ !instr->CheckFlag(HValue::kAllUsesTruncatingToInt32))) { |
+ result = AssignEnvironment(result); |
+ } |
+ return result; |
} |
@@ -1418,8 +1423,7 @@ LInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { |
edx); |
bool can_deopt = |
divisor == 0 || |
- (instr->CheckFlag(HValue::kBailoutOnMinusZero) && |
- instr->left()->RangeCanInclude(0) && divisor < 0); |
+ (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0); |
return can_deopt ? AssignEnvironment(result) : result; |
} |
@@ -1441,12 +1445,12 @@ LInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { |
ASSERT(instr->right()->representation().Equals(instr->representation())); |
LOperand* dividend = UseRegisterAtStart(instr->left()); |
int32_t divisor = instr->right()->GetInteger32Constant(); |
- LInstruction* result = |
- DefineSameAsFirst(new(zone()) LModByPowerOf2I(dividend, divisor)); |
- bool can_deopt = |
- instr->CheckFlag(HValue::kBailoutOnMinusZero) && |
- instr->left()->CanBeNegative(); |
- return can_deopt ? AssignEnvironment(result) : result; |
+ LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( |
+ dividend, divisor)); |
+ if (instr->CheckFlag(HValue::kBailoutOnMinusZero)) { |
+ result = AssignEnvironment(result); |
+ } |
+ return result; |
} |
@@ -1458,14 +1462,12 @@ LInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { |
int32_t divisor = instr->right()->GetInteger32Constant(); |
LOperand* temp1 = FixedTemp(eax); |
LOperand* temp2 = FixedTemp(edx); |
- LInstruction* result = |
- DefineFixed( |
- new(zone()) LModByConstI(dividend, divisor, temp1, temp2), eax); |
- bool can_deopt = |
- divisor == 0 || |
- (instr->CheckFlag(HValue::kBailoutOnMinusZero) && |
- instr->left()->CanBeNegative()); |
- return can_deopt ? AssignEnvironment(result) : result; |
+ LInstruction* result = DefineFixed(new(zone()) LModByConstI( |
+ dividend, divisor, temp1, temp2), eax); |
+ if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { |
+ result = AssignEnvironment(result); |
+ } |
+ return result; |
} |
@@ -1476,16 +1478,13 @@ LInstruction* LChunkBuilder::DoModI(HMod* instr) { |
LOperand* dividend = UseFixed(instr->left(), eax); |
LOperand* divisor = UseRegister(instr->right()); |
LOperand* temp = FixedTemp(edx); |
- LInstruction* result = |
- DefineFixed(new(zone()) LModI(dividend, divisor, temp), edx); |
- bool can_deopt = (instr->right()->CanBeZero() || |
- (instr->CheckFlag(HValue::kBailoutOnMinusZero) && |
- instr->left()->RangeCanInclude(kMinInt) && |
- instr->right()->RangeCanInclude(-1)) || |
- (instr->CheckFlag(HValue::kBailoutOnMinusZero) && |
- instr->left()->CanBeNegative() && |
- instr->CanBeZero())); |
- return can_deopt ? AssignEnvironment(result) : result; |
+ LInstruction* result = DefineFixed(new(zone()) LModI( |
+ dividend, divisor, temp), edx); |
+ if (instr->CheckFlag(HValue::kCanBeDivByZero) || |
+ instr->CheckFlag(HValue::kBailoutOnMinusZero)) { |
+ result = AssignEnvironment(result); |
+ } |
+ return result; |
} |