| Index: src/code-stubs.h
|
| diff --git a/src/code-stubs.h b/src/code-stubs.h
|
| index 68d18c7a93860f73b2679fc2c7258f657a7b8fab..c7de00b858a2b0447f512d1d83f9579a2f22e955 100644
|
| --- a/src/code-stubs.h
|
| +++ b/src/code-stubs.h
|
| @@ -329,8 +329,7 @@ struct FakeStubForTesting : public CodeStub {
|
| Major MajorKey() const override { return CodeStub::NoCache; }
|
|
|
| CallInterfaceDescriptor GetCallInterfaceDescriptor() const override {
|
| - UNREACHABLE();
|
| - return CallInterfaceDescriptor();
|
| + return ContextOnlyDescriptor(isolate());
|
| }
|
|
|
| Handle<Code> GenerateCode() override {
|
| @@ -1278,6 +1277,69 @@ class StoreFieldStub : public HandlerStub {
|
| };
|
|
|
|
|
| +// 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() {
|
| + DCHECK(FLAG_vector_stores);
|
| + return VectorStoreTransitionDescriptor::SlotRegister();
|
| + }
|
| +
|
| + static Register VectorRegister() {
|
| + DCHECK(FLAG_vector_stores);
|
| + return VectorStoreTransitionDescriptor::VectorRegister();
|
| + }
|
| +
|
| + static Register MapRegister() {
|
| + return FLAG_vector_stores ? VectorStoreTransitionDescriptor::MapRegister()
|
| + : StoreTransitionDescriptor::MapRegister();
|
| + }
|
| +
|
| + static int ReceiverIndex() {
|
| + return StoreTransitionDescriptor::kReceiverIndex;
|
| + }
|
| +
|
| + static int NameIndex() { return StoreTransitionDescriptor::kReceiverIndex; }
|
| +
|
| + static int ValueIndex() { return StoreTransitionDescriptor::kValueIndex; }
|
| +
|
| + static int SlotIndex() {
|
| + DCHECK(FLAG_vector_stores);
|
| + return VectorStoreTransitionDescriptor::kSlotIndex;
|
| + }
|
| +
|
| + static int VectorIndex() {
|
| + DCHECK(FLAG_vector_stores);
|
| + return VectorStoreTransitionDescriptor::kVectorIndex;
|
| + }
|
| +
|
| + static int MapIndex() {
|
| + if (FLAG_vector_stores) {
|
| + return VectorStoreTransitionDescriptor::kMapIndex;
|
| + }
|
| + return StoreTransitionDescriptor::kMapIndex;
|
| + }
|
| +
|
| + // Some platforms push Slot, Vector, Map on the stack instead of in
|
| + // registers.
|
| + static bool UsesStackArgs() { return MapRegister().is(no_reg); }
|
| +};
|
| +
|
| +
|
| class StoreTransitionStub : public HandlerStub {
|
| public:
|
| enum StoreMode {
|
| @@ -2606,12 +2668,18 @@ class StoreFastElementStub : public HydrogenCodeStub {
|
| return StoreModeBits::decode(sub_minor_key());
|
| }
|
|
|
| + CallInterfaceDescriptor GetCallInterfaceDescriptor() const override {
|
| + if (FLAG_vector_stores) {
|
| + return VectorStoreICDescriptor(isolate());
|
| + }
|
| + return StoreDescriptor(isolate());
|
| + }
|
| +
|
| private:
|
| class ElementsKindBits: public BitField<ElementsKind, 0, 8> {};
|
| class StoreModeBits: public BitField<KeyedAccessStoreMode, 8, 4> {};
|
| class IsJSArrayBits: public BitField<bool, 12, 1> {};
|
|
|
| - DEFINE_CALL_INTERFACE_DESCRIPTOR(Store);
|
| DEFINE_HYDROGEN_CODE_STUB(StoreFastElement, HydrogenCodeStub);
|
| };
|
|
|
| @@ -2829,6 +2897,13 @@ class StoreElementStub : public PlatformCodeStub {
|
| minor_key_ = ElementsKindBits::encode(elements_kind);
|
| }
|
|
|
| + CallInterfaceDescriptor GetCallInterfaceDescriptor() const override {
|
| + if (FLAG_vector_stores) {
|
| + return VectorStoreICDescriptor(isolate());
|
| + }
|
| + return StoreDescriptor(isolate());
|
| + }
|
| +
|
| private:
|
| ElementsKind elements_kind() const {
|
| return ElementsKindBits::decode(minor_key_);
|
| @@ -2836,7 +2911,6 @@ class StoreElementStub : public PlatformCodeStub {
|
|
|
| class ElementsKindBits : public BitField<ElementsKind, 0, 8> {};
|
|
|
| - DEFINE_CALL_INTERFACE_DESCRIPTOR(Store);
|
| DEFINE_PLATFORM_CODE_STUB(StoreElement, PlatformCodeStub);
|
| };
|
|
|
| @@ -2951,13 +3025,14 @@ class ElementsTransitionAndStoreStub : public HydrogenCodeStub {
|
| return StoreModeBits::decode(sub_minor_key());
|
| }
|
|
|
| + CallInterfaceDescriptor GetCallInterfaceDescriptor() const override;
|
| +
|
| private:
|
| class FromBits : public BitField<ElementsKind, 0, 8> {};
|
| class ToBits : public BitField<ElementsKind, 8, 8> {};
|
| class IsJSArrayBits : public BitField<bool, 16, 1> {};
|
| class StoreModeBits : public BitField<KeyedAccessStoreMode, 17, 4> {};
|
|
|
| - DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreTransition);
|
| DEFINE_HYDROGEN_CODE_STUB(ElementsTransitionAndStore, HydrogenCodeStub);
|
| };
|
|
|
|
|