| 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();
|
| }
|
|
|