Commit 2d4aeaad authored by mvstanton's avatar mvstanton Committed by Commit bot

Vector ICs: Get rid of stack arguments on ia32 transitioning stores.

The stack manipulation was expensive. Two virtual registers are better.

BUG=

Review URL: https://codereview.chromium.org/1376933006

Cr-Commit-Position: refs/heads/master@{#31204}
parent f7e9094f
......@@ -80,14 +80,6 @@ const Register GrowArrayElementsDescriptor::ObjectRegister() { return r0; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return r3; }
void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
SlotRegister(), VectorRegister(), MapRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void FastNewClosureDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {r2};
......
......@@ -78,14 +78,6 @@ const Register GrowArrayElementsDescriptor::ObjectRegister() { return x0; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return x3; }
void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
SlotRegister(), VectorRegister(), MapRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void FastNewClosureDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
// x2: function info
......
......@@ -1439,9 +1439,14 @@ ExternalReference
}
ExternalReference ExternalReference::vector_store_virtual_register(
ExternalReference ExternalReference::virtual_handler_register(
Isolate* isolate) {
return ExternalReference(isolate->vector_store_virtual_register_address());
return ExternalReference(isolate->virtual_handler_register_address());
}
ExternalReference ExternalReference::virtual_slot_register(Isolate* isolate) {
return ExternalReference(isolate->virtual_slot_register_address());
}
......
......@@ -993,7 +993,8 @@ class ExternalReference BASE_EMBEDDED {
static ExternalReference invoke_function_callback(Isolate* isolate);
static ExternalReference invoke_accessor_getter_callback(Isolate* isolate);
static ExternalReference vector_store_virtual_register(Isolate* isolate);
static ExternalReference virtual_handler_register(Isolate* isolate);
static ExternalReference virtual_slot_register(Isolate* isolate);
static ExternalReference runtime_function_table_address(Isolate* isolate);
......
......@@ -1244,8 +1244,10 @@ class StoreTransitionHelper {
}
static Register MapRegister() {
return FLAG_vector_stores ? VectorStoreTransitionDescriptor::MapRegister()
: StoreTransitionDescriptor::MapRegister();
if (FLAG_vector_stores) {
return VectorStoreTransitionDescriptor::MapRegister();
}
return StoreTransitionDescriptor::MapRegister();
}
static int ReceiverIndex() {
......@@ -1256,26 +1258,25 @@ class StoreTransitionHelper {
static int ValueIndex() { return StoreTransitionDescriptor::kValueIndex; }
static int SlotIndex() {
DCHECK(FLAG_vector_stores);
return VectorStoreTransitionDescriptor::kSlotIndex;
static int MapIndex() {
DCHECK(static_cast<int>(VectorStoreTransitionDescriptor::kMapIndex) ==
static_cast<int>(StoreTransitionDescriptor::kMapIndex));
return StoreTransitionDescriptor::kMapIndex;
}
static int VectorIndex() {
DCHECK(FLAG_vector_stores);
if (HasVirtualSlotArg()) {
return VectorStoreTransitionDescriptor::kVirtualSlotVectorIndex;
}
return VectorStoreTransitionDescriptor::kVectorIndex;
}
static int MapIndex() {
if (FLAG_vector_stores) {
return VectorStoreTransitionDescriptor::kMapIndex;
}
return StoreTransitionDescriptor::kMapIndex;
// Some platforms don't have a slot arg.
static bool HasVirtualSlotArg() {
if (!FLAG_vector_stores) return false;
return SlotRegister().is(no_reg);
}
// Some platforms push Slot, Vector, Map on the stack instead of in
// registers.
static bool UsesStackArgs() { return MapRegister().is(no_reg); }
};
......
......@@ -4579,7 +4579,7 @@ static void HandlePolymorphicStoreCase(MacroAssembler* masm, Register receiver,
Label load_smi_map, compare_map;
Label start_polymorphic;
ExternalReference virtual_register =
ExternalReference::vector_store_virtual_register(masm->isolate());
ExternalReference::virtual_handler_register(masm->isolate());
__ push(receiver);
__ push(vector);
......@@ -4660,7 +4660,7 @@ static void HandleMonomorphicStoreCase(MacroAssembler* masm, Register receiver,
// The store ic value is on the stack.
DCHECK(weak_cell.is(VectorStoreICDescriptor::ValueRegister()));
ExternalReference virtual_register =
ExternalReference::vector_store_virtual_register(masm->isolate());
ExternalReference::virtual_handler_register(masm->isolate());
// feedback initially contains the feedback array
Label compare_smi_map;
......@@ -4767,13 +4767,16 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm,
Label transition_call;
Label pop_and_miss;
ExternalReference virtual_register =
ExternalReference::vector_store_virtual_register(masm->isolate());
ExternalReference::virtual_handler_register(masm->isolate());
ExternalReference virtual_slot =
ExternalReference::virtual_slot_register(masm->isolate());
__ push(receiver);
__ push(vector);
Register receiver_map = receiver;
Register cached_map = vector;
Register value = StoreDescriptor::ValueRegister();
// Receiver might not be a heap object.
__ JumpIfSmi(receiver, &load_smi_map);
......@@ -4782,11 +4785,17 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm,
// Polymorphic, we have to loop from 0 to N - 1
__ push(key);
// On the stack we have:
// key (esp)
// vector
// receiver
// value
// Current stack layout:
// - esp[0] -- key
// - esp[4] -- vector
// - esp[8] -- receiver
// - esp[12] -- value
// - esp[16] -- return address
//
// Required stack layout for handler call:
// - esp[0] -- return address
// - receiver, key, value, vector, slot in registers.
// - handler in virtual register.
Register counter = key;
__ mov(counter, Immediate(Smi::FromInt(0)));
__ bind(&next_loop);
......@@ -4805,32 +4814,39 @@ static void HandlePolymorphicKeyedStoreCase(MacroAssembler* masm,
__ pop(receiver);
__ lea(feedback, FieldOperand(feedback, Code::kHeaderSize));
__ mov(Operand::StaticVariable(virtual_register), feedback);
__ pop(feedback); // Pop "value".
__ pop(value);
__ jmp(Operand::StaticVariable(virtual_register));
__ bind(&transition_call);
// Oh holy hell this will be tough.
// The map goes in vector register.
__ mov(receiver, FieldOperand(cached_map, WeakCell::kValueOffset));
// The weak cell may have been cleared.
__ JumpIfSmi(receiver, &pop_and_miss);
// slot goes on the stack, and holds return address.
__ xchg(slot, Operand(esp, 4 * kPointerSize));
// Get the handler in value.
// Current stack layout:
// - esp[0] -- key
// - esp[4] -- vector
// - esp[8] -- receiver
// - esp[12] -- value
// - esp[16] -- return address
//
// Required stack layout for handler call:
// - esp[0] -- return address
// - receiver, key, value, map, vector in registers.
// - handler and slot in virtual registers.
__ mov(Operand::StaticVariable(virtual_slot), slot);
__ mov(feedback, FieldOperand(feedback, counter, times_half_pointer_size,
FixedArray::kHeaderSize + 2 * kPointerSize));
__ lea(feedback, FieldOperand(feedback, Code::kHeaderSize));
__ mov(Operand::StaticVariable(virtual_register), feedback);
__ mov(cached_map, FieldOperand(cached_map, WeakCell::kValueOffset));
// The weak cell may have been cleared.
__ JumpIfSmi(cached_map, &pop_and_miss);
DCHECK(!cached_map.is(VectorStoreTransitionDescriptor::MapRegister()));
__ mov(VectorStoreTransitionDescriptor::MapRegister(), cached_map);
// Pop key into place.
__ pop(key);
// Put the return address on top of stack, vector goes in slot.
__ xchg(slot, Operand(esp, 0));
// put the map on the stack, receiver holds receiver.
__ xchg(receiver, Operand(esp, 1 * kPointerSize));
// put the vector on the stack, slot holds value.
__ xchg(slot, Operand(esp, 2 * kPointerSize));
// feedback (value) = value, slot = handler.
__ xchg(feedback, slot);
__ jmp(slot);
__ pop(vector);
__ pop(receiver);
__ pop(value);
__ jmp(Operand::StaticVariable(virtual_register));
__ bind(&prepare_next);
__ add(counter, Immediate(Smi::FromInt(3)));
......
......@@ -35,12 +35,10 @@ const Register VectorStoreTransitionDescriptor::SlotRegister() {
}
const Register VectorStoreTransitionDescriptor::VectorRegister() {
return no_reg;
}
const Register VectorStoreTransitionDescriptor::VectorRegister() { return ebx; }
const Register VectorStoreTransitionDescriptor::MapRegister() { return no_reg; }
const Register VectorStoreTransitionDescriptor::MapRegister() { return edi; }
const Register StoreTransitionDescriptor::MapRegister() { return ebx; }
......@@ -85,14 +83,6 @@ const Register GrowArrayElementsDescriptor::ObjectRegister() { return eax; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return ebx; }
void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister()};
// The other three parameters are on the stack in ia32.
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void FastNewClosureDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {ebx};
......
......@@ -356,8 +356,8 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
}
void NamedStoreHandlerCompiler::GeneratePushMap(Register map_reg,
Register scratch) {
void NamedStoreHandlerCompiler::RearrangeVectorAndSlot(
Register current_map, Register destination_map) {
DCHECK(false); // Not implemented.
}
......
......@@ -404,8 +404,8 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
}
void NamedStoreHandlerCompiler::GeneratePushMap(Register map_reg,
Register scratch) {
void NamedStoreHandlerCompiler::RearrangeVectorAndSlot(
Register current_map, Register destination_map) {
DCHECK(false); // Not implemented.
}
......
......@@ -456,17 +456,18 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
DCHECK(!transition->is_access_check_needed());
// Call to respective StoreTransitionStub.
Register transition_map_reg = StoreTransitionHelper::MapRegister();
bool stack_args = StoreTransitionHelper::UsesStackArgs();
Register map_reg = stack_args ? scratch1() : transition_map_reg;
bool virtual_args = StoreTransitionHelper::HasVirtualSlotArg();
Register map_reg = StoreTransitionHelper::MapRegister();
if (details.type() == DATA_CONSTANT) {
DCHECK(descriptors->GetValue(descriptor)->IsJSFunction());
GenerateRestoreMap(transition, map_reg, scratch2(), &miss);
GenerateConstantCheck(map_reg, descriptor, value(), scratch2(), &miss);
if (stack_args) {
// Also pushes vector and slot.
GeneratePushMap(map_reg, scratch2());
Register tmp =
virtual_args ? VectorStoreICDescriptor::VectorRegister() : map_reg;
GenerateRestoreMap(transition, tmp, scratch2(), &miss);
GenerateConstantCheck(tmp, descriptor, value(), scratch2(), &miss);
if (virtual_args) {
// This will move the map from tmp into map_reg.
RearrangeVectorAndSlot(tmp, map_reg);
} else if (FLAG_vector_stores) {
PopVectorAndSlot();
}
......@@ -484,10 +485,11 @@ Handle<Code> NamedStoreHandlerCompiler::CompileStoreTransition(
? StoreTransitionStub::ExtendStorageAndStoreMapAndValue
: StoreTransitionStub::StoreMapAndValue;
GenerateRestoreMap(transition, map_reg, scratch2(), &miss);
if (stack_args) {
// Also pushes vector and slot.
GeneratePushMap(map_reg, scratch2());
Register tmp =
virtual_args ? VectorStoreICDescriptor::VectorRegister() : map_reg;
GenerateRestoreMap(transition, tmp, scratch2(), &miss);
if (virtual_args) {
RearrangeVectorAndSlot(tmp, map_reg);
} else if (FLAG_vector_stores) {
PopVectorAndSlot();
}
......
......@@ -251,7 +251,10 @@ class NamedStoreHandlerCompiler : public PropertyHandlerCompiler {
virtual void FrontendFooter(Handle<Name> name, Label* miss);
void GenerateRestoreName(Label* label, Handle<Name> name);
void GeneratePushMap(Register map_reg, Register scratch);
// Pop the vector and slot into appropriate registers, moving the map in
// the process. (This is an accomodation for register pressure on ia32).
void RearrangeVectorAndSlot(Register current_map, Register destination_map);
private:
void GenerateRestoreName(Handle<Name> name);
......
......@@ -362,18 +362,16 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
}
void NamedStoreHandlerCompiler::GeneratePushMap(Register map_reg,
Register scratch) {
// current after GeneratePushMap
// -------------------------------------------------
// ret addr slot
// vector vector
// sp -> slot map
// sp -> ret addr
//
__ xchg(map_reg, Operand(esp, 0));
__ xchg(map_reg, Operand(esp, 2 * kPointerSize));
__ push(map_reg);
void NamedStoreHandlerCompiler::RearrangeVectorAndSlot(
Register current_map, Register destination_map) {
DCHECK(destination_map.is(StoreTransitionHelper::MapRegister()));
DCHECK(current_map.is(StoreTransitionHelper::VectorRegister()));
ExternalReference virtual_slot =
ExternalReference::virtual_slot_register(isolate());
__ mov(destination_map, current_map);
__ pop(current_map);
__ mov(Operand::StaticVariable(virtual_slot), current_map);
__ pop(current_map); // put vector in place.
}
......
......@@ -24,7 +24,7 @@ static void ProbeTable(Isolate* isolate, MacroAssembler* masm,
ExternalReference value_offset(isolate->stub_cache()->value_reference(table));
ExternalReference map_offset(isolate->stub_cache()->map_reference(table));
ExternalReference virtual_register =
ExternalReference::vector_store_virtual_register(masm->isolate());
ExternalReference::virtual_handler_register(masm->isolate());
Label miss;
bool is_vector_store =
......
......@@ -2478,9 +2478,29 @@ RUNTIME_FUNCTION(Runtime_StoreIC_MissFromStubFailure) {
Handle<Object> result;
if (FLAG_vector_stores) {
DCHECK(args.length() == 5 || args.length() == 6);
Handle<Smi> slot = args.at<Smi>(3);
Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4);
int length = args.length();
DCHECK(length == 5 || length == 6);
// We might have slot and vector, for a normal miss (slot(3), vector(4)).
// Or, map and vector for a transitioning store miss (map(3), vector(4)).
// In this case, we need to recover the slot from a virtual register.
// If length == 6, then a map is included (map(3), slot(4), vector(5)).
Handle<Smi> slot;
Handle<TypeFeedbackVector> vector;
if (length == 5) {
if (args.at<Object>(3)->IsMap()) {
vector = args.at<TypeFeedbackVector>(4);
slot = handle(
*reinterpret_cast<Smi**>(isolate->virtual_slot_register_address()),
isolate);
} else {
vector = args.at<TypeFeedbackVector>(4);
slot = args.at<Smi>(3);
}
} else {
vector = args.at<TypeFeedbackVector>(5);
slot = args.at<Smi>(4);
}
FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value());
if (vector->GetKind(vector_slot) == FeedbackVectorSlotKind::STORE_IC) {
StoreICNexus nexus(vector, vector_slot);
......@@ -2616,11 +2636,14 @@ RUNTIME_FUNCTION(Runtime_KeyedStoreIC_Slow) {
RUNTIME_FUNCTION(Runtime_ElementsTransitionAndStoreIC_Miss) {
TimerEventScope<TimerEventIcMiss> timer(isolate);
HandleScope scope(isolate);
DCHECK(args.length() == (FLAG_vector_stores ? 6 : 4));
// Without vector stores, length == 4.
// With vector stores, length == 5 or 6, depending on whether the vector slot
// is passed in a virtual register or not.
DCHECK(!FLAG_vector_stores || args.length() == 5 || args.length() == 6);
Handle<Object> object = args.at<Object>(0);
Handle<Object> key = args.at<Object>(1);
Handle<Object> value = args.at<Object>(2);
Handle<Map> map = args.at<Map>(FLAG_vector_stores ? 5 : 3);
Handle<Map> map = args.at<Map>(3);
LanguageMode language_mode;
if (FLAG_vector_stores) {
KeyedStoreICNexus nexus(isolate);
......
......@@ -346,8 +346,8 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
}
void NamedStoreHandlerCompiler::GeneratePushMap(Register map_reg,
Register scratch) {
void NamedStoreHandlerCompiler::RearrangeVectorAndSlot(
Register current_map, Register destination_map) {
DCHECK(false); // Not implemented.
}
......
......@@ -347,8 +347,8 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
}
void NamedStoreHandlerCompiler::GeneratePushMap(Register map_reg,
Register scratch) {
void NamedStoreHandlerCompiler::RearrangeVectorAndSlot(
Register current_map, Register destination_map) {
DCHECK(false); // Not implemented.
}
......
......@@ -364,8 +364,8 @@ void NamedStoreHandlerCompiler::GenerateRestoreName(Handle<Name> name) {
}
void NamedStoreHandlerCompiler::GeneratePushMap(Register map_reg,
Register scratch) {
void NamedStoreHandlerCompiler::RearrangeVectorAndSlot(
Register current_map, Register destination_map) {
DCHECK(false); // Not implemented.
}
......
......@@ -109,6 +109,21 @@ void StoreTransitionDescriptor::InitializePlatformSpecific(
}
void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
if (SlotRegister().is(no_reg)) {
Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
MapRegister(), VectorRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
} else {
Register registers[] = {ReceiverRegister(), NameRegister(),
ValueRegister(), MapRegister(),
SlotRegister(), VectorRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
}
Type::FunctionType*
StoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType(
Isolate* isolate, int paramater_count) {
......@@ -228,14 +243,19 @@ Type::FunctionType*
VectorStoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType(
Isolate* isolate, int paramater_count) {
Zone* zone = isolate->interface_descriptor_zone();
Type::FunctionType* function =
Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 6, zone);
function->InitParameter(0, AnyTagged(zone)); // receiver
function->InitParameter(1, AnyTagged(zone)); // name
function->InitParameter(2, AnyTagged(zone)); // value
function->InitParameter(3, SmiType(zone)); // slot
function->InitParameter(4, AnyTagged(zone)); // vector
function->InitParameter(5, AnyTagged(zone)); // map
bool has_slot = !VectorStoreTransitionDescriptor::SlotRegister().is(no_reg);
int arg_count = has_slot ? 6 : 5;
Type::FunctionType* function = Type::FunctionType::New(
AnyTagged(zone), Type::Undefined(), arg_count, zone);
int index = 0;
function->InitParameter(index++, AnyTagged(zone)); // receiver
function->InitParameter(index++, AnyTagged(zone)); // name
function->InitParameter(index++, AnyTagged(zone)); // value
function->InitParameter(index++, AnyTagged(zone)); // map
if (has_slot) {
function->InitParameter(index++, SmiType(zone)); // slot
}
function->InitParameter(index++, AnyTagged(zone)); // vector
return function;
}
......
......@@ -281,19 +281,21 @@ class VectorStoreTransitionDescriptor : public StoreDescriptor {
// Extends StoreDescriptor with Map parameter.
enum ParameterIndices {
kReceiverIndex,
kNameIndex,
kValueIndex,
kSlotIndex,
kVectorIndex,
kMapIndex,
kParameterCount
kReceiverIndex = 0,
kNameIndex = 1,
kValueIndex = 2,
kMapIndex = 3,
kSlotIndex = 4, // not present on ia32.
kVirtualSlotVectorIndex = 4,
kVectorIndex = 5
};
// These registers are no_reg for ia32, using the stack instead.
static const Register MapRegister();
static const Register SlotRegister();
static const Register VectorRegister();
static const Register MapRegister();
};
......
......@@ -1784,7 +1784,8 @@ Isolate::Isolate(bool enable_serializer)
deferred_handles_head_(NULL),
optimizing_compile_dispatcher_(NULL),
stress_deopt_count_(0),
vector_store_virtual_register_(NULL),
virtual_handler_register_(NULL),
virtual_slot_register_(NULL),
next_optimization_id_(0),
#if TRACE_MAPS
next_unique_sfi_id_(0),
......
......@@ -1027,10 +1027,12 @@ class Isolate {
void* stress_deopt_count_address() { return &stress_deopt_count_; }
void* vector_store_virtual_register_address() {
return &vector_store_virtual_register_;
void* virtual_handler_register_address() {
return &virtual_handler_register_;
}
void* virtual_slot_register_address() { return &virtual_slot_register_; }
base::RandomNumberGenerator* random_number_generator();
// Given an address occupied by a live code object, return that object.
......@@ -1306,7 +1308,8 @@ class Isolate {
// Counts deopt points if deopt_every_n_times is enabled.
unsigned int stress_deopt_count_;
Address vector_store_virtual_register_;
Address virtual_handler_register_;
Address virtual_slot_register_;
int next_optimization_id_;
......
......@@ -78,14 +78,6 @@ const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
SlotRegister(), VectorRegister(), MapRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void FastNewClosureDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {a2};
......
......@@ -78,14 +78,6 @@ const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
SlotRegister(), VectorRegister(), MapRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void FastNewClosureDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {a2};
......
......@@ -129,8 +129,10 @@ ExternalReferenceTable::ExternalReferenceTable(Isolate* isolate) {
"double_constants.minus_one_half");
Add(ExternalReference::stress_deopt_count(isolate).address(),
"Isolate::stress_deopt_count_address()");
Add(ExternalReference::vector_store_virtual_register(isolate).address(),
"Isolate::vector_store_virtual_register()");
Add(ExternalReference::virtual_handler_register(isolate).address(),
"Isolate::virtual_handler_register()");
Add(ExternalReference::virtual_slot_register(isolate).address(),
"Isolate::virtual_slot_register()");
Add(ExternalReference::runtime_function_table_address(isolate).address(),
"Runtime::runtime_function_table_address()");
......
......@@ -78,14 +78,6 @@ const Register GrowArrayElementsDescriptor::ObjectRegister() { return rax; }
const Register GrowArrayElementsDescriptor::KeyRegister() { return rbx; }
void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
SlotRegister(), VectorRegister(), MapRegister()};
data->InitializePlatformSpecific(arraysize(registers), registers);
}
void FastNewClosureDescriptor::InitializePlatformSpecific(
CallInterfaceDescriptorData* data) {
Register registers[] = {rbx};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment