| 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 V(StoreFastElement) \ | 87 V(StoreFastElement) \ |
| 88 V(StoreScriptContextField) \ | 88 V(StoreScriptContextField) \ |
| 89 V(StringAdd) \ | 89 V(StringAdd) \ |
| 90 V(ToBoolean) \ | 90 V(ToBoolean) \ |
| 91 V(TransitionElementsKind) \ | 91 V(TransitionElementsKind) \ |
| 92 V(KeyedLoadIC) \ | 92 V(KeyedLoadIC) \ |
| 93 V(LoadIC) \ | 93 V(LoadIC) \ |
| 94 /* TurboFanCodeStubs */ \ | 94 /* TurboFanCodeStubs */ \ |
| 95 V(StringLengthTF) \ | 95 V(StringLengthTF) \ |
| 96 V(StringAddTF) \ | 96 V(StringAddTF) \ |
| 97 /* TurboFanICs */ \ | |
| 98 V(MathFloor) \ | 97 V(MathFloor) \ |
| 99 /* IC Handler stubs */ \ | 98 /* IC Handler stubs */ \ |
| 100 V(ArrayBufferViewLoadField) \ | 99 V(ArrayBufferViewLoadField) \ |
| 101 V(LoadConstant) \ | 100 V(LoadConstant) \ |
| 102 V(LoadFastElement) \ | 101 V(LoadFastElement) \ |
| 103 V(LoadField) \ | 102 V(LoadField) \ |
| 104 V(KeyedLoadSloppyArguments) \ | 103 V(KeyedLoadSloppyArguments) \ |
| 105 V(KeyedStoreSloppyArguments) \ | 104 V(KeyedStoreSloppyArguments) \ |
| 106 V(StoreField) \ | 105 V(StoreField) \ |
| 107 V(StoreGlobal) \ | 106 V(StoreGlobal) \ |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 // true, which will cause an assertion if we try to call something that can | 209 // true, which will cause an assertion if we try to call something that can |
| 211 // GC or if we try to put a stack frame on top of the junk, which would not | 210 // GC or if we try to put a stack frame on top of the junk, which would not |
| 212 // result in a traversable stack. | 211 // result in a traversable stack. |
| 213 virtual bool SometimesSetsUpAFrame() { return true; } | 212 virtual bool SometimesSetsUpAFrame() { return true; } |
| 214 | 213 |
| 215 // Lookup the code in the (possibly custom) cache. | 214 // Lookup the code in the (possibly custom) cache. |
| 216 bool FindCodeInCache(Code** code_out); | 215 bool FindCodeInCache(Code** code_out); |
| 217 | 216 |
| 218 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() const = 0; | 217 virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() const = 0; |
| 219 | 218 |
| 220 virtual int GetStackParameterCount() const { | 219 virtual int GetStackParameterCount() const { return 0; } |
| 221 return GetCallInterfaceDescriptor().GetStackParameterCount(); | |
| 222 } | |
| 223 | 220 |
| 224 virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {} | 221 virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {} |
| 225 | 222 |
| 226 static void InitializeDescriptor(Isolate* isolate, uint32_t key, | 223 static void InitializeDescriptor(Isolate* isolate, uint32_t key, |
| 227 CodeStubDescriptor* desc); | 224 CodeStubDescriptor* desc); |
| 228 | 225 |
| 229 static MaybeHandle<Code> GetCode(Isolate* isolate, uint32_t key); | 226 static MaybeHandle<Code> GetCode(Isolate* isolate, uint32_t key); |
| 230 | 227 |
| 231 // Returns information for computing the number key. | 228 // Returns information for computing the number key. |
| 232 virtual Major MajorKey() const = 0; | 229 virtual Major MajorKey() const = 0; |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 void Generate(MacroAssembler* masm) override; \ | 353 void Generate(MacroAssembler* masm) override; \ |
| 357 DEFINE_CODE_STUB(NAME, SUPER) | 354 DEFINE_CODE_STUB(NAME, SUPER) |
| 358 | 355 |
| 359 | 356 |
| 360 #define DEFINE_HYDROGEN_CODE_STUB(NAME, SUPER) \ | 357 #define DEFINE_HYDROGEN_CODE_STUB(NAME, SUPER) \ |
| 361 public: \ | 358 public: \ |
| 362 void InitializeDescriptor(CodeStubDescriptor* descriptor) override; \ | 359 void InitializeDescriptor(CodeStubDescriptor* descriptor) override; \ |
| 363 Handle<Code> GenerateCode() override; \ | 360 Handle<Code> GenerateCode() override; \ |
| 364 DEFINE_CODE_STUB(NAME, SUPER) | 361 DEFINE_CODE_STUB(NAME, SUPER) |
| 365 | 362 |
| 366 #define DEFINE_TURBOFAN_CODE_STUB(NAME, SUPER) \ | |
| 367 public: \ | |
| 368 CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { \ | |
| 369 return DESC##Descriptor(isolate()); \ | |
| 370 }; \ | |
| 371 DEFINE_CODE_STUB(NAME, SUPER) | |
| 372 | |
| 373 #define DEFINE_TURBOFAN_IC(NAME, SUPER, DESC) \ | |
| 374 public: \ | |
| 375 CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { \ | |
| 376 if (GetCallMode() == CALL_FROM_OPTIMIZED_CODE) { \ | |
| 377 return DESC##CallFromOptimizedCodeDescriptor(isolate()); \ | |
| 378 } else { \ | |
| 379 return DESC##CallFromUnoptimizedCodeDescriptor(isolate()); \ | |
| 380 } \ | |
| 381 }; \ | |
| 382 \ | |
| 383 protected: \ | |
| 384 DEFINE_CODE_STUB(NAME, SUPER) | |
| 385 | |
| 386 #define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ | 363 #define DEFINE_HANDLER_CODE_STUB(NAME, SUPER) \ |
| 387 public: \ | 364 public: \ |
| 388 Handle<Code> GenerateCode() override; \ | 365 Handle<Code> GenerateCode() override; \ |
| 389 DEFINE_CODE_STUB(NAME, SUPER) | 366 DEFINE_CODE_STUB(NAME, SUPER) |
| 390 | 367 |
| 391 #define DEFINE_CALL_INTERFACE_DESCRIPTOR(NAME) \ | 368 #define DEFINE_CALL_INTERFACE_DESCRIPTOR(NAME) \ |
| 392 public: \ | 369 public: \ |
| 393 CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { \ | 370 CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { \ |
| 394 return NAME##Descriptor(isolate()); \ | 371 return NAME##Descriptor(isolate()); \ |
| 395 } | 372 } |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 Code::StubType GetStubType() const override { return Code::FAST; } | 537 Code::StubType GetStubType() const override { return Code::FAST; } |
| 561 | 538 |
| 562 protected: | 539 protected: |
| 563 explicit TurboFanCodeStub(Isolate* isolate) : CodeStub(isolate) {} | 540 explicit TurboFanCodeStub(Isolate* isolate) : CodeStub(isolate) {} |
| 564 | 541 |
| 565 private: | 542 private: |
| 566 DEFINE_CODE_STUB_BASE(TurboFanCodeStub, CodeStub); | 543 DEFINE_CODE_STUB_BASE(TurboFanCodeStub, CodeStub); |
| 567 }; | 544 }; |
| 568 | 545 |
| 569 | 546 |
| 570 class TurboFanIC : public TurboFanCodeStub { | |
| 571 public: | |
| 572 enum CallMode { CALL_FROM_UNOPTIMIZED_CODE, CALL_FROM_OPTIMIZED_CODE }; | |
| 573 | |
| 574 protected: | |
| 575 explicit TurboFanIC(Isolate* isolate, CallMode mode) | |
| 576 : TurboFanCodeStub(isolate) { | |
| 577 minor_key_ = CallModeBits::encode(mode); | |
| 578 } | |
| 579 | |
| 580 CallMode GetCallMode() const { return CallModeBits::decode(minor_key_); } | |
| 581 | |
| 582 void set_sub_minor_key(uint32_t key) { | |
| 583 minor_key_ = SubMinorKeyBits::update(minor_key_, key); | |
| 584 } | |
| 585 | |
| 586 uint32_t sub_minor_key() const { return SubMinorKeyBits::decode(minor_key_); } | |
| 587 | |
| 588 static const int kSubMinorKeyBits = kStubMinorKeyBits - 1; | |
| 589 | |
| 590 private: | |
| 591 class CallModeBits : public BitField<CallMode, 0, 1> {}; | |
| 592 class SubMinorKeyBits : public BitField<int, 1, kSubMinorKeyBits> {}; | |
| 593 DEFINE_CODE_STUB_BASE(TurboFanIC, TurboFanCodeStub); | |
| 594 }; | |
| 595 | |
| 596 | |
| 597 // Helper interface to prepare to/restore after making runtime calls. | 547 // Helper interface to prepare to/restore after making runtime calls. |
| 598 class RuntimeCallHelper { | 548 class RuntimeCallHelper { |
| 599 public: | 549 public: |
| 600 virtual ~RuntimeCallHelper() {} | 550 virtual ~RuntimeCallHelper() {} |
| 601 | 551 |
| 602 virtual void BeforeCall(MacroAssembler* masm) const = 0; | 552 virtual void BeforeCall(MacroAssembler* masm) const = 0; |
| 603 | 553 |
| 604 virtual void AfterCall(MacroAssembler* masm) const = 0; | 554 virtual void AfterCall(MacroAssembler* masm) const = 0; |
| 605 | 555 |
| 606 protected: | 556 protected: |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 class NopRuntimeCallHelper : public RuntimeCallHelper { | 603 class NopRuntimeCallHelper : public RuntimeCallHelper { |
| 654 public: | 604 public: |
| 655 NopRuntimeCallHelper() {} | 605 NopRuntimeCallHelper() {} |
| 656 | 606 |
| 657 virtual void BeforeCall(MacroAssembler* masm) const {} | 607 virtual void BeforeCall(MacroAssembler* masm) const {} |
| 658 | 608 |
| 659 virtual void AfterCall(MacroAssembler* masm) const {} | 609 virtual void AfterCall(MacroAssembler* masm) const {} |
| 660 }; | 610 }; |
| 661 | 611 |
| 662 | 612 |
| 663 class MathFloorStub : public TurboFanIC { | 613 class MathFloorStub : public TurboFanCodeStub { |
| 664 public: | 614 public: |
| 665 explicit MathFloorStub(Isolate* isolate, TurboFanIC::CallMode mode) | 615 explicit MathFloorStub(Isolate* isolate) : TurboFanCodeStub(isolate) {} |
| 666 : TurboFanIC(isolate, mode) {} | 616 int GetStackParameterCount() const override { return 1; } |
| 667 Code::Kind GetCodeKind() const override { return Code::CALL_IC; } | 617 |
| 668 DEFINE_TURBOFAN_IC(MathFloor, TurboFanIC, MathRoundVariant); | 618 DEFINE_CALL_INTERFACE_DESCRIPTOR(MathRoundVariant); |
| 619 DEFINE_CODE_STUB(MathFloor, TurboFanCodeStub); |
| 669 }; | 620 }; |
| 670 | 621 |
| 671 | 622 |
| 672 class StringLengthTFStub : public TurboFanCodeStub { | 623 class StringLengthTFStub : public TurboFanCodeStub { |
| 673 public: | 624 public: |
| 674 explicit StringLengthTFStub(Isolate* isolate) : TurboFanCodeStub(isolate) {} | 625 explicit StringLengthTFStub(Isolate* isolate) : TurboFanCodeStub(isolate) {} |
| 675 | 626 |
| 676 Code::Kind GetCodeKind() const override { return Code::HANDLER; } | 627 Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
| 677 InlineCacheState GetICState() const override { return MONOMORPHIC; } | 628 InlineCacheState GetICState() const override { return MONOMORPHIC; } |
| 678 ExtraICState GetExtraICState() const override { return Code::LOAD_IC; } | 629 ExtraICState GetExtraICState() const override { return Code::LOAD_IC; } |
| (...skipping 2356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3035 #undef DEFINE_PLATFORM_CODE_STUB | 2986 #undef DEFINE_PLATFORM_CODE_STUB |
| 3036 #undef DEFINE_HANDLER_CODE_STUB | 2987 #undef DEFINE_HANDLER_CODE_STUB |
| 3037 #undef DEFINE_HYDROGEN_CODE_STUB | 2988 #undef DEFINE_HYDROGEN_CODE_STUB |
| 3038 #undef DEFINE_CODE_STUB | 2989 #undef DEFINE_CODE_STUB |
| 3039 #undef DEFINE_CODE_STUB_BASE | 2990 #undef DEFINE_CODE_STUB_BASE |
| 3040 | 2991 |
| 3041 extern Representation RepresentationFromType(Type* type); | 2992 extern Representation RepresentationFromType(Type* type); |
| 3042 } } // namespace v8::internal | 2993 } } // namespace v8::internal |
| 3043 | 2994 |
| 3044 #endif // V8_CODE_STUBS_H_ | 2995 #endif // V8_CODE_STUBS_H_ |
| OLD | NEW |