| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 1552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1563 __ popq(value_cid_reg); | 1563 __ popq(value_cid_reg); |
| 1564 } else { | 1564 } else { |
| 1565 ASSERT(field_cid == kIllegalCid); | 1565 ASSERT(field_cid == kIllegalCid); |
| 1566 ASSERT(field_length == Field::kUnknownFixedLength); | 1566 ASSERT(field_length == Field::kUnknownFixedLength); |
| 1567 // At compile time we do not know the type of the field nor its | 1567 // At compile time we do not know the type of the field nor its |
| 1568 // length. At execution time we may have set the class id and | 1568 // length. At execution time we may have set the class id and |
| 1569 // list length so we compare the guarded length with the | 1569 // list length so we compare the guarded length with the |
| 1570 // list length here, without this check the list length could change | 1570 // list length here, without this check the list length could change |
| 1571 // without triggering a deoptimization. | 1571 // without triggering a deoptimization. |
| 1572 Label check_array, length_compared, no_fixed_length; | 1572 Label check_array, length_compared, no_fixed_length; |
| 1573 // If length is negative the length guard is either disabled or |
| 1574 // has not been initialized, either way it is safe to skip the |
| 1575 // length check. |
| 1576 __ cmpq(field_length_operand, Immediate(Smi::RawValue(0))); |
| 1577 __ j(LESS, &skip_length_check); |
| 1573 __ cmpq(value_cid_reg, Immediate(kNullCid)); | 1578 __ cmpq(value_cid_reg, Immediate(kNullCid)); |
| 1574 __ j(EQUAL, &no_fixed_length, Assembler::kNearJump); | 1579 __ j(EQUAL, &no_fixed_length, Assembler::kNearJump); |
| 1575 // Check for typed data array. | 1580 // Check for typed data array. |
| 1576 __ cmpq(value_cid_reg, Immediate(kTypedDataFloat32x4ArrayCid)); | 1581 __ cmpq(value_cid_reg, Immediate(kTypedDataFloat32x4ArrayCid)); |
| 1577 // Not a typed array or a regular array. | 1582 // Not a typed array or a regular array. |
| 1578 __ j(GREATER, &no_fixed_length, Assembler::kNearJump); | 1583 __ j(GREATER, &no_fixed_length, Assembler::kNearJump); |
| 1579 __ cmpq(value_cid_reg, Immediate(kTypedDataInt8ArrayCid)); | 1584 __ cmpq(value_cid_reg, Immediate(kTypedDataInt8ArrayCid)); |
| 1580 // Could still be a regular array. | 1585 // Could still be a regular array. |
| 1581 __ j(LESS, &check_array, Assembler::kNearJump); | 1586 __ j(LESS, &check_array, Assembler::kNearJump); |
| 1582 __ pushq(value_cid_reg); | 1587 __ pushq(value_cid_reg); |
| (...skipping 3260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4843 PcDescriptors::kOther, | 4848 PcDescriptors::kOther, |
| 4844 locs()); | 4849 locs()); |
| 4845 __ Drop(2); // Discard type arguments and receiver. | 4850 __ Drop(2); // Discard type arguments and receiver. |
| 4846 } | 4851 } |
| 4847 | 4852 |
| 4848 } // namespace dart | 4853 } // namespace dart |
| 4849 | 4854 |
| 4850 #undef __ | 4855 #undef __ |
| 4851 | 4856 |
| 4852 #endif // defined TARGET_ARCH_X64 | 4857 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |