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

Unified Diff: src/ia32/code-stubs-ia32.cc

Issue 508643002: Vector-ic project, current state (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Added platform dependent version of dispatchers. Created 6 years 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/hydrogen-instructions.cc ('k') | src/ia32/lithium-codegen-ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ia32/code-stubs-ia32.cc
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
index 91df47a91e9987b0aac3b16c7c6a832bee5458ca..dac3da53483ac6c8bf232bd127cf2e7b23b86cfb 100644
--- a/src/ia32/code-stubs-ia32.cc
+++ b/src/ia32/code-stubs-ia32.cc
@@ -12,6 +12,7 @@
#include "src/codegen.h"
#include "src/ic/handler-compiler.h"
#include "src/ic/ic.h"
+#include "src/ic/stub-cache.h"
#include "src/isolate.h"
#include "src/jsregexp.h"
#include "src/regexp-macro-assembler.h"
@@ -652,9 +653,20 @@ void MathPowStub::Generate(MacroAssembler* masm) {
void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
Label miss;
Register receiver = LoadDescriptor::ReceiverRegister();
+ if (FLAG_vector_ics) {
+ // With careful management, we won't have to save slot and vector on
+ // the stack. Simply handle the possibly missing case first.
+ // TODO(mvstanton): this code can be more efficient.
+ __ cmp(FieldOperand(receiver, JSFunction::kPrototypeOrInitialMapOffset),
+ Immediate(isolate()->factory()->the_hole_value()));
+ __ j(equal, &miss);
+ __ TryGetFunctionPrototype(receiver, eax, ebx, &miss);
+ __ ret(0);
+ } else {
+ NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, eax,
+ ebx, &miss);
+ }
- NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, eax,
- ebx, &miss);
__ bind(&miss);
PropertyAccessCompiler::TailCallBuiltin(
masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC));
@@ -4278,15 +4290,168 @@ void StubFailureTrampolineStub::Generate(MacroAssembler* masm) {
void LoadICTrampolineStub::Generate(MacroAssembler* masm) {
EmitLoadTypeFeedbackVector(masm, VectorLoadICDescriptor::VectorRegister());
- VectorLoadStub stub(isolate(), state());
- __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
+ if (FLAG_hydrogen_vector_dispatcher) {
+ VectorLoadStub stub(isolate(), state());
+ __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
+ } else {
+ VectorRawLoadStub stub(isolate(), state());
+ __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
+ }
}
void KeyedLoadICTrampolineStub::Generate(MacroAssembler* masm) {
EmitLoadTypeFeedbackVector(masm, VectorLoadICDescriptor::VectorRegister());
- VectorKeyedLoadStub stub(isolate());
- __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
+ if (FLAG_hydrogen_vector_dispatcher) {
+ VectorKeyedLoadStub stub(isolate());
+ __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
+ } else {
+ VectorRawKeyedLoadStub stub(isolate());
+ __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
+ }
+}
+
+
+static void HandleArrayCases(MacroAssembler* masm, Register receiver,
+ Register key, Register vector, Register slot,
+ Register feedback, Label* miss, bool keyed_load) {
+ int initial_element = keyed_load ? 1 : 0;
+ // feedback initially contains the feedback array
+ Label next, next_loop, prepare_next;
+ __ push(receiver);
+ Register receiver_map = receiver;
+ __ mov(receiver_map, FieldOperand(receiver, 0));
+ __ cmp(
+ receiver_map,
+ FieldOperand(feedback, FixedArray::OffsetOfElementAt(initial_element)));
+ __ j(not_equal, &next);
+ // found, now call handler.
+ __ mov(feedback, FieldOperand(feedback, FixedArray::OffsetOfElementAt(
+ initial_element + 1)));
+ __ pop(receiver);
+ __ lea(feedback, FieldOperand(feedback, Code::kHeaderSize));
+ __ jmp(feedback);
+
+ __ bind(&next);
+ __ cmp(FieldOperand(feedback, FixedArray::kLengthOffset),
+ Immediate(Smi::FromInt(initial_element + 2)));
+ Label start_polymorphic;
+ __ j(not_equal, &start_polymorphic);
+ __ pop(receiver);
+ __ jmp(miss);
+
+ // Polymorphic, we have to loop from (initial_element + 2) to N
+ __ bind(&start_polymorphic);
+ __ push(key);
+ Register counter = key;
+ __ mov(counter, Immediate(Smi::FromInt(initial_element + 2)));
+ __ bind(&next_loop);
+ __ cmp(receiver_map, FieldOperand(feedback, counter, times_half_pointer_size,
+ FixedArray::kHeaderSize));
+ __ j(not_equal, &prepare_next);
+ __ mov(feedback, FieldOperand(feedback, counter, times_half_pointer_size,
+ FixedArray::kHeaderSize + kPointerSize));
+ __ pop(key);
+ __ pop(receiver);
+ __ lea(feedback, FieldOperand(feedback, Code::kHeaderSize));
+ __ jmp(feedback);
+
+ __ bind(&prepare_next);
+ __ add(counter, Immediate(Smi::FromInt(2)));
+ __ cmp(counter, FieldOperand(feedback, FixedArray::kLengthOffset));
+ __ j(less, &next_loop);
+
+ // We exhausted our array of map handler pairs.
+ __ pop(key);
+ __ pop(receiver);
+ __ jmp(miss);
+}
+
+
+void VectorRawLoadStub::Generate(MacroAssembler* masm) {
+ Register receiver = VectorLoadICDescriptor::ReceiverRegister(); // edx
+ Register name = VectorLoadICDescriptor::NameRegister(); // ecx
+ Register vector = VectorLoadICDescriptor::VectorRegister(); // ebx
+ Register slot = VectorLoadICDescriptor::SlotRegister(); // eax
+ Factory* factory = masm->isolate()->factory();
+ Register scratch = edi;
+ __ mov(scratch, FieldOperand(vector, slot, times_half_pointer_size,
+ FixedArray::kHeaderSize));
+ // Is it a fixed array?
+ __ cmp(FieldOperand(scratch, 0), factory->fixed_array_map());
+ Label not_array, miss;
+ __ j(not_equal, &not_array);
+ __ JumpIfSmi(receiver, &miss);
+ HandleArrayCases(masm, receiver, name, vector, slot, scratch, &miss, false);
+ __ int3(); // We shouldn't get here.
+
+ __ bind(&not_array);
+ __ cmp(scratch, factory->megamorphic_symbol());
+ __ j(not_equal, &miss);
+ __ push(slot);
+ __ push(vector);
+ Code::Flags code_flags = Code::RemoveTypeAndHolderFromFlags(
+ Code::ComputeHandlerFlags(Code::LOAD_IC));
+ masm->isolate()->stub_cache()->GenerateProbe(masm, code_flags, false,
+ receiver, name, vector, scratch);
+ __ pop(vector);
+ __ pop(slot);
+
+ __ bind(&miss);
+ LoadIC::GenerateMiss(masm);
+}
+
+
+void VectorRawKeyedLoadStub::Generate(MacroAssembler* masm) {
+ Register receiver = VectorLoadICDescriptor::ReceiverRegister(); // edx
+ Register key = VectorLoadICDescriptor::NameRegister(); // ecx
+ Register vector = VectorLoadICDescriptor::VectorRegister(); // ebx
+ Register slot = VectorLoadICDescriptor::SlotRegister(); // eax
+ Factory* factory = masm->isolate()->factory();
+ Register scratch = edi;
+ __ mov(scratch, FieldOperand(vector, slot, times_half_pointer_size,
+ FixedArray::kHeaderSize));
+ // Is it a fixed array?
+ __ cmp(FieldOperand(scratch, 0), factory->fixed_array_map());
+ Label not_array, smi_key, key_okay, miss;
+ __ j(not_equal, &not_array);
+ // Do we have an element handler or a string handler?
+ const int name_offset = FixedArray::OffsetOfElementAt(0);
+ __ cmp(FieldOperand(scratch, name_offset), Immediate(Smi::FromInt(0)));
+ __ j(equal, &smi_key);
+ __ cmp(key, FieldOperand(scratch, name_offset));
+ __ j(not_equal, &miss);
+ __ jmp(&key_okay);
+ __ bind(&smi_key);
+ __ JumpIfNotSmi(key, &miss);
+ __ bind(&key_okay);
+ __ JumpIfSmi(receiver, &miss);
+ HandleArrayCases(masm, receiver, key, vector, slot, scratch, &miss, true);
+ __ int3(); // We shouldn't get here.
+
+ __ bind(&not_array);
+ // Is it generic?
+ __ cmp(scratch, factory->generic_symbol());
+ Label megamorphic_check;
+ __ j(not_equal, &megamorphic_check);
+ Handle<Code> generic_stub = KeyedLoadIC::generic_stub(masm->isolate());
+ __ jmp(generic_stub, RelocInfo::CODE_TARGET);
+
+ __ bind(&megamorphic_check);
+ __ cmp(scratch, factory->megamorphic_symbol());
+ __ j(not_equal, &miss);
+ __ JumpIfSmi(key, &miss);
+ __ push(slot);
+ __ push(vector);
+ Code::Flags code_flags = Code::RemoveTypeAndHolderFromFlags(
+ Code::ComputeHandlerFlags(Code::LOAD_IC));
+ masm->isolate()->stub_cache()->GenerateProbe(masm, code_flags, false,
+ receiver, key, vector, scratch);
+ __ pop(vector);
+ __ pop(slot);
+
+ __ bind(&miss);
+ KeyedLoadIC::GenerateMiss(masm);
}
« no previous file with comments | « src/hydrogen-instructions.cc ('k') | src/ia32/lithium-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698