| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_MIPS | 7 #if V8_TARGET_ARCH_MIPS |
| 8 | 8 |
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| (...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 779 // scratch3: begin of FixedDoubleArray element fields, not tagged | 779 // scratch3: begin of FixedDoubleArray element fields, not tagged |
| 780 __ Branch(USE_DELAY_SLOT, &entry); | 780 __ Branch(USE_DELAY_SLOT, &entry); |
| 781 __ li(hole_upper, Operand(kHoleNanUpper32)); // In delay slot. | 781 __ li(hole_upper, Operand(kHoleNanUpper32)); // In delay slot. |
| 782 | 782 |
| 783 __ bind(&only_change_map); | 783 __ bind(&only_change_map); |
| 784 __ sw(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); | 784 __ sw(target_map, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
| 785 __ RecordWriteField(receiver, | 785 __ RecordWriteField(receiver, |
| 786 HeapObject::kMapOffset, | 786 HeapObject::kMapOffset, |
| 787 target_map, | 787 target_map, |
| 788 scratch2, | 788 scratch2, |
| 789 kRAHasNotBeenSaved, | 789 kRAHasBeenSaved, |
| 790 kDontSaveFPRegs, | 790 kDontSaveFPRegs, |
| 791 OMIT_REMEMBERED_SET, | 791 OMIT_REMEMBERED_SET, |
| 792 OMIT_SMI_CHECK); | 792 OMIT_SMI_CHECK); |
| 793 __ Branch(&done); | 793 __ Branch(&done); |
| 794 | 794 |
| 795 // Call into runtime if GC is required. | 795 // Call into runtime if GC is required. |
| 796 __ bind(&gc_required); | 796 __ bind(&gc_required); |
| 797 __ lw(ra, MemOperand(sp, 0)); |
| 797 __ Branch(USE_DELAY_SLOT, fail); | 798 __ Branch(USE_DELAY_SLOT, fail); |
| 798 __ pop(ra); | 799 __ addiu(sp, sp, kPointerSize); // In delay slot. |
| 799 | 800 |
| 800 // Convert and copy elements. | 801 // Convert and copy elements. |
| 801 __ bind(&loop); | 802 __ bind(&loop); |
| 802 __ lw(scratch2, MemOperand(scratch1)); | 803 __ lw(scratch2, MemOperand(scratch1)); |
| 803 __ Addu(scratch1, scratch1, kIntSize); | 804 __ Addu(scratch1, scratch1, kIntSize); |
| 804 // scratch2: current element | 805 // scratch2: current element |
| 805 __ UntagAndJumpIfNotSmi(scratch2, scratch2, &convert_hole); | 806 __ UntagAndJumpIfNotSmi(scratch2, scratch2, &convert_hole); |
| 806 | 807 |
| 807 // Normal smi, convert to double and store. | 808 // Normal smi, convert to double and store. |
| 808 __ mtc1(scratch2, f0); | 809 __ mtc1(scratch2, f0); |
| 809 __ cvt_d_w(f0, f0); | 810 __ cvt_d_w(f0, f0); |
| 810 __ sdc1(f0, MemOperand(scratch3)); | 811 __ sdc1(f0, MemOperand(scratch3)); |
| 811 __ Branch(USE_DELAY_SLOT, &entry); | 812 __ Branch(USE_DELAY_SLOT, &entry); |
| 812 __ addiu(scratch3, scratch3, kDoubleSize); // In delay slot. | 813 __ addiu(scratch3, scratch3, kDoubleSize); // In delay slot. |
| 813 | 814 |
| 814 // Hole found, store the-hole NaN. | 815 // Hole found, store the-hole NaN. |
| 815 __ bind(&convert_hole); | 816 __ bind(&convert_hole); |
| 816 if (FLAG_debug_code) { | 817 if (FLAG_debug_code) { |
| 817 // Restore a "smi-untagged" heap object. | 818 // Restore a "smi-untagged" heap object. |
| 818 __ SmiTag(scratch2); | 819 __ SmiTag(scratch2); |
| 819 __ Or(scratch2, scratch2, Operand(1)); | 820 __ Or(scratch2, scratch2, Operand(1)); |
| 820 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 821 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
| 821 __ Assert(eq, kObjectFoundInSmiOnlyArray, at, Operand(scratch2)); | 822 __ Assert(eq, kObjectFoundInSmiOnlyArray, at, Operand(scratch2)); |
| 822 } | 823 } |
| 823 // mantissa | 824 // mantissa |
| 824 __ sw(hole_lower, MemOperand(scratch3, Register::kMantissaOffset)); | 825 __ sw(hole_lower, MemOperand(scratch3, Register::kMantissaOffset)); |
| 825 // exponent | 826 // exponent |
| 826 __ sw(hole_upper, MemOperand(scratch3, Register::kExponentOffset)); | 827 __ sw(hole_upper, MemOperand(scratch3, Register::kExponentOffset)); |
| 827 __ bind(&entry); | 828 __ bind(&entry); |
| 828 __ addiu(scratch3, scratch3, kDoubleSize); // In delay slot. | 829 __ addiu(scratch3, scratch3, kDoubleSize); |
| 829 | 830 |
| 830 __ Branch(&loop, lt, scratch3, Operand(array_end)); | 831 __ Branch(&loop, lt, scratch3, Operand(array_end)); |
| 831 | 832 |
| 833 __ bind(&done); |
| 832 __ pop(ra); | 834 __ pop(ra); |
| 833 __ bind(&done); | |
| 834 } | 835 } |
| 835 | 836 |
| 836 | 837 |
| 837 void ElementsTransitionGenerator::GenerateDoubleToObject( | 838 void ElementsTransitionGenerator::GenerateDoubleToObject( |
| 838 MacroAssembler* masm, | 839 MacroAssembler* masm, |
| 839 Register receiver, | 840 Register receiver, |
| 840 Register key, | 841 Register key, |
| 841 Register value, | 842 Register value, |
| 842 Register target_map, | 843 Register target_map, |
| 843 AllocationSiteMode mode, | 844 AllocationSiteMode mode, |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 patcher.masm()->nop(); // Pad the empty space. | 1241 patcher.masm()->nop(); // Pad the empty space. |
| 1241 } | 1242 } |
| 1242 } | 1243 } |
| 1243 | 1244 |
| 1244 | 1245 |
| 1245 #undef __ | 1246 #undef __ |
| 1246 | 1247 |
| 1247 } } // namespace v8::internal | 1248 } } // namespace v8::internal |
| 1248 | 1249 |
| 1249 #endif // V8_TARGET_ARCH_MIPS | 1250 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |