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

Side by Side Diff: src/assembler_ia32.cpp

Issue 656983002: emitIAS for Shld and Shrd and the ternary and three-address ops. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: stuff Created 6 years, 2 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
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 // 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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698