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 1661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1672 DRegister fpu_temp = EvenDRegisterOf(locs()->temp(2).fpu_reg()); | 1672 DRegister fpu_temp = EvenDRegisterOf(locs()->temp(2).fpu_reg()); |
1673 | 1673 |
1674 Label store_pointer, copy_payload; | 1674 Label store_pointer, copy_payload; |
1675 __ LoadObject(temp, Field::ZoneHandle(field().raw())); | 1675 __ LoadObject(temp, Field::ZoneHandle(field().raw())); |
1676 __ ldr(temp2, FieldAddress(temp, Field::guarded_cid_offset())); | 1676 __ ldr(temp2, FieldAddress(temp, Field::guarded_cid_offset())); |
1677 __ CompareImmediate(temp2, kDoubleCid); | 1677 __ CompareImmediate(temp2, kDoubleCid); |
1678 __ b(&store_pointer, NE); | 1678 __ b(&store_pointer, NE); |
1679 __ ldr(temp2, FieldAddress(temp, Field::is_nullable_offset())); | 1679 __ ldr(temp2, FieldAddress(temp, Field::is_nullable_offset())); |
1680 __ CompareImmediate(temp2, kNullCid); | 1680 __ CompareImmediate(temp2, kNullCid); |
1681 __ b(&store_pointer, EQ); | 1681 __ b(&store_pointer, EQ); |
| 1682 __ ldrb(temp2, FieldAddress(temp, Field::kind_bits_offset())); |
| 1683 __ tst(temp2, ShifterOperand(1 << Field::kUnboxingCandidateBit)); |
| 1684 __ b(&store_pointer, EQ); |
1682 | 1685 |
1683 __ ldr(temp, FieldAddress(instance_reg, field().Offset())); | 1686 __ ldr(temp, FieldAddress(instance_reg, field().Offset())); |
1684 __ CompareImmediate(temp, | 1687 __ CompareImmediate(temp, |
1685 reinterpret_cast<intptr_t>(Object::null())); | 1688 reinterpret_cast<intptr_t>(Object::null())); |
1686 __ b(©_payload, NE); | 1689 __ b(©_payload, NE); |
1687 | 1690 |
1688 StoreInstanceFieldSlowPath* slow_path = | 1691 StoreInstanceFieldSlowPath* slow_path = |
1689 new StoreInstanceFieldSlowPath(this); | 1692 new StoreInstanceFieldSlowPath(this); |
1690 compiler->AddSlowPathCode(slow_path); | 1693 compiler->AddSlowPathCode(slow_path); |
1691 | 1694 |
(...skipping 3125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4817 compiler->GenerateCall(token_pos(), | 4820 compiler->GenerateCall(token_pos(), |
4818 &label, | 4821 &label, |
4819 PcDescriptors::kOther, | 4822 PcDescriptors::kOther, |
4820 locs()); | 4823 locs()); |
4821 __ Drop(2); // Discard type arguments and receiver. | 4824 __ Drop(2); // Discard type arguments and receiver. |
4822 } | 4825 } |
4823 | 4826 |
4824 } // namespace dart | 4827 } // namespace dart |
4825 | 4828 |
4826 #endif // defined TARGET_ARCH_ARM | 4829 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |