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

Side by Side Diff: src/arm/assembler-arm.cc

Issue 12391055: Cleaned up CpuFeature scope handling. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed nits Created 7 years, 9 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 | « src/arm/assembler-arm.h ('k') | src/arm/code-stubs-arm.h » ('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) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 30 matching lines...) Expand all
41 #include "arm/assembler-arm-inl.h" 41 #include "arm/assembler-arm-inl.h"
42 #include "serialize.h" 42 #include "serialize.h"
43 43
44 namespace v8 { 44 namespace v8 {
45 namespace internal { 45 namespace internal {
46 46
47 #ifdef DEBUG 47 #ifdef DEBUG
48 bool CpuFeatures::initialized_ = false; 48 bool CpuFeatures::initialized_ = false;
49 #endif 49 #endif
50 unsigned CpuFeatures::supported_ = 0; 50 unsigned CpuFeatures::supported_ = 0;
51 unsigned CpuFeatures::found_by_runtime_probing_ = 0; 51 unsigned CpuFeatures::found_by_runtime_probing_only_ = 0;
52 52
53 53
54 ExternalReference ExternalReference::cpu_features() { 54 ExternalReference ExternalReference::cpu_features() {
55 ASSERT(CpuFeatures::initialized_); 55 ASSERT(CpuFeatures::initialized_);
56 return ExternalReference(&CpuFeatures::supported_); 56 return ExternalReference(&CpuFeatures::supported_);
57 } 57 }
58 58
59 // Get the CPU features enabled by the build. For cross compilation the 59 // Get the CPU features enabled by the build. For cross compilation the
60 // preprocessor symbols CAN_USE_ARMV7_INSTRUCTIONS and CAN_USE_VFP3_INSTRUCTIONS 60 // preprocessor symbols CAN_USE_ARMV7_INSTRUCTIONS and CAN_USE_VFP3_INSTRUCTIONS
61 // can be defined to enable ARMv7 and VFPv3 instructions when building the 61 // can be defined to enable ARMv7 and VFPv3 instructions when building the
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 103
104 return VFPRegisters::Name(index, true); 104 return VFPRegisters::Name(index, true);
105 } else { 105 } else {
106 ASSERT(index == 0); 106 ASSERT(index == 0);
107 return "sfpd0"; 107 return "sfpd0";
108 } 108 }
109 } 109 }
110 110
111 111
112 void CpuFeatures::Probe() { 112 void CpuFeatures::Probe() {
113 unsigned standard_features = static_cast<unsigned>( 113 uint64_t standard_features = static_cast<unsigned>(
114 OS::CpuFeaturesImpliedByPlatform()) | CpuFeaturesImpliedByCompiler(); 114 OS::CpuFeaturesImpliedByPlatform()) | CpuFeaturesImpliedByCompiler();
115 ASSERT(supported_ == 0 || supported_ == standard_features); 115 ASSERT(supported_ == 0 || supported_ == standard_features);
116 #ifdef DEBUG 116 #ifdef DEBUG
117 initialized_ = true; 117 initialized_ = true;
118 #endif 118 #endif
119 119
120 // Get the features implied by the OS and the compiler settings. This is the 120 // Get the features implied by the OS and the compiler settings. This is the
121 // minimal set of features which is also alowed for generated code in the 121 // minimal set of features which is also alowed for generated code in the
122 // snapshot. 122 // snapshot.
123 supported_ |= standard_features; 123 supported_ |= standard_features;
124 124
125 if (Serializer::enabled()) { 125 if (Serializer::enabled()) {
126 // No probing for features if we might serialize (generate snapshot). 126 // No probing for features if we might serialize (generate snapshot).
127 return; 127 return;
128 } 128 }
129 129
130 #ifndef __arm__ 130 #ifndef __arm__
131 // For the simulator=arm build, use VFP when FLAG_enable_vfp3 is 131 // For the simulator=arm build, use VFP when FLAG_enable_vfp3 is
132 // enabled. VFPv3 implies ARMv7, see ARM DDI 0406B, page A1-6. 132 // enabled. VFPv3 implies ARMv7, see ARM DDI 0406B, page A1-6.
133 if (FLAG_enable_vfp3) { 133 if (FLAG_enable_vfp3) {
134 supported_ |= 1u << VFP3 | 1u << ARMv7 | 1u << VFP2; 134 supported_ |=
135 static_cast<uint64_t>(1) << VFP3 |
136 static_cast<uint64_t>(1) << ARMv7 |
137 static_cast<uint64_t>(1) << VFP2;
135 } 138 }
136 // For the simulator=arm build, use ARMv7 when FLAG_enable_armv7 is enabled 139 // For the simulator=arm build, use ARMv7 when FLAG_enable_armv7 is enabled
137 if (FLAG_enable_armv7) { 140 if (FLAG_enable_armv7) {
138 supported_ |= 1u << ARMv7; 141 supported_ |= static_cast<uint64_t>(1) << ARMv7;
139 } 142 }
140 143
141 if (FLAG_enable_sudiv) { 144 if (FLAG_enable_sudiv) {
142 supported_ |= 1u << SUDIV; 145 supported_ |= static_cast<uint64_t>(1) << SUDIV;
143 } 146 }
144 147
145 if (FLAG_enable_movw_movt) { 148 if (FLAG_enable_movw_movt) {
146 supported_ |= 1u << MOVW_MOVT_IMMEDIATE_LOADS; 149 supported_ |= static_cast<uint64_t>(1) << MOVW_MOVT_IMMEDIATE_LOADS;
147 } 150 }
148 151
149 if (FLAG_enable_32dregs) { 152 if (FLAG_enable_32dregs) {
150 supported_ |= 1u << VFP32DREGS; 153 supported_ |= static_cast<uint64_t>(1) << VFP32DREGS;
151 } 154 }
152 155
153 #else // __arm__ 156 #else // __arm__
154 // Probe for additional features not already known to be available. 157 // Probe for additional features not already known to be available.
155 if (!IsSupported(VFP3) && OS::ArmCpuHasFeature(VFP3)) { 158 if (!IsSupported(VFP3) && OS::ArmCpuHasFeature(VFP3)) {
156 // This implementation also sets the VFP flags if runtime 159 // This implementation also sets the VFP flags if runtime
157 // detection of VFP returns true. VFPv3 implies ARMv7 and VFP2, see ARM DDI 160 // detection of VFP returns true. VFPv3 implies ARMv7 and VFP2, see ARM DDI
158 // 0406B, page A1-6. 161 // 0406B, page A1-6.
159 found_by_runtime_probing_ |= 1u << VFP3 | 1u << ARMv7 | 1u << VFP2; 162 found_by_runtime_probing_only_ |=
163 static_cast<uint64_t>(1) << VFP3 |
164 static_cast<uint64_t>(1) << ARMv7 |
165 static_cast<uint64_t>(1) << VFP2;
160 } else if (!IsSupported(VFP2) && OS::ArmCpuHasFeature(VFP2)) { 166 } else if (!IsSupported(VFP2) && OS::ArmCpuHasFeature(VFP2)) {
161 found_by_runtime_probing_ |= 1u << VFP2; 167 found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << VFP2;
162 } 168 }
163 169
164 if (!IsSupported(ARMv7) && OS::ArmCpuHasFeature(ARMv7)) { 170 if (!IsSupported(ARMv7) && OS::ArmCpuHasFeature(ARMv7)) {
165 found_by_runtime_probing_ |= 1u << ARMv7; 171 found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << ARMv7;
166 } 172 }
167 173
168 if (!IsSupported(SUDIV) && OS::ArmCpuHasFeature(SUDIV)) { 174 if (!IsSupported(SUDIV) && OS::ArmCpuHasFeature(SUDIV)) {
169 found_by_runtime_probing_ |= 1u << SUDIV; 175 found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << SUDIV;
170 } 176 }
171 177
172 if (!IsSupported(UNALIGNED_ACCESSES) && OS::ArmCpuHasFeature(ARMv7)) { 178 if (!IsSupported(UNALIGNED_ACCESSES) && OS::ArmCpuHasFeature(ARMv7)) {
173 found_by_runtime_probing_ |= 1u << UNALIGNED_ACCESSES; 179 found_by_runtime_probing_only_ |=
180 static_cast<uint64_t>(1) << UNALIGNED_ACCESSES;
174 } 181 }
175 182
176 if (OS::GetCpuImplementer() == QUALCOMM_IMPLEMENTER && 183 if (OS::GetCpuImplementer() == QUALCOMM_IMPLEMENTER &&
177 OS::ArmCpuHasFeature(ARMv7)) { 184 OS::ArmCpuHasFeature(ARMv7)) {
178 found_by_runtime_probing_ |= 1u << MOVW_MOVT_IMMEDIATE_LOADS; 185 found_by_runtime_probing_only_ |=
186 static_cast<uint64_t>(1) << MOVW_MOVT_IMMEDIATE_LOADS;
179 } 187 }
180 188
181 if (!IsSupported(VFP32DREGS) && OS::ArmCpuHasFeature(VFP32DREGS)) { 189 if (!IsSupported(VFP32DREGS) && OS::ArmCpuHasFeature(VFP32DREGS)) {
182 found_by_runtime_probing_ |= 1u << VFP32DREGS; 190 found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << VFP32DREGS;
183 } 191 }
184 192
185 supported_ |= found_by_runtime_probing_; 193 supported_ |= found_by_runtime_probing_only_;
186 #endif 194 #endif
187 195
188 // Assert that VFP3 implies VFP2 and ARMv7. 196 // Assert that VFP3 implies VFP2 and ARMv7.
189 ASSERT(!IsSupported(VFP3) || (IsSupported(VFP2) && IsSupported(ARMv7))); 197 ASSERT(!IsSupported(VFP3) || (IsSupported(VFP2) && IsSupported(ARMv7)));
190 } 198 }
191 199
192 200
193 // ----------------------------------------------------------------------------- 201 // -----------------------------------------------------------------------------
194 // Implementation of RelocInfo 202 // Implementation of RelocInfo
195 203
(...skipping 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after
1534 } 1542 }
1535 1543
1536 1544
1537 void Assembler::ldrsh(Register dst, const MemOperand& src, Condition cond) { 1545 void Assembler::ldrsh(Register dst, const MemOperand& src, Condition cond) {
1538 addrmod3(cond | L | B7 | S6 | H | B4, dst, src); 1546 addrmod3(cond | L | B7 | S6 | H | B4, dst, src);
1539 } 1547 }
1540 1548
1541 1549
1542 void Assembler::ldrd(Register dst1, Register dst2, 1550 void Assembler::ldrd(Register dst1, Register dst2,
1543 const MemOperand& src, Condition cond) { 1551 const MemOperand& src, Condition cond) {
1544 ASSERT(CpuFeatures::IsEnabled(ARMv7)); 1552 ASSERT(IsEnabled(ARMv7));
1545 ASSERT(src.rm().is(no_reg)); 1553 ASSERT(src.rm().is(no_reg));
1546 ASSERT(!dst1.is(lr)); // r14. 1554 ASSERT(!dst1.is(lr)); // r14.
1547 ASSERT_EQ(0, dst1.code() % 2); 1555 ASSERT_EQ(0, dst1.code() % 2);
1548 ASSERT_EQ(dst1.code() + 1, dst2.code()); 1556 ASSERT_EQ(dst1.code() + 1, dst2.code());
1549 addrmod3(cond | B7 | B6 | B4, dst1, src); 1557 addrmod3(cond | B7 | B6 | B4, dst1, src);
1550 } 1558 }
1551 1559
1552 1560
1553 void Assembler::strd(Register src1, Register src2, 1561 void Assembler::strd(Register src1, Register src2,
1554 const MemOperand& dst, Condition cond) { 1562 const MemOperand& dst, Condition cond) {
1555 ASSERT(dst.rm().is(no_reg)); 1563 ASSERT(dst.rm().is(no_reg));
1556 ASSERT(!src1.is(lr)); // r14. 1564 ASSERT(!src1.is(lr)); // r14.
1557 ASSERT_EQ(0, src1.code() % 2); 1565 ASSERT_EQ(0, src1.code() % 2);
1558 ASSERT_EQ(src1.code() + 1, src2.code()); 1566 ASSERT_EQ(src1.code() + 1, src2.code());
1559 ASSERT(CpuFeatures::IsEnabled(ARMv7)); 1567 ASSERT(IsEnabled(ARMv7));
1560 addrmod3(cond | B7 | B6 | B5 | B4, src1, dst); 1568 addrmod3(cond | B7 | B6 | B5 | B4, src1, dst);
1561 } 1569 }
1562 1570
1563 // Load/Store multiple instructions. 1571 // Load/Store multiple instructions.
1564 void Assembler::ldm(BlockAddrMode am, 1572 void Assembler::ldm(BlockAddrMode am,
1565 Register base, 1573 Register base,
1566 RegList dst, 1574 RegList dst,
1567 Condition cond) { 1575 Condition cond) {
1568 // ABI stack constraint: ldmxx base, {..sp..} base != sp is not restartable. 1576 // ABI stack constraint: ldmxx base, {..sp..} base != sp is not restartable.
1569 ASSERT(base.is(sp) || (dst & sp.bit()) == 0); 1577 ASSERT(base.is(sp) || (dst & sp.bit()) == 0);
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 // Support for VFP. 1756 // Support for VFP.
1749 1757
1750 void Assembler::vldr(const DwVfpRegister dst, 1758 void Assembler::vldr(const DwVfpRegister dst,
1751 const Register base, 1759 const Register base,
1752 int offset, 1760 int offset,
1753 const Condition cond) { 1761 const Condition cond) {
1754 // Ddst = MEM(Rbase + offset). 1762 // Ddst = MEM(Rbase + offset).
1755 // Instruction details available in ARM DDI 0406C.b, A8-924. 1763 // Instruction details available in ARM DDI 0406C.b, A8-924.
1756 // cond(31-28) | 1101(27-24)| U(23) | D(22) | 01(21-20) | Rbase(19-16) | 1764 // cond(31-28) | 1101(27-24)| U(23) | D(22) | 01(21-20) | Rbase(19-16) |
1757 // Vd(15-12) | 1011(11-8) | offset 1765 // Vd(15-12) | 1011(11-8) | offset
1758 ASSERT(CpuFeatures::IsEnabled(VFP2)); 1766 ASSERT(IsEnabled(VFP2));
1759 int u = 1; 1767 int u = 1;
1760 if (offset < 0) { 1768 if (offset < 0) {
1761 offset = -offset; 1769 offset = -offset;
1762 u = 0; 1770 u = 0;
1763 } 1771 }
1764 int vd, d; 1772 int vd, d;
1765 dst.split_code(&vd, &d); 1773 dst.split_code(&vd, &d);
1766 1774
1767 ASSERT(offset >= 0); 1775 ASSERT(offset >= 0);
1768 if ((offset % 4) == 0 && (offset / 4) < 256) { 1776 if ((offset % 4) == 0 && (offset / 4) < 256) {
(...skipping 23 matching lines...) Expand all
1792 1800
1793 1801
1794 void Assembler::vldr(const SwVfpRegister dst, 1802 void Assembler::vldr(const SwVfpRegister dst,
1795 const Register base, 1803 const Register base,
1796 int offset, 1804 int offset,
1797 const Condition cond) { 1805 const Condition cond) {
1798 // Sdst = MEM(Rbase + offset). 1806 // Sdst = MEM(Rbase + offset).
1799 // Instruction details available in ARM DDI 0406A, A8-628. 1807 // Instruction details available in ARM DDI 0406A, A8-628.
1800 // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) | 1808 // cond(31-28) | 1101(27-24)| U001(23-20) | Rbase(19-16) |
1801 // Vdst(15-12) | 1010(11-8) | offset 1809 // Vdst(15-12) | 1010(11-8) | offset
1802 ASSERT(CpuFeatures::IsEnabled(VFP2)); 1810 ASSERT(IsEnabled(VFP2));
1803 int u = 1; 1811 int u = 1;
1804 if (offset < 0) { 1812 if (offset < 0) {
1805 offset = -offset; 1813 offset = -offset;
1806 u = 0; 1814 u = 0;
1807 } 1815 }
1808 int sd, d; 1816 int sd, d;
1809 dst.split_code(&sd, &d); 1817 dst.split_code(&sd, &d);
1810 ASSERT(offset >= 0); 1818 ASSERT(offset >= 0);
1811 1819
1812 if ((offset % 4) == 0 && (offset / 4) < 256) { 1820 if ((offset % 4) == 0 && (offset / 4) < 256) {
(...skipping 23 matching lines...) Expand all
1836 1844
1837 1845
1838 void Assembler::vstr(const DwVfpRegister src, 1846 void Assembler::vstr(const DwVfpRegister src,
1839 const Register base, 1847 const Register base,
1840 int offset, 1848 int offset,
1841 const Condition cond) { 1849 const Condition cond) {
1842 // MEM(Rbase + offset) = Dsrc. 1850 // MEM(Rbase + offset) = Dsrc.
1843 // Instruction details available in ARM DDI 0406C.b, A8-1082. 1851 // Instruction details available in ARM DDI 0406C.b, A8-1082.
1844 // cond(31-28) | 1101(27-24)| U(23) | D(22) | 00(21-20) | Rbase(19-16) | 1852 // cond(31-28) | 1101(27-24)| U(23) | D(22) | 00(21-20) | Rbase(19-16) |
1845 // Vd(15-12) | 1011(11-8) | (offset/4) 1853 // Vd(15-12) | 1011(11-8) | (offset/4)
1846 ASSERT(CpuFeatures::IsEnabled(VFP2)); 1854 ASSERT(IsEnabled(VFP2));
1847 int u = 1; 1855 int u = 1;
1848 if (offset < 0) { 1856 if (offset < 0) {
1849 offset = -offset; 1857 offset = -offset;
1850 u = 0; 1858 u = 0;
1851 } 1859 }
1852 ASSERT(offset >= 0); 1860 ASSERT(offset >= 0);
1853 int vd, d; 1861 int vd, d;
1854 src.split_code(&vd, &d); 1862 src.split_code(&vd, &d);
1855 1863
1856 if ((offset % 4) == 0 && (offset / 4) < 256) { 1864 if ((offset % 4) == 0 && (offset / 4) < 256) {
(...skipping 23 matching lines...) Expand all
1880 1888
1881 1889
1882 void Assembler::vstr(const SwVfpRegister src, 1890 void Assembler::vstr(const SwVfpRegister src,
1883 const Register base, 1891 const Register base,
1884 int offset, 1892 int offset,
1885 const Condition cond) { 1893 const Condition cond) {
1886 // MEM(Rbase + offset) = SSrc. 1894 // MEM(Rbase + offset) = SSrc.
1887 // Instruction details available in ARM DDI 0406A, A8-786. 1895 // Instruction details available in ARM DDI 0406A, A8-786.
1888 // cond(31-28) | 1101(27-24)| U000(23-20) | Rbase(19-16) | 1896 // cond(31-28) | 1101(27-24)| U000(23-20) | Rbase(19-16) |
1889 // Vdst(15-12) | 1010(11-8) | (offset/4) 1897 // Vdst(15-12) | 1010(11-8) | (offset/4)
1890 ASSERT(CpuFeatures::IsEnabled(VFP2)); 1898 ASSERT(IsEnabled(VFP2));
1891 int u = 1; 1899 int u = 1;
1892 if (offset < 0) { 1900 if (offset < 0) {
1893 offset = -offset; 1901 offset = -offset;
1894 u = 0; 1902 u = 0;
1895 } 1903 }
1896 int sd, d; 1904 int sd, d;
1897 src.split_code(&sd, &d); 1905 src.split_code(&sd, &d);
1898 ASSERT(offset >= 0); 1906 ASSERT(offset >= 0);
1899 if ((offset % 4) == 0 && (offset / 4) < 256) { 1907 if ((offset % 4) == 0 && (offset / 4) < 256) {
1900 emit(cond | u*B23 | d*B22 | 0xD0*B20 | base.code()*B16 | sd*B12 | 1908 emit(cond | u*B23 | d*B22 | 0xD0*B20 | base.code()*B16 | sd*B12 |
(...skipping 22 matching lines...) Expand all
1923 1931
1924 1932
1925 void Assembler::vldm(BlockAddrMode am, 1933 void Assembler::vldm(BlockAddrMode am,
1926 Register base, 1934 Register base,
1927 DwVfpRegister first, 1935 DwVfpRegister first,
1928 DwVfpRegister last, 1936 DwVfpRegister last,
1929 Condition cond) { 1937 Condition cond) {
1930 // Instruction details available in ARM DDI 0406C.b, A8-922. 1938 // Instruction details available in ARM DDI 0406C.b, A8-922.
1931 // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) | 1939 // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) |
1932 // first(15-12) | 1011(11-8) | (count * 2) 1940 // first(15-12) | 1011(11-8) | (count * 2)
1933 ASSERT(CpuFeatures::IsEnabled(VFP2)); 1941 ASSERT(IsEnabled(VFP2));
1934 ASSERT_LE(first.code(), last.code()); 1942 ASSERT_LE(first.code(), last.code());
1935 ASSERT(am == ia || am == ia_w || am == db_w); 1943 ASSERT(am == ia || am == ia_w || am == db_w);
1936 ASSERT(!base.is(pc)); 1944 ASSERT(!base.is(pc));
1937 1945
1938 int sd, d; 1946 int sd, d;
1939 first.split_code(&sd, &d); 1947 first.split_code(&sd, &d);
1940 int count = last.code() - first.code() + 1; 1948 int count = last.code() - first.code() + 1;
1941 ASSERT(count <= 16); 1949 ASSERT(count <= 16);
1942 emit(cond | B27 | B26 | am | d*B22 | B20 | base.code()*B16 | sd*B12 | 1950 emit(cond | B27 | B26 | am | d*B22 | B20 | base.code()*B16 | sd*B12 |
1943 0xB*B8 | count*2); 1951 0xB*B8 | count*2);
1944 } 1952 }
1945 1953
1946 1954
1947 void Assembler::vstm(BlockAddrMode am, 1955 void Assembler::vstm(BlockAddrMode am,
1948 Register base, 1956 Register base,
1949 DwVfpRegister first, 1957 DwVfpRegister first,
1950 DwVfpRegister last, 1958 DwVfpRegister last,
1951 Condition cond) { 1959 Condition cond) {
1952 // Instruction details available in ARM DDI 0406C.b, A8-1080. 1960 // Instruction details available in ARM DDI 0406C.b, A8-1080.
1953 // cond(31-28) | 110(27-25)| PUDW0(24-20) | Rbase(19-16) | 1961 // cond(31-28) | 110(27-25)| PUDW0(24-20) | Rbase(19-16) |
1954 // first(15-12) | 1011(11-8) | (count * 2) 1962 // first(15-12) | 1011(11-8) | (count * 2)
1955 ASSERT(CpuFeatures::IsEnabled(VFP2)); 1963 ASSERT(IsEnabled(VFP2));
1956 ASSERT_LE(first.code(), last.code()); 1964 ASSERT_LE(first.code(), last.code());
1957 ASSERT(am == ia || am == ia_w || am == db_w); 1965 ASSERT(am == ia || am == ia_w || am == db_w);
1958 ASSERT(!base.is(pc)); 1966 ASSERT(!base.is(pc));
1959 1967
1960 int sd, d; 1968 int sd, d;
1961 first.split_code(&sd, &d); 1969 first.split_code(&sd, &d);
1962 int count = last.code() - first.code() + 1; 1970 int count = last.code() - first.code() + 1;
1963 ASSERT(count <= 16); 1971 ASSERT(count <= 16);
1964 emit(cond | B27 | B26 | am | d*B22 | base.code()*B16 | sd*B12 | 1972 emit(cond | B27 | B26 | am | d*B22 | base.code()*B16 | sd*B12 |
1965 0xB*B8 | count*2); 1973 0xB*B8 | count*2);
1966 } 1974 }
1967 1975
1968 void Assembler::vldm(BlockAddrMode am, 1976 void Assembler::vldm(BlockAddrMode am,
1969 Register base, 1977 Register base,
1970 SwVfpRegister first, 1978 SwVfpRegister first,
1971 SwVfpRegister last, 1979 SwVfpRegister last,
1972 Condition cond) { 1980 Condition cond) {
1973 // Instruction details available in ARM DDI 0406A, A8-626. 1981 // Instruction details available in ARM DDI 0406A, A8-626.
1974 // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) | 1982 // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) |
1975 // first(15-12) | 1010(11-8) | (count/2) 1983 // first(15-12) | 1010(11-8) | (count/2)
1976 ASSERT(CpuFeatures::IsEnabled(VFP2)); 1984 ASSERT(IsEnabled(VFP2));
1977 ASSERT_LE(first.code(), last.code()); 1985 ASSERT_LE(first.code(), last.code());
1978 ASSERT(am == ia || am == ia_w || am == db_w); 1986 ASSERT(am == ia || am == ia_w || am == db_w);
1979 ASSERT(!base.is(pc)); 1987 ASSERT(!base.is(pc));
1980 1988
1981 int sd, d; 1989 int sd, d;
1982 first.split_code(&sd, &d); 1990 first.split_code(&sd, &d);
1983 int count = last.code() - first.code() + 1; 1991 int count = last.code() - first.code() + 1;
1984 emit(cond | B27 | B26 | am | d*B22 | B20 | base.code()*B16 | sd*B12 | 1992 emit(cond | B27 | B26 | am | d*B22 | B20 | base.code()*B16 | sd*B12 |
1985 0xA*B8 | count); 1993 0xA*B8 | count);
1986 } 1994 }
1987 1995
1988 1996
1989 void Assembler::vstm(BlockAddrMode am, 1997 void Assembler::vstm(BlockAddrMode am,
1990 Register base, 1998 Register base,
1991 SwVfpRegister first, 1999 SwVfpRegister first,
1992 SwVfpRegister last, 2000 SwVfpRegister last,
1993 Condition cond) { 2001 Condition cond) {
1994 // Instruction details available in ARM DDI 0406A, A8-784. 2002 // Instruction details available in ARM DDI 0406A, A8-784.
1995 // cond(31-28) | 110(27-25)| PUDW0(24-20) | Rbase(19-16) | 2003 // cond(31-28) | 110(27-25)| PUDW0(24-20) | Rbase(19-16) |
1996 // first(15-12) | 1011(11-8) | (count/2) 2004 // first(15-12) | 1011(11-8) | (count/2)
1997 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2005 ASSERT(IsEnabled(VFP2));
1998 ASSERT_LE(first.code(), last.code()); 2006 ASSERT_LE(first.code(), last.code());
1999 ASSERT(am == ia || am == ia_w || am == db_w); 2007 ASSERT(am == ia || am == ia_w || am == db_w);
2000 ASSERT(!base.is(pc)); 2008 ASSERT(!base.is(pc));
2001 2009
2002 int sd, d; 2010 int sd, d;
2003 first.split_code(&sd, &d); 2011 first.split_code(&sd, &d);
2004 int count = last.code() - first.code() + 1; 2012 int count = last.code() - first.code() + 1;
2005 emit(cond | B27 | B26 | am | d*B22 | base.code()*B16 | sd*B12 | 2013 emit(cond | B27 | B26 | am | d*B22 | base.code()*B16 | sd*B12 |
2006 0xA*B8 | count); 2014 0xA*B8 | count);
2007 } 2015 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2061 *encoding |= (hi >> 4) & 0x70000; // Low three bits of the high nybble. 2069 *encoding |= (hi >> 4) & 0x70000; // Low three bits of the high nybble.
2062 *encoding |= (hi >> 12) & 0x80000; // Top bit of the high nybble. 2070 *encoding |= (hi >> 12) & 0x80000; // Top bit of the high nybble.
2063 2071
2064 return true; 2072 return true;
2065 } 2073 }
2066 2074
2067 2075
2068 void Assembler::vmov(const DwVfpRegister dst, 2076 void Assembler::vmov(const DwVfpRegister dst,
2069 double imm, 2077 double imm,
2070 const Register scratch) { 2078 const Register scratch) {
2071 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2079 ASSERT(IsEnabled(VFP2));
2072 2080
2073 uint32_t enc; 2081 uint32_t enc;
2074 if (CpuFeatures::IsSupported(VFP3) && FitsVMOVDoubleImmediate(imm, &enc)) { 2082 if (CpuFeatures::IsSupported(VFP3) && FitsVMOVDoubleImmediate(imm, &enc)) {
2075 // The double can be encoded in the instruction. 2083 // The double can be encoded in the instruction.
2076 // 2084 //
2077 // Dd = immediate 2085 // Dd = immediate
2078 // Instruction details available in ARM DDI 0406C.b, A8-936. 2086 // Instruction details available in ARM DDI 0406C.b, A8-936.
2079 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | imm4H(19-16) | 2087 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | imm4H(19-16) |
2080 // Vd(15-12) | 101(11-9) | sz=1(8) | imm4L(3-0) 2088 // Vd(15-12) | 101(11-9) | sz=1(8) | imm4L(3-0)
2081 int vd, d; 2089 int vd, d;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 } 2141 }
2134 } 2142 }
2135 } 2143 }
2136 2144
2137 2145
2138 void Assembler::vmov(const SwVfpRegister dst, 2146 void Assembler::vmov(const SwVfpRegister dst,
2139 const SwVfpRegister src, 2147 const SwVfpRegister src,
2140 const Condition cond) { 2148 const Condition cond) {
2141 // Sd = Sm 2149 // Sd = Sm
2142 // Instruction details available in ARM DDI 0406B, A8-642. 2150 // Instruction details available in ARM DDI 0406B, A8-642.
2143 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2151 ASSERT(IsEnabled(VFP2));
2144 int sd, d, sm, m; 2152 int sd, d, sm, m;
2145 dst.split_code(&sd, &d); 2153 dst.split_code(&sd, &d);
2146 src.split_code(&sm, &m); 2154 src.split_code(&sm, &m);
2147 emit(cond | 0xE*B24 | d*B22 | 0xB*B20 | sd*B12 | 0xA*B8 | B6 | m*B5 | sm); 2155 emit(cond | 0xE*B24 | d*B22 | 0xB*B20 | sd*B12 | 0xA*B8 | B6 | m*B5 | sm);
2148 } 2156 }
2149 2157
2150 2158
2151 void Assembler::vmov(const DwVfpRegister dst, 2159 void Assembler::vmov(const DwVfpRegister dst,
2152 const DwVfpRegister src, 2160 const DwVfpRegister src,
2153 const Condition cond) { 2161 const Condition cond) {
2154 // Dd = Dm 2162 // Dd = Dm
2155 // Instruction details available in ARM DDI 0406C.b, A8-938. 2163 // Instruction details available in ARM DDI 0406C.b, A8-938.
2156 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | 0000(19-16) | Vd(15-12) | 2164 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | 0000(19-16) | Vd(15-12) |
2157 // 101(11-9) | sz=1(8) | 0(7) | 1(6) | M(5) | 0(4) | Vm(3-0) 2165 // 101(11-9) | sz=1(8) | 0(7) | 1(6) | M(5) | 0(4) | Vm(3-0)
2158 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2166 ASSERT(IsEnabled(VFP2));
2159 int vd, d; 2167 int vd, d;
2160 dst.split_code(&vd, &d); 2168 dst.split_code(&vd, &d);
2161 int vm, m; 2169 int vm, m;
2162 src.split_code(&vm, &m); 2170 src.split_code(&vm, &m);
2163 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | vd*B12 | 0x5*B9 | B8 | B6 | m*B5 | 2171 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | vd*B12 | 0x5*B9 | B8 | B6 | m*B5 |
2164 vm); 2172 vm);
2165 } 2173 }
2166 2174
2167 2175
2168 void Assembler::vmov(const DwVfpRegister dst, 2176 void Assembler::vmov(const DwVfpRegister dst,
2169 const VmovIndex index, 2177 const VmovIndex index,
2170 const Register src, 2178 const Register src,
2171 const Condition cond) { 2179 const Condition cond) {
2172 // Dd[index] = Rt 2180 // Dd[index] = Rt
2173 // Instruction details available in ARM DDI 0406C.b, A8-940. 2181 // Instruction details available in ARM DDI 0406C.b, A8-940.
2174 // cond(31-28) | 1110(27-24) | 0(23) | opc1=0index(22-21) | 0(20) | 2182 // cond(31-28) | 1110(27-24) | 0(23) | opc1=0index(22-21) | 0(20) |
2175 // Vd(19-16) | Rt(15-12) | 1011(11-8) | D(7) | opc2=00(6-5) | 1(4) | 0000(3-0) 2183 // Vd(19-16) | Rt(15-12) | 1011(11-8) | D(7) | opc2=00(6-5) | 1(4) | 0000(3-0)
2176 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2184 ASSERT(IsEnabled(VFP2));
2177 ASSERT(index.index == 0 || index.index == 1); 2185 ASSERT(index.index == 0 || index.index == 1);
2178 int vd, d; 2186 int vd, d;
2179 dst.split_code(&vd, &d); 2187 dst.split_code(&vd, &d);
2180 emit(cond | 0xE*B24 | index.index*B21 | vd*B16 | src.code()*B12 | 0xB*B8 | 2188 emit(cond | 0xE*B24 | index.index*B21 | vd*B16 | src.code()*B12 | 0xB*B8 |
2181 d*B7 | B4); 2189 d*B7 | B4);
2182 } 2190 }
2183 2191
2184 2192
2185 void Assembler::vmov(const DwVfpRegister dst, 2193 void Assembler::vmov(const DwVfpRegister dst,
2186 const Register src1, 2194 const Register src1,
2187 const Register src2, 2195 const Register src2,
2188 const Condition cond) { 2196 const Condition cond) {
2189 // Dm = <Rt,Rt2>. 2197 // Dm = <Rt,Rt2>.
2190 // Instruction details available in ARM DDI 0406C.b, A8-948. 2198 // Instruction details available in ARM DDI 0406C.b, A8-948.
2191 // cond(31-28) | 1100(27-24)| 010(23-21) | op=0(20) | Rt2(19-16) | 2199 // cond(31-28) | 1100(27-24)| 010(23-21) | op=0(20) | Rt2(19-16) |
2192 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm 2200 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm
2193 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2201 ASSERT(IsEnabled(VFP2));
2194 ASSERT(!src1.is(pc) && !src2.is(pc)); 2202 ASSERT(!src1.is(pc) && !src2.is(pc));
2195 int vm, m; 2203 int vm, m;
2196 dst.split_code(&vm, &m); 2204 dst.split_code(&vm, &m);
2197 emit(cond | 0xC*B24 | B22 | src2.code()*B16 | 2205 emit(cond | 0xC*B24 | B22 | src2.code()*B16 |
2198 src1.code()*B12 | 0xB*B8 | m*B5 | B4 | vm); 2206 src1.code()*B12 | 0xB*B8 | m*B5 | B4 | vm);
2199 } 2207 }
2200 2208
2201 2209
2202 void Assembler::vmov(const Register dst1, 2210 void Assembler::vmov(const Register dst1,
2203 const Register dst2, 2211 const Register dst2,
2204 const DwVfpRegister src, 2212 const DwVfpRegister src,
2205 const Condition cond) { 2213 const Condition cond) {
2206 // <Rt,Rt2> = Dm. 2214 // <Rt,Rt2> = Dm.
2207 // Instruction details available in ARM DDI 0406C.b, A8-948. 2215 // Instruction details available in ARM DDI 0406C.b, A8-948.
2208 // cond(31-28) | 1100(27-24)| 010(23-21) | op=1(20) | Rt2(19-16) | 2216 // cond(31-28) | 1100(27-24)| 010(23-21) | op=1(20) | Rt2(19-16) |
2209 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm 2217 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm
2210 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2218 ASSERT(IsEnabled(VFP2));
2211 ASSERT(!dst1.is(pc) && !dst2.is(pc)); 2219 ASSERT(!dst1.is(pc) && !dst2.is(pc));
2212 int vm, m; 2220 int vm, m;
2213 src.split_code(&vm, &m); 2221 src.split_code(&vm, &m);
2214 emit(cond | 0xC*B24 | B22 | B20 | dst2.code()*B16 | 2222 emit(cond | 0xC*B24 | B22 | B20 | dst2.code()*B16 |
2215 dst1.code()*B12 | 0xB*B8 | m*B5 | B4 | vm); 2223 dst1.code()*B12 | 0xB*B8 | m*B5 | B4 | vm);
2216 } 2224 }
2217 2225
2218 2226
2219 void Assembler::vmov(const SwVfpRegister dst, 2227 void Assembler::vmov(const SwVfpRegister dst,
2220 const Register src, 2228 const Register src,
2221 const Condition cond) { 2229 const Condition cond) {
2222 // Sn = Rt. 2230 // Sn = Rt.
2223 // Instruction details available in ARM DDI 0406A, A8-642. 2231 // Instruction details available in ARM DDI 0406A, A8-642.
2224 // cond(31-28) | 1110(27-24)| 000(23-21) | op=0(20) | Vn(19-16) | 2232 // cond(31-28) | 1110(27-24)| 000(23-21) | op=0(20) | Vn(19-16) |
2225 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) 2233 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0)
2226 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2234 ASSERT(IsEnabled(VFP2));
2227 ASSERT(!src.is(pc)); 2235 ASSERT(!src.is(pc));
2228 int sn, n; 2236 int sn, n;
2229 dst.split_code(&sn, &n); 2237 dst.split_code(&sn, &n);
2230 emit(cond | 0xE*B24 | sn*B16 | src.code()*B12 | 0xA*B8 | n*B7 | B4); 2238 emit(cond | 0xE*B24 | sn*B16 | src.code()*B12 | 0xA*B8 | n*B7 | B4);
2231 } 2239 }
2232 2240
2233 2241
2234 void Assembler::vmov(const Register dst, 2242 void Assembler::vmov(const Register dst,
2235 const SwVfpRegister src, 2243 const SwVfpRegister src,
2236 const Condition cond) { 2244 const Condition cond) {
2237 // Rt = Sn. 2245 // Rt = Sn.
2238 // Instruction details available in ARM DDI 0406A, A8-642. 2246 // Instruction details available in ARM DDI 0406A, A8-642.
2239 // cond(31-28) | 1110(27-24)| 000(23-21) | op=1(20) | Vn(19-16) | 2247 // cond(31-28) | 1110(27-24)| 000(23-21) | op=1(20) | Vn(19-16) |
2240 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) 2248 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0)
2241 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2249 ASSERT(IsEnabled(VFP2));
2242 ASSERT(!dst.is(pc)); 2250 ASSERT(!dst.is(pc));
2243 int sn, n; 2251 int sn, n;
2244 src.split_code(&sn, &n); 2252 src.split_code(&sn, &n);
2245 emit(cond | 0xE*B24 | B20 | sn*B16 | dst.code()*B12 | 0xA*B8 | n*B7 | B4); 2253 emit(cond | 0xE*B24 | B20 | sn*B16 | dst.code()*B12 | 0xA*B8 | n*B7 | B4);
2246 } 2254 }
2247 2255
2248 2256
2249 // Type of data to read from or write to VFP register. 2257 // Type of data to read from or write to VFP register.
2250 // Used as specifier in generic vcvt instruction. 2258 // Used as specifier in generic vcvt instruction.
2251 enum VFPType { S32, U32, F32, F64 }; 2259 enum VFPType { S32, U32, F32, F64 };
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
2356 return (cond | 0xE*B24 | B23 | D*B22 | 0x3*B20 | 0x7*B16 | 2364 return (cond | 0xE*B24 | B23 | D*B22 | 0x3*B20 | 0x7*B16 |
2357 Vd*B12 | 0x5*B9 | sz*B8 | B7 | B6 | M*B5 | Vm); 2365 Vd*B12 | 0x5*B9 | sz*B8 | B7 | B6 | M*B5 | Vm);
2358 } 2366 }
2359 } 2367 }
2360 2368
2361 2369
2362 void Assembler::vcvt_f64_s32(const DwVfpRegister dst, 2370 void Assembler::vcvt_f64_s32(const DwVfpRegister dst,
2363 const SwVfpRegister src, 2371 const SwVfpRegister src,
2364 VFPConversionMode mode, 2372 VFPConversionMode mode,
2365 const Condition cond) { 2373 const Condition cond) {
2366 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2374 ASSERT(IsEnabled(VFP2));
2367 emit(EncodeVCVT(F64, dst.code(), S32, src.code(), mode, cond)); 2375 emit(EncodeVCVT(F64, dst.code(), S32, src.code(), mode, cond));
2368 } 2376 }
2369 2377
2370 2378
2371 void Assembler::vcvt_f32_s32(const SwVfpRegister dst, 2379 void Assembler::vcvt_f32_s32(const SwVfpRegister dst,
2372 const SwVfpRegister src, 2380 const SwVfpRegister src,
2373 VFPConversionMode mode, 2381 VFPConversionMode mode,
2374 const Condition cond) { 2382 const Condition cond) {
2375 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2383 ASSERT(IsEnabled(VFP2));
2376 emit(EncodeVCVT(F32, dst.code(), S32, src.code(), mode, cond)); 2384 emit(EncodeVCVT(F32, dst.code(), S32, src.code(), mode, cond));
2377 } 2385 }
2378 2386
2379 2387
2380 void Assembler::vcvt_f64_u32(const DwVfpRegister dst, 2388 void Assembler::vcvt_f64_u32(const DwVfpRegister dst,
2381 const SwVfpRegister src, 2389 const SwVfpRegister src,
2382 VFPConversionMode mode, 2390 VFPConversionMode mode,
2383 const Condition cond) { 2391 const Condition cond) {
2384 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2392 ASSERT(IsEnabled(VFP2));
2385 emit(EncodeVCVT(F64, dst.code(), U32, src.code(), mode, cond)); 2393 emit(EncodeVCVT(F64, dst.code(), U32, src.code(), mode, cond));
2386 } 2394 }
2387 2395
2388 2396
2389 void Assembler::vcvt_s32_f64(const SwVfpRegister dst, 2397 void Assembler::vcvt_s32_f64(const SwVfpRegister dst,
2390 const DwVfpRegister src, 2398 const DwVfpRegister src,
2391 VFPConversionMode mode, 2399 VFPConversionMode mode,
2392 const Condition cond) { 2400 const Condition cond) {
2393 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2401 ASSERT(IsEnabled(VFP2));
2394 emit(EncodeVCVT(S32, dst.code(), F64, src.code(), mode, cond)); 2402 emit(EncodeVCVT(S32, dst.code(), F64, src.code(), mode, cond));
2395 } 2403 }
2396 2404
2397 2405
2398 void Assembler::vcvt_u32_f64(const SwVfpRegister dst, 2406 void Assembler::vcvt_u32_f64(const SwVfpRegister dst,
2399 const DwVfpRegister src, 2407 const DwVfpRegister src,
2400 VFPConversionMode mode, 2408 VFPConversionMode mode,
2401 const Condition cond) { 2409 const Condition cond) {
2402 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2410 ASSERT(IsEnabled(VFP2));
2403 emit(EncodeVCVT(U32, dst.code(), F64, src.code(), mode, cond)); 2411 emit(EncodeVCVT(U32, dst.code(), F64, src.code(), mode, cond));
2404 } 2412 }
2405 2413
2406 2414
2407 void Assembler::vcvt_f64_f32(const DwVfpRegister dst, 2415 void Assembler::vcvt_f64_f32(const DwVfpRegister dst,
2408 const SwVfpRegister src, 2416 const SwVfpRegister src,
2409 VFPConversionMode mode, 2417 VFPConversionMode mode,
2410 const Condition cond) { 2418 const Condition cond) {
2411 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2419 ASSERT(IsEnabled(VFP2));
2412 emit(EncodeVCVT(F64, dst.code(), F32, src.code(), mode, cond)); 2420 emit(EncodeVCVT(F64, dst.code(), F32, src.code(), mode, cond));
2413 } 2421 }
2414 2422
2415 2423
2416 void Assembler::vcvt_f32_f64(const SwVfpRegister dst, 2424 void Assembler::vcvt_f32_f64(const SwVfpRegister dst,
2417 const DwVfpRegister src, 2425 const DwVfpRegister src,
2418 VFPConversionMode mode, 2426 VFPConversionMode mode,
2419 const Condition cond) { 2427 const Condition cond) {
2420 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2428 ASSERT(IsEnabled(VFP2));
2421 emit(EncodeVCVT(F32, dst.code(), F64, src.code(), mode, cond)); 2429 emit(EncodeVCVT(F32, dst.code(), F64, src.code(), mode, cond));
2422 } 2430 }
2423 2431
2424 2432
2425 void Assembler::vneg(const DwVfpRegister dst, 2433 void Assembler::vneg(const DwVfpRegister dst,
2426 const DwVfpRegister src, 2434 const DwVfpRegister src,
2427 const Condition cond) { 2435 const Condition cond) {
2428 // Instruction details available in ARM DDI 0406C.b, A8-968. 2436 // Instruction details available in ARM DDI 0406C.b, A8-968.
2429 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | 0001(19-16) | Vd(15-12) | 2437 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | 0001(19-16) | Vd(15-12) |
2430 // 101(11-9) | sz=1(8) | 0(7) | 1(6) | M(5) | 0(4) | Vm(3-0) 2438 // 101(11-9) | sz=1(8) | 0(7) | 1(6) | M(5) | 0(4) | Vm(3-0)
2431 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2439 ASSERT(IsEnabled(VFP2));
2432 int vd, d; 2440 int vd, d;
2433 dst.split_code(&vd, &d); 2441 dst.split_code(&vd, &d);
2434 int vm, m; 2442 int vm, m;
2435 src.split_code(&vm, &m); 2443 src.split_code(&vm, &m);
2436 2444
2437 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | B16 | vd*B12 | 0x5*B9 | B8 | B6 | 2445 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | B16 | vd*B12 | 0x5*B9 | B8 | B6 |
2438 m*B5 | vm); 2446 m*B5 | vm);
2439 } 2447 }
2440 2448
2441 2449
2442 void Assembler::vabs(const DwVfpRegister dst, 2450 void Assembler::vabs(const DwVfpRegister dst,
2443 const DwVfpRegister src, 2451 const DwVfpRegister src,
2444 const Condition cond) { 2452 const Condition cond) {
2445 // Instruction details available in ARM DDI 0406C.b, A8-524. 2453 // Instruction details available in ARM DDI 0406C.b, A8-524.
2446 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | 0000(19-16) | Vd(15-12) | 2454 // cond(31-28) | 11101(27-23) | D(22) | 11(21-20) | 0000(19-16) | Vd(15-12) |
2447 // 101(11-9) | sz=1(8) | 1(7) | 1(6) | M(5) | 0(4) | Vm(3-0) 2455 // 101(11-9) | sz=1(8) | 1(7) | 1(6) | M(5) | 0(4) | Vm(3-0)
2448 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2456 ASSERT(IsEnabled(VFP2));
2449 int vd, d; 2457 int vd, d;
2450 dst.split_code(&vd, &d); 2458 dst.split_code(&vd, &d);
2451 int vm, m; 2459 int vm, m;
2452 src.split_code(&vm, &m); 2460 src.split_code(&vm, &m);
2453 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | vd*B12 | 0x5*B9 | B8 | B7 | B6 | 2461 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | vd*B12 | 0x5*B9 | B8 | B7 | B6 |
2454 m*B5 | vm); 2462 m*B5 | vm);
2455 } 2463 }
2456 2464
2457 2465
2458 void Assembler::vadd(const DwVfpRegister dst, 2466 void Assembler::vadd(const DwVfpRegister dst,
2459 const DwVfpRegister src1, 2467 const DwVfpRegister src1,
2460 const DwVfpRegister src2, 2468 const DwVfpRegister src2,
2461 const Condition cond) { 2469 const Condition cond) {
2462 // Dd = vadd(Dn, Dm) double precision floating point addition. 2470 // Dd = vadd(Dn, Dm) double precision floating point addition.
2463 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. 2471 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm.
2464 // Instruction details available in ARM DDI 0406C.b, A8-830. 2472 // Instruction details available in ARM DDI 0406C.b, A8-830.
2465 // cond(31-28) | 11100(27-23)| D(22) | 11(21-20) | Vn(19-16) | 2473 // cond(31-28) | 11100(27-23)| D(22) | 11(21-20) | Vn(19-16) |
2466 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 0(6) | M(5) | 0(4) | Vm(3-0) 2474 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 0(6) | M(5) | 0(4) | Vm(3-0)
2467 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2475 ASSERT(IsEnabled(VFP2));
2468 int vd, d; 2476 int vd, d;
2469 dst.split_code(&vd, &d); 2477 dst.split_code(&vd, &d);
2470 int vn, n; 2478 int vn, n;
2471 src1.split_code(&vn, &n); 2479 src1.split_code(&vn, &n);
2472 int vm, m; 2480 int vm, m;
2473 src2.split_code(&vm, &m); 2481 src2.split_code(&vm, &m);
2474 emit(cond | 0x1C*B23 | d*B22 | 0x3*B20 | vn*B16 | vd*B12 | 0x5*B9 | B8 | 2482 emit(cond | 0x1C*B23 | d*B22 | 0x3*B20 | vn*B16 | vd*B12 | 0x5*B9 | B8 |
2475 n*B7 | m*B5 | vm); 2483 n*B7 | m*B5 | vm);
2476 } 2484 }
2477 2485
2478 2486
2479 void Assembler::vsub(const DwVfpRegister dst, 2487 void Assembler::vsub(const DwVfpRegister dst,
2480 const DwVfpRegister src1, 2488 const DwVfpRegister src1,
2481 const DwVfpRegister src2, 2489 const DwVfpRegister src2,
2482 const Condition cond) { 2490 const Condition cond) {
2483 // Dd = vsub(Dn, Dm) double precision floating point subtraction. 2491 // Dd = vsub(Dn, Dm) double precision floating point subtraction.
2484 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. 2492 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm.
2485 // Instruction details available in ARM DDI 0406C.b, A8-1086. 2493 // Instruction details available in ARM DDI 0406C.b, A8-1086.
2486 // cond(31-28) | 11100(27-23)| D(22) | 11(21-20) | Vn(19-16) | 2494 // cond(31-28) | 11100(27-23)| D(22) | 11(21-20) | Vn(19-16) |
2487 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 1(6) | M(5) | 0(4) | Vm(3-0) 2495 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 1(6) | M(5) | 0(4) | Vm(3-0)
2488 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2496 ASSERT(IsEnabled(VFP2));
2489 int vd, d; 2497 int vd, d;
2490 dst.split_code(&vd, &d); 2498 dst.split_code(&vd, &d);
2491 int vn, n; 2499 int vn, n;
2492 src1.split_code(&vn, &n); 2500 src1.split_code(&vn, &n);
2493 int vm, m; 2501 int vm, m;
2494 src2.split_code(&vm, &m); 2502 src2.split_code(&vm, &m);
2495 emit(cond | 0x1C*B23 | d*B22 | 0x3*B20 | vn*B16 | vd*B12 | 0x5*B9 | B8 | 2503 emit(cond | 0x1C*B23 | d*B22 | 0x3*B20 | vn*B16 | vd*B12 | 0x5*B9 | B8 |
2496 n*B7 | B6 | m*B5 | vm); 2504 n*B7 | B6 | m*B5 | vm);
2497 } 2505 }
2498 2506
2499 2507
2500 void Assembler::vmul(const DwVfpRegister dst, 2508 void Assembler::vmul(const DwVfpRegister dst,
2501 const DwVfpRegister src1, 2509 const DwVfpRegister src1,
2502 const DwVfpRegister src2, 2510 const DwVfpRegister src2,
2503 const Condition cond) { 2511 const Condition cond) {
2504 // Dd = vmul(Dn, Dm) double precision floating point multiplication. 2512 // Dd = vmul(Dn, Dm) double precision floating point multiplication.
2505 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. 2513 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm.
2506 // Instruction details available in ARM DDI 0406C.b, A8-960. 2514 // Instruction details available in ARM DDI 0406C.b, A8-960.
2507 // cond(31-28) | 11100(27-23)| D(22) | 10(21-20) | Vn(19-16) | 2515 // cond(31-28) | 11100(27-23)| D(22) | 10(21-20) | Vn(19-16) |
2508 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 0(6) | M(5) | 0(4) | Vm(3-0) 2516 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 0(6) | M(5) | 0(4) | Vm(3-0)
2509 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2517 ASSERT(IsEnabled(VFP2));
2510 int vd, d; 2518 int vd, d;
2511 dst.split_code(&vd, &d); 2519 dst.split_code(&vd, &d);
2512 int vn, n; 2520 int vn, n;
2513 src1.split_code(&vn, &n); 2521 src1.split_code(&vn, &n);
2514 int vm, m; 2522 int vm, m;
2515 src2.split_code(&vm, &m); 2523 src2.split_code(&vm, &m);
2516 emit(cond | 0x1C*B23 | d*B22 | 0x2*B20 | vn*B16 | vd*B12 | 0x5*B9 | B8 | 2524 emit(cond | 0x1C*B23 | d*B22 | 0x2*B20 | vn*B16 | vd*B12 | 0x5*B9 | B8 |
2517 n*B7 | m*B5 | vm); 2525 n*B7 | m*B5 | vm);
2518 } 2526 }
2519 2527
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2556 2564
2557 void Assembler::vdiv(const DwVfpRegister dst, 2565 void Assembler::vdiv(const DwVfpRegister dst,
2558 const DwVfpRegister src1, 2566 const DwVfpRegister src1,
2559 const DwVfpRegister src2, 2567 const DwVfpRegister src2,
2560 const Condition cond) { 2568 const Condition cond) {
2561 // Dd = vdiv(Dn, Dm) double precision floating point division. 2569 // Dd = vdiv(Dn, Dm) double precision floating point division.
2562 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. 2570 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm.
2563 // Instruction details available in ARM DDI 0406C.b, A8-882. 2571 // Instruction details available in ARM DDI 0406C.b, A8-882.
2564 // cond(31-28) | 11101(27-23)| D(22) | 00(21-20) | Vn(19-16) | 2572 // cond(31-28) | 11101(27-23)| D(22) | 00(21-20) | Vn(19-16) |
2565 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 0(6) | M(5) | 0(4) | Vm(3-0) 2573 // Vd(15-12) | 101(11-9) | sz=1(8) | N(7) | 0(6) | M(5) | 0(4) | Vm(3-0)
2566 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2574 ASSERT(IsEnabled(VFP2));
2567 int vd, d; 2575 int vd, d;
2568 dst.split_code(&vd, &d); 2576 dst.split_code(&vd, &d);
2569 int vn, n; 2577 int vn, n;
2570 src1.split_code(&vn, &n); 2578 src1.split_code(&vn, &n);
2571 int vm, m; 2579 int vm, m;
2572 src2.split_code(&vm, &m); 2580 src2.split_code(&vm, &m);
2573 emit(cond | 0x1D*B23 | d*B22 | vn*B16 | vd*B12 | 0x5*B9 | B8 | n*B7 | m*B5 | 2581 emit(cond | 0x1D*B23 | d*B22 | vn*B16 | vd*B12 | 0x5*B9 | B8 | n*B7 | m*B5 |
2574 vm); 2582 vm);
2575 } 2583 }
2576 2584
2577 2585
2578 void Assembler::vcmp(const DwVfpRegister src1, 2586 void Assembler::vcmp(const DwVfpRegister src1,
2579 const DwVfpRegister src2, 2587 const DwVfpRegister src2,
2580 const Condition cond) { 2588 const Condition cond) {
2581 // vcmp(Dd, Dm) double precision floating point comparison. 2589 // vcmp(Dd, Dm) double precision floating point comparison.
2582 // Instruction details available in ARM DDI 0406C.b, A8-864. 2590 // Instruction details available in ARM DDI 0406C.b, A8-864.
2583 // cond(31-28) | 11101(27-23)| D(22) | 11(21-20) | 0100(19-16) | 2591 // cond(31-28) | 11101(27-23)| D(22) | 11(21-20) | 0100(19-16) |
2584 // Vd(15-12) | 101(11-9) | sz=1(8) | E=0(7) | 1(6) | M(5) | 0(4) | Vm(3-0) 2592 // Vd(15-12) | 101(11-9) | sz=1(8) | E=0(7) | 1(6) | M(5) | 0(4) | Vm(3-0)
2585 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2593 ASSERT(IsEnabled(VFP2));
2586 int vd, d; 2594 int vd, d;
2587 src1.split_code(&vd, &d); 2595 src1.split_code(&vd, &d);
2588 int vm, m; 2596 int vm, m;
2589 src2.split_code(&vm, &m); 2597 src2.split_code(&vm, &m);
2590 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | 0x4*B16 | vd*B12 | 0x5*B9 | B8 | B6 | 2598 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | 0x4*B16 | vd*B12 | 0x5*B9 | B8 | B6 |
2591 m*B5 | vm); 2599 m*B5 | vm);
2592 } 2600 }
2593 2601
2594 2602
2595 void Assembler::vcmp(const DwVfpRegister src1, 2603 void Assembler::vcmp(const DwVfpRegister src1,
2596 const double src2, 2604 const double src2,
2597 const Condition cond) { 2605 const Condition cond) {
2598 // vcmp(Dd, #0.0) double precision floating point comparison. 2606 // vcmp(Dd, #0.0) double precision floating point comparison.
2599 // Instruction details available in ARM DDI 0406C.b, A8-864. 2607 // Instruction details available in ARM DDI 0406C.b, A8-864.
2600 // cond(31-28) | 11101(27-23)| D(22) | 11(21-20) | 0101(19-16) | 2608 // cond(31-28) | 11101(27-23)| D(22) | 11(21-20) | 0101(19-16) |
2601 // Vd(15-12) | 101(11-9) | sz=1(8) | E=0(7) | 1(6) | 0(5) | 0(4) | 0000(3-0) 2609 // Vd(15-12) | 101(11-9) | sz=1(8) | E=0(7) | 1(6) | 0(5) | 0(4) | 0000(3-0)
2602 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2610 ASSERT(IsEnabled(VFP2));
2603 ASSERT(src2 == 0.0); 2611 ASSERT(src2 == 0.0);
2604 int vd, d; 2612 int vd, d;
2605 src1.split_code(&vd, &d); 2613 src1.split_code(&vd, &d);
2606 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | 0x5*B16 | vd*B12 | 0x5*B9 | B8 | B6); 2614 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | 0x5*B16 | vd*B12 | 0x5*B9 | B8 | B6);
2607 } 2615 }
2608 2616
2609 2617
2610 void Assembler::vmsr(Register dst, Condition cond) { 2618 void Assembler::vmsr(Register dst, Condition cond) {
2611 // Instruction details available in ARM DDI 0406A, A8-652. 2619 // Instruction details available in ARM DDI 0406A, A8-652.
2612 // cond(31-28) | 1110 (27-24) | 1110(23-20)| 0001 (19-16) | 2620 // cond(31-28) | 1110 (27-24) | 1110(23-20)| 0001 (19-16) |
2613 // Rt(15-12) | 1010 (11-8) | 0(7) | 00 (6-5) | 1(4) | 0000(3-0) 2621 // Rt(15-12) | 1010 (11-8) | 0(7) | 00 (6-5) | 1(4) | 0000(3-0)
2614 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2622 ASSERT(IsEnabled(VFP2));
2615 emit(cond | 0xE*B24 | 0xE*B20 | B16 | 2623 emit(cond | 0xE*B24 | 0xE*B20 | B16 |
2616 dst.code()*B12 | 0xA*B8 | B4); 2624 dst.code()*B12 | 0xA*B8 | B4);
2617 } 2625 }
2618 2626
2619 2627
2620 void Assembler::vmrs(Register dst, Condition cond) { 2628 void Assembler::vmrs(Register dst, Condition cond) {
2621 // Instruction details available in ARM DDI 0406A, A8-652. 2629 // Instruction details available in ARM DDI 0406A, A8-652.
2622 // cond(31-28) | 1110 (27-24) | 1111(23-20)| 0001 (19-16) | 2630 // cond(31-28) | 1110 (27-24) | 1111(23-20)| 0001 (19-16) |
2623 // Rt(15-12) | 1010 (11-8) | 0(7) | 00 (6-5) | 1(4) | 0000(3-0) 2631 // Rt(15-12) | 1010 (11-8) | 0(7) | 00 (6-5) | 1(4) | 0000(3-0)
2624 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2632 ASSERT(IsEnabled(VFP2));
2625 emit(cond | 0xE*B24 | 0xF*B20 | B16 | 2633 emit(cond | 0xE*B24 | 0xF*B20 | B16 |
2626 dst.code()*B12 | 0xA*B8 | B4); 2634 dst.code()*B12 | 0xA*B8 | B4);
2627 } 2635 }
2628 2636
2629 2637
2630 void Assembler::vsqrt(const DwVfpRegister dst, 2638 void Assembler::vsqrt(const DwVfpRegister dst,
2631 const DwVfpRegister src, 2639 const DwVfpRegister src,
2632 const Condition cond) { 2640 const Condition cond) {
2633 // Instruction details available in ARM DDI 0406C.b, A8-1058. 2641 // Instruction details available in ARM DDI 0406C.b, A8-1058.
2634 // cond(31-28) | 11101(27-23)| D(22) | 11(21-20) | 0001(19-16) | 2642 // cond(31-28) | 11101(27-23)| D(22) | 11(21-20) | 0001(19-16) |
2635 // Vd(15-12) | 101(11-9) | sz=1(8) | 11(7-6) | M(5) | 0(4) | Vm(3-0) 2643 // Vd(15-12) | 101(11-9) | sz=1(8) | 11(7-6) | M(5) | 0(4) | Vm(3-0)
2636 ASSERT(CpuFeatures::IsEnabled(VFP2)); 2644 ASSERT(IsEnabled(VFP2));
2637 int vd, d; 2645 int vd, d;
2638 dst.split_code(&vd, &d); 2646 dst.split_code(&vd, &d);
2639 int vm, m; 2647 int vm, m;
2640 src.split_code(&vm, &m); 2648 src.split_code(&vm, &m);
2641 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | B16 | vd*B12 | 0x5*B9 | B8 | 0x3*B6 | 2649 emit(cond | 0x1D*B23 | d*B22 | 0x3*B20 | B16 | vd*B12 | 0x5*B9 | B8 | 0x3*B6 |
2642 m*B5 | vm); 2650 m*B5 | vm);
2643 } 2651 }
2644 2652
2645 2653
2646 // Pseudo instructions. 2654 // Pseudo instructions.
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
3043 3051
3044 // Since a constant pool was just emitted, move the check offset forward by 3052 // Since a constant pool was just emitted, move the check offset forward by
3045 // the standard interval. 3053 // the standard interval.
3046 next_buffer_check_ = pc_offset() + kCheckPoolInterval; 3054 next_buffer_check_ = pc_offset() + kCheckPoolInterval;
3047 } 3055 }
3048 3056
3049 3057
3050 } } // namespace v8::internal 3058 } } // namespace v8::internal
3051 3059
3052 #endif // V8_TARGET_ARCH_ARM 3060 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/assembler-arm.h ('k') | src/arm/code-stubs-arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698