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

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

Issue 539073002: Fixes for ARM/ARM64/MIPS parallel move resolver. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 3 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
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/bit_vector.h" 9 #include "vm/bit_vector.h"
10 #include "vm/cha.h" 10 #include "vm/cha.h"
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 return true; 1283 return true;
1284 } 1284 }
1285 } 1285 }
1286 1286
1287 return false; 1287 return false;
1288 } 1288 }
1289 1289
1290 1290
1291 intptr_t ParallelMoveResolver::AllocateScratchRegister( 1291 intptr_t ParallelMoveResolver::AllocateScratchRegister(
1292 Location::Kind kind, 1292 Location::Kind kind,
1293 intptr_t blocked, 1293 uword blocked_mask,
1294 intptr_t first_free_register, 1294 intptr_t first_free_register,
1295 intptr_t last_free_register, 1295 intptr_t last_free_register,
1296 bool* spilled) { 1296 bool* spilled) {
1297 COMPILE_ASSERT(static_cast<intptr_t>(sizeof(blocked_mask)) * kBitsPerByte >=
1298 kNumberOfFpuRegisters);
1299 COMPILE_ASSERT(static_cast<intptr_t>(sizeof(blocked_mask)) * kBitsPerByte >=
1300 kNumberOfCpuRegisters);
1297 intptr_t scratch = -1; 1301 intptr_t scratch = -1;
1298 for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) { 1302 for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
1299 if ((blocked != reg) && 1303 if ((((1 << reg) & blocked_mask) == 0) &&
1300 IsScratchLocation(Location::MachineRegisterLocation(kind, reg))) { 1304 IsScratchLocation(Location::MachineRegisterLocation(kind, reg))) {
1301 scratch = reg; 1305 scratch = reg;
1302 break; 1306 break;
1303 } 1307 }
1304 } 1308 }
1305 1309
1306 if (scratch == -1) { 1310 if (scratch == -1) {
1307 *spilled = true; 1311 *spilled = true;
1308 for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) { 1312 for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
1309 if (blocked != reg) { 1313 if (((1 << reg) & blocked_mask) == 0) {
1310 scratch = reg; 1314 scratch = reg;
1311 break; 1315 break;
1312 } 1316 }
1313 } 1317 }
1314 } else { 1318 } else {
1315 *spilled = false; 1319 *spilled = false;
1316 } 1320 }
1317 1321
1318 return scratch; 1322 return scratch;
1319 } 1323 }
1320 1324
1321 1325
1322 ParallelMoveResolver::ScratchFpuRegisterScope::ScratchFpuRegisterScope( 1326 ParallelMoveResolver::ScratchFpuRegisterScope::ScratchFpuRegisterScope(
1323 ParallelMoveResolver* resolver, FpuRegister blocked) 1327 ParallelMoveResolver* resolver, FpuRegister blocked)
1324 : resolver_(resolver), 1328 : resolver_(resolver),
1325 reg_(kNoFpuRegister), 1329 reg_(kNoFpuRegister),
1326 spilled_(false) { 1330 spilled_(false) {
1331 COMPILE_ASSERT(FpuTMP != kNoFpuRegister);
1332 uword blocked_mask = ((blocked != kNoFpuRegister) ? 1 << blocked : 0)
1333 | 1 << FpuTMP;
1327 reg_ = static_cast<FpuRegister>( 1334 reg_ = static_cast<FpuRegister>(
1328 resolver_->AllocateScratchRegister(Location::kFpuRegister, 1335 resolver_->AllocateScratchRegister(Location::kFpuRegister,
1329 blocked, 1336 blocked_mask,
1330 0, 1337 0,
1331 kNumberOfFpuRegisters - 1, 1338 kNumberOfFpuRegisters - 1,
1332 &spilled_)); 1339 &spilled_));
1333 1340
1334 if (spilled_) { 1341 if (spilled_) {
1335 resolver->SpillFpuScratch(reg_); 1342 resolver->SpillFpuScratch(reg_);
1336 } 1343 }
1337 } 1344 }
1338 1345
1339 1346
1340 ParallelMoveResolver::ScratchFpuRegisterScope::~ScratchFpuRegisterScope() { 1347 ParallelMoveResolver::ScratchFpuRegisterScope::~ScratchFpuRegisterScope() {
1341 if (spilled_) { 1348 if (spilled_) {
1342 resolver_->RestoreFpuScratch(reg_); 1349 resolver_->RestoreFpuScratch(reg_);
1343 } 1350 }
1344 } 1351 }
1345 1352
1346 1353
1347 ParallelMoveResolver::ScratchRegisterScope::ScratchRegisterScope( 1354 ParallelMoveResolver::ScratchRegisterScope::ScratchRegisterScope(
1348 ParallelMoveResolver* resolver, Register blocked) 1355 ParallelMoveResolver* resolver, Register blocked)
1349 : resolver_(resolver), 1356 : resolver_(resolver),
1350 reg_(kNoRegister), 1357 reg_(kNoRegister),
1351 spilled_(false) { 1358 spilled_(false) {
1359 uword blocked_mask = ((blocked != kNoRegister) ? 1 << blocked : 0)
1360 | 1 << CTX
1361 | 1 << SPREG
1362 | 1 << FPREG
1363 | ((TMP != kNoRegister) ? 1 << TMP : 0)
1364 | ((TMP2 != kNoRegister) ? 1 << TMP2 : 0)
1365 | ((PP != kNoRegister) ? 1 << PP : 0);
1352 reg_ = static_cast<Register>( 1366 reg_ = static_cast<Register>(
1353 resolver_->AllocateScratchRegister(Location::kRegister, 1367 resolver_->AllocateScratchRegister(Location::kRegister,
1354 blocked, 1368 blocked_mask,
1355 kFirstFreeCpuRegister, 1369 kFirstFreeCpuRegister,
1356 kLastFreeCpuRegister, 1370 kLastFreeCpuRegister,
1357 &spilled_)); 1371 &spilled_));
1358 1372
1359 if (spilled_) { 1373 if (spilled_) {
1360 resolver->SpillScratch(reg_); 1374 resolver->SpillScratch(reg_);
1361 } 1375 }
1362 } 1376 }
1363 1377
1364 1378
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1445 threshold = FLAG_optimization_counter_scale * basic_blocks + 1459 threshold = FLAG_optimization_counter_scale * basic_blocks +
1446 FLAG_min_optimization_counter_threshold; 1460 FLAG_min_optimization_counter_threshold;
1447 if (threshold > FLAG_optimization_counter_threshold) { 1461 if (threshold > FLAG_optimization_counter_threshold) {
1448 threshold = FLAG_optimization_counter_threshold; 1462 threshold = FLAG_optimization_counter_threshold;
1449 } 1463 }
1450 } 1464 }
1451 return threshold; 1465 return threshold;
1452 } 1466 }
1453 1467
1454 } // namespace dart 1468 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698