| 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_ARM. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 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 1520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1531 __ CompareImmediate(temp_reg, Smi::RawValue(field_length)); | 1531 __ CompareImmediate(temp_reg, Smi::RawValue(field_length)); |
| 1532 } else { | 1532 } else { |
| 1533 ASSERT(field_cid == kIllegalCid); | 1533 ASSERT(field_cid == kIllegalCid); |
| 1534 ASSERT(field_length == Field::kUnknownFixedLength); | 1534 ASSERT(field_length == Field::kUnknownFixedLength); |
| 1535 // At compile time we do not know the type of the field nor its | 1535 // At compile time we do not know the type of the field nor its |
| 1536 // length. At execution time we may have set the class id and | 1536 // length. At execution time we may have set the class id and |
| 1537 // list length so we compare the guarded length with the | 1537 // list length so we compare the guarded length with the |
| 1538 // list length here, without this check the list length could change | 1538 // list length here, without this check the list length could change |
| 1539 // without triggering a deoptimization. | 1539 // without triggering a deoptimization. |
| 1540 Label check_array, length_compared, no_fixed_length; | 1540 Label check_array, length_compared, no_fixed_length; |
| 1541 // If length is negative the length guard is either disabled or |
| 1542 // has not been initialized, either way it is safe to skip the |
| 1543 // length check. |
| 1544 __ ldr(IP, field_length_operand); |
| 1545 __ CompareImmediate(IP, 0); |
| 1546 __ b(&skip_length_check, LT); |
| 1541 __ CompareImmediate(value_cid_reg, kNullCid); | 1547 __ CompareImmediate(value_cid_reg, kNullCid); |
| 1542 __ b(&no_fixed_length, EQ); | 1548 __ b(&no_fixed_length, EQ); |
| 1543 // Check for typed data array. | 1549 // Check for typed data array. |
| 1544 __ CompareImmediate(value_cid_reg, kTypedDataFloat32x4ArrayCid); | 1550 __ CompareImmediate(value_cid_reg, kTypedDataFloat32x4ArrayCid); |
| 1545 __ b(&no_fixed_length, GT); | 1551 __ b(&no_fixed_length, GT); |
| 1546 __ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid); | 1552 __ CompareImmediate(value_cid_reg, kTypedDataInt8ArrayCid); |
| 1547 // Could still be a regular array. | 1553 // Could still be a regular array. |
| 1548 __ b(&check_array, LT); | 1554 __ b(&check_array, LT); |
| 1549 __ ldr(temp_reg, | 1555 __ ldr(temp_reg, |
| 1550 FieldAddress(value_reg, TypedData::length_offset())); | 1556 FieldAddress(value_reg, TypedData::length_offset())); |
| (...skipping 3116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4667 compiler->GenerateCall(token_pos(), | 4673 compiler->GenerateCall(token_pos(), |
| 4668 &label, | 4674 &label, |
| 4669 PcDescriptors::kOther, | 4675 PcDescriptors::kOther, |
| 4670 locs()); | 4676 locs()); |
| 4671 __ Drop(2); // Discard type arguments and receiver. | 4677 __ Drop(2); // Discard type arguments and receiver. |
| 4672 } | 4678 } |
| 4673 | 4679 |
| 4674 } // namespace dart | 4680 } // namespace dart |
| 4675 | 4681 |
| 4676 #endif // defined TARGET_ARCH_ARM | 4682 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |