Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: runtime/vm/intermediate_language_mips.cc

Issue 150063004: Support reusable boxes for Float32x4 fields (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/intermediate_language_ia32.cc ('k') | runtime/vm/intermediate_language_x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 &copy_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(&copy_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 &copy_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(&copy_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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language_ia32.cc ('k') | runtime/vm/intermediate_language_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698