Index: runtime/vm/intermediate_language_arm.cc |
=================================================================== |
--- runtime/vm/intermediate_language_arm.cc (revision 38317) |
+++ runtime/vm/intermediate_language_arm.cc (working copy) |
@@ -6102,18 +6102,18 @@ |
case Token::kBIT_AND: { |
__ and_(out_lo, left_lo, Operand(right_lo)); |
__ and_(out_hi, left_hi, Operand(right_hi)); |
+ break; |
} |
- break; |
case Token::kBIT_OR: { |
__ orr(out_lo, left_lo, Operand(right_lo)); |
__ orr(out_hi, left_hi, Operand(right_hi)); |
+ break; |
} |
- break; |
case Token::kBIT_XOR: { |
__ eor(out_lo, left_lo, Operand(right_lo)); |
__ eor(out_hi, left_hi, Operand(right_hi)); |
+ break; |
} |
- break; |
case Token::kADD: |
case Token::kSUB: { |
if (op_kind() == Token::kADD) { |
@@ -6130,9 +6130,20 @@ |
} |
break; |
} |
+ case Token::kMUL: { |
+ if (TargetCPUFeatures::arm_version() == ARMv7) { |
+ __ smull(out_lo, out_hi, left_lo, right_lo); |
+ if (can_overflow()) { |
+ __ TestImmediate(out_hi, 0xC0000000); |
+ __ b(deopt, NE); |
+ } |
+ } else { |
+ __ b(deopt); |
+ } |
+ break; |
+ } |
default: |
UNREACHABLE(); |
- break; |
} |
if (FLAG_throw_on_javascript_int_overflow) { |
EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi); |
@@ -6227,7 +6238,6 @@ |
} |
default: |
UNREACHABLE(); |
- break; |
} |
if (FLAG_throw_on_javascript_int_overflow) { |
@@ -6319,19 +6329,22 @@ |
switch (op_kind()) { |
case Token::kBIT_AND: |
__ and_(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kBIT_OR: |
__ orr(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kBIT_XOR: |
__ eor(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kADD: |
__ add(out, left, Operand(right)); |
- break; |
+ break; |
case Token::kSUB: |
__ sub(out, left, Operand(right)); |
- break; |
+ break; |
+ case Token::kMUL: |
+ __ mul(out, left, right); |
+ break; |
default: |
UNREACHABLE(); |
} |
@@ -6385,10 +6398,10 @@ |
switch (op_kind()) { |
case Token::kSHR: |
__ Lsr(out, left, shift_value); |
- break; |
+ break; |
case Token::kSHL: |
__ Lsl(out, left, shift_value); |
- break; |
+ break; |
default: |
UNREACHABLE(); |
} |
@@ -6412,10 +6425,10 @@ |
switch (op_kind()) { |
case Token::kSHR: |
__ Lsr(out, left, temp, LS); |
- break; |
+ break; |
case Token::kSHL: |
__ Lsl(out, left, temp, LS); |
- break; |
+ break; |
default: |
UNREACHABLE(); |
} |