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