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

Unified Diff: src/a64/stub-cache-a64.cc

Issue 145773008: A64: Synchronize with r17104. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 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
« no previous file with comments | « src/a64/macro-assembler-a64.cc ('k') | src/api.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/a64/stub-cache-a64.cc
diff --git a/src/a64/stub-cache-a64.cc b/src/a64/stub-cache-a64.cc
index cf23b9fb865db624cda84a93281f309c042e8ee2..f0be91ab3db785d0555b269057decce5c95c62a1 100644
--- a/src/a64/stub-cache-a64.cc
+++ b/src/a64/stub-cache-a64.cc
@@ -847,15 +847,14 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
// -- sp[(argc + 7) * 8] : receiver
// -----------------------------------
typedef FunctionCallbackArguments FCA;
- const int kArgs = kFastApiCallArguments;
// Save calling context.
- __ Poke(cp, (kArgs - 1 + FCA::kContextSaveIndex) * kPointerSize);
+ __ Poke(cp, FCA::kContextSaveIndex * kPointerSize);
// Get the function and setup the context.
Handle<JSFunction> function = optimization.constant_function();
Register function_reg = x5;
__ LoadHeapObject(function_reg, function);
__ Ldr(cp, FieldMemOperand(function_reg, JSFunction::kContextOffset));
- __ Poke(function_reg, (kArgs - 1 + FCA::kCalleeIndex) * kPointerSize);
+ __ Poke(function_reg, FCA::kCalleeIndex * kPointerSize);
// Construct the FunctionCallbackInfo.
Handle<CallHandlerInfo> api_call_info = optimization.api_call_info();
@@ -868,21 +867,21 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
__ Mov(call_data_reg, Operand(call_data));
}
// Store call data.
- __ Poke(call_data_reg, (kArgs - 1 + FCA::kDataIndex) * kPointerSize);
+ __ Poke(call_data_reg, FCA::kDataIndex * kPointerSize);
// Store isolate.
Register isolate_reg = x7;
__ Mov(isolate_reg,
Operand(ExternalReference::isolate_address(masm->isolate())));
- __ Poke(isolate_reg, (kArgs - 1 + FCA::kIsolateIndex) * kPointerSize);
+ __ Poke(isolate_reg, FCA::kIsolateIndex * kPointerSize);
// Store ReturnValue default and ReturnValue.
Register undefined_reg = x8;
__ LoadRoot(undefined_reg, Heap::kUndefinedValueRootIndex);
- __ Poke(undefined_reg, (kArgs - 1 + FCA::kReturnValueOffset) * kPointerSize);
- __ Poke(undefined_reg,
- (kArgs - 1 + FCA::kReturnValueDefaultValueIndex) * kPointerSize);
+ // TODO(all): These are adjacent. Once things settle down, use PokePair.
+ __ Poke(undefined_reg, FCA::kReturnValueOffset * kPointerSize);
+ __ Poke(undefined_reg, FCA::kReturnValueDefaultValueIndex * kPointerSize);
Register implicit_args = x2;
- __ Add(implicit_args, masm->StackPointer(), (kArgs - 1) * kPointerSize);
+ __ Mov(implicit_args, masm->StackPointer());
FrameScope frame_scope(masm, StackFrame::MANUAL);
// Allocate the v8::Arguments structure inside the ExitFrame since it's not
@@ -894,20 +893,20 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
kApiArgsStackSpace + MacroAssembler::kCallApiFunctionSpillSpace);
// Arguments structure is after the return address.
+ // args = FunctionCallbackInfo&
Register args = x0;
__ Add(args, masm->StackPointer(), kPointerSize);
- // v8::Arguments::implicit_args_
+ // FunctionCallbackInfo::implicit_args_
__ Str(implicit_args, MemOperand(args, 0 * kPointerSize));
- // v8::Arguments::values_
- __ Add(x3, implicit_args, argc * kPointerSize);
+ // FunctionCallbackInfo::values_
+ __ Add(x3, implicit_args, (kFastApiCallArguments - 1 + argc) * kPointerSize);
__ Str(x3, MemOperand(args, 1 * kPointerSize));
- // v8::Arguments::length_ = argc
+ // FunctionCallbackInfo::length_ = argc
__ Mov(x3, argc);
__ Str(x3, MemOperand(args, 2 * kPointerSize));
- // v8::Arguments::is_construct_call = 0
- __ Mov(x3, 0);
- __ Str(x3, MemOperand(args, 3 * kPointerSize));
+ // FunctionCallbackInfo::is_construct_call = 0
+ __ Str(xzr, MemOperand(args, 3 * kPointerSize));
// After the call to the API function we need to free memory used for:
// - JS arguments
@@ -916,7 +915,7 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
//
// The memory allocated for v8::Arguments structure will be freed when we'll
// leave the ExitFrame.
- const int kStackUnwindSpace = argc + kArgs + 1;
+ const int kStackUnwindSpace = argc + kFastApiCallArguments + 1;
Address function_address = v8::ToCData<Address>(api_call_info->callback());
ApiFunction fun(function_address);
@@ -931,9 +930,10 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
AllowExternalCallThatCantCauseGC scope(masm);
MemOperand context_restore_operand(
- fp, (kArgs + 1 + FCA::kContextSaveIndex) * kPointerSize);
+ fp, (2 + FCA::kContextSaveIndex) * kPointerSize);
MemOperand return_value_operand(
- fp, (kArgs + 1 + FCA::kReturnValueOffset) * kPointerSize);
+ fp, (2 + FCA::kReturnValueOffset) * kPointerSize);
+
// CallApiFunctionAndReturn can spill registers inside the exit frame,
// after the return address and the v8::Arguments structure.
const int spill_offset = 1 + kApiArgsStackSpace;
@@ -959,13 +959,12 @@ static void GenerateFastApiCall(MacroAssembler* masm,
ASSERT(optimization.is_simple_api_call());
ASSERT(!AreAliased(receiver, scratch));
+ typedef FunctionCallbackArguments FCA;
const int stack_space = kFastApiCallArguments + argc + 1;
- const int kHolderIndex = kFastApiCallArguments +
- FunctionCallbackArguments::kHolderIndex - 1;
// Assign stack space for the call arguments.
__ Claim(stack_space);
// Write holder to stack frame.
- __ Poke(receiver, kHolderIndex * kPointerSize);
+ __ Poke(receiver, FCA::kHolderIndex * kPointerSize);
// Write receiver to stack frame.
int index = stack_space - 1;
__ Poke(receiver, index * kPointerSize);
@@ -1195,8 +1194,6 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object,
int save_at_depth,
Label* miss,
PrototypeCheckType check) {
- const int kHolderIndex = kFastApiCallArguments +
- FunctionCallbackArguments::kHolderIndex - 1;
// Make sure that the type feedback oracle harvests the receiver map.
// TODO(svenpanne) Remove this hack when all ICs are reworked.
__ Mov(scratch1, Operand(Handle<Map>(object->map())));
@@ -1211,8 +1208,9 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object,
Register reg = object_reg;
int depth = 0;
+ typedef FunctionCallbackArguments FCA;
if (save_at_depth == depth) {
- __ Poke(reg, kHolderIndex * kPointerSize);
+ __ Poke(reg, FCA::kHolderIndex * kPointerSize);
}
// Check the maps in the prototype chain.
@@ -1271,7 +1269,7 @@ Register StubCompiler::CheckPrototypes(Handle<JSObject> object,
}
if (save_at_depth == depth) {
- __ Poke(reg, kHolderIndex * kPointerSize);
+ __ Poke(reg, FCA::kHolderIndex * kPointerSize);
}
// Go to the next object in the prototype chain.
@@ -1438,16 +1436,15 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
// Build ExecutableAccessorInfo::args_ list on the stack and push property
// name below the exit frame to make GC aware of them and store pointers to
// them.
- STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 0);
- STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == -1);
- STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == -2);
- STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == -3);
- STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == -4);
- STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == -5);
+ STATIC_ASSERT(PropertyCallbackArguments::kHolderIndex == 0);
+ STATIC_ASSERT(PropertyCallbackArguments::kIsolateIndex == 1);
+ STATIC_ASSERT(PropertyCallbackArguments::kReturnValueDefaultValueIndex == 2);
+ STATIC_ASSERT(PropertyCallbackArguments::kReturnValueOffset == 3);
+ STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 4);
+ STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 5);
+ STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6);
__ Push(receiver());
- Register args_addr = scratch2();
- __ Mov(args_addr, __ StackPointer());
if (heap()->InNewSpace(callback->data())) {
__ Mov(scratch3(), Operand(callback));
@@ -1458,18 +1455,22 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
}
// TODO(jbramley): Find another scratch register and combine the pushes
// together. Can we use scratch1() here?
- // Push:
- // - callback data
- // - undefined
- // - undefined
- // - isolate
- // - reg
- // - name
__ LoadRoot(scratch4(), Heap::kUndefinedValueRootIndex);
__ Push(scratch3(), scratch4());
__ Mov(scratch3(), Operand(ExternalReference::isolate_address(isolate())));
__ Push(scratch4(), scratch3(), reg, name());
+ Register args_addr = scratch2();
+ __ Add(args_addr, __ StackPointer(), kPointerSize);
+
+ // Stack at this point:
+ // sp[40] callback data
+ // sp[32] undefined
+ // sp[24] undefined
+ // sp[16] isolate
+ // args_addr -> sp[8] reg
+ // sp[0] name
+
// Pass the Handle<Name> of the property name to the runtime.
__ Mov(x0, __ StackPointer());
@@ -1478,9 +1479,8 @@ void BaseLoadStubCompiler::GenerateLoadCallback(
__ EnterExitFrame(false, scratch4(),
kApiStackSpace + MacroAssembler::kCallApiFunctionSpillSpace);
- // Create ExecutableAccessorInfo instance on the stack above the exit frame
- // before the return address. ExecutableAccessorInfo has only one field: the
- // address of args_.
+ // Create PropertyAccessorInfo instance on the stack above the exit frame
+ // (before the return address) with args_addr as the data.
__ Poke(args_addr, 1 * kPointerSize);
// Get the address of ExecutableAccessorInfo instance and pass it to the
« no previous file with comments | « src/a64/macro-assembler-a64.cc ('k') | src/api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698