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 "allocation.h" | 8 #include "allocation.h" |
9 #include "assembler.h" | 9 #include "assembler.h" |
10 #include "codegen.h" | 10 #include "codegen.h" |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 struct CodeStubInterfaceDescriptor { | 270 struct CodeStubInterfaceDescriptor { |
271 CodeStubInterfaceDescriptor(); | 271 CodeStubInterfaceDescriptor(); |
272 int register_param_count_; | 272 int register_param_count_; |
273 | 273 |
274 Register stack_parameter_count_; | 274 Register stack_parameter_count_; |
275 // if hint_stack_parameter_count_ > 0, the code stub can optimize the | 275 // if hint_stack_parameter_count_ > 0, the code stub can optimize the |
276 // return sequence. Default value is -1, which means it is ignored. | 276 // return sequence. Default value is -1, which means it is ignored. |
277 int hint_stack_parameter_count_; | 277 int hint_stack_parameter_count_; |
278 StubFunctionMode function_mode_; | 278 StubFunctionMode function_mode_; |
279 Register* register_params_; | 279 Register* register_params_; |
280 // Specifies Representations for the stub's parameter. Points to an array of | |
281 // Representations of the same length of the numbers of parameters to the | |
282 // stub, or if NULL (the default value), Representation of each parameter | |
283 // assumed to be Tagged() | |
284 Representation* register_param_representations_; | |
285 | 280 |
286 Address deoptimization_handler_; | 281 Address deoptimization_handler_; |
287 HandlerArgumentsMode handler_arguments_mode_; | 282 HandlerArgumentsMode handler_arguments_mode_; |
288 | 283 |
289 bool initialized() const { return register_param_count_ >= 0; } | 284 bool initialized() const { return register_param_count_ >= 0; } |
290 | 285 |
291 int environment_length() const { | 286 int environment_length() const { |
292 return register_param_count_; | 287 return register_param_count_; |
293 } | 288 } |
294 | 289 |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 static const int kFunction = 0; | 574 static const int kFunction = 0; |
580 | 575 |
581 private: | 576 private: |
582 int slots_; | 577 int slots_; |
583 }; | 578 }; |
584 | 579 |
585 | 580 |
586 class FastCloneShallowArrayStub : public HydrogenCodeStub { | 581 class FastCloneShallowArrayStub : public HydrogenCodeStub { |
587 public: | 582 public: |
588 // Maximum length of copied elements array. | 583 // Maximum length of copied elements array. |
589 static const int kMaximumInlinedCloneLength = 8; | 584 static const int kMaximumClonedLength = 8; |
| 585 enum Mode { |
| 586 CLONE_ELEMENTS, |
| 587 CLONE_DOUBLE_ELEMENTS, |
| 588 COPY_ON_WRITE_ELEMENTS, |
| 589 CLONE_ANY_ELEMENTS, |
| 590 LAST_CLONE_MODE = CLONE_ANY_ELEMENTS |
| 591 }; |
| 592 |
| 593 static const int kFastCloneModeCount = LAST_CLONE_MODE + 1; |
590 | 594 |
591 FastCloneShallowArrayStub(Isolate* isolate, | 595 FastCloneShallowArrayStub(Isolate* isolate, |
592 AllocationSiteMode allocation_site_mode) | 596 Mode mode, |
| 597 AllocationSiteMode allocation_site_mode, |
| 598 int length) |
593 : HydrogenCodeStub(isolate), | 599 : HydrogenCodeStub(isolate), |
594 allocation_site_mode_(allocation_site_mode) {} | 600 mode_(mode), |
| 601 allocation_site_mode_(allocation_site_mode), |
| 602 length_((mode == COPY_ON_WRITE_ELEMENTS) ? 0 : length) { |
| 603 ASSERT_GE(length_, 0); |
| 604 ASSERT_LE(length_, kMaximumClonedLength); |
| 605 } |
595 | 606 |
| 607 Mode mode() const { return mode_; } |
| 608 int length() const { return length_; } |
596 AllocationSiteMode allocation_site_mode() const { | 609 AllocationSiteMode allocation_site_mode() const { |
597 return allocation_site_mode_; | 610 return allocation_site_mode_; |
598 } | 611 } |
599 | 612 |
600 virtual Handle<Code> GenerateCode(); | 613 ElementsKind ComputeElementsKind() const { |
| 614 switch (mode()) { |
| 615 case CLONE_ELEMENTS: |
| 616 case COPY_ON_WRITE_ELEMENTS: |
| 617 return FAST_ELEMENTS; |
| 618 case CLONE_DOUBLE_ELEMENTS: |
| 619 return FAST_DOUBLE_ELEMENTS; |
| 620 case CLONE_ANY_ELEMENTS: |
| 621 /*fall-through*/; |
| 622 } |
| 623 UNREACHABLE(); |
| 624 return LAST_ELEMENTS_KIND; |
| 625 } |
| 626 |
| 627 virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
601 | 628 |
602 virtual void InitializeInterfaceDescriptor( | 629 virtual void InitializeInterfaceDescriptor( |
603 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; | 630 CodeStubInterfaceDescriptor* descriptor) V8_OVERRIDE; |
604 | 631 |
605 static void InstallDescriptors(Isolate* isolate); | 632 static void InstallDescriptors(Isolate* isolate); |
606 | 633 |
607 private: | 634 private: |
| 635 Mode mode_; |
608 AllocationSiteMode allocation_site_mode_; | 636 AllocationSiteMode allocation_site_mode_; |
| 637 int length_; |
609 | 638 |
610 class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {}; | 639 class AllocationSiteModeBits: public BitField<AllocationSiteMode, 0, 1> {}; |
| 640 class ModeBits: public BitField<Mode, 1, 4> {}; |
| 641 class LengthBits: public BitField<int, 5, 4> {}; |
611 // Ensure data fits within available bits. | 642 // Ensure data fits within available bits. |
| 643 STATIC_ASSERT(LAST_ALLOCATION_SITE_MODE == 1); |
| 644 STATIC_ASSERT(kFastCloneModeCount < 16); |
| 645 STATIC_ASSERT(kMaximumClonedLength < 16); |
612 Major MajorKey() { return FastCloneShallowArray; } | 646 Major MajorKey() { return FastCloneShallowArray; } |
613 int NotMissMinorKey() { | 647 int NotMissMinorKey() { |
614 return AllocationSiteModeBits::encode(allocation_site_mode_); | 648 return AllocationSiteModeBits::encode(allocation_site_mode_) |
| 649 | ModeBits::encode(mode_) |
| 650 | LengthBits::encode(length_); |
615 } | 651 } |
616 }; | 652 }; |
617 | 653 |
618 | 654 |
619 class FastCloneShallowObjectStub : public HydrogenCodeStub { | 655 class FastCloneShallowObjectStub : public HydrogenCodeStub { |
620 public: | 656 public: |
621 // Maximum number of properties in copied object. | 657 // Maximum number of properties in copied object. |
622 static const int kMaximumClonedProperties = 6; | 658 static const int kMaximumClonedProperties = 6; |
623 | 659 |
624 FastCloneShallowObjectStub(Isolate* isolate, int length) | 660 FastCloneShallowObjectStub(Isolate* isolate, int length) |
(...skipping 1882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2507 | 2543 |
2508 | 2544 |
2509 class CallDescriptors { | 2545 class CallDescriptors { |
2510 public: | 2546 public: |
2511 static void InitializeForIsolate(Isolate* isolate); | 2547 static void InitializeForIsolate(Isolate* isolate); |
2512 }; | 2548 }; |
2513 | 2549 |
2514 } } // namespace v8::internal | 2550 } } // namespace v8::internal |
2515 | 2551 |
2516 #endif // V8_CODE_STUBS_H_ | 2552 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |