Index: src/arm/lithium-codegen-arm.cc |
diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
index 8f28651e326da89bb99e9cb17393c374eb099bd8..d7d3c5eab40481aa1c153053e8b873f914948eb6 100644 |
--- a/src/arm/lithium-codegen-arm.cc |
+++ b/src/arm/lithium-codegen-arm.cc |
@@ -1744,7 +1744,14 @@ void LCodeGen::DoShiftI(LShiftI* instr) { |
break; |
case Token::SHL: |
if (shift_count != 0) { |
- __ mov(result, Operand(left, LSL, shift_count)); |
+ if (instr->hydrogen_value()->representation().IsSmi() && |
+ instr->can_deopt()) { |
+ __ mov(result, Operand(left, LSL, shift_count - 1)); |
+ __ SmiTag(result, result, SetCC); |
+ DeoptimizeIf(vs, instr->environment()); |
+ } else { |
+ __ mov(result, Operand(left, LSL, shift_count)); |
+ } |
} else { |
__ Move(result, left); |
} |