| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/interpreter/bytecode-array-builder.h" | 5 #include "src/interpreter/bytecode-array-builder.h" |
| 6 | 6 |
| 7 namespace v8 { | 7 namespace v8 { |
| 8 namespace internal { | 8 namespace internal { |
| 9 namespace interpreter { | 9 namespace interpreter { |
| 10 | 10 |
| (...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 981 return last_temporary_register().index(); | 981 return last_temporary_register().index(); |
| 982 } else { | 982 } else { |
| 983 auto pos = free_temporaries_.begin(); | 983 auto pos = free_temporaries_.begin(); |
| 984 int retval = *pos; | 984 int retval = *pos; |
| 985 free_temporaries_.erase(pos); | 985 free_temporaries_.erase(pos); |
| 986 return retval; | 986 return retval; |
| 987 } | 987 } |
| 988 } | 988 } |
| 989 | 989 |
| 990 | 990 |
| 991 int BytecodeArrayBuilder::BorrowTemporaryRegisterNotInRange(int start_index, |
| 992 int end_index) { |
| 993 auto index = free_temporaries_.lower_bound(start_index); |
| 994 if (index == free_temporaries_.begin()) { |
| 995 // If start_index is the first free register, check for a register |
| 996 // greater than end_index. |
| 997 index = free_temporaries_.upper_bound(end_index); |
| 998 if (index == free_temporaries_.end()) { |
| 999 temporary_register_count_ += 1; |
| 1000 return last_temporary_register().index(); |
| 1001 } |
| 1002 } else { |
| 1003 // If there is a free register < start_index |
| 1004 index--; |
| 1005 } |
| 1006 |
| 1007 int retval = *index; |
| 1008 free_temporaries_.erase(index); |
| 1009 return retval; |
| 1010 } |
| 1011 |
| 1012 |
| 1013 int BytecodeArrayBuilder::AllocateAndBorrowTemporaryRegister() { |
| 1014 temporary_register_count_ += 1; |
| 1015 return last_temporary_register().index(); |
| 1016 } |
| 1017 |
| 1018 |
| 991 void BytecodeArrayBuilder::BorrowConsecutiveTemporaryRegister(int reg_index) { | 1019 void BytecodeArrayBuilder::BorrowConsecutiveTemporaryRegister(int reg_index) { |
| 992 DCHECK(free_temporaries_.find(reg_index) != free_temporaries_.end()); | 1020 DCHECK(free_temporaries_.find(reg_index) != free_temporaries_.end()); |
| 993 free_temporaries_.erase(reg_index); | 1021 free_temporaries_.erase(reg_index); |
| 994 } | 1022 } |
| 995 | 1023 |
| 996 | 1024 |
| 997 void BytecodeArrayBuilder::ReturnTemporaryRegister(int reg_index) { | 1025 void BytecodeArrayBuilder::ReturnTemporaryRegister(int reg_index) { |
| 998 DCHECK(free_temporaries_.find(reg_index) == free_temporaries_.end()); | 1026 DCHECK(free_temporaries_.find(reg_index) == free_temporaries_.end()); |
| 999 free_temporaries_.insert(reg_index); | 1027 free_temporaries_.insert(reg_index); |
| 1000 } | 1028 } |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1392 | 1420 |
| 1393 TemporaryRegisterScope::~TemporaryRegisterScope() { | 1421 TemporaryRegisterScope::~TemporaryRegisterScope() { |
| 1394 for (auto i = allocated_.rbegin(); i != allocated_.rend(); i++) { | 1422 for (auto i = allocated_.rbegin(); i != allocated_.rend(); i++) { |
| 1395 builder_->ReturnTemporaryRegister(*i); | 1423 builder_->ReturnTemporaryRegister(*i); |
| 1396 } | 1424 } |
| 1397 allocated_.clear(); | 1425 allocated_.clear(); |
| 1398 } | 1426 } |
| 1399 | 1427 |
| 1400 | 1428 |
| 1401 Register TemporaryRegisterScope::NewRegister() { | 1429 Register TemporaryRegisterScope::NewRegister() { |
| 1402 int allocated = builder_->BorrowTemporaryRegister(); | 1430 int allocated = -1; |
| 1431 if (next_consecutive_count_ <= 0) { |
| 1432 allocated = builder_->BorrowTemporaryRegister(); |
| 1433 } else { |
| 1434 allocated = builder_->BorrowTemporaryRegisterNotInRange( |
| 1435 next_consecutive_register_, |
| 1436 next_consecutive_register_ + next_consecutive_count_ - 1); |
| 1437 } |
| 1403 allocated_.push_back(allocated); | 1438 allocated_.push_back(allocated); |
| 1404 return Register(allocated); | 1439 return Register(allocated); |
| 1405 } | 1440 } |
| 1441 |
| 1442 |
| 1443 Register TemporaryRegisterScope::AllocateNewRegister() { |
| 1444 int allocated = builder_->AllocateAndBorrowTemporaryRegister(); |
| 1445 allocated_.push_back(allocated); |
| 1446 return Register(allocated); |
| 1447 } |
| 1406 | 1448 |
| 1407 | 1449 |
| 1408 bool TemporaryRegisterScope::RegisterIsAllocatedInThisScope( | 1450 bool TemporaryRegisterScope::RegisterIsAllocatedInThisScope( |
| 1409 Register reg) const { | 1451 Register reg) const { |
| 1410 for (auto i = allocated_.begin(); i != allocated_.end(); i++) { | 1452 for (auto i = allocated_.begin(); i != allocated_.end(); i++) { |
| 1411 if (*i == reg.index()) return true; | 1453 if (*i == reg.index()) return true; |
| 1412 } | 1454 } |
| 1413 return false; | 1455 return false; |
| 1414 } | 1456 } |
| 1415 | 1457 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1428 DCHECK_GT(next_consecutive_count_, 0); | 1470 DCHECK_GT(next_consecutive_count_, 0); |
| 1429 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_); | 1471 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_); |
| 1430 allocated_.push_back(next_consecutive_register_); | 1472 allocated_.push_back(next_consecutive_register_); |
| 1431 next_consecutive_count_--; | 1473 next_consecutive_count_--; |
| 1432 return Register(next_consecutive_register_++); | 1474 return Register(next_consecutive_register_++); |
| 1433 } | 1475 } |
| 1434 | 1476 |
| 1435 } // namespace interpreter | 1477 } // namespace interpreter |
| 1436 } // namespace internal | 1478 } // namespace internal |
| 1437 } // namespace v8 | 1479 } // namespace v8 |
| OLD | NEW |