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); |
}; |