OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #include "src/code-stub-assembler.h" | 5 #include "src/code-stub-assembler.h" |
6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
7 #include "src/frames-inl.h" | 7 #include "src/frames-inl.h" |
8 #include "src/frames.h" | 8 #include "src/frames.h" |
9 #include "src/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
10 | 10 |
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 StoreHeapNumberValue(result, value); | 688 StoreHeapNumberValue(result, value); |
689 return result; | 689 return result; |
690 } | 690 } |
691 | 691 |
692 Node* CodeStubAssembler::AllocateSeqOneByteString(int length) { | 692 Node* CodeStubAssembler::AllocateSeqOneByteString(int length) { |
693 Node* result = Allocate(SeqOneByteString::SizeFor(length)); | 693 Node* result = Allocate(SeqOneByteString::SizeFor(length)); |
694 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex)); | 694 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex)); |
695 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kLengthOffset, | 695 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kLengthOffset, |
696 SmiConstant(Smi::FromInt(length))); | 696 SmiConstant(Smi::FromInt(length))); |
697 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kHashFieldOffset, | 697 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kHashFieldOffset, |
698 IntPtrConstant(String::kEmptyHashField)); | 698 IntPtrConstant(String::kEmptyHashField), |
| 699 MachineRepresentation::kWord32); |
699 return result; | 700 return result; |
700 } | 701 } |
701 | 702 |
702 Node* CodeStubAssembler::AllocateSeqOneByteString(Node* context, Node* length) { | 703 Node* CodeStubAssembler::AllocateSeqOneByteString(Node* context, Node* length) { |
703 Variable var_result(this, MachineRepresentation::kTagged); | 704 Variable var_result(this, MachineRepresentation::kTagged); |
704 | 705 |
705 // Compute the SeqOneByteString size and check if it fits into new space. | 706 // Compute the SeqOneByteString size and check if it fits into new space. |
706 Label if_sizeissmall(this), if_notsizeissmall(this, Label::kDeferred), | 707 Label if_sizeissmall(this), if_notsizeissmall(this, Label::kDeferred), |
707 if_join(this); | 708 if_join(this); |
708 Node* size = WordAnd( | 709 Node* size = WordAnd( |
709 IntPtrAdd( | 710 IntPtrAdd( |
710 IntPtrAdd(length, IntPtrConstant(SeqOneByteString::kHeaderSize)), | 711 IntPtrAdd(length, IntPtrConstant(SeqOneByteString::kHeaderSize)), |
711 IntPtrConstant(kObjectAlignmentMask)), | 712 IntPtrConstant(kObjectAlignmentMask)), |
712 IntPtrConstant(~kObjectAlignmentMask)); | 713 IntPtrConstant(~kObjectAlignmentMask)); |
713 Branch(IntPtrLessThanOrEqual(size, | 714 Branch(IntPtrLessThanOrEqual(size, |
714 IntPtrConstant(Page::kMaxRegularHeapObjectSize)), | 715 IntPtrConstant(Page::kMaxRegularHeapObjectSize)), |
715 &if_sizeissmall, &if_notsizeissmall); | 716 &if_sizeissmall, &if_notsizeissmall); |
716 | 717 |
717 Bind(&if_sizeissmall); | 718 Bind(&if_sizeissmall); |
718 { | 719 { |
719 // Just allocate the SeqOneByteString in new space. | 720 // Just allocate the SeqOneByteString in new space. |
720 Node* result = Allocate(size); | 721 Node* result = Allocate(size); |
721 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex)); | 722 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex)); |
722 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kLengthOffset, | 723 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kLengthOffset, |
723 SmiFromWord(length)); | 724 SmiFromWord(length)); |
724 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kHashFieldOffset, | 725 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kHashFieldOffset, |
725 IntPtrConstant(String::kEmptyHashField)); | 726 IntPtrConstant(String::kEmptyHashField), |
| 727 MachineRepresentation::kWord32); |
726 var_result.Bind(result); | 728 var_result.Bind(result); |
727 Goto(&if_join); | 729 Goto(&if_join); |
728 } | 730 } |
729 | 731 |
730 Bind(&if_notsizeissmall); | 732 Bind(&if_notsizeissmall); |
731 { | 733 { |
732 // We might need to allocate in large object space, go to the runtime. | 734 // We might need to allocate in large object space, go to the runtime. |
733 Node* result = CallRuntime(Runtime::kAllocateSeqOneByteString, context, | 735 Node* result = CallRuntime(Runtime::kAllocateSeqOneByteString, context, |
734 SmiFromWord(length)); | 736 SmiFromWord(length)); |
735 var_result.Bind(result); | 737 var_result.Bind(result); |
736 Goto(&if_join); | 738 Goto(&if_join); |
737 } | 739 } |
738 | 740 |
739 Bind(&if_join); | 741 Bind(&if_join); |
740 return var_result.value(); | 742 return var_result.value(); |
741 } | 743 } |
742 | 744 |
743 Node* CodeStubAssembler::AllocateSeqTwoByteString(int length) { | 745 Node* CodeStubAssembler::AllocateSeqTwoByteString(int length) { |
744 Node* result = Allocate(SeqTwoByteString::SizeFor(length)); | 746 Node* result = Allocate(SeqTwoByteString::SizeFor(length)); |
745 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex)); | 747 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex)); |
746 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kLengthOffset, | 748 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kLengthOffset, |
747 SmiConstant(Smi::FromInt(length))); | 749 SmiConstant(Smi::FromInt(length))); |
748 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kHashFieldOffset, | 750 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kHashFieldOffset, |
749 IntPtrConstant(String::kEmptyHashField)); | 751 IntPtrConstant(String::kEmptyHashField), |
| 752 MachineRepresentation::kWord32); |
750 return result; | 753 return result; |
751 } | 754 } |
752 | 755 |
753 Node* CodeStubAssembler::AllocateSeqTwoByteString(Node* context, Node* length) { | 756 Node* CodeStubAssembler::AllocateSeqTwoByteString(Node* context, Node* length) { |
754 Variable var_result(this, MachineRepresentation::kTagged); | 757 Variable var_result(this, MachineRepresentation::kTagged); |
755 | 758 |
756 // Compute the SeqTwoByteString size and check if it fits into new space. | 759 // Compute the SeqTwoByteString size and check if it fits into new space. |
757 Label if_sizeissmall(this), if_notsizeissmall(this, Label::kDeferred), | 760 Label if_sizeissmall(this), if_notsizeissmall(this, Label::kDeferred), |
758 if_join(this); | 761 if_join(this); |
759 Node* size = WordAnd( | 762 Node* size = WordAnd( |
760 IntPtrAdd(IntPtrAdd(WordShl(length, 1), | 763 IntPtrAdd(IntPtrAdd(WordShl(length, 1), |
761 IntPtrConstant(SeqTwoByteString::kHeaderSize)), | 764 IntPtrConstant(SeqTwoByteString::kHeaderSize)), |
762 IntPtrConstant(kObjectAlignmentMask)), | 765 IntPtrConstant(kObjectAlignmentMask)), |
763 IntPtrConstant(~kObjectAlignmentMask)); | 766 IntPtrConstant(~kObjectAlignmentMask)); |
764 Branch(IntPtrLessThanOrEqual(size, | 767 Branch(IntPtrLessThanOrEqual(size, |
765 IntPtrConstant(Page::kMaxRegularHeapObjectSize)), | 768 IntPtrConstant(Page::kMaxRegularHeapObjectSize)), |
766 &if_sizeissmall, &if_notsizeissmall); | 769 &if_sizeissmall, &if_notsizeissmall); |
767 | 770 |
768 Bind(&if_sizeissmall); | 771 Bind(&if_sizeissmall); |
769 { | 772 { |
770 // Just allocate the SeqTwoByteString in new space. | 773 // Just allocate the SeqTwoByteString in new space. |
771 Node* result = Allocate(size); | 774 Node* result = Allocate(size); |
772 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex)); | 775 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex)); |
773 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kLengthOffset, | 776 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kLengthOffset, |
774 SmiFromWord(length)); | 777 SmiFromWord(length)); |
775 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kHashFieldOffset, | 778 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kHashFieldOffset, |
776 IntPtrConstant(String::kEmptyHashField)); | 779 IntPtrConstant(String::kEmptyHashField), |
| 780 MachineRepresentation::kWord32); |
777 var_result.Bind(result); | 781 var_result.Bind(result); |
778 Goto(&if_join); | 782 Goto(&if_join); |
779 } | 783 } |
780 | 784 |
781 Bind(&if_notsizeissmall); | 785 Bind(&if_notsizeissmall); |
782 { | 786 { |
783 // We might need to allocate in large object space, go to the runtime. | 787 // We might need to allocate in large object space, go to the runtime. |
784 Node* result = CallRuntime(Runtime::kAllocateSeqTwoByteString, context, | 788 Node* result = CallRuntime(Runtime::kAllocateSeqTwoByteString, context, |
785 SmiFromWord(length)); | 789 SmiFromWord(length)); |
786 var_result.Bind(result); | 790 var_result.Bind(result); |
(...skipping 1568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2355 } | 2359 } |
2356 Bind(&miss); | 2360 Bind(&miss); |
2357 { | 2361 { |
2358 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->name, p->slot, | 2362 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->name, p->slot, |
2359 p->vector); | 2363 p->vector); |
2360 } | 2364 } |
2361 } | 2365 } |
2362 | 2366 |
2363 } // namespace internal | 2367 } // namespace internal |
2364 } // namespace v8 | 2368 } // namespace v8 |
OLD | NEW |