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_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
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 1722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1733 | 1733 |
1734 if (is_initialization_) { | 1734 if (is_initialization_) { |
1735 const Class* cls = NULL; | 1735 const Class* cls = NULL; |
1736 switch (cid) { | 1736 switch (cid) { |
1737 case kDoubleCid: | 1737 case kDoubleCid: |
1738 cls = &compiler->double_class(); | 1738 cls = &compiler->double_class(); |
1739 break; | 1739 break; |
1740 default: | 1740 default: |
1741 UNREACHABLE(); | 1741 UNREACHABLE(); |
1742 } | 1742 } |
| 1743 |
1743 StoreInstanceFieldSlowPath* slow_path = | 1744 StoreInstanceFieldSlowPath* slow_path = |
1744 new StoreInstanceFieldSlowPath(this, *cls); | 1745 new StoreInstanceFieldSlowPath(this, *cls); |
1745 compiler->AddSlowPathCode(slow_path); | 1746 compiler->AddSlowPathCode(slow_path); |
| 1747 |
1746 __ TryAllocate(*cls, | 1748 __ TryAllocate(*cls, |
1747 slow_path->entry_label(), | 1749 slow_path->entry_label(), |
1748 temp, | 1750 temp, |
1749 temp2); | 1751 temp2); |
1750 __ Bind(slow_path->exit_label()); | 1752 __ Bind(slow_path->exit_label()); |
1751 __ mov(temp2, temp); | 1753 __ mov(temp2, temp); |
1752 __ StoreIntoObject(instance_reg, | 1754 __ StoreIntoObject(instance_reg, |
1753 FieldAddress(instance_reg, field().Offset()), | 1755 FieldAddress(instance_reg, field().Offset()), |
1754 temp2); | 1756 temp2); |
1755 } else { | 1757 } else { |
1756 __ lw(temp, FieldAddress(instance_reg, field().Offset())); | 1758 __ lw(temp, FieldAddress(instance_reg, field().Offset())); |
1757 } | 1759 } |
1758 switch (cid) { | 1760 switch (cid) { |
1759 case kDoubleCid: | 1761 case kDoubleCid: |
1760 __ StoreDToOffset(value, temp, Double::value_offset() - kHeapObjectTag); | 1762 __ StoreDToOffset(value, temp, Double::value_offset() - kHeapObjectTag); |
1761 break; | 1763 break; |
1762 default: | 1764 default: |
1763 UNREACHABLE(); | 1765 UNREACHABLE(); |
1764 } | 1766 } |
1765 return; | 1767 return; |
1766 } | 1768 } |
1767 | 1769 |
1768 if (IsPotentialUnboxedStore()) { | 1770 if (IsPotentialUnboxedStore()) { |
1769 Register value_reg = locs()->in(1).reg(); | 1771 Register value_reg = locs()->in(1).reg(); |
1770 Register temp = locs()->temp(0).reg(); | 1772 Register temp = locs()->temp(0).reg(); |
1771 Register temp2 = locs()->temp(1).reg(); | 1773 Register temp2 = locs()->temp(1).reg(); |
1772 DRegister fpu_temp = locs()->temp(2).fpu_reg(); | 1774 DRegister fpu_temp = locs()->temp(2).fpu_reg(); |
1773 | 1775 |
1774 Label store_pointer; | 1776 Label store_pointer; |
1775 Label copy_double; | |
1776 Label store_double; | 1777 Label store_double; |
1777 | 1778 |
1778 __ LoadObject(temp, Field::ZoneHandle(field().raw())); | 1779 __ LoadObject(temp, Field::ZoneHandle(field().raw())); |
1779 | 1780 |
1780 __ lw(temp2, FieldAddress(temp, Field::is_nullable_offset())); | 1781 __ lw(temp2, FieldAddress(temp, Field::is_nullable_offset())); |
1781 __ BranchEqual(temp2, kNullCid, &store_pointer); | 1782 __ BranchEqual(temp2, kNullCid, &store_pointer); |
1782 | 1783 |
1783 __ lbu(temp2, FieldAddress(temp, Field::kind_bits_offset())); | 1784 __ lbu(temp2, FieldAddress(temp, Field::kind_bits_offset())); |
1784 __ andi(CMPRES1, temp2, Immediate(1 << Field::kUnboxingCandidateBit)); | 1785 __ andi(CMPRES1, temp2, Immediate(1 << Field::kUnboxingCandidateBit)); |
1785 __ beq(CMPRES1, ZR, &store_pointer); | 1786 __ beq(CMPRES1, ZR, &store_pointer); |
1786 | 1787 |
1787 __ lw(temp2, FieldAddress(temp, Field::guarded_cid_offset())); | 1788 __ lw(temp2, FieldAddress(temp, Field::guarded_cid_offset())); |
1788 __ BranchEqual(temp2, kDoubleCid, &store_double); | 1789 __ BranchEqual(temp2, kDoubleCid, &store_double); |
1789 | 1790 |
1790 // Fall through. | 1791 // Fall through. |
1791 __ b(&store_pointer); | 1792 __ b(&store_pointer); |
1792 | 1793 |
1793 __ Bind(&store_double); | |
1794 | |
1795 __ lw(temp, FieldAddress(instance_reg, field().Offset())); | |
1796 __ BranchNotEqual(temp, reinterpret_cast<int32_t>(Object::null()), | |
1797 ©_double); | |
1798 | |
1799 StoreInstanceFieldSlowPath* slow_path = | |
1800 new StoreInstanceFieldSlowPath(this, compiler->double_class()); | |
1801 compiler->AddSlowPathCode(slow_path); | |
1802 | |
1803 if (!compiler->is_optimizing()) { | 1794 if (!compiler->is_optimizing()) { |
1804 locs()->live_registers()->Add(locs()->in(0)); | 1795 locs()->live_registers()->Add(locs()->in(0)); |
1805 locs()->live_registers()->Add(locs()->in(1)); | 1796 locs()->live_registers()->Add(locs()->in(1)); |
1806 } | 1797 } |
1807 | 1798 |
1808 __ TryAllocate(compiler->double_class(), | 1799 { |
1809 slow_path->entry_label(), | 1800 __ Bind(&store_double); |
1810 temp, | 1801 Label copy_double; |
1811 temp2); | |
1812 __ Bind(slow_path->exit_label()); | |
1813 __ mov(temp2, temp); | |
1814 __ StoreIntoObject(instance_reg, | |
1815 FieldAddress(instance_reg, field().Offset()), | |
1816 temp2); | |
1817 | 1802 |
1818 __ Bind(©_double); | 1803 __ lw(temp, FieldAddress(instance_reg, field().Offset())); |
1819 __ LoadDFromOffset(fpu_temp, | 1804 __ BranchNotEqual(temp, reinterpret_cast<int32_t>(Object::null()), |
1820 value_reg, | 1805 ©_double); |
1821 Double::value_offset() - kHeapObjectTag); | 1806 |
1822 __ StoreDToOffset(fpu_temp, temp, Double::value_offset() - kHeapObjectTag); | 1807 StoreInstanceFieldSlowPath* slow_path = |
1823 __ b(&skip_store); | 1808 new StoreInstanceFieldSlowPath(this, compiler->double_class()); |
| 1809 compiler->AddSlowPathCode(slow_path); |
| 1810 |
| 1811 __ TryAllocate(compiler->double_class(), |
| 1812 slow_path->entry_label(), |
| 1813 temp, |
| 1814 temp2); |
| 1815 __ Bind(slow_path->exit_label()); |
| 1816 __ mov(temp2, temp); |
| 1817 __ StoreIntoObject(instance_reg, |
| 1818 FieldAddress(instance_reg, field().Offset()), |
| 1819 temp2); |
| 1820 |
| 1821 __ Bind(©_double); |
| 1822 __ LoadDFromOffset(fpu_temp, |
| 1823 value_reg, |
| 1824 Double::value_offset() - kHeapObjectTag); |
| 1825 __ StoreDToOffset(fpu_temp, temp, |
| 1826 Double::value_offset() - kHeapObjectTag); |
| 1827 __ b(&skip_store); |
| 1828 } |
| 1829 |
1824 __ Bind(&store_pointer); | 1830 __ Bind(&store_pointer); |
1825 } | 1831 } |
1826 | 1832 |
1827 if (ShouldEmitStoreBarrier()) { | 1833 if (ShouldEmitStoreBarrier()) { |
1828 Register value_reg = locs()->in(1).reg(); | 1834 Register value_reg = locs()->in(1).reg(); |
1829 __ StoreIntoObject(instance_reg, | 1835 __ StoreIntoObject(instance_reg, |
1830 FieldAddress(instance_reg, field().Offset()), | 1836 FieldAddress(instance_reg, field().Offset()), |
1831 value_reg, | 1837 value_reg, |
1832 CanValueBeSmi()); | 1838 CanValueBeSmi()); |
1833 } else { | 1839 } else { |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2060 | 2066 |
2061 __ lw(temp, field_nullability_operand); | 2067 __ lw(temp, field_nullability_operand); |
2062 __ BranchEqual(temp, kNullCid, &load_pointer); | 2068 __ BranchEqual(temp, kNullCid, &load_pointer); |
2063 | 2069 |
2064 __ lw(temp, field_cid_operand); | 2070 __ lw(temp, field_cid_operand); |
2065 __ BranchEqual(temp, kDoubleCid, &load_double); | 2071 __ BranchEqual(temp, kDoubleCid, &load_double); |
2066 | 2072 |
2067 // Fall through. | 2073 // Fall through. |
2068 __ b(&load_pointer); | 2074 __ b(&load_pointer); |
2069 | 2075 |
2070 __ Bind(&load_double); | |
2071 | |
2072 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); | |
2073 compiler->AddSlowPathCode(slow_path); | |
2074 | |
2075 if (!compiler->is_optimizing()) { | 2076 if (!compiler->is_optimizing()) { |
2076 locs()->live_registers()->Add(locs()->in(0)); | 2077 locs()->live_registers()->Add(locs()->in(0)); |
2077 } | 2078 } |
2078 | 2079 |
2079 __ TryAllocate(compiler->double_class(), | 2080 { |
2080 slow_path->entry_label(), | 2081 __ Bind(&load_double); |
2081 result_reg, | 2082 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); |
2082 temp); | 2083 compiler->AddSlowPathCode(slow_path); |
2083 __ Bind(slow_path->exit_label()); | 2084 |
2084 __ lw(temp, FieldAddress(instance_reg, offset_in_bytes())); | 2085 __ TryAllocate(compiler->double_class(), |
2085 __ LoadDFromOffset(value, temp, Double::value_offset() - kHeapObjectTag); | 2086 slow_path->entry_label(), |
2086 __ StoreDToOffset(value, | 2087 result_reg, |
2087 result_reg, | 2088 temp); |
2088 Double::value_offset() - kHeapObjectTag); | 2089 __ Bind(slow_path->exit_label()); |
2089 __ b(&done); | 2090 __ lw(temp, FieldAddress(instance_reg, offset_in_bytes())); |
| 2091 __ LoadDFromOffset(value, temp, Double::value_offset() - kHeapObjectTag); |
| 2092 __ StoreDToOffset(value, |
| 2093 result_reg, |
| 2094 Double::value_offset() - kHeapObjectTag); |
| 2095 __ b(&done); |
| 2096 } |
| 2097 |
2090 __ Bind(&load_pointer); | 2098 __ Bind(&load_pointer); |
2091 } | 2099 } |
2092 __ lw(result_reg, Address(instance_reg, offset_in_bytes() - kHeapObjectTag)); | 2100 __ lw(result_reg, Address(instance_reg, offset_in_bytes() - kHeapObjectTag)); |
2093 __ Bind(&done); | 2101 __ Bind(&done); |
2094 } | 2102 } |
2095 | 2103 |
2096 | 2104 |
2097 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const { | 2105 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const { |
2098 const intptr_t kNumInputs = 1; | 2106 const intptr_t kNumInputs = 1; |
2099 const intptr_t kNumTemps = 0; | 2107 const intptr_t kNumTemps = 0; |
(...skipping 2144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4244 compiler->GenerateCall(token_pos(), | 4252 compiler->GenerateCall(token_pos(), |
4245 &label, | 4253 &label, |
4246 PcDescriptors::kOther, | 4254 PcDescriptors::kOther, |
4247 locs()); | 4255 locs()); |
4248 __ Drop(2); // Discard type arguments and receiver. | 4256 __ Drop(2); // Discard type arguments and receiver. |
4249 } | 4257 } |
4250 | 4258 |
4251 } // namespace dart | 4259 } // namespace dart |
4252 | 4260 |
4253 #endif // defined TARGET_ARCH_MIPS | 4261 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |