Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: runtime/vm/flow_graph_compiler.cc

Issue 337503003: Fix a bug in ParallelMoveResolver::AllocateScratchRegister, where we end up allocating PC on ARM. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/flow_graph_compiler.h ('k') | tests/language/memory_swap_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_XXX. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_XXX.
6 6
7 #include "vm/flow_graph_compiler.h" 7 #include "vm/flow_graph_compiler.h"
8 8
9 #include "vm/cha.h" 9 #include "vm/cha.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 1219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 for (int i = 0; i < moves_.length(); ++i) { 1230 for (int i = 0; i < moves_.length(); ++i) {
1231 if (moves_[i]->dest().Equals(loc)) { 1231 if (moves_[i]->dest().Equals(loc)) {
1232 return true; 1232 return true;
1233 } 1233 }
1234 } 1234 }
1235 1235
1236 return false; 1236 return false;
1237 } 1237 }
1238 1238
1239 1239
1240 intptr_t ParallelMoveResolver::AllocateScratchRegister(Location::Kind kind, 1240 intptr_t ParallelMoveResolver::AllocateScratchRegister(
1241 intptr_t blocked, 1241 Location::Kind kind,
1242 intptr_t register_count, 1242 intptr_t blocked,
1243 bool* spilled) { 1243 intptr_t first_free_register,
1244 intptr_t last_free_register,
1245 bool* spilled) {
1244 intptr_t scratch = -1; 1246 intptr_t scratch = -1;
1245 for (intptr_t reg = 0; reg < register_count; reg++) { 1247 for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
1246 if ((blocked != reg) && 1248 if ((blocked != reg) &&
1247 IsScratchLocation(Location::MachineRegisterLocation(kind, reg))) { 1249 IsScratchLocation(Location::MachineRegisterLocation(kind, reg))) {
1248 scratch = reg; 1250 scratch = reg;
1249 break; 1251 break;
1250 } 1252 }
1251 } 1253 }
1252 1254
1253 if (scratch == -1) { 1255 if (scratch == -1) {
1254 *spilled = true; 1256 *spilled = true;
1255 for (intptr_t reg = 0; reg < register_count; reg++) { 1257 for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
1256 if (blocked != reg) { 1258 if (blocked != reg) {
1257 scratch = reg; 1259 scratch = reg;
1260 break;
1258 } 1261 }
1259 } 1262 }
1260 } else { 1263 } else {
1261 *spilled = false; 1264 *spilled = false;
1262 } 1265 }
1263 1266
1264 return scratch; 1267 return scratch;
1265 } 1268 }
1266 1269
1267 1270
1268 ParallelMoveResolver::ScratchFpuRegisterScope::ScratchFpuRegisterScope( 1271 ParallelMoveResolver::ScratchFpuRegisterScope::ScratchFpuRegisterScope(
1269 ParallelMoveResolver* resolver, FpuRegister blocked) 1272 ParallelMoveResolver* resolver, FpuRegister blocked)
1270 : resolver_(resolver), 1273 : resolver_(resolver),
1271 reg_(kNoFpuRegister), 1274 reg_(kNoFpuRegister),
1272 spilled_(false) { 1275 spilled_(false) {
1273 reg_ = static_cast<FpuRegister>( 1276 reg_ = static_cast<FpuRegister>(
1274 resolver_->AllocateScratchRegister(Location::kFpuRegister, 1277 resolver_->AllocateScratchRegister(Location::kFpuRegister,
1275 blocked, 1278 blocked,
1276 kNumberOfFpuRegisters, 1279 0,
1280 kNumberOfFpuRegisters - 1,
1277 &spilled_)); 1281 &spilled_));
1278 1282
1279 if (spilled_) { 1283 if (spilled_) {
1280 resolver->SpillFpuScratch(reg_); 1284 resolver->SpillFpuScratch(reg_);
1281 } 1285 }
1282 } 1286 }
1283 1287
1284 1288
1285 ParallelMoveResolver::ScratchFpuRegisterScope::~ScratchFpuRegisterScope() { 1289 ParallelMoveResolver::ScratchFpuRegisterScope::~ScratchFpuRegisterScope() {
1286 if (spilled_) { 1290 if (spilled_) {
1287 resolver_->RestoreFpuScratch(reg_); 1291 resolver_->RestoreFpuScratch(reg_);
1288 } 1292 }
1289 } 1293 }
1290 1294
1291 1295
1292 ParallelMoveResolver::ScratchRegisterScope::ScratchRegisterScope( 1296 ParallelMoveResolver::ScratchRegisterScope::ScratchRegisterScope(
1293 ParallelMoveResolver* resolver, Register blocked) 1297 ParallelMoveResolver* resolver, Register blocked)
1294 : resolver_(resolver), 1298 : resolver_(resolver),
1295 reg_(kNoRegister), 1299 reg_(kNoRegister),
1296 spilled_(false) { 1300 spilled_(false) {
1297 reg_ = static_cast<Register>( 1301 reg_ = static_cast<Register>(
1298 resolver_->AllocateScratchRegister(Location::kRegister, 1302 resolver_->AllocateScratchRegister(Location::kRegister,
1299 blocked, 1303 blocked,
1300 kNumberOfCpuRegisters, 1304 kFirstFreeCpuRegister,
1305 kLastFreeCpuRegister,
1301 &spilled_)); 1306 &spilled_));
1302 1307
1303 if (spilled_) { 1308 if (spilled_) {
1304 resolver->SpillScratch(reg_); 1309 resolver->SpillScratch(reg_);
1305 } 1310 }
1306 } 1311 }
1307 1312
1308 1313
1309 ParallelMoveResolver::ScratchRegisterScope::~ScratchRegisterScope() { 1314 ParallelMoveResolver::ScratchRegisterScope::~ScratchRegisterScope() {
1310 if (spilled_) { 1315 if (spilled_) {
(...skipping 18 matching lines...) Expand all
1329 1334
1330 for (int i = 0; i < len; i++) { 1335 for (int i = 0; i < len; i++) {
1331 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i), 1336 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i),
1332 &Function::ZoneHandle(ic_data.GetTargetAt(i)), 1337 &Function::ZoneHandle(ic_data.GetTargetAt(i)),
1333 ic_data.GetCountAt(i))); 1338 ic_data.GetCountAt(i)));
1334 } 1339 }
1335 sorted->Sort(HighestCountFirst); 1340 sorted->Sort(HighestCountFirst);
1336 } 1341 }
1337 1342
1338 } // namespace dart 1343 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_compiler.h ('k') | tests/language/memory_swap_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698