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

Side by Side Diff: src/interpreter/bytecode-array-builder.cc

Issue 1555713002: [Interpreter] Bytecodes for exchanging registers. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: One more test. Created 4 years, 11 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
OLDNEW
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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 372
373 373
374 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, 374 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from,
375 Register to) { 375 Register to) {
376 DCHECK(from != to); 376 DCHECK(from != to);
377 Output(Bytecode::kMov, from.ToOperand(), to.ToOperand()); 377 Output(Bytecode::kMov, from.ToOperand(), to.ToOperand());
378 return *this; 378 return *this;
379 } 379 }
380 380
381 381
382 BytecodeArrayBuilder& BytecodeArrayBuilder::ExchangeRegisters(Register a,
383 Register b) {
rmcilroy 2016/01/04 11:54:54 nit - a->lhs b->rhs (like .h file)
oth 2016/01/04 14:01:42 Done.
384 if (a != b) {
rmcilroy 2016/01/04 11:54:54 Should we ever call Exchange when the registers ar
oth 2016/01/04 14:01:42 Done.
385 if (FitsInReg8Operand(a)) {
386 Output(Bytecode::kExchange, a.ToOperand(), b.ToWideOperand());
387 } else if (FitsInReg8Operand(b)) {
388 Output(Bytecode::kExchange, b.ToOperand(), a.ToWideOperand());
389 } else {
390 Output(Bytecode::kExchangeWide, a.ToWideOperand(), b.ToWideOperand());
391 }
392 }
393 return *this;
394 }
395
396
382 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( 397 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal(
383 const Handle<String> name, int feedback_slot, LanguageMode language_mode, 398 const Handle<String> name, int feedback_slot, LanguageMode language_mode,
384 TypeofMode typeof_mode) { 399 TypeofMode typeof_mode) {
385 // TODO(rmcilroy): Potentially store language and typeof information in an 400 // TODO(rmcilroy): Potentially store language and typeof information in an
386 // operand rather than having extra bytecodes. 401 // operand rather than having extra bytecodes.
387 Bytecode bytecode = BytecodeForLoadGlobal(language_mode, typeof_mode); 402 Bytecode bytecode = BytecodeForLoadGlobal(language_mode, typeof_mode);
388 size_t name_index = GetConstantPoolEntry(name); 403 size_t name_index = GetConstantPoolEntry(name);
389 if (FitsInIdx8Operand(name_index) && FitsInIdx8Operand(feedback_slot)) { 404 if (FitsInIdx8Operand(name_index) && FitsInIdx8Operand(feedback_slot)) {
390 Output(bytecode, static_cast<uint8_t>(name_index), 405 Output(bytecode, static_cast<uint8_t>(name_index),
391 static_cast<uint8_t>(feedback_slot)); 406 static_cast<uint8_t>(feedback_slot));
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 return true; 1171 return true;
1157 } else if (reg.is_parameter()) { 1172 } else if (reg.is_parameter()) {
1158 int parameter_index = reg.ToParameterIndex(parameter_count_); 1173 int parameter_index = reg.ToParameterIndex(parameter_count_);
1159 return parameter_index >= 0 && parameter_index < parameter_count_; 1174 return parameter_index >= 0 && parameter_index < parameter_count_;
1160 } else if (reg.index() < fixed_register_count()) { 1175 } else if (reg.index() < fixed_register_count()) {
1161 return true; 1176 return true;
1162 } else { 1177 } else {
1163 return TemporaryRegisterIsLive(reg); 1178 return TemporaryRegisterIsLive(reg);
1164 } 1179 }
1165 } 1180 }
1181 case OperandType::kReg16: {
1182 if (bytecode != Bytecode::kExchange &&
1183 bytecode != Bytecode::kExchangeWide) {
1184 return false;
1185 }
1186 Register reg =
1187 Register::FromWideOperand(static_cast<uint16_t>(operand_value));
1188 if (reg.is_function_context() || reg.is_function_closure() ||
1189 reg.is_new_target()) {
rmcilroy 2016/01/04 11:54:53 Do we ever want to allow exchanges of these regist
oth 2016/01/04 14:01:42 Done.
1190 return true;
1191 } else if (reg.is_parameter()) {
1192 int parameter_index = reg.ToParameterIndex(parameter_count_);
1193 return parameter_index >= 0 && parameter_index < parameter_count_;
1194 } else if (reg.index() < fixed_register_count()) {
1195 return true;
1196 } else {
1197 return TemporaryRegisterIsLive(reg);
1198 }
1199 }
1166 } 1200 }
1167 UNREACHABLE(); 1201 UNREACHABLE();
1168 return false; 1202 return false;
1169 } 1203 }
1170 1204
1171 1205
1172 bool BytecodeArrayBuilder::LastBytecodeInSameBlock() const { 1206 bool BytecodeArrayBuilder::LastBytecodeInSameBlock() const {
1173 return last_bytecode_start_ < bytecodes()->size() && 1207 return last_bytecode_start_ < bytecodes()->size() &&
1174 last_bytecode_start_ >= last_block_end_; 1208 last_bytecode_start_ >= last_block_end_;
1175 } 1209 }
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 1495
1462 1496
1463 // static 1497 // static
1464 bool BytecodeArrayBuilder::FitsInIdx8Operand(size_t value) { 1498 bool BytecodeArrayBuilder::FitsInIdx8Operand(size_t value) {
1465 return value <= static_cast<size_t>(kMaxUInt8); 1499 return value <= static_cast<size_t>(kMaxUInt8);
1466 } 1500 }
1467 1501
1468 1502
1469 // static 1503 // static
1470 bool BytecodeArrayBuilder::FitsInImm8Operand(int value) { 1504 bool BytecodeArrayBuilder::FitsInImm8Operand(int value) {
1471 return kMinInt8 <= value && value < kMaxInt8; 1505 return kMinInt8 <= value && value <= kMaxInt8;
1472 } 1506 }
1473 1507
1474 1508
1475 // static 1509 // static
1476 bool BytecodeArrayBuilder::FitsInIdx16Operand(int value) { 1510 bool BytecodeArrayBuilder::FitsInIdx16Operand(int value) {
1477 return kMinUInt16 <= value && value <= kMaxUInt16; 1511 return kMinUInt16 <= value && value <= kMaxUInt16;
1478 } 1512 }
1479 1513
1480 1514
1481 // static 1515 // static
1482 bool BytecodeArrayBuilder::FitsInIdx16Operand(size_t value) { 1516 bool BytecodeArrayBuilder::FitsInIdx16Operand(size_t value) {
1483 return value <= static_cast<size_t>(kMaxUInt16); 1517 return value <= static_cast<size_t>(kMaxUInt16);
1484 } 1518 }
1485 1519
1486 1520
1521 // static
1522 bool BytecodeArrayBuilder::FitsInReg8Operand(Register value) {
1523 return kMinInt8 <= value.index() && value.index() <= kMaxInt8;
1524 }
1525
1526
1527 // static
1528 bool BytecodeArrayBuilder::FitsInReg16Operand(Register value) {
1529 return kMinInt16 <= value.index() && value.index() <= kMaxInt16;
1530 }
1531
1532
1487 TemporaryRegisterScope::TemporaryRegisterScope(BytecodeArrayBuilder* builder) 1533 TemporaryRegisterScope::TemporaryRegisterScope(BytecodeArrayBuilder* builder)
1488 : builder_(builder), 1534 : builder_(builder),
1489 allocated_(builder->zone()), 1535 allocated_(builder->zone()),
1490 next_consecutive_register_(-1), 1536 next_consecutive_register_(-1),
1491 next_consecutive_count_(-1) {} 1537 next_consecutive_count_(-1) {}
1492 1538
1493 1539
1494 TemporaryRegisterScope::~TemporaryRegisterScope() { 1540 TemporaryRegisterScope::~TemporaryRegisterScope() {
1495 for (auto i = allocated_.rbegin(); i != allocated_.rend(); i++) { 1541 for (auto i = allocated_.rbegin(); i != allocated_.rend(); i++) {
1496 builder_->ReturnTemporaryRegister(*i); 1542 builder_->ReturnTemporaryRegister(*i);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 DCHECK_GT(next_consecutive_count_, 0); 1589 DCHECK_GT(next_consecutive_count_, 0);
1544 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_); 1590 builder_->BorrowConsecutiveTemporaryRegister(next_consecutive_register_);
1545 allocated_.push_back(next_consecutive_register_); 1591 allocated_.push_back(next_consecutive_register_);
1546 next_consecutive_count_--; 1592 next_consecutive_count_--;
1547 return Register(next_consecutive_register_++); 1593 return Register(next_consecutive_register_++);
1548 } 1594 }
1549 1595
1550 } // namespace interpreter 1596 } // namespace interpreter
1551 } // namespace internal 1597 } // namespace internal
1552 } // namespace v8 1598 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698