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

Unified Diff: src/ia32/builtins-ia32.cc

Issue 1688283003: [Interpreter] Implements calls through CallICStub in the interpreter. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixes comments I missed in last patch. 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 side-by-side diff with in-line comments
Download patch
Index: src/ia32/builtins-ia32.cc
diff --git a/src/ia32/builtins-ia32.cc b/src/ia32/builtins-ia32.cc
index 1715ac156291f14d4e3d03c57872e2b169d29faf..1c37d9f0dcbc2474c393e425be2164346a41dc8b 100644
--- a/src/ia32/builtins-ia32.cc
+++ b/src/ia32/builtins-ia32.cc
@@ -675,6 +675,19 @@ static void Generate_InterpreterPushArgs(MacroAssembler* masm,
__ j(greater, &loop_header, Label::kNear);
}
+static void Generate_InterpreterComputeLastArgumentAddress(
+ MacroAssembler* masm) {
+ // Find the address of the last argument.
+ // ----------- S t a t e -------------
+ // input: ebx : Address of the first argument.
+ // output: ecx: Address of the last argument.
+ // -----------------------------------
+ __ mov(ecx, eax);
+ __ add(ecx, Immediate(1)); // Add one for receiver.
+ __ shl(ecx, kPointerSizeLog2);
+ __ neg(ecx);
+ __ add(ecx, ebx);
+}
// static
void Builtins::Generate_InterpreterPushArgsAndCall(MacroAssembler* masm) {
@@ -689,13 +702,7 @@ void Builtins::Generate_InterpreterPushArgsAndCall(MacroAssembler* masm) {
// Pop return address to allow tail-call after pushing arguments.
__ Pop(edx);
- // Find the address of the last argument.
- __ mov(ecx, eax);
- __ add(ecx, Immediate(1)); // Add one for receiver.
- __ shl(ecx, kPointerSizeLog2);
- __ neg(ecx);
- __ add(ecx, ebx);
-
+ Generate_InterpreterComputeLastArgumentAddress(masm);
Generate_InterpreterPushArgs(masm, ecx);
// Call the target.
@@ -705,6 +712,42 @@ void Builtins::Generate_InterpreterPushArgsAndCall(MacroAssembler* masm) {
// static
+void Builtins::Generate_InterpreterPushArgsAndCallIC(MacroAssembler* masm) {
+ // ----------- S t a t e -------------
+ // -- eax : the number of arguments (not including the receiver)
+ // -- ebx : the address of the first argument to be pushed. Subsequent
+ // arguments should be consecutive above this, in the same order as
+ // they are to be pushed onto the stack.
+ // -- edi : the target to call (can be any Object).
+ // -- edx : feedback slot id.
+ // -- ecx : type feedback vector.
+ // -----------------------------------
+
+ {
+ FrameScope scope(masm, StackFrame::INTERNAL);
+ // Store type feedback vector in a virtual register.
+ ExternalReference virtual_register =
mvstanton 2016/02/15 11:13:45 I'd love it if we don't have to expand the usage o
rmcilroy 2016/02/15 11:20:50 Sorry, this was my fault suggesting it as I though
mvstanton 2016/02/15 11:32:04 LOL, I know, I am tempted too..! I think the virtu
mythria 2016/02/17 11:02:48 Done.
+ ExternalReference::virtual_handler_register(masm->isolate());
+ __ mov(Operand::StaticVariable(virtual_register), ecx);
+
+ Generate_InterpreterComputeLastArgumentAddress(masm);
mvstanton 2016/02/15 11:13:45 It would be nice if InterpreterComputeLastArgument
mythria 2016/02/17 11:02:48 We just clobber ecx, though we use eax and ebx as
+ Generate_InterpreterPushArgs(masm, ecx);
+
+ // Restore feedback vector to ebx from the virtual register.
+ __ mov(ebx, Operand::StaticVariable(virtual_register));
+
+ // Call via the CallIC stub.
+ CallICState call_ic_state(0, ConvertReceiverMode::kAny,
+ TailCallMode::kDisallow, true);
+ CallICStub stub(masm->isolate(), call_ic_state);
+ // TODO(mythria): This should be replaced by a TailCallStub, when we
+ // update the code to find the target IC from jump instructions.
+ __ CallStub(&stub);
+ }
+ __ Ret();
+}
+
+// static
void Builtins::Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm) {
// ----------- S t a t e -------------
// -- eax : the number of arguments (not including the receiver)

Powered by Google App Engine
This is Rietveld 408576698