| Index: runtime/vm/intermediate_language_arm.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_arm.cc (revision 30543)
|
| +++ runtime/vm/intermediate_language_arm.cc (working copy)
|
| @@ -2380,6 +2380,7 @@
|
| }
|
|
|
| Register right = locs()->in(1).reg();
|
| + Range* right_range = this->right()->definition()->range();
|
| switch (op_kind()) {
|
| case Token::kADD: {
|
| if (deopt == NULL) {
|
| @@ -2427,9 +2428,11 @@
|
| break;
|
| }
|
| case Token::kTRUNCDIV: {
|
| - // Handle divide by zero in runtime.
|
| - __ cmp(right, ShifterOperand(0));
|
| - __ b(deopt, EQ);
|
| + if ((right_range == NULL) || right_range->IsWithin(0, 0)) {
|
| + // Handle divide by zero in runtime.
|
| + __ cmp(right, ShifterOperand(0));
|
| + __ b(deopt, EQ);
|
| + }
|
| Register temp = locs()->temp(0).reg();
|
| DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
|
| __ Asr(temp, left, kSmiTagSize); // SmiUntag left into temp.
|
| @@ -2445,9 +2448,11 @@
|
| break;
|
| }
|
| case Token::kMOD: {
|
| - // Handle divide by zero in runtime.
|
| - __ cmp(right, ShifterOperand(0));
|
| - __ b(deopt, EQ);
|
| + if ((right_range == NULL) || right_range->IsWithin(0, 0)) {
|
| + // Handle divide by zero in runtime.
|
| + __ cmp(right, ShifterOperand(0));
|
| + __ b(deopt, EQ);
|
| + }
|
| Register temp = locs()->temp(0).reg();
|
| DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
|
| __ Asr(temp, left, kSmiTagSize); // SmiUntag left into temp.
|
| @@ -2484,7 +2489,6 @@
|
| __ Asr(IP, right, kSmiTagSize); // SmiUntag right into IP.
|
| // sarl operation masks the count to 5 bits.
|
| const intptr_t kCountLimit = 0x1F;
|
| - Range* right_range = this->right()->definition()->range();
|
| if ((right_range == NULL) ||
|
| !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
|
| __ CompareImmediate(IP, kCountLimit);
|
| @@ -4094,9 +4098,12 @@
|
| Register left = locs()->in(0).reg();
|
| Register right = locs()->in(1).reg();
|
| Register result = locs()->out().reg();
|
| - // Handle divide by zero in runtime.
|
| - __ cmp(right, ShifterOperand(0));
|
| - __ b(deopt, EQ);
|
| + Range* right_range = InputAt(1)->definition()->range();
|
| + if ((right_range == NULL) || right_range->IsWithin(0, 0)) {
|
| + // Handle divide by zero in runtime.
|
| + __ cmp(right, ShifterOperand(0));
|
| + __ b(deopt, EQ);
|
| + }
|
| Register temp = locs()->temp(0).reg();
|
| DRegister dtemp = EvenDRegisterOf(locs()->temp(1).fpu_reg());
|
| Register result_div = locs()->temp(2).reg();
|
|
|