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 |