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 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 | 889 |
890 // Prepare for conversion loop. | 890 // Prepare for conversion loop. |
891 Register src_elements = elements; | 891 Register src_elements = elements; |
892 Register dst_elements = target_map; | 892 Register dst_elements = target_map; |
893 Register dst_end = length; | 893 Register dst_end = length; |
894 Register heap_number_map = scratch; | 894 Register heap_number_map = scratch; |
895 __ Addu(src_elements, src_elements, Operand( | 895 __ Addu(src_elements, src_elements, Operand( |
896 FixedDoubleArray::kHeaderSize - kHeapObjectTag | 896 FixedDoubleArray::kHeaderSize - kHeapObjectTag |
897 + Register::kExponentOffset)); | 897 + Register::kExponentOffset)); |
898 __ Addu(dst_elements, array, Operand(FixedArray::kHeaderSize)); | 898 __ Addu(dst_elements, array, Operand(FixedArray::kHeaderSize)); |
899 __ Addu(array, array, Operand(kHeapObjectTag)); | |
900 __ sll(dst_end, dst_end, 1); | 899 __ sll(dst_end, dst_end, 1); |
901 __ Addu(dst_end, dst_elements, dst_end); | 900 __ Addu(dst_end, dst_elements, dst_end); |
| 901 |
| 902 // Allocating heap numbers in the loop below can fail and cause a jump to |
| 903 // gc_required. We can't leave a partly initialized FixedArray behind, |
| 904 // so pessimistically fill it with holes now. |
| 905 Label initialization_loop, initialization_loop_entry; |
| 906 __ LoadRoot(scratch, Heap::kTheHoleValueRootIndex); |
| 907 __ Branch(&initialization_loop_entry); |
| 908 __ bind(&initialization_loop); |
| 909 __ sw(scratch, MemOperand(dst_elements)); |
| 910 __ Addu(dst_elements, dst_elements, Operand(kPointerSize)); |
| 911 __ bind(&initialization_loop_entry); |
| 912 __ Branch(&initialization_loop, lt, dst_elements, Operand(dst_end)); |
| 913 |
| 914 __ Addu(dst_elements, array, Operand(FixedArray::kHeaderSize)); |
| 915 __ Addu(array, array, Operand(kHeapObjectTag)); |
902 __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); | 916 __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |
903 // Using offsetted addresses. | 917 // Using offsetted addresses. |
904 // dst_elements: begin of destination FixedArray element fields, not tagged | 918 // dst_elements: begin of destination FixedArray element fields, not tagged |
905 // src_elements: begin of source FixedDoubleArray element fields, not tagged, | 919 // src_elements: begin of source FixedDoubleArray element fields, not tagged, |
906 // points to the exponent | 920 // points to the exponent |
907 // dst_end: end of destination FixedArray, not tagged | 921 // dst_end: end of destination FixedArray, not tagged |
908 // array: destination FixedArray | 922 // array: destination FixedArray |
909 // heap_number_map: heap number map | 923 // heap_number_map: heap number map |
910 __ Branch(&entry); | 924 __ Branch(&entry); |
911 | 925 |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1243 patcher.masm()->nop(); // Pad the empty space. | 1257 patcher.masm()->nop(); // Pad the empty space. |
1244 } | 1258 } |
1245 } | 1259 } |
1246 | 1260 |
1247 | 1261 |
1248 #undef __ | 1262 #undef __ |
1249 | 1263 |
1250 } } // namespace v8::internal | 1264 } } // namespace v8::internal |
1251 | 1265 |
1252 #endif // V8_TARGET_ARCH_MIPS | 1266 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |