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/compiler/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
6 | 6 |
7 #include "src/compiler/bytecode-branch-analysis.h" | 7 #include "src/compiler/bytecode-branch-analysis.h" |
8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
9 #include "src/compiler/operator-properties.h" | 9 #include "src/compiler/operator-properties.h" |
10 #include "src/interpreter/bytecodes.h" | 10 #include "src/interpreter/bytecodes.h" |
(...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 | 1043 |
1044 void BytecodeGraphBuilder::BuildCall() { | 1044 void BytecodeGraphBuilder::BuildCall() { |
1045 FrameStateBeforeAndAfter states(this); | 1045 FrameStateBeforeAndAfter states(this); |
1046 // TODO(rmcilroy): Set receiver_hint correctly based on whether the receiver | 1046 // TODO(rmcilroy): Set receiver_hint correctly based on whether the receiver |
1047 // register has been loaded with null / undefined explicitly or we are sure it | 1047 // register has been loaded with null / undefined explicitly or we are sure it |
1048 // is not null / undefined. | 1048 // is not null / undefined. |
1049 ConvertReceiverMode receiver_hint = ConvertReceiverMode::kAny; | 1049 ConvertReceiverMode receiver_hint = ConvertReceiverMode::kAny; |
1050 Node* callee = | 1050 Node* callee = |
1051 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); | 1051 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
1052 interpreter::Register receiver = bytecode_iterator().GetRegisterOperand(1); | 1052 interpreter::Register receiver = bytecode_iterator().GetRegisterOperand(1); |
1053 size_t arg_count = bytecode_iterator().GetCountOperand(2); | 1053 size_t arg_count = bytecode_iterator().GetRegisterCountOperand(2); |
1054 VectorSlotPair feedback = | 1054 VectorSlotPair feedback = |
1055 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(3)); | 1055 CreateVectorSlotPair(bytecode_iterator().GetIndexOperand(3)); |
1056 | 1056 |
1057 // TODO(ishell): provide correct tail_call_mode value to CallFunction. | 1057 // TODO(ishell): provide correct tail_call_mode value to CallFunction. |
1058 const Operator* call = javascript()->CallFunction( | 1058 const Operator* call = javascript()->CallFunction( |
1059 arg_count + 1, language_mode(), feedback, receiver_hint); | 1059 arg_count + 1, language_mode(), feedback, receiver_hint); |
1060 Node* value = ProcessCallArguments(call, callee, receiver, arg_count + 1); | 1060 Node* value = ProcessCallArguments(call, callee, receiver, arg_count + 1); |
1061 environment()->BindAccumulator(value, &states); | 1061 environment()->BindAccumulator(value, &states); |
1062 } | 1062 } |
1063 | 1063 |
1064 void BytecodeGraphBuilder::VisitCall() { BuildCall(); } | 1064 void BytecodeGraphBuilder::VisitCall() { BuildCall(); } |
1065 | 1065 |
1066 void BytecodeGraphBuilder::VisitCallWide() { BuildCall(); } | 1066 void BytecodeGraphBuilder::VisitCallWide() { BuildCall(); } |
1067 | 1067 |
1068 void BytecodeGraphBuilder::BuildCallJSRuntime() { | 1068 void BytecodeGraphBuilder::BuildCallJSRuntime() { |
1069 FrameStateBeforeAndAfter states(this); | 1069 FrameStateBeforeAndAfter states(this); |
1070 Node* callee = | 1070 Node* callee = |
1071 BuildLoadNativeContextField(bytecode_iterator().GetIndexOperand(0)); | 1071 BuildLoadNativeContextField(bytecode_iterator().GetIndexOperand(0)); |
1072 interpreter::Register receiver = bytecode_iterator().GetRegisterOperand(1); | 1072 interpreter::Register receiver = bytecode_iterator().GetRegisterOperand(1); |
1073 size_t arg_count = bytecode_iterator().GetCountOperand(2); | 1073 size_t arg_count = bytecode_iterator().GetRegisterCountOperand(2); |
1074 | 1074 |
1075 // Create node to perform the JS runtime call. | 1075 // Create node to perform the JS runtime call. |
1076 const Operator* call = | 1076 const Operator* call = |
1077 javascript()->CallFunction(arg_count + 1, language_mode()); | 1077 javascript()->CallFunction(arg_count + 1, language_mode()); |
1078 Node* value = ProcessCallArguments(call, callee, receiver, arg_count + 1); | 1078 Node* value = ProcessCallArguments(call, callee, receiver, arg_count + 1); |
1079 environment()->BindAccumulator(value, &states); | 1079 environment()->BindAccumulator(value, &states); |
1080 } | 1080 } |
1081 | 1081 |
1082 void BytecodeGraphBuilder::VisitCallJSRuntime() { BuildCallJSRuntime(); } | 1082 void BytecodeGraphBuilder::VisitCallJSRuntime() { BuildCallJSRuntime(); } |
1083 | 1083 |
(...skipping 10 matching lines...) Expand all Loading... |
1094 } | 1094 } |
1095 Node* value = MakeNode(call_runtime_op, static_cast<int>(arity), all, false); | 1095 Node* value = MakeNode(call_runtime_op, static_cast<int>(arity), all, false); |
1096 return value; | 1096 return value; |
1097 } | 1097 } |
1098 | 1098 |
1099 void BytecodeGraphBuilder::BuildCallRuntime() { | 1099 void BytecodeGraphBuilder::BuildCallRuntime() { |
1100 FrameStateBeforeAndAfter states(this); | 1100 FrameStateBeforeAndAfter states(this); |
1101 Runtime::FunctionId functionId = | 1101 Runtime::FunctionId functionId = |
1102 static_cast<Runtime::FunctionId>(bytecode_iterator().GetIndexOperand(0)); | 1102 static_cast<Runtime::FunctionId>(bytecode_iterator().GetIndexOperand(0)); |
1103 interpreter::Register first_arg = bytecode_iterator().GetRegisterOperand(1); | 1103 interpreter::Register first_arg = bytecode_iterator().GetRegisterOperand(1); |
1104 size_t arg_count = bytecode_iterator().GetCountOperand(2); | 1104 size_t arg_count = bytecode_iterator().GetRegisterCountOperand(2); |
1105 | 1105 |
1106 // Create node to perform the runtime call. | 1106 // Create node to perform the runtime call. |
1107 const Operator* call = javascript()->CallRuntime(functionId, arg_count); | 1107 const Operator* call = javascript()->CallRuntime(functionId, arg_count); |
1108 Node* value = ProcessCallRuntimeArguments(call, first_arg, arg_count); | 1108 Node* value = ProcessCallRuntimeArguments(call, first_arg, arg_count); |
1109 environment()->BindAccumulator(value, &states); | 1109 environment()->BindAccumulator(value, &states); |
1110 } | 1110 } |
1111 | 1111 |
1112 void BytecodeGraphBuilder::VisitCallRuntime() { BuildCallRuntime(); } | 1112 void BytecodeGraphBuilder::VisitCallRuntime() { BuildCallRuntime(); } |
1113 | 1113 |
1114 void BytecodeGraphBuilder::VisitCallRuntimeWide() { BuildCallRuntime(); } | 1114 void BytecodeGraphBuilder::VisitCallRuntimeWide() { BuildCallRuntime(); } |
1115 | 1115 |
1116 void BytecodeGraphBuilder::BuildCallRuntimeForPair() { | 1116 void BytecodeGraphBuilder::BuildCallRuntimeForPair() { |
1117 FrameStateBeforeAndAfter states(this); | 1117 FrameStateBeforeAndAfter states(this); |
1118 Runtime::FunctionId functionId = | 1118 Runtime::FunctionId functionId = |
1119 static_cast<Runtime::FunctionId>(bytecode_iterator().GetIndexOperand(0)); | 1119 static_cast<Runtime::FunctionId>(bytecode_iterator().GetIndexOperand(0)); |
1120 interpreter::Register first_arg = bytecode_iterator().GetRegisterOperand(1); | 1120 interpreter::Register first_arg = bytecode_iterator().GetRegisterOperand(1); |
1121 size_t arg_count = bytecode_iterator().GetCountOperand(2); | 1121 size_t arg_count = bytecode_iterator().GetRegisterCountOperand(2); |
1122 interpreter::Register first_return = | 1122 interpreter::Register first_return = |
1123 bytecode_iterator().GetRegisterOperand(3); | 1123 bytecode_iterator().GetRegisterOperand(3); |
1124 | 1124 |
1125 // Create node to perform the runtime call. | 1125 // Create node to perform the runtime call. |
1126 const Operator* call = javascript()->CallRuntime(functionId, arg_count); | 1126 const Operator* call = javascript()->CallRuntime(functionId, arg_count); |
1127 Node* return_pair = ProcessCallRuntimeArguments(call, first_arg, arg_count); | 1127 Node* return_pair = ProcessCallRuntimeArguments(call, first_arg, arg_count); |
1128 environment()->BindRegistersToProjections(first_return, return_pair, &states); | 1128 environment()->BindRegistersToProjections(first_return, return_pair, &states); |
1129 } | 1129 } |
1130 | 1130 |
1131 void BytecodeGraphBuilder::VisitCallRuntimeForPair() { | 1131 void BytecodeGraphBuilder::VisitCallRuntimeForPair() { |
(...skipping 18 matching lines...) Expand all Loading... |
1150 // Original constructor is the same as the callee. | 1150 // Original constructor is the same as the callee. |
1151 all[arity - 1] = environment()->LookupRegister(callee); | 1151 all[arity - 1] = environment()->LookupRegister(callee); |
1152 Node* value = MakeNode(call_new_op, static_cast<int>(arity), all, false); | 1152 Node* value = MakeNode(call_new_op, static_cast<int>(arity), all, false); |
1153 return value; | 1153 return value; |
1154 } | 1154 } |
1155 | 1155 |
1156 void BytecodeGraphBuilder::BuildCallConstruct() { | 1156 void BytecodeGraphBuilder::BuildCallConstruct() { |
1157 FrameStateBeforeAndAfter states(this); | 1157 FrameStateBeforeAndAfter states(this); |
1158 interpreter::Register callee = bytecode_iterator().GetRegisterOperand(0); | 1158 interpreter::Register callee = bytecode_iterator().GetRegisterOperand(0); |
1159 interpreter::Register first_arg = bytecode_iterator().GetRegisterOperand(1); | 1159 interpreter::Register first_arg = bytecode_iterator().GetRegisterOperand(1); |
1160 size_t arg_count = bytecode_iterator().GetCountOperand(2); | 1160 size_t arg_count = bytecode_iterator().GetRegisterCountOperand(2); |
1161 | 1161 |
1162 // TODO(turbofan): Pass the feedback here. | 1162 // TODO(turbofan): Pass the feedback here. |
1163 const Operator* call = javascript()->CallConstruct( | 1163 const Operator* call = javascript()->CallConstruct( |
1164 static_cast<int>(arg_count) + 2, VectorSlotPair()); | 1164 static_cast<int>(arg_count) + 2, VectorSlotPair()); |
1165 Node* value = ProcessCallNewArguments(call, callee, first_arg, arg_count + 2); | 1165 Node* value = ProcessCallNewArguments(call, callee, first_arg, arg_count + 2); |
1166 environment()->BindAccumulator(value, &states); | 1166 environment()->BindAccumulator(value, &states); |
1167 } | 1167 } |
1168 | 1168 |
1169 void BytecodeGraphBuilder::VisitNew() { BuildCallConstruct(); } | 1169 void BytecodeGraphBuilder::VisitNew() { BuildCallConstruct(); } |
1170 | 1170 |
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1794 // Phi does not exist yet, introduce one. | 1794 // Phi does not exist yet, introduce one. |
1795 value = NewPhi(inputs, value, control); | 1795 value = NewPhi(inputs, value, control); |
1796 value->ReplaceInput(inputs - 1, other); | 1796 value->ReplaceInput(inputs - 1, other); |
1797 } | 1797 } |
1798 return value; | 1798 return value; |
1799 } | 1799 } |
1800 | 1800 |
1801 } // namespace compiler | 1801 } // namespace compiler |
1802 } // namespace internal | 1802 } // namespace internal |
1803 } // namespace v8 | 1803 } // namespace v8 |
OLD | NEW |