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 // Modified by the Subzero authors. | 5 // Modified by the Subzero authors. |
6 // | 6 // |
7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// | 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// |
8 // | 8 // |
9 // The Subzero Code Generator | 9 // The Subzero Code Generator |
10 // | 10 // |
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 void AssemblerX86::shufps(XmmRegister dst, XmmRegister src, | 933 void AssemblerX86::shufps(XmmRegister dst, XmmRegister src, |
934 const Immediate &imm) { | 934 const Immediate &imm) { |
935 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 935 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
936 EmitUint8(0x0F); | 936 EmitUint8(0x0F); |
937 EmitUint8(0xC6); | 937 EmitUint8(0xC6); |
938 EmitXmmRegisterOperand(dst, src); | 938 EmitXmmRegisterOperand(dst, src); |
939 assert(imm.is_uint8()); | 939 assert(imm.is_uint8()); |
940 EmitUint8(imm.value()); | 940 EmitUint8(imm.value()); |
941 } | 941 } |
942 | 942 |
| 943 void AssemblerX86::pshufd(Type /* Ty */, XmmRegister dst, XmmRegister src, |
| 944 const Immediate &imm) { |
| 945 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 946 EmitUint8(0x66); |
| 947 EmitUint8(0x0F); |
| 948 EmitUint8(0x70); |
| 949 EmitXmmRegisterOperand(dst, src); |
| 950 assert(imm.is_uint8()); |
| 951 EmitUint8(imm.value()); |
| 952 } |
| 953 |
| 954 void AssemblerX86::pshufd(Type /* Ty */, XmmRegister dst, const Address &src, |
| 955 const Immediate &imm) { |
| 956 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 957 EmitUint8(0x66); |
| 958 EmitUint8(0x0F); |
| 959 EmitUint8(0x70); |
| 960 EmitOperand(dst, src); |
| 961 assert(imm.is_uint8()); |
| 962 EmitUint8(imm.value()); |
| 963 } |
| 964 |
| 965 void AssemblerX86::shufps(Type /* Ty */, XmmRegister dst, XmmRegister src, |
| 966 const Immediate &imm) { |
| 967 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 968 EmitUint8(0x0F); |
| 969 EmitUint8(0xC6); |
| 970 EmitXmmRegisterOperand(dst, src); |
| 971 assert(imm.is_uint8()); |
| 972 EmitUint8(imm.value()); |
| 973 } |
| 974 |
| 975 void AssemblerX86::shufps(Type /* Ty */, XmmRegister dst, const Address &src, |
| 976 const Immediate &imm) { |
| 977 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 978 EmitUint8(0x0F); |
| 979 EmitUint8(0xC6); |
| 980 EmitOperand(dst, src); |
| 981 assert(imm.is_uint8()); |
| 982 EmitUint8(imm.value()); |
| 983 } |
| 984 |
943 void AssemblerX86::minpd(XmmRegister dst, XmmRegister src) { | 985 void AssemblerX86::minpd(XmmRegister dst, XmmRegister src) { |
944 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 986 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
945 EmitUint8(0x66); | 987 EmitUint8(0x66); |
946 EmitUint8(0x0F); | 988 EmitUint8(0x0F); |
947 EmitUint8(0x5D); | 989 EmitUint8(0x5D); |
948 EmitXmmRegisterOperand(dst, src); | 990 EmitXmmRegisterOperand(dst, src); |
949 } | 991 } |
950 | 992 |
951 void AssemblerX86::maxpd(XmmRegister dst, XmmRegister src) { | 993 void AssemblerX86::maxpd(XmmRegister dst, XmmRegister src) { |
952 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 994 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 } | 1198 } |
1157 | 1199 |
1158 void AssemblerX86::andpd(XmmRegister dst, XmmRegister src) { | 1200 void AssemblerX86::andpd(XmmRegister dst, XmmRegister src) { |
1159 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1201 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1160 EmitUint8(0x66); | 1202 EmitUint8(0x66); |
1161 EmitUint8(0x0F); | 1203 EmitUint8(0x0F); |
1162 EmitUint8(0x54); | 1204 EmitUint8(0x54); |
1163 EmitXmmRegisterOperand(dst, src); | 1205 EmitXmmRegisterOperand(dst, src); |
1164 } | 1206 } |
1165 | 1207 |
1166 void AssemblerX86::pextrd(GPRRegister dst, XmmRegister src, | 1208 void AssemblerX86::insertps(Type Ty, XmmRegister dst, XmmRegister src, |
1167 const Immediate &imm) { | 1209 const Immediate &imm) { |
1168 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1210 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1211 assert(imm.is_uint8()); |
| 1212 assert(isVectorFloatingType(Ty)); |
| 1213 (void)Ty; |
1169 EmitUint8(0x66); | 1214 EmitUint8(0x66); |
1170 EmitUint8(0x0F); | 1215 EmitUint8(0x0F); |
1171 EmitUint8(0x3A); | 1216 EmitUint8(0x3A); |
1172 EmitUint8(0x16); | 1217 EmitUint8(0x21); |
1173 EmitOperand(src, Operand(dst)); | 1218 EmitXmmRegisterOperand(dst, src); |
| 1219 EmitUint8(imm.value()); |
| 1220 } |
| 1221 |
| 1222 void AssemblerX86::insertps(Type Ty, XmmRegister dst, const Address &src, |
| 1223 const Immediate &imm) { |
| 1224 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1174 assert(imm.is_uint8()); | 1225 assert(imm.is_uint8()); |
| 1226 assert(isVectorFloatingType(Ty)); |
| 1227 (void)Ty; |
| 1228 EmitUint8(0x66); |
| 1229 EmitUint8(0x0F); |
| 1230 EmitUint8(0x3A); |
| 1231 EmitUint8(0x21); |
| 1232 EmitOperand(dst, src); |
1175 EmitUint8(imm.value()); | 1233 EmitUint8(imm.value()); |
1176 } | 1234 } |
1177 | 1235 |
| 1236 void AssemblerX86::pinsr(Type Ty, XmmRegister dst, GPRRegister src, |
| 1237 const Immediate &imm) { |
| 1238 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1239 assert(imm.is_uint8()); |
| 1240 if (Ty == IceType_i16) { |
| 1241 EmitUint8(0x66); |
| 1242 EmitUint8(0x0F); |
| 1243 EmitUint8(0xC4); |
| 1244 EmitXmmRegisterOperand(dst, XmmRegister(src)); |
| 1245 EmitUint8(imm.value()); |
| 1246 } else { |
| 1247 EmitUint8(0x66); |
| 1248 EmitUint8(0x0F); |
| 1249 EmitUint8(0x3A); |
| 1250 EmitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); |
| 1251 EmitXmmRegisterOperand(dst, XmmRegister(src)); |
| 1252 EmitUint8(imm.value()); |
| 1253 } |
| 1254 } |
| 1255 |
| 1256 void AssemblerX86::pinsr(Type Ty, XmmRegister dst, const Address &src, |
| 1257 const Immediate &imm) { |
| 1258 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1259 assert(imm.is_uint8()); |
| 1260 if (Ty == IceType_i16) { |
| 1261 EmitUint8(0x66); |
| 1262 EmitUint8(0x0F); |
| 1263 EmitUint8(0xC4); |
| 1264 EmitOperand(dst, src); |
| 1265 EmitUint8(imm.value()); |
| 1266 } else { |
| 1267 EmitUint8(0x66); |
| 1268 EmitUint8(0x0F); |
| 1269 EmitUint8(0x3A); |
| 1270 EmitUint8(isByteSizedType(Ty) ? 0x20 : 0x22); |
| 1271 EmitOperand(dst, src); |
| 1272 EmitUint8(imm.value()); |
| 1273 } |
| 1274 } |
| 1275 |
| 1276 void AssemblerX86::pextr(Type Ty, GPRRegister dst, XmmRegister src, |
| 1277 const Immediate &imm) { |
| 1278 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1279 assert(imm.is_uint8()); |
| 1280 if (Ty == IceType_i16) { |
| 1281 EmitUint8(0x66); |
| 1282 EmitUint8(0x0F); |
| 1283 EmitUint8(0xC5); |
| 1284 EmitXmmRegisterOperand(XmmRegister(dst), src); |
| 1285 EmitUint8(imm.value()); |
| 1286 } else { |
| 1287 EmitUint8(0x66); |
| 1288 EmitUint8(0x0F); |
| 1289 EmitUint8(0x3A); |
| 1290 EmitUint8(isByteSizedType(Ty) ? 0x14 : 0x16); |
| 1291 // SSE 4.1 versions are "MRI" because dst can be mem, while |
| 1292 // pextrw (SSE2) is RMI because dst must be reg. |
| 1293 EmitXmmRegisterOperand(src, XmmRegister(dst)); |
| 1294 EmitUint8(imm.value()); |
| 1295 } |
| 1296 } |
| 1297 |
1178 void AssemblerX86::pmovsxdq(XmmRegister dst, XmmRegister src) { | 1298 void AssemblerX86::pmovsxdq(XmmRegister dst, XmmRegister src) { |
1179 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1299 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1180 EmitUint8(0x66); | 1300 EmitUint8(0x66); |
1181 EmitUint8(0x0F); | 1301 EmitUint8(0x0F); |
1182 EmitUint8(0x38); | 1302 EmitUint8(0x38); |
1183 EmitUint8(0x25); | 1303 EmitUint8(0x25); |
1184 EmitXmmRegisterOperand(dst, src); | 1304 EmitXmmRegisterOperand(dst, src); |
1185 } | 1305 } |
1186 | 1306 |
1187 void AssemblerX86::pcmpeq(Type Ty, XmmRegister dst, XmmRegister src) { | 1307 void AssemblerX86::pcmpeq(Type Ty, XmmRegister dst, XmmRegister src) { |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1856 } | 1976 } |
1857 | 1977 |
1858 void AssemblerX86::sar(Type Ty, GPRRegister operand, GPRRegister shifter) { | 1978 void AssemblerX86::sar(Type Ty, GPRRegister operand, GPRRegister shifter) { |
1859 EmitGenericShift(7, Ty, Operand(operand), shifter); | 1979 EmitGenericShift(7, Ty, Operand(operand), shifter); |
1860 } | 1980 } |
1861 | 1981 |
1862 void AssemblerX86::sar(Type Ty, const Address &address, GPRRegister shifter) { | 1982 void AssemblerX86::sar(Type Ty, const Address &address, GPRRegister shifter) { |
1863 EmitGenericShift(7, Ty, address, shifter); | 1983 EmitGenericShift(7, Ty, address, shifter); |
1864 } | 1984 } |
1865 | 1985 |
1866 void AssemblerX86::shld(GPRRegister dst, GPRRegister src) { | 1986 void AssemblerX86::shld(Type Ty, GPRRegister dst, GPRRegister src) { |
1867 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1987 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1988 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 1989 if (Ty == IceType_i16) |
| 1990 EmitOperandSizeOverride(); |
1868 EmitUint8(0x0F); | 1991 EmitUint8(0x0F); |
1869 EmitUint8(0xA5); | 1992 EmitUint8(0xA5); |
1870 EmitRegisterOperand(src, dst); | 1993 EmitRegisterOperand(src, dst); |
1871 } | 1994 } |
1872 | 1995 |
1873 void AssemblerX86::shld(GPRRegister dst, GPRRegister src, | 1996 void AssemblerX86::shld(Type Ty, GPRRegister dst, GPRRegister src, |
1874 const Immediate &imm) { | 1997 const Immediate &imm) { |
1875 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1998 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1999 assert(Ty == IceType_i16 || Ty == IceType_i32); |
1876 assert(imm.is_int8()); | 2000 assert(imm.is_int8()); |
| 2001 if (Ty == IceType_i16) |
| 2002 EmitOperandSizeOverride(); |
1877 EmitUint8(0x0F); | 2003 EmitUint8(0x0F); |
1878 EmitUint8(0xA4); | 2004 EmitUint8(0xA4); |
1879 EmitRegisterOperand(src, dst); | 2005 EmitRegisterOperand(src, dst); |
1880 EmitUint8(imm.value() & 0xFF); | 2006 EmitUint8(imm.value() & 0xFF); |
1881 } | 2007 } |
1882 | 2008 |
1883 void AssemblerX86::shld(const Address &operand, GPRRegister src) { | 2009 void AssemblerX86::shld(Type Ty, const Address &operand, GPRRegister src) { |
1884 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2010 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2011 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 2012 if (Ty == IceType_i16) |
| 2013 EmitOperandSizeOverride(); |
1885 EmitUint8(0x0F); | 2014 EmitUint8(0x0F); |
1886 EmitUint8(0xA5); | 2015 EmitUint8(0xA5); |
1887 EmitOperand(src, Operand(operand)); | 2016 EmitOperand(src, operand); |
1888 } | 2017 } |
1889 | 2018 |
1890 void AssemblerX86::shrd(GPRRegister dst, GPRRegister src) { | 2019 void AssemblerX86::shrd(Type Ty, GPRRegister dst, GPRRegister src) { |
1891 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2020 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2021 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 2022 if (Ty == IceType_i16) |
| 2023 EmitOperandSizeOverride(); |
1892 EmitUint8(0x0F); | 2024 EmitUint8(0x0F); |
1893 EmitUint8(0xAD); | 2025 EmitUint8(0xAD); |
1894 EmitRegisterOperand(src, dst); | 2026 EmitRegisterOperand(src, dst); |
1895 } | 2027 } |
1896 | 2028 |
1897 void AssemblerX86::shrd(GPRRegister dst, GPRRegister src, | 2029 void AssemblerX86::shrd(Type Ty, GPRRegister dst, GPRRegister src, |
1898 const Immediate &imm) { | 2030 const Immediate &imm) { |
1899 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2031 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2032 assert(Ty == IceType_i16 || Ty == IceType_i32); |
1900 assert(imm.is_int8()); | 2033 assert(imm.is_int8()); |
| 2034 if (Ty == IceType_i16) |
| 2035 EmitOperandSizeOverride(); |
1901 EmitUint8(0x0F); | 2036 EmitUint8(0x0F); |
1902 EmitUint8(0xAC); | 2037 EmitUint8(0xAC); |
1903 EmitRegisterOperand(src, dst); | 2038 EmitRegisterOperand(src, dst); |
1904 EmitUint8(imm.value() & 0xFF); | 2039 EmitUint8(imm.value() & 0xFF); |
1905 } | 2040 } |
1906 | 2041 |
1907 void AssemblerX86::shrd(const Address &dst, GPRRegister src) { | 2042 void AssemblerX86::shrd(Type Ty, const Address &dst, GPRRegister src) { |
1908 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2043 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2044 assert(Ty == IceType_i16 || Ty == IceType_i32); |
| 2045 if (Ty == IceType_i16) |
| 2046 EmitOperandSizeOverride(); |
1909 EmitUint8(0x0F); | 2047 EmitUint8(0x0F); |
1910 EmitUint8(0xAD); | 2048 EmitUint8(0xAD); |
1911 EmitOperand(src, Operand(dst)); | 2049 EmitOperand(src, dst); |
1912 } | 2050 } |
1913 | 2051 |
1914 void AssemblerX86::neg(Type Ty, GPRRegister reg) { | 2052 void AssemblerX86::neg(Type Ty, GPRRegister reg) { |
1915 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2053 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
1916 if (Ty == IceType_i16) | 2054 if (Ty == IceType_i16) |
1917 EmitOperandSizeOverride(); | 2055 EmitOperandSizeOverride(); |
1918 if (isByteSizedArithType(Ty)) | 2056 if (isByteSizedArithType(Ty)) |
1919 EmitUint8(0xF6); | 2057 EmitUint8(0xF6); |
1920 else | 2058 else |
1921 EmitUint8(0xF7); | 2059 EmitUint8(0xF7); |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2354 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2492 assert(shifter == RegX8632::Encoded_Reg_ecx); |
2355 (void)shifter; | 2493 (void)shifter; |
2356 if (Ty == IceType_i16) | 2494 if (Ty == IceType_i16) |
2357 EmitOperandSizeOverride(); | 2495 EmitOperandSizeOverride(); |
2358 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); | 2496 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); |
2359 EmitOperand(rm, operand); | 2497 EmitOperand(rm, operand); |
2360 } | 2498 } |
2361 | 2499 |
2362 } // end of namespace x86 | 2500 } // end of namespace x86 |
2363 } // end of namespace Ice | 2501 } // end of namespace Ice |
OLD | NEW |