| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
| 6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 2657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2668 Register left = locs()->in(0).reg(); | 2668 Register left = locs()->in(0).reg(); |
| 2669 Register result = locs()->out(0).reg(); | 2669 Register result = locs()->out(0).reg(); |
| 2670 Label* deopt = NULL; | 2670 Label* deopt = NULL; |
| 2671 if (CanDeoptimize()) { | 2671 if (CanDeoptimize()) { |
| 2672 deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp); | 2672 deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp); |
| 2673 } | 2673 } |
| 2674 | 2674 |
| 2675 if (locs()->in(1).IsConstant()) { | 2675 if (locs()->in(1).IsConstant()) { |
| 2676 const Object& constant = locs()->in(1).constant(); | 2676 const Object& constant = locs()->in(1).constant(); |
| 2677 ASSERT(constant.IsSmi()); | 2677 ASSERT(constant.IsSmi()); |
| 2678 int32_t imm = reinterpret_cast<int32_t>(constant.raw()); | 2678 const int32_t imm = reinterpret_cast<int32_t>(constant.raw()); |
| 2679 switch (op_kind()) { | 2679 switch (op_kind()) { |
| 2680 case Token::kADD: { |
| 2681 if (deopt == NULL) { |
| 2682 __ AddImmediate(result, left, imm); |
| 2683 } else { |
| 2684 Register temp = locs()->temp(0).reg(); |
| 2685 __ AddImmediateDetectOverflow(result, left, imm, CMPRES1, temp); |
| 2686 __ bltz(CMPRES1, deopt); |
| 2687 } |
| 2688 break; |
| 2689 } |
| 2680 case Token::kSUB: { | 2690 case Token::kSUB: { |
| 2681 __ TraceSimMsg("kSUB imm"); | 2691 __ TraceSimMsg("kSUB imm"); |
| 2682 if (deopt == NULL) { | 2692 if (deopt == NULL) { |
| 2683 __ AddImmediate(result, left, -imm); | 2693 __ AddImmediate(result, left, -imm); |
| 2684 } else { | 2694 } else { |
| 2685 __ SubImmediateDetectOverflow(result, left, imm, CMPRES1); | 2695 __ SubImmediateDetectOverflow(result, left, imm, CMPRES1); |
| 2686 __ bltz(CMPRES1, deopt); | 2696 __ bltz(CMPRES1, deopt); |
| 2687 } | 2697 } |
| 2688 break; | 2698 break; |
| 2689 } | |
| 2690 case Token::kADD: { | |
| 2691 if (deopt == NULL) { | |
| 2692 __ AddImmediate(result, left, imm); | |
| 2693 } else { | |
| 2694 Register temp = locs()->temp(0).reg(); | |
| 2695 __ AddImmediateDetectOverflow(result, left, imm, CMPRES1, temp); | |
| 2696 __ bltz(CMPRES1, deopt); | |
| 2697 } | |
| 2698 break; | |
| 2699 } | 2699 } |
| 2700 case Token::kMUL: { | 2700 case Token::kMUL: { |
| 2701 // Keep left value tagged and untag right value. | 2701 // Keep left value tagged and untag right value. |
| 2702 const intptr_t value = Smi::Cast(constant).Value(); | 2702 const intptr_t value = Smi::Cast(constant).Value(); |
| 2703 if (deopt == NULL) { | 2703 if (deopt == NULL) { |
| 2704 if (value == 2) { | 2704 if (value == 2) { |
| 2705 __ sll(result, left, 1); | 2705 __ sll(result, left, 1); |
| 2706 } else { | 2706 } else { |
| 2707 __ LoadImmediate(TMP, value); | 2707 __ LoadImmediate(TMP, value); |
| 2708 __ mult(left, TMP); | 2708 __ mult(left, TMP); |
| (...skipping 1840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4549 compiler->GenerateCall(token_pos(), | 4549 compiler->GenerateCall(token_pos(), |
| 4550 &label, | 4550 &label, |
| 4551 PcDescriptors::kOther, | 4551 PcDescriptors::kOther, |
| 4552 locs()); | 4552 locs()); |
| 4553 __ Drop(ArgumentCount()); // Discard arguments. | 4553 __ Drop(ArgumentCount()); // Discard arguments. |
| 4554 } | 4554 } |
| 4555 | 4555 |
| 4556 } // namespace dart | 4556 } // namespace dart |
| 4557 | 4557 |
| 4558 #endif // defined TARGET_ARCH_MIPS | 4558 #endif // defined TARGET_ARCH_MIPS |
| OLD | NEW |