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

Unified Diff: src/interpreter/interpreter-intrinsics.cc

Issue 2019433003: [Interpreter] Add intrinsic for Runtime::kInlineCall. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: src/interpreter/interpreter-intrinsics.cc
diff --git a/src/interpreter/interpreter-intrinsics.cc b/src/interpreter/interpreter-intrinsics.cc
index 6d9917de4faca4988ba71c0847c15a5a07e4eabc..7a4abd0fcaf394e1e1cd08507e61aa8c074593c4 100644
--- a/src/interpreter/interpreter-intrinsics.cc
+++ b/src/interpreter/interpreter-intrinsics.cc
@@ -49,10 +49,10 @@ Node* IntrinsicsHelper::InvokeIntrinsic(Node* function_id, Node* context,
__ Switch(function_id, &abort, cases, labels, arraysize(cases));
#define HANDLE_CASE(name, lower_case, expected_arg_count) \
__ Bind(&lower_case); \
- if (FLAG_debug_code) { \
+ if (FLAG_debug_code && expected_arg_count >= 0) { \
AbortIfArgCountMismatch(expected_arg_count, arg_count); \
} \
- result.Bind(name(first_arg_reg)); \
+ result.Bind(name(first_arg_reg, arg_count, context)); \
__ Goto(&end);
INTRINSICS_LIST(HANDLE_CASE)
#undef HANDLE_CASE
@@ -96,7 +96,8 @@ Node* IntrinsicsHelper::CompareInstanceType(Node* map, int type,
return return_value.value();
}
-Node* IntrinsicsHelper::IsJSReceiver(Node* input) {
+Node* IntrinsicsHelper::IsJSReceiver(Node* input, Node* arg_count,
+ Node* context) {
InterpreterAssembler::Variable return_value(assembler_,
MachineRepresentation::kTagged);
@@ -119,7 +120,7 @@ Node* IntrinsicsHelper::IsJSReceiver(Node* input) {
return return_value.value();
}
-Node* IntrinsicsHelper::IsArray(Node* input) {
+Node* IntrinsicsHelper::IsArray(Node* input, Node* arg_count, Node* context) {
InterpreterAssembler::Variable return_value(assembler_,
MachineRepresentation::kTagged);
@@ -141,17 +142,39 @@ Node* IntrinsicsHelper::IsArray(Node* input) {
return return_value.value();
}
+Node* IntrinsicsHelper::Call(Node* args_reg, Node* arg_count, Node* context) {
+ // First argument register contains the function target.
+ Node* function = __ LoadRegister(args_reg);
+
+ // Receiver is the second runtime call argument.
+ Node* receiver_reg = __ NextRegister(args_reg);
+ Node* receiver_arg = __ RegisterLocation(receiver_reg);
+
+ // Subtract function and receiver from arg count.
+ Node* function_and_receiver_count = __ Int32Constant(2);
+ Node* target_args_count = __ Int32Sub(arg_count, function_and_receiver_count);
+
+ if (FLAG_debug_code) {
+ InterpreterAssembler::Label arg_count_positive(assembler_);
+ Node* comparison = __ Int32LessThan(target_args_count, __ Int32Constant(0));
+ __ GotoUnless(comparison, &arg_count_positive);
+ __ Abort(kWrongArgumentCountForInvokeIntrinsic);
+ __ Goto(&arg_count_positive);
+ __ Bind(&arg_count_positive);
+ }
+
+ Node* result = __ CallJS(function, context, receiver_arg, target_args_count,
+ TailCallMode::kDisallow);
+ return result;
+}
+
void IntrinsicsHelper::AbortIfArgCountMismatch(int expected, Node* actual) {
- InterpreterAssembler::Label match(assembler_), mismatch(assembler_),
- end(assembler_);
+ InterpreterAssembler::Label match(assembler_);
Node* comparison = __ Word32Equal(actual, __ Int32Constant(expected));
- __ Branch(comparison, &match, &mismatch);
- __ Bind(&mismatch);
+ __ GotoIf(comparison, &match);
__ Abort(kWrongArgumentCountForInvokeIntrinsic);
- __ Goto(&end);
+ __ Goto(&match);
__ Bind(&match);
- __ Goto(&end);
- __ Bind(&end);
}
} // namespace interpreter
« no previous file with comments | « src/interpreter/interpreter-intrinsics.h ('k') | test/cctest/interpreter/bytecode_expectations/ForOf.golden » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698