| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |