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

Side by Side Diff: src/ia32/disasm-ia32.cc

Issue 90643003: Experimental implementation: Exposing SIMD instructions into JavaScript Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years 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/ia32/deoptimizer-ia32.cc ('k') | src/ia32/full-codegen-ia32.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 AppendToBuffer("%s", f0mnem); 1035 AppendToBuffer("%s", f0mnem);
1036 data += 2; 1036 data += 2;
1037 } else if (f0byte == 0x28) { 1037 } else if (f0byte == 0x28) {
1038 data += 2; 1038 data += 2;
1039 int mod, regop, rm; 1039 int mod, regop, rm;
1040 get_modrm(*data, &mod, &regop, &rm); 1040 get_modrm(*data, &mod, &regop, &rm);
1041 AppendToBuffer("movaps %s,%s", 1041 AppendToBuffer("movaps %s,%s",
1042 NameOfXMMRegister(regop), 1042 NameOfXMMRegister(regop),
1043 NameOfXMMRegister(rm)); 1043 NameOfXMMRegister(rm));
1044 data++; 1044 data++;
1045 } else if (f0byte >= 0x53 && f0byte <= 0x5F) { 1045 } else if (f0byte == 0x10) {
1046 data += 2;
1047 int mod, regop, rm;
1048 get_modrm(*data, &mod, &regop, &rm);
1049 AppendToBuffer("movups %s,", NameOfXMMRegister(regop));
1050 data += PrintRightXMMOperand(data);
1051 } else if (f0byte == 0x11) {
1052 AppendToBuffer("movups ");
1053 data += 2;
1054 int mod, regop, rm;
1055 get_modrm(*data, &mod, &regop, &rm);
1056 data += PrintRightXMMOperand(data);
1057 AppendToBuffer(",%s", NameOfXMMRegister(regop));
1058 } else if (f0byte >= 0x51 && f0byte <= 0x5F) {
1046 const char* const pseudo_op[] = { 1059 const char* const pseudo_op[] = {
1060 "sqrtps",
1061 "rsqrtps",
1047 "rcpps", 1062 "rcpps",
1048 "andps", 1063 "andps",
1049 "andnps", 1064 "andnps",
1050 "orps", 1065 "orps",
1051 "xorps", 1066 "xorps",
1052 "addps", 1067 "addps",
1053 "mulps", 1068 "mulps",
1054 "cvtps2pd", 1069 "cvtps2pd",
1055 "cvtdq2ps", 1070 "cvtdq2ps",
1056 "subps", 1071 "subps",
1057 "minps", 1072 "minps",
1058 "divps", 1073 "divps",
1059 "maxps", 1074 "maxps"
1060 }; 1075 };
1061 1076
1062 data += 2; 1077 data += 2;
1063 int mod, regop, rm; 1078 int mod, regop, rm;
1064 get_modrm(*data, &mod, &regop, &rm); 1079 get_modrm(*data, &mod, &regop, &rm);
1065 AppendToBuffer("%s %s,", 1080 AppendToBuffer("%s %s,",
1066 pseudo_op[f0byte - 0x53], 1081 pseudo_op[f0byte - 0x51],
1067 NameOfXMMRegister(regop)); 1082 NameOfXMMRegister(regop));
1068 data += PrintRightXMMOperand(data); 1083 data += PrintRightXMMOperand(data);
1069 } else if (f0byte == 0x50) { 1084 } else if (f0byte == 0x50) {
1070 data += 2; 1085 data += 2;
1071 int mod, regop, rm; 1086 int mod, regop, rm;
1072 get_modrm(*data, &mod, &regop, &rm); 1087 get_modrm(*data, &mod, &regop, &rm);
1073 AppendToBuffer("movmskps %s,%s", 1088 AppendToBuffer("movmskps %s,%s",
1074 NameOfCPURegister(regop), 1089 NameOfCPURegister(regop),
1075 NameOfXMMRegister(rm)); 1090 NameOfXMMRegister(rm));
1076 data++; 1091 data++;
1092 } else if (f0byte == 0xC2) {
1093 // Intel manual 2A, Table 3-11.
1094 data += 2;
1095 int mod, regop, rm;
1096 get_modrm(*data, &mod, &regop, &rm);
1097 const char* const pseudo_op[] = {
1098 "cmpeqps",
1099 "cmpltps",
1100 "cmpleps",
1101 "cmpunordps",
1102 "cmpneqps",
1103 "cmpnltps",
1104 "cmpnleps",
1105 "cmpordps"
1106 };
1107 AppendToBuffer("%s %s,%s",
1108 pseudo_op[data[1]],
1109 NameOfXMMRegister(regop),
1110 NameOfXMMRegister(rm));
1111 data += 2;
1077 } else if (f0byte== 0xC6) { 1112 } else if (f0byte== 0xC6) {
1078 // shufps xmm, xmm/m128, imm8 1113 // shufps xmm, xmm/m128, imm8
1079 data += 2; 1114 data += 2;
1080 int mod, regop, rm; 1115 int mod, regop, rm;
1081 get_modrm(*data, &mod, &regop, &rm); 1116 get_modrm(*data, &mod, &regop, &rm);
1082 int8_t imm8 = static_cast<int8_t>(data[1]); 1117 int8_t imm8 = static_cast<int8_t>(data[1]);
1083 AppendToBuffer("shufps %s,%s,%d", 1118 AppendToBuffer("shufps %s,%s,%d",
1084 NameOfXMMRegister(rm), 1119 NameOfXMMRegister(rm),
1085 NameOfXMMRegister(regop), 1120 NameOfXMMRegister(regop),
1086 static_cast<int>(imm8)); 1121 static_cast<int>(imm8));
1087 data += 2; 1122 data += 2;
1123 } else if (f0byte== 0x5B) {
1124 data += 2;
1125 int mod, regop, rm;
1126 get_modrm(*data, &mod, &regop, &rm);
1127 AppendToBuffer("cvtdq2ps %s,",
1128 NameOfXMMRegister(rm));
1129 data += PrintRightXMMOperand(data);
1088 } else if ((f0byte & 0xF0) == 0x80) { 1130 } else if ((f0byte & 0xF0) == 0x80) {
1089 data += JumpConditional(data, branch_hint); 1131 data += JumpConditional(data, branch_hint);
1090 } else if (f0byte == 0xBE || f0byte == 0xBF || f0byte == 0xB6 || 1132 } else if (f0byte == 0xBE || f0byte == 0xBF || f0byte == 0xB6 ||
1091 f0byte == 0xB7 || f0byte == 0xAF) { 1133 f0byte == 0xB7 || f0byte == 0xAF) {
1092 data += 2; 1134 data += 2;
1093 data += PrintOperands(f0mnem, REG_OPER_OP_ORDER, data); 1135 data += PrintOperands(f0mnem, REG_OPER_OP_ORDER, data);
1094 } else if ((f0byte & 0xF0) == 0x90) { 1136 } else if ((f0byte & 0xF0) == 0x90) {
1095 data += SetCC(data); 1137 data += SetCC(data);
1096 } else if ((f0byte & 0xF0) == 0x40) { 1138 } else if ((f0byte & 0xF0) == 0x40) {
1097 data += CMov(data); 1139 data += CMov(data);
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1228 if (*data == 0x38) { 1270 if (*data == 0x38) {
1229 data++; 1271 data++;
1230 if (*data == 0x17) { 1272 if (*data == 0x17) {
1231 data++; 1273 data++;
1232 int mod, regop, rm; 1274 int mod, regop, rm;
1233 get_modrm(*data, &mod, &regop, &rm); 1275 get_modrm(*data, &mod, &regop, &rm);
1234 AppendToBuffer("ptest %s,%s", 1276 AppendToBuffer("ptest %s,%s",
1235 NameOfXMMRegister(regop), 1277 NameOfXMMRegister(regop),
1236 NameOfXMMRegister(rm)); 1278 NameOfXMMRegister(rm));
1237 data++; 1279 data++;
1280 } else if (*data == 0x40) {
1281 data++;
1282 int mod, regop, rm;
1283 get_modrm(*data, &mod, &regop, &rm);
1284 AppendToBuffer("pmulld %s,%s",
1285 NameOfXMMRegister(regop));
1286 data += PrintRightXMMOperand(data);
1238 } else if (*data == 0x2A) { 1287 } else if (*data == 0x2A) {
1239 // movntdqa 1288 // movntdqa
1240 data++; 1289 data++;
1241 int mod, regop, rm; 1290 int mod, regop, rm;
1242 get_modrm(*data, &mod, &regop, &rm); 1291 get_modrm(*data, &mod, &regop, &rm);
1243 AppendToBuffer("movntdqa %s,", NameOfXMMRegister(regop)); 1292 AppendToBuffer("movntdqa %s,", NameOfXMMRegister(regop));
1244 data += PrintRightOperand(data); 1293 data += PrintRightOperand(data);
1245 } else { 1294 } else {
1246 UnimplementedInstruction(); 1295 UnimplementedInstruction();
1247 } 1296 }
(...skipping 12 matching lines...) Expand all
1260 } else if (*data == 0x16) { 1309 } else if (*data == 0x16) {
1261 data++; 1310 data++;
1262 int mod, regop, rm; 1311 int mod, regop, rm;
1263 get_modrm(*data, &mod, &regop, &rm); 1312 get_modrm(*data, &mod, &regop, &rm);
1264 int8_t imm8 = static_cast<int8_t>(data[1]); 1313 int8_t imm8 = static_cast<int8_t>(data[1]);
1265 AppendToBuffer("pextrd %s,%s,%d", 1314 AppendToBuffer("pextrd %s,%s,%d",
1266 NameOfCPURegister(regop), 1315 NameOfCPURegister(regop),
1267 NameOfXMMRegister(rm), 1316 NameOfXMMRegister(rm),
1268 static_cast<int>(imm8)); 1317 static_cast<int>(imm8));
1269 data += 2; 1318 data += 2;
1319 } else if (*data == 0x21) {
1320 data++;
1321 int mod, regop, rm;
1322 get_modrm(*data, &mod, &regop, &rm);
1323 int8_t imm8 = static_cast<int8_t>(data[1]);
1324 AppendToBuffer("insertps %s,%s,%d",
1325 NameOfXMMRegister(regop),
1326 NameOfXMMRegister(rm),
1327 static_cast<int>(imm8));
1328 data += 2;
1270 } else if (*data == 0x17) { 1329 } else if (*data == 0x17) {
1271 data++; 1330 data++;
1272 int mod, regop, rm; 1331 int mod, regop, rm;
1273 get_modrm(*data, &mod, &regop, &rm); 1332 get_modrm(*data, &mod, &regop, &rm);
1274 int8_t imm8 = static_cast<int8_t>(data[1]); 1333 int8_t imm8 = static_cast<int8_t>(data[1]);
1275 AppendToBuffer("extractps %s,%s,%d", 1334 AppendToBuffer("extractps %s,%s,%d",
1276 NameOfCPURegister(rm), 1335 NameOfCPURegister(rm),
1277 NameOfXMMRegister(regop), 1336 NameOfXMMRegister(regop),
1278 static_cast<int>(imm8)); 1337 static_cast<int>(imm8));
1279 data += 2; 1338 data += 2;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 NameOfXMMRegister(rm)); 1388 NameOfXMMRegister(rm));
1330 data++; 1389 data++;
1331 } else if (*data == 0x57) { 1390 } else if (*data == 0x57) {
1332 data++; 1391 data++;
1333 int mod, regop, rm; 1392 int mod, regop, rm;
1334 get_modrm(*data, &mod, &regop, &rm); 1393 get_modrm(*data, &mod, &regop, &rm);
1335 AppendToBuffer("xorpd %s,%s", 1394 AppendToBuffer("xorpd %s,%s",
1336 NameOfXMMRegister(regop), 1395 NameOfXMMRegister(regop),
1337 NameOfXMMRegister(rm)); 1396 NameOfXMMRegister(rm));
1338 data++; 1397 data++;
1398 } else if (*data == 0x5B) {
1399 data++;
1400 int mod, regop, rm;
1401 get_modrm(*data, &mod, &regop, &rm);
1402 AppendToBuffer("cvtps2dq %s,%s",
1403 NameOfXMMRegister(regop));
1404 data += PrintRightXMMOperand(data);
1405 } else if (*data == 0x62) {
1406 data++;
1407 int mod, regop, rm;
1408 get_modrm(*data, &mod, &regop, &rm);
1409 AppendToBuffer("punpackldq %s,",
1410 NameOfXMMRegister(regop));
1411 data += PrintRightXMMOperand(data);
1412 } else if (*data == 0xF4) {
1413 data++;
1414 int mod, regop, rm;
1415 get_modrm(*data, &mod, &regop, &rm);
1416 AppendToBuffer("pmuludq %s,",
1417 NameOfXMMRegister(regop));
1418 data += PrintRightXMMOperand(data);
1419 } else if (*data == 0xFA) {
1420 data++;
1421 int mod, regop, rm;
1422 get_modrm(*data, &mod, &regop, &rm);
1423 AppendToBuffer("psubd %s,",
1424 NameOfXMMRegister(regop));
1425 data += PrintRightXMMOperand(data);
1426 } else if (*data == 0xFE) {
1427 data++;
1428 int mod, regop, rm;
1429 get_modrm(*data, &mod, &regop, &rm);
1430 AppendToBuffer("paddd %s,",
1431 NameOfXMMRegister(regop));
1432 data += PrintRightXMMOperand(data);
1339 } else if (*data == 0x6E) { 1433 } else if (*data == 0x6E) {
1340 data++; 1434 data++;
1341 int mod, regop, rm; 1435 int mod, regop, rm;
1342 get_modrm(*data, &mod, &regop, &rm); 1436 get_modrm(*data, &mod, &regop, &rm);
1343 AppendToBuffer("movd %s,", NameOfXMMRegister(regop)); 1437 AppendToBuffer("movd %s,", NameOfXMMRegister(regop));
1344 data += PrintRightOperand(data); 1438 data += PrintRightOperand(data);
1345 } else if (*data == 0x6F) { 1439 } else if (*data == 0x6F) {
1346 data++; 1440 data++;
1347 int mod, regop, rm; 1441 int mod, regop, rm;
1348 get_modrm(*data, &mod, &regop, &rm); 1442 get_modrm(*data, &mod, &regop, &rm);
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 fprintf(f, " "); 1856 fprintf(f, " ");
1763 } 1857 }
1764 fprintf(f, " %s\n", buffer.start()); 1858 fprintf(f, " %s\n", buffer.start());
1765 } 1859 }
1766 } 1860 }
1767 1861
1768 1862
1769 } // namespace disasm 1863 } // namespace disasm
1770 1864
1771 #endif // V8_TARGET_ARCH_IA32 1865 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/deoptimizer-ia32.cc ('k') | src/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698