| 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 |