Chromium Code Reviews| Index: src/compiler/js-generic-lowering.cc |
| diff --git a/src/compiler/js-generic-lowering.cc b/src/compiler/js-generic-lowering.cc |
| index f87006f08b4c4a5d8267099cd10ad9efa0e36580..8b230c928f498ac851327dce4bfe9e962204448d 100644 |
| --- a/src/compiler/js-generic-lowering.cc |
| +++ b/src/compiler/js-generic-lowering.cc |
| @@ -29,6 +29,132 @@ static CodeStubInterfaceDescriptor* GetInterfaceDescriptor(Isolate* isolate, |
| } |
| +// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub |
| +// which doesn't have an interface descriptor yet. It mimics a hydrogen code |
| +// stub for the underlying IC stub code. |
| +class LoadICStubShim : public HydrogenCodeStub { |
| + public: |
| + LoadICStubShim(Isolate* isolate, ContextualMode contextual_mode) |
| + : HydrogenCodeStub(isolate), contextual_mode_(contextual_mode) { |
| + i::compiler::GetInterfaceDescriptor(isolate, this); |
| + } |
| + |
| + virtual Handle<Code> GenerateCode() V8_OVERRIDE { |
| + ExtraICState extra_state = LoadIC::ComputeExtraICState(contextual_mode_); |
| + return LoadIC::initialize_stub(isolate(), extra_state); |
| + } |
| + |
| + virtual void InitializeInterfaceDescriptor( |
| + CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE { |
| + Register registers[] = { InterfaceDescriptor::ContextRegister(), |
| + LoadIC::ReceiverRegister(), |
| + LoadIC::NameRegister() }; |
| + descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers); |
| + } |
| + |
| + private: |
| + virtual Major MajorKey() const V8_OVERRIDE { return NoCache; } |
| + virtual int NotMissMinorKey() const V8_OVERRIDE { return 0; } |
| + virtual bool UseSpecialCache() V8_OVERRIDE { return true; } |
| + |
| + ContextualMode contextual_mode_; |
| +}; |
| + |
| + |
| +// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub |
| +// which doesn't have an interface descriptor yet. It mimics a hydrogen code |
| +// stub for the underlying IC stub code. |
| +class KeyedLoadICStubShim : public HydrogenCodeStub { |
| + public: |
| + explicit KeyedLoadICStubShim(Isolate* isolate) : HydrogenCodeStub(isolate) { |
| + i::compiler::GetInterfaceDescriptor(isolate, this); |
| + } |
| + |
| + virtual Handle<Code> GenerateCode() V8_OVERRIDE { |
| + return isolate()->builtins()->KeyedLoadIC_Initialize(); |
| + } |
| + |
| + virtual void InitializeInterfaceDescriptor( |
| + CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE { |
| + Register registers[] = { InterfaceDescriptor::ContextRegister(), |
| + KeyedLoadIC::ReceiverRegister(), |
| + KeyedLoadIC::NameRegister() }; |
| + descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers); |
| + } |
| + |
| + private: |
| + virtual Major MajorKey() const V8_OVERRIDE { return NoCache; } |
| + virtual int NotMissMinorKey() const V8_OVERRIDE { return 0; } |
| + virtual bool UseSpecialCache() V8_OVERRIDE { return true; } |
| +}; |
| + |
| + |
| +// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub |
| +// which doesn't have an interface descriptor yet. It mimics a hydrogen code |
| +// stub for the underlying IC stub code. |
| +class StoreICStubShim : public HydrogenCodeStub { |
| + public: |
| + StoreICStubShim(Isolate* isolate, StrictMode strict_mode) |
| + : HydrogenCodeStub(isolate), strict_mode_(strict_mode) { |
| + i::compiler::GetInterfaceDescriptor(isolate, this); |
| + } |
| + |
| + virtual Handle<Code> GenerateCode() V8_OVERRIDE { |
| + return StoreIC::initialize_stub(isolate(), strict_mode_); |
| + } |
| + |
| + virtual void InitializeInterfaceDescriptor( |
| + CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE { |
| + Register registers[] = { InterfaceDescriptor::ContextRegister(), |
| + StoreIC::ReceiverRegister(), |
| + StoreIC::NameRegister(), |
| + StoreIC::ValueRegister() }; |
| + descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers); |
| + } |
| + |
| + private: |
| + virtual Major MajorKey() const V8_OVERRIDE { return NoCache; } |
| + virtual int NotMissMinorKey() const V8_OVERRIDE { return 0; } |
| + virtual bool UseSpecialCache() V8_OVERRIDE { return true; } |
| + |
| + StrictMode strict_mode_; |
| +}; |
| + |
| + |
| +// TODO(mstarzinger): This is a temporary shim to be able to call an IC stub |
| +// which doesn't have an interface descriptor yet. It mimics a hydrogen code |
| +// stub for the underlying IC stub code. |
| +class KeyedStoreICStubShim : public HydrogenCodeStub { |
| + public: |
| + KeyedStoreICStubShim(Isolate* isolate, StrictMode strict_mode) |
| + : HydrogenCodeStub(isolate), strict_mode_(strict_mode) { |
| + i::compiler::GetInterfaceDescriptor(isolate, this); |
| + } |
| + |
| + virtual Handle<Code> GenerateCode() V8_OVERRIDE { |
| + return strict_mode_ == SLOPPY |
| + ? isolate()->builtins()->KeyedStoreIC_Initialize() |
| + : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); |
| + } |
| + |
| + virtual void InitializeInterfaceDescriptor( |
| + CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE { |
| + Register registers[] = { InterfaceDescriptor::ContextRegister(), |
| + KeyedStoreIC::ReceiverRegister(), |
| + KeyedStoreIC::NameRegister(), |
| + KeyedStoreIC::ValueRegister() }; |
| + descriptor->Initialize(MajorKey(), ARRAY_SIZE(registers), registers); |
| + } |
| + |
| + private: |
| + virtual Major MajorKey() const V8_OVERRIDE { return NoCache; } |
| + virtual int NotMissMinorKey() const V8_OVERRIDE { return 0; } |
| + virtual bool UseSpecialCache() V8_OVERRIDE { return true; } |
| + |
| + StrictMode strict_mode_; |
| +}; |
| + |
| + |
| JSGenericLowering::JSGenericLowering(CompilationInfo* info, JSGraph* jsgraph, |
| MachineOperatorBuilder* machine, |
| SourcePositionTable* source_positions) |
| @@ -296,23 +422,19 @@ Node* JSGenericLowering::LowerJSToObject(Node* node) { |
| Node* JSGenericLowering::LowerJSLoadProperty(Node* node) { |
| - if (FLAG_compiled_keyed_generic_loads) { |
| - KeyedLoadGenericStub stub(isolate()); |
| - ReplaceWithICStubCall(node, &stub); |
| - } else { |
| - ReplaceWithRuntimeCall(node, Runtime::kKeyedGetProperty); |
| - } |
| + KeyedLoadICStubShim stub(isolate()); |
|
titzer
2014/08/05 12:33:27
Do we still want to respect the flag?
Michael Starzinger
2014/08/05 12:41:38
I don't think so. I only added the check because t
|
| + ReplaceWithICStubCall(node, &stub); |
| return node; |
| } |
| Node* JSGenericLowering::LowerJSLoadNamed(Node* node) { |
| - Node* key = |
| - jsgraph()->HeapConstant(OpParameter<PrintableUnique<Name> >(node)); |
| - PatchInsertInput(node, 1, key); |
| - // TODO(mstarzinger): We cannot yet use KeyedLoadGenericElementStub here, |
| - // because named interceptors would not fire correctly yet. |
| - ReplaceWithRuntimeCall(node, Runtime::kGetProperty); |
| + PrintableUnique<Name> key = OpParameter<PrintableUnique<Name> >(node); |
| + // TODO(mstarzinger): The ContextualMode needs to be carried along in the |
| + // operator to use JSLoadNamed for global variable loads. |
| + LoadICStubShim stub(isolate(), NOT_CONTEXTUAL); |
| + PatchInsertInput(node, 1, jsgraph()->HeapConstant(key)); |
| + ReplaceWithICStubCall(node, &stub); |
| return node; |
| } |
| @@ -321,21 +443,20 @@ Node* JSGenericLowering::LowerJSStoreProperty(Node* node) { |
| // TODO(mstarzinger): The strict_mode needs to be carried along in the |
| // operator so that graphs are fully compositional for inlining. |
| StrictMode strict_mode = info()->strict_mode(); |
| - PatchInsertInput(node, 3, SmiConstant(strict_mode)); |
| - ReplaceWithRuntimeCall(node, Runtime::kSetProperty, 4); |
| + KeyedStoreICStubShim stub(isolate(), strict_mode); |
| + ReplaceWithICStubCall(node, &stub); |
| return node; |
| } |
| Node* JSGenericLowering::LowerJSStoreNamed(Node* node) { |
| + PrintableUnique<Name> key = OpParameter<PrintableUnique<Name> >(node); |
| // TODO(mstarzinger): The strict_mode needs to be carried along in the |
| // operator so that graphs are fully compositional for inlining. |
| StrictMode strict_mode = info()->strict_mode(); |
| - Node* key = |
| - jsgraph()->HeapConstant(OpParameter<PrintableUnique<Name> >(node)); |
| - PatchInsertInput(node, 1, key); |
| - PatchInsertInput(node, 3, SmiConstant(strict_mode)); |
| - ReplaceWithRuntimeCall(node, Runtime::kSetProperty, 4); |
| + StoreICStubShim stub(isolate(), strict_mode); |
| + PatchInsertInput(node, 1, jsgraph()->HeapConstant(key)); |
| + ReplaceWithICStubCall(node, &stub); |
| return node; |
| } |