| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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_ARM64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. |
| 6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 2791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2802 | 2802 |
| 2803 | 2803 |
| 2804 void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2804 void CheckedSmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 2805 CheckedSmiSlowPath* slow_path = | 2805 CheckedSmiSlowPath* slow_path = |
| 2806 new CheckedSmiSlowPath(this, compiler->CurrentTryIndex()); | 2806 new CheckedSmiSlowPath(this, compiler->CurrentTryIndex()); |
| 2807 compiler->AddSlowPathCode(slow_path); | 2807 compiler->AddSlowPathCode(slow_path); |
| 2808 // Test operands if necessary. | 2808 // Test operands if necessary. |
| 2809 Register left = locs()->in(0).reg(); | 2809 Register left = locs()->in(0).reg(); |
| 2810 Register right = locs()->in(1).reg(); | 2810 Register right = locs()->in(1).reg(); |
| 2811 Register result = locs()->out(0).reg(); | 2811 Register result = locs()->out(0).reg(); |
| 2812 __ orr(result, left, Operand(right)); | 2812 intptr_t left_cid = this->left()->Type()->ToCid(); |
| 2813 __ tsti(result, Immediate(kSmiTagMask)); | 2813 intptr_t right_cid = this->right()->Type()->ToCid(); |
| 2814 bool combined_smi_check = false; |
| 2815 if (this->left()->definition() == this->right()->definition()) { |
| 2816 __ tsti(left, Immediate(kSmiTagMask)); |
| 2817 } else if (left_cid == kSmiCid) { |
| 2818 __ tsti(right, Immediate(kSmiTagMask)); |
| 2819 } else if (right_cid == kSmiCid) { |
| 2820 __ tsti(left, Immediate(kSmiTagMask)); |
| 2821 } else { |
| 2822 combined_smi_check = true; |
| 2823 __ orr(result, left, Operand(right)); |
| 2824 __ tsti(result, Immediate(kSmiTagMask)); |
| 2825 } |
| 2826 |
| 2814 __ b(slow_path->entry_label(), NE); | 2827 __ b(slow_path->entry_label(), NE); |
| 2815 switch (op_kind()) { | 2828 switch (op_kind()) { |
| 2816 case Token::kADD: | 2829 case Token::kADD: |
| 2817 __ adds(result, left, Operand(right)); | 2830 __ adds(result, left, Operand(right)); |
| 2818 __ b(slow_path->entry_label(), VS); | 2831 __ b(slow_path->entry_label(), VS); |
| 2819 break; | 2832 break; |
| 2820 case Token::kSUB: | 2833 case Token::kSUB: |
| 2821 __ subs(result, left, Operand(right)); | 2834 __ subs(result, left, Operand(right)); |
| 2822 __ b(slow_path->entry_label(), VS); | 2835 __ b(slow_path->entry_label(), VS); |
| 2823 break; | 2836 break; |
| 2824 case Token::kBIT_OR: | 2837 case Token::kBIT_OR: |
| 2825 // Operation part of combined smi check. | 2838 // Operation may be part of combined smi check. |
| 2839 if (!combined_smi_check) { |
| 2840 __ orr(result, left, Operand(right)); |
| 2841 } |
| 2826 break; | 2842 break; |
| 2827 case Token::kBIT_AND: | 2843 case Token::kBIT_AND: |
| 2828 __ and_(result, left, Operand(right)); | 2844 __ and_(result, left, Operand(right)); |
| 2829 break; | 2845 break; |
| 2830 case Token::kBIT_XOR: | 2846 case Token::kBIT_XOR: |
| 2831 __ eor(result, left, Operand(right)); | 2847 __ eor(result, left, Operand(right)); |
| 2832 break; | 2848 break; |
| 2833 case Token::kEQ: | 2849 case Token::kEQ: |
| 2834 case Token::kLT: | 2850 case Token::kLT: |
| 2835 case Token::kLTE: | 2851 case Token::kLTE: |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3148 | 3164 |
| 3149 | 3165 |
| 3150 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3166 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3151 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 3167 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
| 3152 ICData::kDeoptBinaryDoubleOp, | 3168 ICData::kDeoptBinaryDoubleOp, |
| 3153 licm_hoisted_ ? ICData::kHoisted : 0); | 3169 licm_hoisted_ ? ICData::kHoisted : 0); |
| 3154 intptr_t left_cid = left()->Type()->ToCid(); | 3170 intptr_t left_cid = left()->Type()->ToCid(); |
| 3155 intptr_t right_cid = right()->Type()->ToCid(); | 3171 intptr_t right_cid = right()->Type()->ToCid(); |
| 3156 const Register left = locs()->in(0).reg(); | 3172 const Register left = locs()->in(0).reg(); |
| 3157 const Register right = locs()->in(1).reg(); | 3173 const Register right = locs()->in(1).reg(); |
| 3158 if (left_cid == kSmiCid) { | 3174 if (this->left()->definition() == this->right()->definition()) { |
| 3175 __ tsti(left, Immediate(kSmiTagMask)); |
| 3176 } else if (left_cid == kSmiCid) { |
| 3159 __ tsti(right, Immediate(kSmiTagMask)); | 3177 __ tsti(right, Immediate(kSmiTagMask)); |
| 3160 } else if (right_cid == kSmiCid) { | 3178 } else if (right_cid == kSmiCid) { |
| 3161 __ tsti(left, Immediate(kSmiTagMask)); | 3179 __ tsti(left, Immediate(kSmiTagMask)); |
| 3162 } else { | 3180 } else { |
| 3163 __ orr(TMP, left, Operand(right)); | 3181 __ orr(TMP, left, Operand(right)); |
| 3164 __ tsti(TMP, Immediate(kSmiTagMask)); | 3182 __ tsti(TMP, Immediate(kSmiTagMask)); |
| 3165 } | 3183 } |
| 3166 __ b(deopt, EQ); | 3184 __ b(deopt, EQ); |
| 3167 } | 3185 } |
| 3168 | 3186 |
| (...skipping 2502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5671 1, | 5689 1, |
| 5672 locs()); | 5690 locs()); |
| 5673 __ Drop(1); | 5691 __ Drop(1); |
| 5674 __ Pop(result); | 5692 __ Pop(result); |
| 5675 } | 5693 } |
| 5676 | 5694 |
| 5677 | 5695 |
| 5678 } // namespace dart | 5696 } // namespace dart |
| 5679 | 5697 |
| 5680 #endif // defined TARGET_ARCH_ARM64 | 5698 #endif // defined TARGET_ARCH_ARM64 |
| OLD | NEW |