| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_CODE_STUBS_H_ | 5 #ifndef V8_CODE_STUBS_H_ |
| 6 #define V8_CODE_STUBS_H_ | 6 #define V8_CODE_STUBS_H_ |
| 7 | 7 |
| 8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
| 9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 V(NumberToString) \ | 82 V(NumberToString) \ |
| 83 V(Typeof) \ | 83 V(Typeof) \ |
| 84 V(RegExpConstructResult) \ | 84 V(RegExpConstructResult) \ |
| 85 V(StoreFastElement) \ | 85 V(StoreFastElement) \ |
| 86 V(StoreScriptContextField) \ | 86 V(StoreScriptContextField) \ |
| 87 V(StringAdd) \ | 87 V(StringAdd) \ |
| 88 V(ToBoolean) \ | 88 V(ToBoolean) \ |
| 89 V(TransitionElementsKind) \ | 89 V(TransitionElementsKind) \ |
| 90 V(VectorRawKeyedLoad) \ | 90 V(VectorRawKeyedLoad) \ |
| 91 V(VectorRawLoad) \ | 91 V(VectorRawLoad) \ |
| 92 /* TurboFanCodeStubs */ \ |
| 93 V(StringLengthTF) \ |
| 94 V(MathFloor) \ |
| 92 /* IC Handler stubs */ \ | 95 /* IC Handler stubs */ \ |
| 93 V(ArrayBufferViewLoadField) \ | 96 V(ArrayBufferViewLoadField) \ |
| 94 V(LoadConstant) \ | 97 V(LoadConstant) \ |
| 95 V(LoadField) \ | 98 V(LoadField) \ |
| 96 V(KeyedLoadSloppyArguments) \ | 99 V(KeyedLoadSloppyArguments) \ |
| 97 V(StoreField) \ | 100 V(StoreField) \ |
| 98 V(StoreGlobal) \ | 101 V(StoreGlobal) \ |
| 99 V(StoreTransition) \ | 102 V(StoreTransition) \ |
| 100 V(StringLength) \ | 103 V(StringLength) \ |
| 101 V(RestParamAccess) | 104 V(RestParamAccess) |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 #endif | 148 #endif |
| 146 | 149 |
| 147 // Combined list of code stubs. | 150 // Combined list of code stubs. |
| 148 #define CODE_STUB_LIST(V) \ | 151 #define CODE_STUB_LIST(V) \ |
| 149 CODE_STUB_LIST_ALL_PLATFORMS(V) \ | 152 CODE_STUB_LIST_ALL_PLATFORMS(V) \ |
| 150 CODE_STUB_LIST_ARM(V) \ | 153 CODE_STUB_LIST_ARM(V) \ |
| 151 CODE_STUB_LIST_ARM64(V) \ | 154 CODE_STUB_LIST_ARM64(V) \ |
| 152 CODE_STUB_LIST_PPC(V) \ | 155 CODE_STUB_LIST_PPC(V) \ |
| 153 CODE_STUB_LIST_MIPS(V) | 156 CODE_STUB_LIST_MIPS(V) |
| 154 | 157 |
| 158 static const int kHasReturnedMinusZeroSentinel = 1; |
| 159 |
| 155 // Stub is base classes of all stubs. | 160 // Stub is base classes of all stubs. |
| 156 class CodeStub BASE_EMBEDDED { | 161 class CodeStub BASE_EMBEDDED { |
| 157 public: | 162 public: |
| 158 enum Major { | 163 enum Major { |
| 159 // TODO(mvstanton): eliminate the NoCache key by getting rid | 164 // TODO(mvstanton): eliminate the NoCache key by getting rid |
| 160 // of the non-monomorphic-cache. | 165 // of the non-monomorphic-cache. |
| 161 NoCache = 0, // marker for stubs that do custom caching] | 166 NoCache = 0, // marker for stubs that do custom caching] |
| 162 #define DEF_ENUM(name) name, | 167 #define DEF_ENUM(name) name, |
| 163 CODE_STUB_LIST(DEF_ENUM) | 168 CODE_STUB_LIST(DEF_ENUM) |
| 164 #undef DEF_ENUM | 169 #undef DEF_ENUM |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 // true, which will cause an assertion if we try to call something that can | 204 // true, which will cause an assertion if we try to call something that can |
| 200 // GC or if we try to put a stack frame on top of the junk, which would not | 205 // GC or if we try to put a stack frame on top of the junk, which would not |
| 201 // result in a traversable stack. | 206 // result in a traversable stack. |
| 202 virtual bool SometimesSetsUpAFrame() { return true; } | 207 virtual bool SometimesSetsUpAFrame() { return true; } |
| 203 | 208 |
| 204 // Lookup the code in the (possibly custom) cache. | 209 // Lookup the code in the (possibly custom) cache. |
| 205 bool FindCodeInCache(Code** code_out); | 210 bool FindCodeInCache(Code** code_out); |
| 206 | 211 |
| 207 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() = 0; | 212 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() = 0; |
| 208 | 213 |
| 214 virtual int GetStackParameterCount() const { return 0; } |
| 215 |
| 209 virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {} | 216 virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {} |
| 210 | 217 |
| 211 static void InitializeDescriptor(Isolate* isolate, uint32_t key, | 218 static void InitializeDescriptor(Isolate* isolate, uint32_t key, |
| 212 CodeStubDescriptor* desc); | 219 CodeStubDescriptor* desc); |
| 213 | 220 |
| 214 static MaybeHandle<Code> GetCode(Isolate* isolate, uint32_t key); | 221 static MaybeHandle<Code> GetCode(Isolate* isolate, uint32_t key); |
| 215 | 222 |
| 216 // Returns information for computing the number key. | 223 // Returns information for computing the number key. |
| 217 virtual Major MajorKey() const = 0; | 224 virtual Major MajorKey() const = 0; |
| 218 uint32_t MinorKey() const { return minor_key_; } | 225 uint32_t MinorKey() const { return minor_key_; } |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 void Generate(MacroAssembler* masm) override; \ | 348 void Generate(MacroAssembler* masm) override; \ |
| 342 DEFINE_CODE_STUB(NAME, SUPER) | 349 DEFINE_CODE_STUB(NAME, SUPER) |
| 343 | 350 |
| 344 | 351 |
| 345 #define DEFINE_HYDROGEN_CODE_STUB(NAME, SUPER) \ | 352 #define DEFINE_HYDROGEN_CODE_STUB(NAME, SUPER) \ |
| 346 public: \ | 353 public: \ |
| 347 void InitializeDescriptor(CodeStubDescriptor* descriptor) override; \ | 354 void InitializeDescriptor(CodeStubDescriptor* descriptor) override; \ |
| 348 Handle<Code> GenerateCode() override; \ | 355 Handle<Code> GenerateCode() override; \ |
| 349 DEFINE_CODE_STUB(NAME, SUPER) | 356 DEFINE_CODE_STUB(NAME, SUPER) |
| 350 | 357 |
| 358 #define DEFINE_TURBOFAN_CODE_STUB(NAME, SUPER, DESC, STACK_PARAMS) \ |
| 359 public: \ |
| 360 NAME##Stub(Isolate* isolate) : SUPER(isolate) {} \ |
| 361 CallInterfaceDescriptor GetCallInterfaceDescriptor() override { \ |
| 362 return DESC(isolate()); \ |
| 363 }; \ |
| 364 virtual const char* GetFunctionName() const override { \ |
| 365 return #NAME "_STUB"; \ |
| 366 } \ |
| 367 int GetStackParameterCount() const override { return STACK_PARAMS; } \ |
| 368 Code::StubType GetStubType() const override { return Code::FAST; } \ |
| 369 DEFINE_CODE_STUB(NAME, SUPER) |
| 370 |
| 351 #define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ | 371 #define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ |
| 352 public: \ | 372 public: \ |
| 353 Handle<Code> GenerateCode() override; \ | 373 Handle<Code> GenerateCode() override; \ |
| 354 DEFINE_CODE_STUB(NAME, SUPER) | 374 DEFINE_CODE_STUB(NAME, SUPER) |
| 355 | 375 |
| 356 #define DEFINE_CALL_INTERFACE_DESCRIPTOR(NAME) \ | 376 #define DEFINE_CALL_INTERFACE_DESCRIPTOR(NAME) \ |
| 357 public: \ | 377 public: \ |
| 358 CallInterfaceDescriptor GetCallInterfaceDescriptor() override { \ | 378 CallInterfaceDescriptor GetCallInterfaceDescriptor() override { \ |
| 359 return NAME##Descriptor(isolate()); \ | 379 return NAME##Descriptor(isolate()); \ |
| 360 } | 380 } |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 private: | 531 private: |
| 512 class IsMissBits : public BitField<bool, kSubMinorKeyBits, 1> {}; | 532 class IsMissBits : public BitField<bool, kSubMinorKeyBits, 1> {}; |
| 513 class SubMinorKeyBits : public BitField<int, 0, kSubMinorKeyBits> {}; | 533 class SubMinorKeyBits : public BitField<int, 0, kSubMinorKeyBits> {}; |
| 514 | 534 |
| 515 void GenerateLightweightMiss(MacroAssembler* masm, ExternalReference miss); | 535 void GenerateLightweightMiss(MacroAssembler* masm, ExternalReference miss); |
| 516 | 536 |
| 517 DEFINE_CODE_STUB_BASE(HydrogenCodeStub, CodeStub); | 537 DEFINE_CODE_STUB_BASE(HydrogenCodeStub, CodeStub); |
| 518 }; | 538 }; |
| 519 | 539 |
| 520 | 540 |
| 541 class TurboFanCodeStub : public CodeStub { |
| 542 public: |
| 543 Code::Kind GetCodeKind() const override { return Code::STUB; } |
| 544 |
| 545 // Retrieve the code for the stub. Generate the code if needed. |
| 546 Handle<Code> GenerateCode() override; |
| 547 |
| 548 virtual const char* GetFunctionName() const = 0; |
| 549 |
| 550 protected: |
| 551 explicit TurboFanCodeStub(Isolate* isolate) : CodeStub(isolate) {} |
| 552 |
| 553 private: |
| 554 DEFINE_CODE_STUB_BASE(TurboFanCodeStub, CodeStub); |
| 555 }; |
| 556 |
| 557 |
| 521 // Helper interface to prepare to/restore after making runtime calls. | 558 // Helper interface to prepare to/restore after making runtime calls. |
| 522 class RuntimeCallHelper { | 559 class RuntimeCallHelper { |
| 523 public: | 560 public: |
| 524 virtual ~RuntimeCallHelper() {} | 561 virtual ~RuntimeCallHelper() {} |
| 525 | 562 |
| 526 virtual void BeforeCall(MacroAssembler* masm) const = 0; | 563 virtual void BeforeCall(MacroAssembler* masm) const = 0; |
| 527 | 564 |
| 528 virtual void AfterCall(MacroAssembler* masm) const = 0; | 565 virtual void AfterCall(MacroAssembler* masm) const = 0; |
| 529 | 566 |
| 530 protected: | 567 protected: |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 class NopRuntimeCallHelper : public RuntimeCallHelper { | 614 class NopRuntimeCallHelper : public RuntimeCallHelper { |
| 578 public: | 615 public: |
| 579 NopRuntimeCallHelper() {} | 616 NopRuntimeCallHelper() {} |
| 580 | 617 |
| 581 virtual void BeforeCall(MacroAssembler* masm) const {} | 618 virtual void BeforeCall(MacroAssembler* masm) const {} |
| 582 | 619 |
| 583 virtual void AfterCall(MacroAssembler* masm) const {} | 620 virtual void AfterCall(MacroAssembler* masm) const {} |
| 584 }; | 621 }; |
| 585 | 622 |
| 586 | 623 |
| 624 class MathFloorStub : public TurboFanCodeStub { |
| 625 DEFINE_TURBOFAN_CODE_STUB(MathFloor, TurboFanCodeStub, |
| 626 MathRoundVariantDescriptor, 1); |
| 627 }; |
| 628 |
| 629 |
| 630 class StringLengthTFStub : public TurboFanCodeStub { |
| 631 DEFINE_TURBOFAN_CODE_STUB(StringLengthTF, TurboFanCodeStub, LoadDescriptor, |
| 632 0); |
| 633 |
| 634 public: |
| 635 Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
| 636 InlineCacheState GetICState() const override { return MONOMORPHIC; } |
| 637 ExtraICState GetExtraICState() const override { return Code::LOAD_IC; } |
| 638 }; |
| 639 |
| 640 |
| 587 class NumberToStringStub final : public HydrogenCodeStub { | 641 class NumberToStringStub final : public HydrogenCodeStub { |
| 588 public: | 642 public: |
| 589 explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} | 643 explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} |
| 590 | 644 |
| 591 // Parameters accessed via CodeStubGraphBuilder::GetParameter() | 645 // Parameters accessed via CodeStubGraphBuilder::GetParameter() |
| 592 static const int kNumber = 0; | 646 static const int kNumber = 0; |
| 593 | 647 |
| 594 DEFINE_CALL_INTERFACE_DESCRIPTOR(NumberToString); | 648 DEFINE_CALL_INTERFACE_DESCRIPTOR(NumberToString); |
| 595 DEFINE_HYDROGEN_CODE_STUB(NumberToString, HydrogenCodeStub); | 649 DEFINE_HYDROGEN_CODE_STUB(NumberToString, HydrogenCodeStub); |
| 596 }; | 650 }; |
| (...skipping 2238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2835 | 2889 |
| 2836 #undef DEFINE_CALL_INTERFACE_DESCRIPTOR | 2890 #undef DEFINE_CALL_INTERFACE_DESCRIPTOR |
| 2837 #undef DEFINE_PLATFORM_CODE_STUB | 2891 #undef DEFINE_PLATFORM_CODE_STUB |
| 2838 #undef DEFINE_HANDLER_CODE_STUB | 2892 #undef DEFINE_HANDLER_CODE_STUB |
| 2839 #undef DEFINE_HYDROGEN_CODE_STUB | 2893 #undef DEFINE_HYDROGEN_CODE_STUB |
| 2840 #undef DEFINE_CODE_STUB | 2894 #undef DEFINE_CODE_STUB |
| 2841 #undef DEFINE_CODE_STUB_BASE | 2895 #undef DEFINE_CODE_STUB_BASE |
| 2842 } } // namespace v8::internal | 2896 } } // namespace v8::internal |
| 2843 | 2897 |
| 2844 #endif // V8_CODE_STUBS_H_ | 2898 #endif // V8_CODE_STUBS_H_ |
| OLD | NEW |