From 5d4f77fd76be22322db672c17b6a371eb6cdffed Mon Sep 17 00:00:00 2001 From: "chunyang.dai" Date: Thu, 27 Nov 2014 20:18:03 -0800 Subject: [PATCH] X87: Flesh out vector ic state query and set mechanisms. port c142994f742b52cd59aa15d0961d4b0034bcbf88 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} --- src/ic/x87/ic-x87.cc | 49 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/ic/x87/ic-x87.cc b/src/ic/x87/ic-x87.cc index 959b8b628e..b0779c1169 100644 --- a/src/ic/x87/ic-x87.cc +++ b/src/ic/x87/ic-x87.cc @@ -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);