Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 60f8799ded39c294a0cd2e2d721b8fd3ac0f63d4..9b6cfaa9c2982660a25d3819556629b7c5effa64 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -67,7 +67,6 @@ class ObjectLiteral; |
V(KeyedStoreICTrampoline) \ |
V(StoreICTrampoline) \ |
/* --- HydrogenCodeStubs --- */ \ |
- V(ElementsTransitionAndStore) \ |
V(FastCloneShallowArray) \ |
V(NumberToString) \ |
V(StringAdd) \ |
@@ -86,7 +85,6 @@ class ObjectLiteral; |
V(LoadDictionaryElement) \ |
V(LoadFastElement) \ |
V(LoadField) \ |
- V(StoreTransition) \ |
/* These should never be ported to TF */ \ |
/* because they are either used only by */ \ |
/* FCG/Crankshaft or are deprecated */ \ |
@@ -134,6 +132,7 @@ class ObjectLiteral; |
V(InternalArrayNoArgumentConstructor) \ |
V(InternalArraySingleArgumentConstructor) \ |
V(Dec) \ |
+ V(ElementsTransitionAndStore) \ |
V(FastCloneShallowObject) \ |
V(FastCloneRegExp) \ |
V(FastNewClosure) \ |
@@ -168,6 +167,7 @@ class ObjectLiteral; |
V(StoreField) \ |
V(StoreGlobal) \ |
V(StoreInterceptor) \ |
+ V(StoreTransition) \ |
V(LoadApiGetter) \ |
V(LoadIndexedInterceptor) \ |
V(GrowArrayElements) \ |
@@ -1666,63 +1666,7 @@ class StoreFieldStub : public TurboFanCodeStub { |
DEFINE_TURBOFAN_CODE_STUB(StoreField, TurboFanCodeStub); |
}; |
- |
-// Register and parameter access methods are specified here instead of in |
-// the CallInterfaceDescriptor because the stub uses a different descriptor |
-// if FLAG_vector_stores is on. |
-class StoreTransitionHelper { |
- public: |
- static Register ReceiverRegister() { |
- return StoreTransitionDescriptor::ReceiverRegister(); |
- } |
- |
- static Register NameRegister() { |
- return StoreTransitionDescriptor::NameRegister(); |
- } |
- |
- static Register ValueRegister() { |
- return StoreTransitionDescriptor::ValueRegister(); |
- } |
- |
- static Register SlotRegister() { |
- return VectorStoreTransitionDescriptor::SlotRegister(); |
- } |
- |
- static Register VectorRegister() { |
- return VectorStoreTransitionDescriptor::VectorRegister(); |
- } |
- |
- static Register MapRegister() { |
- return VectorStoreTransitionDescriptor::MapRegister(); |
- } |
- |
- static int ReceiverIndex() { return StoreTransitionDescriptor::kReceiver; } |
- |
- static int NameIndex() { return StoreTransitionDescriptor::kReceiver; } |
- |
- static int ValueIndex() { return StoreTransitionDescriptor::kValue; } |
- |
- static int MapIndex() { |
- DCHECK(static_cast<int>(VectorStoreTransitionDescriptor::kMap) == |
- static_cast<int>(StoreTransitionDescriptor::kMap)); |
- return StoreTransitionDescriptor::kMap; |
- } |
- |
- static int VectorIndex() { |
- if (HasVirtualSlotArg()) { |
- return VectorStoreTransitionDescriptor::kVirtualSlotVector; |
- } |
- return VectorStoreTransitionDescriptor::kVector; |
- } |
- |
- // Some platforms don't have a slot arg. |
- static bool HasVirtualSlotArg() { |
- return SlotRegister().is(no_reg); |
- } |
-}; |
- |
- |
-class StoreTransitionStub : public HandlerStub { |
+class StoreTransitionStub : public TurboFanCodeStub { |
public: |
enum StoreMode { |
StoreMapOnly, |
@@ -1730,48 +1674,45 @@ class StoreTransitionStub : public HandlerStub { |
ExtendStorageAndStoreMapAndValue |
}; |
- explicit StoreTransitionStub(Isolate* isolate) : HandlerStub(isolate) { |
- set_sub_minor_key(StoreModeBits::encode(StoreMapOnly)); |
+ explicit StoreTransitionStub(Isolate* isolate) : TurboFanCodeStub(isolate) { |
+ minor_key_ = StoreModeBits::encode(StoreMapOnly); |
} |
StoreTransitionStub(Isolate* isolate, FieldIndex index, |
Representation representation, StoreMode store_mode) |
- : HandlerStub(isolate) { |
+ : TurboFanCodeStub(isolate) { |
DCHECK(store_mode != StoreMapOnly); |
int property_index_key = index.GetFieldAccessStubKey(); |
- uint8_t repr = PropertyDetails::EncodeRepresentation(representation); |
- set_sub_minor_key(StoreFieldByIndexBits::encode(property_index_key) | |
- RepresentationBits::encode(repr) | |
- StoreModeBits::encode(store_mode)); |
+ minor_key_ = StoreFieldByIndexBits::encode(property_index_key) | |
+ RepresentationBits::encode(representation.kind()) | |
+ StoreModeBits::encode(store_mode); |
} |
+ Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
+ ExtraICState GetExtraICState() const override { return Code::STORE_IC; } |
+ |
FieldIndex index() const { |
DCHECK(store_mode() != StoreMapOnly); |
- int property_index_key = StoreFieldByIndexBits::decode(sub_minor_key()); |
+ int property_index_key = StoreFieldByIndexBits::decode(minor_key_); |
return FieldIndex::FromFieldAccessStubKey(property_index_key); |
} |
- Representation representation() { |
+ Representation representation() const { |
DCHECK(store_mode() != StoreMapOnly); |
- uint8_t repr = RepresentationBits::decode(sub_minor_key()); |
- return PropertyDetails::DecodeRepresentation(repr); |
- } |
- |
- StoreMode store_mode() const { |
- return StoreModeBits::decode(sub_minor_key()); |
+ return Representation::FromKind(RepresentationBits::decode(minor_key_)); |
} |
- protected: |
- Code::Kind kind() const override { return Code::STORE_IC; } |
- void InitializeDescriptor(CodeStubDescriptor* descriptor) override; |
+ StoreMode store_mode() const { return StoreModeBits::decode(minor_key_); } |
private: |
class StoreFieldByIndexBits : public BitField<int, 0, 13> {}; |
- class RepresentationBits : public BitField<uint8_t, 13, 4> {}; |
+ class RepresentationBits : public BitField<Representation::Kind, 13, 4> {}; |
+ STATIC_ASSERT(Representation::kNumRepresentations - 1 < |
+ RepresentationBits::kMax); |
class StoreModeBits : public BitField<StoreMode, 17, 2> {}; |
- DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorStoreTransition); |
- DEFINE_HANDLER_CODE_STUB(StoreTransition, HandlerStub); |
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreTransition); |
+ DEFINE_TURBOFAN_CODE_STUB(StoreTransition, TurboFanCodeStub); |
}; |
class StoreGlobalStub : public TurboFanCodeStub { |
@@ -2992,10 +2933,6 @@ class StoreElementStub : public PlatformCodeStub { |
CommonStoreModeBits::encode(mode); |
} |
- CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { |
- return StoreWithVectorDescriptor(isolate()); |
- } |
- |
Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
ExtraICState GetExtraICState() const override { return Code::KEYED_STORE_IC; } |
@@ -3007,6 +2944,7 @@ class StoreElementStub : public PlatformCodeStub { |
class ElementsKindBits |
: public BitField<ElementsKind, CommonStoreModeBits::kNext, 8> {}; |
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreWithVector); |
DEFINE_PLATFORM_CODE_STUB(StoreElement, PlatformCodeStub); |
}; |
@@ -3083,22 +3021,22 @@ class ToBooleanICStub : public HydrogenCodeStub { |
std::ostream& operator<<(std::ostream& os, const ToBooleanICStub::Types& t); |
-class ElementsTransitionAndStoreStub : public HydrogenCodeStub { |
+class ElementsTransitionAndStoreStub : public TurboFanCodeStub { |
public: |
ElementsTransitionAndStoreStub(Isolate* isolate, ElementsKind from_kind, |
ElementsKind to_kind, bool is_jsarray, |
KeyedAccessStoreMode store_mode) |
- : HydrogenCodeStub(isolate) { |
- set_sub_minor_key(CommonStoreModeBits::encode(store_mode) | |
- FromBits::encode(from_kind) | ToBits::encode(to_kind) | |
- IsJSArrayBits::encode(is_jsarray)); |
+ : TurboFanCodeStub(isolate) { |
+ minor_key_ = CommonStoreModeBits::encode(store_mode) | |
+ FromBits::encode(from_kind) | ToBits::encode(to_kind) | |
+ IsJSArrayBits::encode(is_jsarray); |
} |
- ElementsKind from_kind() const { return FromBits::decode(sub_minor_key()); } |
- ElementsKind to_kind() const { return ToBits::decode(sub_minor_key()); } |
- bool is_jsarray() const { return IsJSArrayBits::decode(sub_minor_key()); } |
+ ElementsKind from_kind() const { return FromBits::decode(minor_key_); } |
+ ElementsKind to_kind() const { return ToBits::decode(minor_key_); } |
+ bool is_jsarray() const { return IsJSArrayBits::decode(minor_key_); } |
KeyedAccessStoreMode store_mode() const { |
- return CommonStoreModeBits::decode(sub_minor_key()); |
+ return CommonStoreModeBits::decode(minor_key_); |
} |
Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
@@ -3110,8 +3048,8 @@ class ElementsTransitionAndStoreStub : public HydrogenCodeStub { |
class ToBits : public BitField<ElementsKind, 11, 8> {}; |
class IsJSArrayBits : public BitField<bool, 19, 1> {}; |
- DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorStoreTransition); |
- DEFINE_HYDROGEN_CODE_STUB(ElementsTransitionAndStore, HydrogenCodeStub); |
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreTransition); |
+ DEFINE_TURBOFAN_CODE_STUB(ElementsTransitionAndStore, TurboFanCodeStub); |
}; |