X87: Flesh out vector ic state query and set mechanisms.
port c142994f74
original commit message:
Flesh out vector ic state query and set mechanisms.
The IC system now fully integrates the vector concept and can
handle loads and keyed loads vector-based.
BUG=
Review URL: https://codereview.chromium.org/763953002
Cr-Commit-Position: refs/heads/master@{#25556}
This commit is contained in:
parent
65aa17b9c3
commit
5d4f77fd76
@ -769,31 +769,52 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) {
|
||||
static void LoadIC_PushArgs(MacroAssembler* masm) {
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
Register name = LoadDescriptor::NameRegister();
|
||||
DCHECK(!ebx.is(receiver) && !ebx.is(name));
|
||||
if (FLAG_vector_ics) {
|
||||
Register slot = VectorLoadICDescriptor::SlotRegister();
|
||||
Register vector = VectorLoadICDescriptor::VectorRegister();
|
||||
DCHECK(!edi.is(receiver) && !edi.is(name) && !edi.is(slot) &&
|
||||
!edi.is(vector));
|
||||
|
||||
__ pop(ebx);
|
||||
__ push(receiver);
|
||||
__ push(name);
|
||||
__ push(ebx);
|
||||
__ pop(edi);
|
||||
__ push(receiver);
|
||||
__ push(name);
|
||||
__ push(slot);
|
||||
__ push(vector);
|
||||
__ push(edi);
|
||||
} else {
|
||||
DCHECK(!ebx.is(receiver) && !ebx.is(name));
|
||||
|
||||
__ pop(ebx);
|
||||
__ push(receiver);
|
||||
__ push(name);
|
||||
__ push(ebx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LoadIC::GenerateMiss(MacroAssembler* masm) {
|
||||
// Return address is on the stack.
|
||||
__ IncrementCounter(masm->isolate()->counters()->load_miss(), 1);
|
||||
|
||||
LoadIC_PushArgs(masm);
|
||||
|
||||
// Perform tail call to the entry.
|
||||
ExternalReference ref =
|
||||
ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate());
|
||||
__ TailCallExternalReference(ref, 2, 1);
|
||||
int arg_count = FLAG_vector_ics ? 4 : 2;
|
||||
__ TailCallExternalReference(ref, arg_count, 1);
|
||||
}
|
||||
|
||||
|
||||
void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
|
||||
// Return address is on the stack.
|
||||
LoadIC_PushArgs(masm);
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
Register name = LoadDescriptor::NameRegister();
|
||||
DCHECK(!ebx.is(receiver) && !ebx.is(name));
|
||||
|
||||
__ pop(ebx);
|
||||
__ push(receiver);
|
||||
__ push(name);
|
||||
__ push(ebx);
|
||||
|
||||
// Perform tail call to the entry.
|
||||
__ TailCallRuntime(Runtime::kGetProperty, 2, 1);
|
||||
@ -809,13 +830,21 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) {
|
||||
// Perform tail call to the entry.
|
||||
ExternalReference ref =
|
||||
ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate());
|
||||
__ TailCallExternalReference(ref, 2, 1);
|
||||
int arg_count = FLAG_vector_ics ? 4 : 2;
|
||||
__ TailCallExternalReference(ref, arg_count, 1);
|
||||
}
|
||||
|
||||
|
||||
void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) {
|
||||
// Return address is on the stack.
|
||||
LoadIC_PushArgs(masm);
|
||||
Register receiver = LoadDescriptor::ReceiverRegister();
|
||||
Register name = LoadDescriptor::NameRegister();
|
||||
DCHECK(!ebx.is(receiver) && !ebx.is(name));
|
||||
|
||||
__ pop(ebx);
|
||||
__ push(receiver);
|
||||
__ push(name);
|
||||
__ push(ebx);
|
||||
|
||||
// Perform tail call to the entry.
|
||||
__ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1);
|
||||
|
Loading…
Reference in New Issue
Block a user