Chromium Code Reviews| Index: src/code-stubs.h |
| diff --git a/src/code-stubs.h b/src/code-stubs.h |
| index c06c6c1fe498b1a9daf9314017a54d0dcf89f659..c15f369ecc4c08beb11b974b2fe6698b0155015d 100644 |
| --- a/src/code-stubs.h |
| +++ b/src/code-stubs.h |
| @@ -94,12 +94,12 @@ namespace internal { |
| /* TurboFanCodeStubs */ \ |
| V(StringLengthTF) \ |
| V(StringAddTF) \ |
| - V(MathFloor) \ |
| /* IC Handler stubs */ \ |
| V(ArrayBufferViewLoadField) \ |
| V(LoadConstant) \ |
| V(LoadFastElement) \ |
| V(LoadField) \ |
| + V(MathFloor) \ |
|
mvstanton
2015/07/08 09:42:29
Why is this now listed as an IC handler stub?
danno
2015/07/08 13:08:40
Done.
|
| V(KeyedLoadSloppyArguments) \ |
| V(KeyedStoreSloppyArguments) \ |
| V(StoreField) \ |
| @@ -216,7 +216,9 @@ class CodeStub BASE_EMBEDDED { |
| virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() const = 0; |
| - virtual int GetStackParameterCount() const { return 0; } |
| + virtual int GetStackParameterCount() const { |
| + return GetCallInterfaceDescriptor().GetStackParameterCount(); |
| + } |
| virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {} |
| @@ -360,6 +362,26 @@ struct FakeStubForTesting : public CodeStub { |
| Handle<Code> GenerateCode() override; \ |
| DEFINE_CODE_STUB(NAME, SUPER) |
| +#define DEFINE_TURBOFAN_CODE_STUB(NAME, SUPER) \ |
| + public: \ |
| + CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { \ |
| + return DESC##Descriptor(isolate()); \ |
| + }; \ |
| + DEFINE_CODE_STUB(NAME, SUPER) |
| + |
| +#define DEFINE_TURBOFAN_IC(NAME, SUPER, DESC) \ |
| + public: \ |
| + CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { \ |
| + if (GetCallMode() == CALL_FROM_OPTIMIZED_CODE) { \ |
| + return DESC##CallFromOptimizedCodeDescriptor(isolate()); \ |
| + } else { \ |
| + return DESC##CallFromUnoptimizedCodeDescriptor(isolate()); \ |
| + } \ |
| + }; \ |
| + \ |
| + protected: \ |
| + DEFINE_CODE_STUB(NAME, SUPER) |
| + |
| #define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ |
| public: \ |
| Handle<Code> GenerateCode() override; \ |
| @@ -544,6 +566,33 @@ class TurboFanCodeStub : public CodeStub { |
| }; |
| +class TurboFanIC : public TurboFanCodeStub { |
| + public: |
| + enum CallMode { CALL_FROM_UNOPTIMIZED_CODE, CALL_FROM_OPTIMIZED_CODE }; |
| + |
| + protected: |
| + explicit TurboFanIC(Isolate* isolate, CallMode mode) |
| + : TurboFanCodeStub(isolate) { |
| + minor_key_ = CallModeBits::encode(mode); |
| + } |
| + |
| + CallMode GetCallMode() const { return CallModeBits::decode(minor_key_); } |
| + |
| + void set_sub_minor_key(uint32_t key) { |
| + minor_key_ = SubMinorKeyBits::update(minor_key_, key); |
| + } |
| + |
| + uint32_t sub_minor_key() const { return SubMinorKeyBits::decode(minor_key_); } |
| + |
| + static const int kSubMinorKeyBits = kStubMinorKeyBits - 1; |
| + |
| + private: |
| + class CallModeBits : public BitField<CallMode, 0, 1> {}; |
| + class SubMinorKeyBits : public BitField<int, 1, kSubMinorKeyBits> {}; |
| + DEFINE_CODE_STUB_BASE(TurboFanIC, TurboFanCodeStub); |
| +}; |
| + |
| + |
| // Helper interface to prepare to/restore after making runtime calls. |
| class RuntimeCallHelper { |
| public: |
| @@ -610,13 +659,12 @@ class NopRuntimeCallHelper : public RuntimeCallHelper { |
| }; |
| -class MathFloorStub : public TurboFanCodeStub { |
| +class MathFloorStub : public TurboFanIC { |
| public: |
| - explicit MathFloorStub(Isolate* isolate) : TurboFanCodeStub(isolate) {} |
| - int GetStackParameterCount() const override { return 1; } |
| - |
| - DEFINE_CALL_INTERFACE_DESCRIPTOR(MathRoundVariant); |
| - DEFINE_CODE_STUB(MathFloor, TurboFanCodeStub); |
| + explicit MathFloorStub(Isolate* isolate, TurboFanIC::CallMode mode) |
| + : TurboFanIC(isolate, mode) {} |
| + Code::Kind GetCodeKind() const override { return Code::CALL_IC; } |
| + DEFINE_TURBOFAN_IC(MathFloor, TurboFanIC, MathRoundVariant); |
| }; |