OLD | NEW |
1 | 1 |
2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. | 6 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
7 #if defined(TARGET_ARCH_ARM) | 7 #if defined(TARGET_ARCH_ARM) |
8 | 8 |
9 #include "vm/intermediate_language.h" | 9 #include "vm/intermediate_language.h" |
10 | 10 |
(...skipping 6345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6356 bool use_near_jump) { | 6356 bool use_near_jump) { |
6357 Register biased_cid = locs()->temp(0).reg(); | 6357 Register biased_cid = locs()->temp(0).reg(); |
6358 Condition no_match, match; | 6358 Condition no_match, match; |
6359 if (cid_start == cid_end) { | 6359 if (cid_start == cid_end) { |
6360 __ CompareImmediate(biased_cid, cid_start - bias); | 6360 __ CompareImmediate(biased_cid, cid_start - bias); |
6361 no_match = NE; | 6361 no_match = NE; |
6362 match = EQ; | 6362 match = EQ; |
6363 } else { | 6363 } else { |
6364 // For class ID ranges use a subtract followed by an unsigned | 6364 // For class ID ranges use a subtract followed by an unsigned |
6365 // comparison to check both ends of the ranges with one comparison. | 6365 // comparison to check both ends of the ranges with one comparison. |
6366 __ AddImmediate(biased_cid, biased_cid, bias - cid_start); | 6366 __ AddImmediate(biased_cid, bias - cid_start); |
6367 bias = cid_start; | 6367 bias = cid_start; |
6368 __ CompareImmediate(biased_cid, cid_end - cid_start); | 6368 __ CompareImmediate(biased_cid, cid_end - cid_start); |
6369 no_match = HI; // Unsigned higher. | 6369 no_match = HI; // Unsigned higher. |
6370 match = LS; // Unsigned lower or same. | 6370 match = LS; // Unsigned lower or same. |
6371 } | 6371 } |
6372 if (is_last) { | 6372 if (is_last) { |
6373 __ b(deopt, no_match); | 6373 __ b(deopt, no_match); |
6374 } else { | 6374 } else { |
6375 __ b(is_ok, match); | 6375 __ b(is_ok, match); |
6376 } | 6376 } |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7101 return summary; | 7101 return summary; |
7102 } | 7102 } |
7103 | 7103 |
7104 | 7104 |
7105 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 7105 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
7106 Register target_address_reg = locs()->temp_slot(0)->reg(); | 7106 Register target_address_reg = locs()->temp_slot(0)->reg(); |
7107 | 7107 |
7108 // Offset is relative to entry pc. | 7108 // Offset is relative to entry pc. |
7109 const intptr_t entry_to_pc_offset = __ CodeSize() + Instr::kPCReadOffset; | 7109 const intptr_t entry_to_pc_offset = __ CodeSize() + Instr::kPCReadOffset; |
7110 __ mov(target_address_reg, Operand(PC)); | 7110 __ mov(target_address_reg, Operand(PC)); |
7111 __ AddImmediate(target_address_reg, target_address_reg, -entry_to_pc_offset); | 7111 __ AddImmediate(target_address_reg, -entry_to_pc_offset); |
7112 // Add the offset. | 7112 // Add the offset. |
7113 Register offset_reg = locs()->in(0).reg(); | 7113 Register offset_reg = locs()->in(0).reg(); |
7114 Operand offset_opr = (offset()->definition()->representation() == kTagged) | 7114 Operand offset_opr = (offset()->definition()->representation() == kTagged) |
7115 ? Operand(offset_reg, ASR, kSmiTagSize) | 7115 ? Operand(offset_reg, ASR, kSmiTagSize) |
7116 : Operand(offset_reg); | 7116 : Operand(offset_reg); |
7117 __ add(target_address_reg, target_address_reg, offset_opr); | 7117 __ add(target_address_reg, target_address_reg, offset_opr); |
7118 | 7118 |
7119 // Jump to the absolute address. | 7119 // Jump to the absolute address. |
7120 __ bx(target_address_reg); | 7120 __ bx(target_address_reg); |
7121 } | 7121 } |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7269 compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(), | 7269 compiler->GenerateRuntimeCall(TokenPosition::kNoSource, deopt_id(), |
7270 kGrowRegExpStackRuntimeEntry, 1, locs()); | 7270 kGrowRegExpStackRuntimeEntry, 1, locs()); |
7271 __ Drop(1); | 7271 __ Drop(1); |
7272 __ Pop(result); | 7272 __ Pop(result); |
7273 } | 7273 } |
7274 | 7274 |
7275 | 7275 |
7276 } // namespace dart | 7276 } // namespace dart |
7277 | 7277 |
7278 #endif // defined TARGET_ARCH_ARM | 7278 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |