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

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

Issue 1688283003: [Interpreter] Implements calls through CallICStub in the interpreter. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: removes an unused label declaration. Created 4 years, 10 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-generator.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 #include "src/compiler.h" 6 #include "src/compiler.h"
7 7
8 namespace v8 { 8 namespace v8 {
9 namespace internal { 9 namespace internal {
10 namespace interpreter { 10 namespace interpreter {
(...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 } 1052 }
1053 1053
1054 void BytecodeArrayBuilder::EnsureReturn(FunctionLiteral* literal) { 1054 void BytecodeArrayBuilder::EnsureReturn(FunctionLiteral* literal) {
1055 if (!exit_seen_in_block_) { 1055 if (!exit_seen_in_block_) {
1056 LoadUndefined(); 1056 LoadUndefined();
1057 SetReturnPosition(literal); 1057 SetReturnPosition(literal);
1058 Return(); 1058 Return();
1059 } 1059 }
1060 } 1060 }
1061 1061
1062 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, 1062 BytecodeArrayBuilder& BytecodeArrayBuilder::CallIC(
1063 Register receiver_args, 1063 Register callable, Register receiver_args, size_t receiver_args_count,
1064 size_t receiver_args_count, 1064 int feedback_slot, TailCallMode tail_call_mode) {
1065 int feedback_slot, 1065 Bytecode bytecode = BytecodeForCallIC(tail_call_mode);
1066 TailCallMode tail_call_mode) {
1067 Bytecode bytecode = BytecodeForCall(tail_call_mode);
1068 if (FitsInReg8Operand(callable) && FitsInReg8Operand(receiver_args) && 1066 if (FitsInReg8Operand(callable) && FitsInReg8Operand(receiver_args) &&
1069 FitsInIdx8Operand(receiver_args_count) && 1067 FitsInIdx8Operand(receiver_args_count) &&
1070 FitsInIdx8Operand(feedback_slot)) { 1068 FitsInIdx8Operand(feedback_slot)) {
1071 Output(bytecode, callable.ToRawOperand(), receiver_args.ToRawOperand(), 1069 Output(bytecode, callable.ToRawOperand(), receiver_args.ToRawOperand(),
1072 static_cast<uint8_t>(receiver_args_count), 1070 static_cast<uint8_t>(receiver_args_count),
1073 static_cast<uint8_t>(feedback_slot)); 1071 static_cast<uint8_t>(feedback_slot));
1074 } else if (FitsInReg16Operand(callable) && 1072 } else if (FitsInReg16Operand(callable) &&
1075 FitsInReg16Operand(receiver_args) && 1073 FitsInReg16Operand(receiver_args) &&
1076 FitsInIdx16Operand(receiver_args_count) && 1074 FitsInIdx16Operand(receiver_args_count) &&
1077 FitsInIdx16Operand(feedback_slot)) { 1075 FitsInIdx16Operand(feedback_slot)) {
1078 bytecode = BytecodeForWideOperands(bytecode); 1076 bytecode = BytecodeForWideOperands(bytecode);
1079 Output(bytecode, callable.ToRawOperand(), receiver_args.ToRawOperand(), 1077 Output(bytecode, callable.ToRawOperand(), receiver_args.ToRawOperand(),
1080 static_cast<uint16_t>(receiver_args_count), 1078 static_cast<uint16_t>(receiver_args_count),
1081 static_cast<uint16_t>(feedback_slot)); 1079 static_cast<uint16_t>(feedback_slot));
1082 } else { 1080 } else {
1083 UNIMPLEMENTED(); 1081 UNIMPLEMENTED();
1084 } 1082 }
1085 return *this; 1083 return *this;
1086 } 1084 }
1087 1085
1086 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable,
1087 Register receiver_args,
1088 size_t receiver_args_count,
1089 TailCallMode tail_call_mode) {
1090 Bytecode bytecode = BytecodeForCall(tail_call_mode);
1091 if (FitsInReg8Operand(callable) && FitsInReg8Operand(receiver_args) &&
1092 FitsInIdx8Operand(receiver_args_count)) {
1093 Output(bytecode, callable.ToRawOperand(), receiver_args.ToRawOperand(),
1094 static_cast<uint8_t>(receiver_args_count));
1095 } else if (FitsInReg16Operand(callable) &&
1096 FitsInReg16Operand(receiver_args) &&
1097 FitsInIdx16Operand(receiver_args_count)) {
1098 bytecode = BytecodeForWideOperands(bytecode);
1099 Output(bytecode, callable.ToRawOperand(), receiver_args.ToRawOperand(),
1100 static_cast<uint16_t>(receiver_args_count));
1101 } else {
1102 UNIMPLEMENTED();
1103 }
1104 return *this;
1105 }
1088 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, 1106 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor,
1089 Register first_arg, 1107 Register first_arg,
1090 size_t arg_count) { 1108 size_t arg_count) {
1091 if (!first_arg.is_valid()) { 1109 if (!first_arg.is_valid()) {
1092 DCHECK_EQ(0u, arg_count); 1110 DCHECK_EQ(0u, arg_count);
1093 first_arg = Register(0); 1111 first_arg = Register(0);
1094 } 1112 }
1095 if (FitsInReg8Operand(constructor) && FitsInReg8Operand(first_arg) && 1113 if (FitsInReg8Operand(constructor) && FitsInReg8Operand(first_arg) &&
1096 FitsInIdx8Operand(arg_count)) { 1114 FitsInIdx8Operand(arg_count)) {
1097 Output(Bytecode::kNew, constructor.ToRawOperand(), first_arg.ToRawOperand(), 1115 Output(Bytecode::kNew, constructor.ToRawOperand(), first_arg.ToRawOperand(),
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 default: 1437 default:
1420 UNREACHABLE(); 1438 UNREACHABLE();
1421 return static_cast<Bytecode>(-1); 1439 return static_cast<Bytecode>(-1);
1422 } 1440 }
1423 } 1441 }
1424 1442
1425 1443
1426 // static 1444 // static
1427 Bytecode BytecodeArrayBuilder::BytecodeForWideOperands(Bytecode bytecode) { 1445 Bytecode BytecodeArrayBuilder::BytecodeForWideOperands(Bytecode bytecode) {
1428 switch (bytecode) { 1446 switch (bytecode) {
1447 case Bytecode::kCallIC:
1448 return Bytecode::kCallICWide;
1449 case Bytecode::kTailCallIC:
1450 return Bytecode::kTailCallICWide;
1429 case Bytecode::kCall: 1451 case Bytecode::kCall:
1430 return Bytecode::kCallWide; 1452 return Bytecode::kCallWide;
1431 case Bytecode::kTailCall: 1453 case Bytecode::kTailCall:
1432 return Bytecode::kTailCallWide; 1454 return Bytecode::kTailCallWide;
1433 case Bytecode::kLoadIC: 1455 case Bytecode::kLoadIC:
1434 return Bytecode::kLoadICWide; 1456 return Bytecode::kLoadICWide;
1435 case Bytecode::kKeyedLoadIC: 1457 case Bytecode::kKeyedLoadIC:
1436 return Bytecode::kKeyedLoadICWide; 1458 return Bytecode::kKeyedLoadICWide;
1437 case Bytecode::kStoreICSloppy: 1459 case Bytecode::kStoreICSloppy:
1438 return Bytecode::kStoreICSloppyWide; 1460 return Bytecode::kStoreICSloppyWide;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 return Bytecode::kDeletePropertyStrict; 1585 return Bytecode::kDeletePropertyStrict;
1564 case STRONG: 1586 case STRONG:
1565 UNIMPLEMENTED(); 1587 UNIMPLEMENTED();
1566 default: 1588 default:
1567 UNREACHABLE(); 1589 UNREACHABLE();
1568 } 1590 }
1569 return static_cast<Bytecode>(-1); 1591 return static_cast<Bytecode>(-1);
1570 } 1592 }
1571 1593
1572 // static 1594 // static
1595 Bytecode BytecodeArrayBuilder::BytecodeForCallIC(TailCallMode tail_call_mode) {
1596 switch (tail_call_mode) {
1597 case TailCallMode::kDisallow:
1598 return Bytecode::kCallIC;
1599 case TailCallMode::kAllow:
1600 return Bytecode::kTailCallIC;
1601 default:
1602 UNREACHABLE();
1603 }
1604 return static_cast<Bytecode>(-1);
1605 }
1606
1607 // static
1573 Bytecode BytecodeArrayBuilder::BytecodeForCall(TailCallMode tail_call_mode) { 1608 Bytecode BytecodeArrayBuilder::BytecodeForCall(TailCallMode tail_call_mode) {
1574 switch (tail_call_mode) { 1609 switch (tail_call_mode) {
1575 case TailCallMode::kDisallow: 1610 case TailCallMode::kDisallow:
1576 return Bytecode::kCall; 1611 return Bytecode::kCall;
1577 case TailCallMode::kAllow: 1612 case TailCallMode::kAllow:
1578 return Bytecode::kTailCall; 1613 return Bytecode::kTailCall;
1579 default: 1614 default:
1580 UNREACHABLE(); 1615 UNREACHABLE();
1581 } 1616 }
1582 return static_cast<Bytecode>(-1); 1617 return static_cast<Bytecode>(-1);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1629 } 1664 }
1630 1665
1631 // static 1666 // static
1632 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) { 1667 bool BytecodeArrayBuilder::FitsInReg16OperandUntranslated(Register value) {
1633 return value.is_short_operand(); 1668 return value.is_short_operand();
1634 } 1669 }
1635 1670
1636 } // namespace interpreter 1671 } // namespace interpreter
1637 } // namespace internal 1672 } // namespace internal
1638 } // namespace v8 1673 } // namespace v8
OLDNEW
« no previous file with comments | « src/interpreter/bytecode-array-builder.h ('k') | src/interpreter/bytecode-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698