| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 5665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5676 AllocationSiteOverrideMode mode) { | 5676 AllocationSiteOverrideMode mode) { |
| 5677 if (mode == DISABLE_ALLOCATION_SITES) { | 5677 if (mode == DISABLE_ALLOCATION_SITES) { |
| 5678 T stub(GetInitialFastElementsKind(), | 5678 T stub(GetInitialFastElementsKind(), |
| 5679 CONTEXT_CHECK_REQUIRED, | 5679 CONTEXT_CHECK_REQUIRED, |
| 5680 mode); | 5680 mode); |
| 5681 __ TailCallStub(&stub); | 5681 __ TailCallStub(&stub); |
| 5682 } else if (mode == DONT_OVERRIDE) { | 5682 } else if (mode == DONT_OVERRIDE) { |
| 5683 int last_index = GetSequenceIndexFromFastElementsKind( | 5683 int last_index = GetSequenceIndexFromFastElementsKind( |
| 5684 TERMINAL_FAST_ELEMENTS_KIND); | 5684 TERMINAL_FAST_ELEMENTS_KIND); |
| 5685 for (int i = 0; i <= last_index; ++i) { | 5685 for (int i = 0; i <= last_index; ++i) { |
| 5686 Label next; | |
| 5687 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 5686 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 5688 __ Branch(&next, ne, a3, Operand(kind)); | |
| 5689 T stub(kind); | 5687 T stub(kind); |
| 5690 __ TailCallStub(&stub); | 5688 __ TailCallStub(&stub, eq, a3, Operand(kind)); |
| 5691 __ bind(&next); | |
| 5692 } | 5689 } |
| 5693 | 5690 |
| 5694 // If we reached this point there is a problem. | 5691 // If we reached this point there is a problem. |
| 5695 __ Abort(kUnexpectedElementsKindInArrayConstructor); | 5692 __ Abort(kUnexpectedElementsKindInArrayConstructor); |
| 5696 } else { | 5693 } else { |
| 5697 UNREACHABLE(); | 5694 UNREACHABLE(); |
| 5698 } | 5695 } |
| 5699 } | 5696 } |
| 5700 | 5697 |
| 5701 | 5698 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5757 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); | 5754 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); |
| 5758 __ lw(t0, FieldMemOperand(t1, AllocationSite::kTransitionInfoOffset)); | 5755 __ lw(t0, FieldMemOperand(t1, AllocationSite::kTransitionInfoOffset)); |
| 5759 __ Addu(t0, t0, Operand(Smi::FromInt(kFastElementsKindPackedToHoley))); | 5756 __ Addu(t0, t0, Operand(Smi::FromInt(kFastElementsKindPackedToHoley))); |
| 5760 __ sw(t0, FieldMemOperand(t1, AllocationSite::kTransitionInfoOffset)); | 5757 __ sw(t0, FieldMemOperand(t1, AllocationSite::kTransitionInfoOffset)); |
| 5761 | 5758 |
| 5762 | 5759 |
| 5763 __ bind(&normal_sequence); | 5760 __ bind(&normal_sequence); |
| 5764 int last_index = GetSequenceIndexFromFastElementsKind( | 5761 int last_index = GetSequenceIndexFromFastElementsKind( |
| 5765 TERMINAL_FAST_ELEMENTS_KIND); | 5762 TERMINAL_FAST_ELEMENTS_KIND); |
| 5766 for (int i = 0; i <= last_index; ++i) { | 5763 for (int i = 0; i <= last_index; ++i) { |
| 5767 Label next; | |
| 5768 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 5764 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 5769 __ Branch(&next, ne, a3, Operand(kind)); | |
| 5770 ArraySingleArgumentConstructorStub stub(kind); | 5765 ArraySingleArgumentConstructorStub stub(kind); |
| 5771 __ TailCallStub(&stub); | 5766 __ TailCallStub(&stub, eq, a3, Operand(kind)); |
| 5772 __ bind(&next); | |
| 5773 } | 5767 } |
| 5774 | 5768 |
| 5775 // If we reached this point there is a problem. | 5769 // If we reached this point there is a problem. |
| 5776 __ Abort(kUnexpectedElementsKindInArrayConstructor); | 5770 __ Abort(kUnexpectedElementsKindInArrayConstructor); |
| 5777 } else { | 5771 } else { |
| 5778 UNREACHABLE(); | 5772 UNREACHABLE(); |
| 5779 } | 5773 } |
| 5780 } | 5774 } |
| 5781 | 5775 |
| 5782 | 5776 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5904 __ And(a3, a3, Operand(AllocationSite::ElementsKindBits::kMask)); | 5898 __ And(a3, a3, Operand(AllocationSite::ElementsKindBits::kMask)); |
| 5905 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); | 5899 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); |
| 5906 | 5900 |
| 5907 __ bind(&no_info); | 5901 __ bind(&no_info); |
| 5908 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); | 5902 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); |
| 5909 } | 5903 } |
| 5910 | 5904 |
| 5911 | 5905 |
| 5912 void InternalArrayConstructorStub::GenerateCase( | 5906 void InternalArrayConstructorStub::GenerateCase( |
| 5913 MacroAssembler* masm, ElementsKind kind) { | 5907 MacroAssembler* masm, ElementsKind kind) { |
| 5914 Label not_zero_case, not_one_case; | |
| 5915 Label normal_sequence; | |
| 5916 | 5908 |
| 5917 __ Branch(¬_zero_case, ne, a0, Operand(zero_reg)); | |
| 5918 InternalArrayNoArgumentConstructorStub stub0(kind); | 5909 InternalArrayNoArgumentConstructorStub stub0(kind); |
| 5919 __ TailCallStub(&stub0); | 5910 __ TailCallStub(&stub0, lo, a0, Operand(1)); |
| 5920 | 5911 |
| 5921 __ bind(¬_zero_case); | 5912 InternalArrayNArgumentsConstructorStub stubN(kind); |
| 5922 __ Branch(¬_one_case, gt, a0, Operand(1)); | 5913 __ TailCallStub(&stubN, hi, a0, Operand(1)); |
| 5923 | 5914 |
| 5924 if (IsFastPackedElementsKind(kind)) { | 5915 if (IsFastPackedElementsKind(kind)) { |
| 5925 // We might need to create a holey array | 5916 // We might need to create a holey array |
| 5926 // look at the first argument. | 5917 // look at the first argument. |
| 5927 __ lw(at, MemOperand(sp, 0)); | 5918 __ lw(at, MemOperand(sp, 0)); |
| 5928 __ Branch(&normal_sequence, eq, at, Operand(zero_reg)); | |
| 5929 | 5919 |
| 5930 InternalArraySingleArgumentConstructorStub | 5920 InternalArraySingleArgumentConstructorStub |
| 5931 stub1_holey(GetHoleyElementsKind(kind)); | 5921 stub1_holey(GetHoleyElementsKind(kind)); |
| 5932 __ TailCallStub(&stub1_holey); | 5922 __ TailCallStub(&stub1_holey, ne, at, Operand(zero_reg)); |
| 5933 } | 5923 } |
| 5934 | 5924 |
| 5935 __ bind(&normal_sequence); | |
| 5936 InternalArraySingleArgumentConstructorStub stub1(kind); | 5925 InternalArraySingleArgumentConstructorStub stub1(kind); |
| 5937 __ TailCallStub(&stub1); | 5926 __ TailCallStub(&stub1); |
| 5938 | |
| 5939 __ bind(¬_one_case); | |
| 5940 InternalArrayNArgumentsConstructorStub stubN(kind); | |
| 5941 __ TailCallStub(&stubN); | |
| 5942 } | 5927 } |
| 5943 | 5928 |
| 5944 | 5929 |
| 5945 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { | 5930 void InternalArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 5946 // ----------- S t a t e ------------- | 5931 // ----------- S t a t e ------------- |
| 5947 // -- a0 : argc | 5932 // -- a0 : argc |
| 5948 // -- a1 : constructor | 5933 // -- a1 : constructor |
| 5949 // -- sp[0] : return address | 5934 // -- sp[0] : return address |
| 5950 // -- sp[4] : last argument | 5935 // -- sp[4] : last argument |
| 5951 // ----------------------------------- | 5936 // ----------------------------------- |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5990 __ bind(&fast_elements_case); | 5975 __ bind(&fast_elements_case); |
| 5991 GenerateCase(masm, FAST_ELEMENTS); | 5976 GenerateCase(masm, FAST_ELEMENTS); |
| 5992 } | 5977 } |
| 5993 | 5978 |
| 5994 | 5979 |
| 5995 #undef __ | 5980 #undef __ |
| 5996 | 5981 |
| 5997 } } // namespace v8::internal | 5982 } } // namespace v8::internal |
| 5998 | 5983 |
| 5999 #endif // V8_TARGET_ARCH_MIPS | 5984 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |