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

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

Issue 1633153002: [interpreter] Reduce move operations for wide register support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove RegisterOperandIsMovable from RegisterMover interface 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
« no previous file with comments | « src/interpreter/bytecode-array-builder.h ('k') | src/interpreter/bytecode-array-iterator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 RegisterIsValid(to, OperandType::kReg16)); 394 RegisterIsValid(to, OperandType::kReg16));
395 } else if (FitsInReg8OperandUntranslated(to)) { 395 } else if (FitsInReg8OperandUntranslated(to)) {
396 CHECK(RegisterIsValid(from, OperandType::kReg16) && 396 CHECK(RegisterIsValid(from, OperandType::kReg16) &&
397 RegisterIsValid(to, OperandType::kReg8)); 397 RegisterIsValid(to, OperandType::kReg8));
398 } else { 398 } else {
399 UNIMPLEMENTED(); 399 UNIMPLEMENTED();
400 } 400 }
401 Output(Bytecode::kMovWide, from.ToRawOperand(), to.ToRawOperand()); 401 Output(Bytecode::kMovWide, from.ToRawOperand(), to.ToRawOperand());
402 } 402 }
403 403
404 bool BytecodeArrayBuilder::RegisterOperandIsMovable(Bytecode bytecode,
405 int operand_index) {
406 // By design, we only support moving individual registers. There
407 // should be wide variants of such bytecodes instead to avoid the
408 // need for a large translation window.
409 OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index);
410 if (operand_type != OperandType::kReg8 &&
411 operand_type != OperandType::kReg16) {
412 return false;
413 } else if (operand_index + 1 == Bytecodes::NumberOfOperands(bytecode)) {
414 return true;
415 } else {
416 OperandType next_operand_type =
417 Bytecodes::GetOperandType(bytecode, operand_index + 1);
418 return (next_operand_type != OperandType::kRegCount8 &&
419 next_operand_type != OperandType::kRegCount16);
420 }
421 }
422
423 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( 404 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal(
424 const Handle<String> name, int feedback_slot, LanguageMode language_mode, 405 const Handle<String> name, int feedback_slot, LanguageMode language_mode,
425 TypeofMode typeof_mode) { 406 TypeofMode typeof_mode) {
426 // TODO(rmcilroy): Potentially store language and typeof information in an 407 // TODO(rmcilroy): Potentially store language and typeof information in an
427 // operand rather than having extra bytecodes. 408 // operand rather than having extra bytecodes.
428 Bytecode bytecode = BytecodeForLoadGlobal(language_mode, typeof_mode); 409 Bytecode bytecode = BytecodeForLoadGlobal(language_mode, typeof_mode);
429 size_t name_index = GetConstantPoolEntry(name); 410 size_t name_index = GetConstantPoolEntry(name);
430 if (FitsInIdx8Operand(name_index) && FitsInIdx8Operand(feedback_slot)) { 411 if (FitsInIdx8Operand(name_index) && FitsInIdx8Operand(feedback_slot)) {
431 Output(bytecode, static_cast<uint8_t>(name_index), 412 Output(bytecode, static_cast<uint8_t>(name_index),
432 static_cast<uint8_t>(feedback_slot)); 413 static_cast<uint8_t>(feedback_slot));
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 return static_cast<uint16_t>(operand_value) == operand_value; 1387 return static_cast<uint16_t>(operand_value) == operand_value;
1407 case OperandType::kImm8: 1388 case OperandType::kImm8:
1408 case OperandType::kIdx8: 1389 case OperandType::kIdx8:
1409 return static_cast<uint8_t>(operand_value) == operand_value; 1390 return static_cast<uint8_t>(operand_value) == operand_value;
1410 case OperandType::kMaybeReg8: 1391 case OperandType::kMaybeReg8:
1411 if (operand_value == 0) { 1392 if (operand_value == 0) {
1412 return true; 1393 return true;
1413 } 1394 }
1414 // Fall-through to kReg8 case. 1395 // Fall-through to kReg8 case.
1415 case OperandType::kReg8: 1396 case OperandType::kReg8:
1397 case OperandType::kRegOut8:
1416 return RegisterIsValid(Register::FromRawOperand(operand_value), 1398 return RegisterIsValid(Register::FromRawOperand(operand_value),
1417 operand_type); 1399 operand_type);
1400 case OperandType::kRegOutPair8:
1401 case OperandType::kRegOutPair16:
1418 case OperandType::kRegPair8: 1402 case OperandType::kRegPair8:
1419 case OperandType::kRegPair16: { 1403 case OperandType::kRegPair16: {
1420 Register reg0 = Register::FromRawOperand(operand_value); 1404 Register reg0 = Register::FromRawOperand(operand_value);
1421 Register reg1 = Register(reg0.index() + 1); 1405 Register reg1 = Register(reg0.index() + 1);
1422 return RegisterIsValid(reg0, operand_type) && 1406 return RegisterIsValid(reg0, operand_type) &&
1423 RegisterIsValid(reg1, operand_type); 1407 RegisterIsValid(reg1, operand_type);
1424 } 1408 }
1425 case OperandType::kRegTriple8: 1409 case OperandType::kRegOutTriple8:
1426 case OperandType::kRegTriple16: { 1410 case OperandType::kRegOutTriple16: {
1427 Register reg0 = Register::FromRawOperand(operand_value); 1411 Register reg0 = Register::FromRawOperand(operand_value);
1428 Register reg1 = Register(reg0.index() + 1); 1412 Register reg1 = Register(reg0.index() + 1);
1429 Register reg2 = Register(reg0.index() + 2); 1413 Register reg2 = Register(reg0.index() + 2);
1430 return RegisterIsValid(reg0, operand_type) && 1414 return RegisterIsValid(reg0, operand_type) &&
1431 RegisterIsValid(reg1, operand_type) && 1415 RegisterIsValid(reg1, operand_type) &&
1432 RegisterIsValid(reg2, operand_type); 1416 RegisterIsValid(reg2, operand_type);
1433 } 1417 }
1434 case OperandType::kMaybeReg16: 1418 case OperandType::kMaybeReg16:
1435 if (operand_value == 0) { 1419 if (operand_value == 0) {
1436 return true; 1420 return true;
1437 } 1421 }
1438 // Fall-through to kReg16 case. 1422 // Fall-through to kReg16 case.
1439 case OperandType::kReg16: { 1423 case OperandType::kReg16:
1424 case OperandType::kRegOut16: {
1440 Register reg = Register::FromRawOperand(operand_value); 1425 Register reg = Register::FromRawOperand(operand_value);
1441 return RegisterIsValid(reg, operand_type); 1426 return RegisterIsValid(reg, operand_type);
1442 } 1427 }
1443 } 1428 }
1444 UNREACHABLE(); 1429 UNREACHABLE();
1445 return false; 1430 return false;
1446 } 1431 }
1447 1432
1448 1433
1449 bool BytecodeArrayBuilder::RegisterIsValid(Register reg, 1434 bool BytecodeArrayBuilder::RegisterIsValid(Register reg,
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1828 } 1813 }
1829 1814
1830 // static 1815 // static
1831 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { 1816 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) {
1832 return value.is_short_operand(); 1817 return value.is_short_operand();
1833 } 1818 }
1834 1819
1835 } // namespace interpreter 1820 } // namespace interpreter
1836 } // namespace internal 1821 } // namespace internal
1837 } // namespace v8 1822 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-array-builder.h ('k') | src/interpreter/bytecode-array-iterator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698