Index: src/arm/lithium-arm.cc |
diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc |
index 8a91216a202eba5e6ed6ae558222f3b64a38fe42..ea2ce326615c33690e6937bb85b89d91af2641d2 100644 |
--- a/src/arm/lithium-arm.cc |
+++ b/src/arm/lithium-arm.cc |
@@ -1296,43 +1296,27 @@ bool LChunkBuilder::HasMagicNumberForDivisor(int32_t divisor) { |
} |
-HValue* LChunkBuilder::SimplifiedDivisorForMathFloorOfDiv(HValue* divisor) { |
- if (CpuFeatures::IsSupported(SUDIV)) { |
- // A value with an integer representation does not need to be transformed. |
- if (divisor->representation().IsInteger32()) { |
- return divisor; |
- // A change from an integer32 can be replaced by the integer32 value. |
- } else if (divisor->IsChange() && |
- HChange::cast(divisor)->from().IsInteger32()) { |
- return HChange::cast(divisor)->value(); |
- } |
- } |
- |
- if (divisor->IsConstant() && HConstant::cast(divisor)->HasInteger32Value()) { |
- HConstant* constant_val = HConstant::cast(divisor); |
- int32_t int32_val = constant_val->Integer32Value(); |
- if (LChunkBuilder::HasMagicNumberForDivisor(int32_val) || |
- CpuFeatures::IsSupported(SUDIV)) { |
- return constant_val->CopyToRepresentation(Representation::Integer32(), |
- divisor->block()->zone()); |
- } |
- } |
- |
- return NULL; |
-} |
- |
- |
LInstruction* LChunkBuilder::DoMathFloorOfDiv(HMathFloorOfDiv* instr) { |
+ // LMathFloorOfDiv can only handle a subset of divisors, so fall |
+ // back to a flooring division in all other cases. |
HValue* right = instr->right(); |
+ if (!right->IsInteger32Constant() || |
+ (right->IsInteger32Constant() && |
Benedikt Meurer
2014/01/24 12:33:21
right->IsInteger32Constant() is always true here.
Sven Panne
2014/01/24 14:02:05
Embarrassing... :-} This is what you get after edi
|
+ !CpuFeatures::IsSupported(SUDIV) && |
+ !HasMagicNumberForDivisor(HConstant::cast(right)->Integer32Value())) |
+ ) { |
+ LOperand* dividend = UseRegister(instr->left()); |
+ LOperand* divisor = UseRegister(right); |
+ LOperand* temp = CpuFeatures::IsSupported(SUDIV) ? NULL : FixedTemp(d4); |
+ LDivI* div = new(zone()) LDivI(dividend, divisor, temp); |
+ return AssignEnvironment(DefineAsRegister(div)); |
+ } |
+ |
LOperand* dividend = UseRegister(instr->left()); |
LOperand* divisor = CpuFeatures::IsSupported(SUDIV) |
? UseRegister(right) |
: UseOrConstant(right); |
LOperand* remainder = TempRegister(); |
- ASSERT(CpuFeatures::IsSupported(SUDIV) || |
- (right->IsConstant() && |
- HConstant::cast(right)->HasInteger32Value() && |
- HasMagicNumberForDivisor(HConstant::cast(right)->Integer32Value()))); |
return AssignEnvironment(DefineAsRegister( |
new(zone()) LMathFloorOfDiv(dividend, divisor, remainder))); |
} |