Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index fab5a1b7a07d3ddb9a3bcefba6be68813644def5..3a0d32cd0b55cffd87c2e3e9f04ec9fcc0188d06 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -498,9 +498,18 @@ bool LCodeGen::IsSmi(LConstantOperand* op) const { |
} |
-int LCodeGen::ToInteger32(LConstantOperand* op) const { |
+int32_t LCodeGen::ToInteger32(LConstantOperand* op) const { |
+ return ToRepresentation(op, Representation::Integer32()); |
+} |
+ |
+ |
+int32_t LCodeGen::ToRepresentation(LConstantOperand* op, |
+ const Representation& r) const { |
HConstant* constant = chunk_->LookupConstant(op); |
- return constant->Integer32Value(); |
+ int32_t value = constant->Integer32Value(); |
+ if (r.IsInteger32()) return value; |
+ ASSERT(r.IsSmiOrTagged()); |
+ return reinterpret_cast<int32_t>(Smi::FromInt(value)); |
} |
@@ -522,7 +531,10 @@ Operand LCodeGen::ToOperand(LOperand* op) { |
LConstantOperand* const_op = LConstantOperand::cast(op); |
HConstant* constant = chunk()->LookupConstant(const_op); |
Representation r = chunk_->LookupLiteralRepresentation(const_op); |
- if (r.IsInteger32()) { |
+ if (r.IsSmi()) { |
+ ASSERT(constant->HasSmiValue()); |
+ return Operand(Smi::FromInt(constant->Integer32Value())); |
+ } else if (r.IsInteger32()) { |
ASSERT(constant->HasInteger32Value()); |
return Operand(constant->Integer32Value()); |
} else if (r.IsDouble()) { |
@@ -1544,7 +1556,9 @@ void LCodeGen::DoMulI(LMulI* instr) { |
if (right_op->IsConstantOperand() && !can_overflow) { |
// Use optimized code for specific constants. |
- int32_t constant = ToInteger32(LConstantOperand::cast(right_op)); |
+ int32_t constant = ToRepresentation( |
+ LConstantOperand::cast(right_op), |
+ instr->hydrogen()->right()->representation()); |
if (bailout_on_minus_zero && (constant < 0)) { |
// The case of a null constant will be handled separately. |
@@ -1608,11 +1622,21 @@ void LCodeGen::DoMulI(LMulI* instr) { |
if (can_overflow) { |
// scratch:result = left * right. |
- __ smull(result, scratch, left, right); |
+ if (instr->hydrogen()->representation().IsSmi()) { |
+ __ SmiUntag(result, left); |
+ __ smull(result, scratch, result, right); |
+ } else { |
+ __ smull(result, scratch, left, right); |
+ } |
__ cmp(scratch, Operand(result, ASR, 31)); |
DeoptimizeIf(ne, instr->environment()); |
} else { |
- __ mul(result, left, right); |
+ if (instr->hydrogen()->representation().IsSmi()) { |
+ __ SmiUntag(result, left); |
+ __ mul(result, result, right); |
+ } else { |
+ __ mul(result, left, right); |
+ } |
} |
if (bailout_on_minus_zero) { |
@@ -1967,7 +1991,7 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) { |
LOperand* left = instr->left(); |
LOperand* right = instr->right(); |
HMathMinMax::Operation operation = instr->hydrogen()->operation(); |
- if (instr->hydrogen()->representation().IsInteger32()) { |
+ if (instr->hydrogen()->representation().IsSmiOrInteger32()) { |
Condition condition = (operation == HMathMinMax::kMathMin) ? le : ge; |
Register left_reg = ToRegister(left); |
Operand right_op = (right->IsRegister() || right->IsConstantOperand()) |