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

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

Issue 6702001: Fix some register names in the ia32 disassembler. Byte register and XMM regi... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2007-2008 the V8 project authors. All rights reserved. 1 // Copyright 2007-2008 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 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 *scale = (data >> 6) & 3; 324 *scale = (data >> 6) & 3;
325 *index = (data >> 3) & 7; 325 *index = (data >> 3) & 7;
326 *base = data & 7; 326 *base = data & 7;
327 } 327 }
328 328
329 typedef const char* (DisassemblerIA32::*RegisterNameMapping)(int reg) const; 329 typedef const char* (DisassemblerIA32::*RegisterNameMapping)(int reg) const;
330 330
331 int PrintRightOperandHelper(byte* modrmp, RegisterNameMapping register_name); 331 int PrintRightOperandHelper(byte* modrmp, RegisterNameMapping register_name);
332 int PrintRightOperand(byte* modrmp); 332 int PrintRightOperand(byte* modrmp);
333 int PrintRightByteOperand(byte* modrmp); 333 int PrintRightByteOperand(byte* modrmp);
334 int PrintRightXMMOperand(byte* modrmp);
334 int PrintOperands(const char* mnem, OperandOrder op_order, byte* data); 335 int PrintOperands(const char* mnem, OperandOrder op_order, byte* data);
335 int PrintImmediateOp(byte* data); 336 int PrintImmediateOp(byte* data);
336 int F7Instruction(byte* data); 337 int F7Instruction(byte* data);
337 int D1D3C1Instruction(byte* data); 338 int D1D3C1Instruction(byte* data);
338 int JumpShort(byte* data); 339 int JumpShort(byte* data);
339 int JumpConditional(byte* data, const char* comment); 340 int JumpConditional(byte* data, const char* comment);
340 int JumpConditionalShort(byte* data, const char* comment); 341 int JumpConditionalShort(byte* data, const char* comment);
341 int SetCC(byte* data); 342 int SetCC(byte* data);
342 int CMov(byte* data); 343 int CMov(byte* data);
343 int FPUInstruction(byte* data); 344 int FPUInstruction(byte* data);
(...skipping 16 matching lines...) Expand all
360 v8::internal::Vector<char> buf = tmp_buffer_ + tmp_buffer_pos_; 361 v8::internal::Vector<char> buf = tmp_buffer_ + tmp_buffer_pos_;
361 va_list args; 362 va_list args;
362 va_start(args, format); 363 va_start(args, format);
363 int result = v8::internal::OS::VSNPrintF(buf, format, args); 364 int result = v8::internal::OS::VSNPrintF(buf, format, args);
364 va_end(args); 365 va_end(args);
365 tmp_buffer_pos_ += result; 366 tmp_buffer_pos_ += result;
366 } 367 }
367 368
368 int DisassemblerIA32::PrintRightOperandHelper( 369 int DisassemblerIA32::PrintRightOperandHelper(
369 byte* modrmp, 370 byte* modrmp,
370 RegisterNameMapping register_name) { 371 RegisterNameMapping direct_register_name) {
371 int mod, regop, rm; 372 int mod, regop, rm;
372 get_modrm(*modrmp, &mod, &regop, &rm); 373 get_modrm(*modrmp, &mod, &regop, &rm);
374 RegisterNameMapping register_name = (mod == 3) ? direct_register_name :
375 &DisassemblerIA32::NameOfCPURegister;
373 switch (mod) { 376 switch (mod) {
374 case 0: 377 case 0:
375 if (rm == ebp) { 378 if (rm == ebp) {
376 int32_t disp = *reinterpret_cast<int32_t*>(modrmp+1); 379 int32_t disp = *reinterpret_cast<int32_t*>(modrmp+1);
377 AppendToBuffer("[0x%x]", disp); 380 AppendToBuffer("[0x%x]", disp);
378 return 5; 381 return 5;
379 } else if (rm == esp) { 382 } else if (rm == esp) {
380 byte sib = *(modrmp + 1); 383 byte sib = *(modrmp + 1);
381 int scale, index, base; 384 int scale, index, base;
382 get_sib(sib, &scale, &index, &base); 385 get_sib(sib, &scale, &index, &base);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 return PrintRightOperandHelper(modrmp, &DisassemblerIA32::NameOfCPURegister); 450 return PrintRightOperandHelper(modrmp, &DisassemblerIA32::NameOfCPURegister);
448 } 451 }
449 452
450 453
451 int DisassemblerIA32::PrintRightByteOperand(byte* modrmp) { 454 int DisassemblerIA32::PrintRightByteOperand(byte* modrmp) {
452 return PrintRightOperandHelper(modrmp, 455 return PrintRightOperandHelper(modrmp,
453 &DisassemblerIA32::NameOfByteCPURegister); 456 &DisassemblerIA32::NameOfByteCPURegister);
454 } 457 }
455 458
456 459
460 int DisassemblerIA32::PrintRightXMMOperand(byte* modrmp) {
461 return PrintRightOperandHelper(modrmp,
462 &DisassemblerIA32::NameOfXMMRegister);
463 }
464
465
457 // Returns number of bytes used including the current *data. 466 // Returns number of bytes used including the current *data.
458 // Writes instruction's mnemonic, left and right operands to 'tmp_buffer_'. 467 // Writes instruction's mnemonic, left and right operands to 'tmp_buffer_'.
459 int DisassemblerIA32::PrintOperands(const char* mnem, 468 int DisassemblerIA32::PrintOperands(const char* mnem,
460 OperandOrder op_order, 469 OperandOrder op_order,
461 byte* data) { 470 byte* data) {
462 byte modrm = *data; 471 byte modrm = *data;
463 int mod, regop, rm; 472 int mod, regop, rm;
464 get_modrm(modrm, &mod, &regop, &rm); 473 get_modrm(modrm, &mod, &regop, &rm);
465 int advance = 0; 474 int advance = 0;
466 switch (op_order) { 475 switch (op_order) {
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 data += 2 + (*data == 0x6B ? 1 : 4); 939 data += 2 + (*data == 0x6B ? 1 : 4);
931 } 940 }
932 break; 941 break;
933 942
934 case 0xF6: 943 case 0xF6:
935 { data++; 944 { data++;
936 int mod, regop, rm; 945 int mod, regop, rm;
937 get_modrm(*data, &mod, &regop, &rm); 946 get_modrm(*data, &mod, &regop, &rm);
938 if (regop == eax) { 947 if (regop == eax) {
939 AppendToBuffer("test_b "); 948 AppendToBuffer("test_b ");
940 data += PrintRightOperand(data); 949 data += PrintRightByteOperand(data);
941 int32_t imm = *data; 950 int32_t imm = *data;
942 AppendToBuffer(",0x%x", imm); 951 AppendToBuffer(",0x%x", imm);
943 data++; 952 data++;
944 } else { 953 } else {
945 UnimplementedInstruction(); 954 UnimplementedInstruction();
946 } 955 }
947 } 956 }
948 break; 957 break;
949 958
950 case 0x81: // fall through 959 case 0x81: // fall through
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 } 1037 }
1029 AppendToBuffer("%s ", mnem); 1038 AppendToBuffer("%s ", mnem);
1030 data += PrintRightOperand(data); 1039 data += PrintRightOperand(data);
1031 } 1040 }
1032 break; 1041 break;
1033 1042
1034 case 0xC7: // imm32, fall through 1043 case 0xC7: // imm32, fall through
1035 case 0xC6: // imm8 1044 case 0xC6: // imm8
1036 { bool is_byte = *data == 0xC6; 1045 { bool is_byte = *data == 0xC6;
1037 data++; 1046 data++;
1038 AppendToBuffer("%s ", is_byte ? "mov_b" : "mov"); 1047 if (is_byte) {
1039 data += PrintRightOperand(data); 1048 AppendToBuffer("%s ", "mov_b");
1040 int32_t imm = is_byte ? *data : *reinterpret_cast<int32_t*>(data); 1049 data += PrintRightByteOperand(data);
1041 AppendToBuffer(",0x%x", imm); 1050 int32_t imm = *data;
1042 data += is_byte ? 1 : 4; 1051 AppendToBuffer(",0x%x", imm);
1052 data++;
1053 } else {
1054 AppendToBuffer("%s ", "mov");
1055 data += PrintRightOperand(data);
1056 int32_t imm = *reinterpret_cast<int32_t*>(data);
1057 AppendToBuffer(",0x%x", imm);
1058 data += 4;
1059 }
1043 } 1060 }
1044 break; 1061 break;
1045 1062
1046 case 0x80: 1063 case 0x80:
1047 { data++; 1064 { data++;
1048 int mod, regop, rm; 1065 int mod, regop, rm;
1049 get_modrm(*data, &mod, &regop, &rm); 1066 get_modrm(*data, &mod, &regop, &rm);
1050 const char* mnem = NULL; 1067 const char* mnem = NULL;
1051 switch (regop) { 1068 switch (regop) {
1052 case 5: mnem = "subb"; break; 1069 case 5: mnem = "subb"; break;
1053 case 7: mnem = "cmpb"; break; 1070 case 7: mnem = "cmpb"; break;
1054 default: UnimplementedInstruction(); 1071 default: UnimplementedInstruction();
1055 } 1072 }
1056 AppendToBuffer("%s ", mnem); 1073 AppendToBuffer("%s ", mnem);
1057 data += PrintRightOperand(data); 1074 data += PrintRightByteOperand(data);
1058 int32_t imm = *data; 1075 int32_t imm = *data;
1059 AppendToBuffer(",0x%x", imm); 1076 AppendToBuffer(",0x%x", imm);
1060 data++; 1077 data++;
1061 } 1078 }
1062 break; 1079 break;
1063 1080
1064 case 0x88: // 8bit, fall through 1081 case 0x88: // 8bit, fall through
1065 case 0x89: // 32bit 1082 case 0x89: // 32bit
1066 { bool is_byte = *data == 0x88; 1083 { bool is_byte = *data == 0x88;
1067 int mod, regop, rm; 1084 int mod, regop, rm;
1068 data++; 1085 data++;
1069 get_modrm(*data, &mod, &regop, &rm); 1086 get_modrm(*data, &mod, &regop, &rm);
1070 AppendToBuffer("%s ", is_byte ? "mov_b" : "mov"); 1087 if (is_byte) {
1071 data += PrintRightOperand(data); 1088 AppendToBuffer("%s ", "mov_b");
1072 AppendToBuffer(",%s", NameOfCPURegister(regop)); 1089 data += PrintRightByteOperand(data);
1090 AppendToBuffer(",%s", NameOfByteCPURegister(regop));
1091 } else {
1092 AppendToBuffer("%s ", "mov");
1093 data += PrintRightOperand(data);
1094 AppendToBuffer(",%s", NameOfCPURegister(regop));
1095 }
1073 } 1096 }
1074 break; 1097 break;
1075 1098
1076 case 0x66: // prefix 1099 case 0x66: // prefix
1077 data++; 1100 data++;
1078 if (*data == 0x8B) { 1101 if (*data == 0x8B) {
1079 data++; 1102 data++;
1080 data += PrintOperands("mov_w", REG_OPER_OP_ORDER, data); 1103 data += PrintOperands("mov_w", REG_OPER_OP_ORDER, data);
1081 } else if (*data == 0x89) { 1104 } else if (*data == 0x89) {
1082 data++; 1105 data++;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 data++; 1197 data++;
1175 int mod, regop, rm; 1198 int mod, regop, rm;
1176 get_modrm(*data, &mod, &regop, &rm); 1199 get_modrm(*data, &mod, &regop, &rm);
1177 AppendToBuffer("movd %s,", NameOfXMMRegister(regop)); 1200 AppendToBuffer("movd %s,", NameOfXMMRegister(regop));
1178 data += PrintRightOperand(data); 1201 data += PrintRightOperand(data);
1179 } else if (*data == 0x6F) { 1202 } else if (*data == 0x6F) {
1180 data++; 1203 data++;
1181 int mod, regop, rm; 1204 int mod, regop, rm;
1182 get_modrm(*data, &mod, &regop, &rm); 1205 get_modrm(*data, &mod, &regop, &rm);
1183 AppendToBuffer("movdqa %s,", NameOfXMMRegister(regop)); 1206 AppendToBuffer("movdqa %s,", NameOfXMMRegister(regop));
1184 data += PrintRightOperand(data); 1207 data += PrintRightXMMOperand(data);
1185 } else if (*data == 0x70) { 1208 } else if (*data == 0x70) {
1186 data++; 1209 data++;
1187 int mod, regop, rm; 1210 int mod, regop, rm;
1188 get_modrm(*data, &mod, &regop, &rm); 1211 get_modrm(*data, &mod, &regop, &rm);
1189 int8_t imm8 = static_cast<int8_t>(data[1]); 1212 int8_t imm8 = static_cast<int8_t>(data[1]);
1190 AppendToBuffer("pshufd %s,%s,%d", 1213 AppendToBuffer("pshufd %s,%s,%d",
1191 NameOfXMMRegister(regop), 1214 NameOfXMMRegister(regop),
1192 NameOfXMMRegister(rm), 1215 NameOfXMMRegister(rm),
1193 static_cast<int>(imm8)); 1216 static_cast<int>(imm8));
1194 data += 2; 1217 data += 2;
(...skipping 22 matching lines...) Expand all
1217 get_modrm(*data, &mod, &regop, &rm); 1240 get_modrm(*data, &mod, &regop, &rm);
1218 AppendToBuffer("psrlq %s,%s", 1241 AppendToBuffer("psrlq %s,%s",
1219 NameOfXMMRegister(regop), 1242 NameOfXMMRegister(regop),
1220 NameOfXMMRegister(rm)); 1243 NameOfXMMRegister(rm));
1221 data++; 1244 data++;
1222 } else if (*data == 0x7F) { 1245 } else if (*data == 0x7F) {
1223 AppendToBuffer("movdqa "); 1246 AppendToBuffer("movdqa ");
1224 data++; 1247 data++;
1225 int mod, regop, rm; 1248 int mod, regop, rm;
1226 get_modrm(*data, &mod, &regop, &rm); 1249 get_modrm(*data, &mod, &regop, &rm);
1227 data += PrintRightOperand(data); 1250 data += PrintRightXMMOperand(data);
1228 AppendToBuffer(",%s", NameOfXMMRegister(regop)); 1251 AppendToBuffer(",%s", NameOfXMMRegister(regop));
1229 } else if (*data == 0x7E) { 1252 } else if (*data == 0x7E) {
1230 data++; 1253 data++;
1231 int mod, regop, rm; 1254 int mod, regop, rm;
1232 get_modrm(*data, &mod, &regop, &rm); 1255 get_modrm(*data, &mod, &regop, &rm);
1233 AppendToBuffer("movd "); 1256 AppendToBuffer("movd ");
1234 data += PrintRightOperand(data); 1257 data += PrintRightOperand(data);
1235 AppendToBuffer(",%s", NameOfXMMRegister(regop)); 1258 AppendToBuffer(",%s", NameOfXMMRegister(regop));
1236 } else if (*data == 0xDB) { 1259 } else if (*data == 0xDB) {
1237 data++; 1260 data++;
1238 int mod, regop, rm; 1261 int mod, regop, rm;
1239 get_modrm(*data, &mod, &regop, &rm); 1262 get_modrm(*data, &mod, &regop, &rm);
1240 AppendToBuffer("pand %s,%s", 1263 AppendToBuffer("pand %s,%s",
1241 NameOfXMMRegister(regop), 1264 NameOfXMMRegister(regop),
1242 NameOfXMMRegister(rm)); 1265 NameOfXMMRegister(rm));
1243 data++; 1266 data++;
1244 } else if (*data == 0xE7) { 1267 } else if (*data == 0xE7) {
1245 AppendToBuffer("movntdq ");
1246 data++; 1268 data++;
1247 int mod, regop, rm; 1269 int mod, regop, rm;
1248 get_modrm(*data, &mod, &regop, &rm); 1270 get_modrm(*data, &mod, &regop, &rm);
1249 data += PrintRightOperand(data); 1271 if (mod == 3) {
1250 AppendToBuffer(",%s", NameOfXMMRegister(regop)); 1272 AppendToBuffer("movntdq ");
1273 data += PrintRightOperand(data);
1274 AppendToBuffer(",%s", NameOfXMMRegister(regop));
1275 } else {
1276 UnimplementedInstruction();
1277 }
1251 } else if (*data == 0xEF) { 1278 } else if (*data == 0xEF) {
1252 data++; 1279 data++;
1253 int mod, regop, rm; 1280 int mod, regop, rm;
1254 get_modrm(*data, &mod, &regop, &rm); 1281 get_modrm(*data, &mod, &regop, &rm);
1255 AppendToBuffer("pxor %s,%s", 1282 AppendToBuffer("pxor %s,%s",
1256 NameOfXMMRegister(regop), 1283 NameOfXMMRegister(regop),
1257 NameOfXMMRegister(rm)); 1284 NameOfXMMRegister(rm));
1258 data++; 1285 data++;
1259 } else if (*data == 0xEB) { 1286 } else if (*data == 0xEB) {
1260 data++; 1287 data++;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 break; 1358 break;
1332 1359
1333 case 0xF2: 1360 case 0xF2:
1334 if (*(data+1) == 0x0F) { 1361 if (*(data+1) == 0x0F) {
1335 byte b2 = *(data+2); 1362 byte b2 = *(data+2);
1336 if (b2 == 0x11) { 1363 if (b2 == 0x11) {
1337 AppendToBuffer("movsd "); 1364 AppendToBuffer("movsd ");
1338 data += 3; 1365 data += 3;
1339 int mod, regop, rm; 1366 int mod, regop, rm;
1340 get_modrm(*data, &mod, &regop, &rm); 1367 get_modrm(*data, &mod, &regop, &rm);
1341 data += PrintRightOperand(data); 1368 data += PrintRightXMMOperand(data);
1342 AppendToBuffer(",%s", NameOfXMMRegister(regop)); 1369 AppendToBuffer(",%s", NameOfXMMRegister(regop));
1343 } else if (b2 == 0x10) { 1370 } else if (b2 == 0x10) {
1344 data += 3; 1371 data += 3;
1345 int mod, regop, rm; 1372 int mod, regop, rm;
1346 get_modrm(*data, &mod, &regop, &rm); 1373 get_modrm(*data, &mod, &regop, &rm);
1347 AppendToBuffer("movsd %s,", NameOfXMMRegister(regop)); 1374 AppendToBuffer("movsd %s,", NameOfXMMRegister(regop));
1348 data += PrintRightOperand(data); 1375 data += PrintRightXMMOperand(data);
1349 } else { 1376 } else {
1350 const char* mnem = "?"; 1377 const char* mnem = "?";
1351 switch (b2) { 1378 switch (b2) {
1352 case 0x2A: mnem = "cvtsi2sd"; break; 1379 case 0x2A: mnem = "cvtsi2sd"; break;
1353 case 0x2C: mnem = "cvttsd2si"; break; 1380 case 0x2C: mnem = "cvttsd2si"; break;
1354 case 0x51: mnem = "sqrtsd"; break; 1381 case 0x51: mnem = "sqrtsd"; break;
1355 case 0x58: mnem = "addsd"; break; 1382 case 0x58: mnem = "addsd"; break;
1356 case 0x59: mnem = "mulsd"; break; 1383 case 0x59: mnem = "mulsd"; break;
1357 case 0x5C: mnem = "subsd"; break; 1384 case 0x5C: mnem = "subsd"; break;
1358 case 0x5E: mnem = "divsd"; break; 1385 case 0x5E: mnem = "divsd"; break;
1359 } 1386 }
1360 data += 3; 1387 data += 3;
1361 int mod, regop, rm; 1388 int mod, regop, rm;
1362 get_modrm(*data, &mod, &regop, &rm); 1389 get_modrm(*data, &mod, &regop, &rm);
1363 if (b2 == 0x2A) { 1390 if (b2 == 0x2A) {
1364 if (mod != 0x3) { 1391 AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop));
1365 AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop)); 1392 data += PrintRightOperand(data);
1366 data += PrintRightOperand(data);
1367 } else {
1368 AppendToBuffer("%s %s,%s",
1369 mnem,
1370 NameOfXMMRegister(regop),
1371 NameOfCPURegister(rm));
1372 data++;
1373 }
1374 } else if (b2 == 0x2C) { 1393 } else if (b2 == 0x2C) {
1375 if (mod != 0x3) { 1394 AppendToBuffer("%s %s,", mnem, NameOfCPURegister(regop));
1376 AppendToBuffer("%s %s,", mnem, NameOfCPURegister(regop)); 1395 data += PrintRightXMMOperand(data);
1377 data += PrintRightOperand(data);
1378 } else {
1379 AppendToBuffer("%s %s,%s",
1380 mnem,
1381 NameOfCPURegister(regop),
1382 NameOfXMMRegister(rm));
1383 data++;
1384 }
1385 } else if (b2 == 0xC2) { 1396 } else if (b2 == 0xC2) {
1386 // Intel manual 2A, Table 3-18. 1397 // Intel manual 2A, Table 3-18.
1387 const char* const pseudo_op[] = { 1398 const char* const pseudo_op[] = {
1388 "cmpeqsd", 1399 "cmpeqsd",
1389 "cmpltsd", 1400 "cmpltsd",
1390 "cmplesd", 1401 "cmplesd",
1391 "cmpunordsd", 1402 "cmpunordsd",
1392 "cmpneqsd", 1403 "cmpneqsd",
1393 "cmpnltsd", 1404 "cmpnltsd",
1394 "cmpnlesd", 1405 "cmpnlesd",
1395 "cmpordsd" 1406 "cmpordsd"
1396 }; 1407 };
1397 AppendToBuffer("%s %s,%s", 1408 AppendToBuffer("%s %s,%s",
1398 pseudo_op[data[1]], 1409 pseudo_op[data[1]],
1399 NameOfXMMRegister(regop), 1410 NameOfXMMRegister(regop),
1400 NameOfXMMRegister(rm)); 1411 NameOfXMMRegister(rm));
1401 data += 2; 1412 data += 2;
1402 } else { 1413 } else {
1403 if (mod != 0x3) { 1414 AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop));
1404 AppendToBuffer("%s %s,", mnem, NameOfXMMRegister(regop)); 1415 data += PrintRightXMMOperand(data);
1405 data += PrintRightOperand(data);
1406 } else {
1407 AppendToBuffer("%s %s,%s",
1408 mnem,
1409 NameOfXMMRegister(regop),
1410 NameOfXMMRegister(rm));
1411 data++;
1412 }
1413 } 1416 }
1414 } 1417 }
1415 } else { 1418 } else {
1416 UnimplementedInstruction(); 1419 UnimplementedInstruction();
1417 } 1420 }
1418 break; 1421 break;
1419 1422
1420 case 0xF3: 1423 case 0xF3:
1421 if (*(data+1) == 0x0F) { 1424 if (*(data+1) == 0x0F) {
1422 if (*(data+2) == 0x2C) { 1425 if (*(data+2) == 0x2C) {
1423 data += 3; 1426 data += 3;
1424 data += PrintOperands("cvttss2si", REG_OPER_OP_ORDER, data); 1427 int mod, regop, rm;
1428 get_modrm(*data, &mod, &regop, &rm);
1429 AppendToBuffer("cvttss2si %s,", NameOfCPURegister(regop));
1430 data += PrintRightXMMOperand(data);
1425 } else if (*(data+2) == 0x5A) { 1431 } else if (*(data+2) == 0x5A) {
1426 data += 3; 1432 data += 3;
1427 int mod, regop, rm; 1433 int mod, regop, rm;
1428 get_modrm(*data, &mod, &regop, &rm); 1434 get_modrm(*data, &mod, &regop, &rm);
1429 AppendToBuffer("cvtss2sd %s,%s", 1435 AppendToBuffer("cvtss2sd %s,", NameOfXMMRegister(regop));
1430 NameOfXMMRegister(regop), 1436 data += PrintRightXMMOperand(data);
1431 NameOfXMMRegister(rm));
1432 data++;
1433 } else if (*(data+2) == 0x6F) { 1437 } else if (*(data+2) == 0x6F) {
1434 data += 3; 1438 data += 3;
1435 int mod, regop, rm; 1439 int mod, regop, rm;
1436 get_modrm(*data, &mod, &regop, &rm); 1440 get_modrm(*data, &mod, &regop, &rm);
1437 AppendToBuffer("movdqu %s,", NameOfXMMRegister(regop)); 1441 AppendToBuffer("movdqu %s,", NameOfXMMRegister(regop));
1438 data += PrintRightOperand(data); 1442 data += PrintRightXMMOperand(data);
1439 } else if (*(data+2) == 0x7F) { 1443 } else if (*(data+2) == 0x7F) {
1440 AppendToBuffer("movdqu "); 1444 AppendToBuffer("movdqu ");
1441 data += 3; 1445 data += 3;
1442 int mod, regop, rm; 1446 int mod, regop, rm;
1443 get_modrm(*data, &mod, &regop, &rm); 1447 get_modrm(*data, &mod, &regop, &rm);
1444 data += PrintRightOperand(data); 1448 data += PrintRightXMMOperand(data);
1445 AppendToBuffer(",%s", NameOfXMMRegister(regop)); 1449 AppendToBuffer(",%s", NameOfXMMRegister(regop));
1446 } else { 1450 } else {
1447 UnimplementedInstruction(); 1451 UnimplementedInstruction();
1448 } 1452 }
1449 } else if (*(data+1) == 0xA5) { 1453 } else if (*(data+1) == 0xA5) {
1450 data += 2; 1454 data += 2;
1451 AppendToBuffer("rep_movs"); 1455 AppendToBuffer("rep_movs");
1452 } else if (*(data+1) == 0xAB) { 1456 } else if (*(data+1) == 0xAB) {
1453 data += 2; 1457 data += 2;
1454 AppendToBuffer("rep_stos"); 1458 AppendToBuffer("rep_stos");
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 fprintf(f, " "); 1592 fprintf(f, " ");
1589 } 1593 }
1590 fprintf(f, " %s\n", buffer.start()); 1594 fprintf(f, " %s\n", buffer.start());
1591 } 1595 }
1592 } 1596 }
1593 1597
1594 1598
1595 } // namespace disasm 1599 } // namespace disasm
1596 1600
1597 #endif // V8_TARGET_ARCH_IA32 1601 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698