OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <assert.h> | 5 #include <assert.h> |
6 #include <stdarg.h> | 6 #include <stdarg.h> |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #if V8_TARGET_ARCH_X87 | 9 #if V8_TARGET_ARCH_X87 |
10 | 10 |
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 case 0xA4: | 913 case 0xA4: |
914 return "shld"; | 914 return "shld"; |
915 case 0xA5: | 915 case 0xA5: |
916 return "shld"; | 916 return "shld"; |
917 case 0xAD: | 917 case 0xAD: |
918 return "shrd"; | 918 return "shrd"; |
919 case 0xAC: | 919 case 0xAC: |
920 return "shrd"; // 3-operand version. | 920 return "shrd"; // 3-operand version. |
921 case 0xAB: | 921 case 0xAB: |
922 return "bts"; | 922 return "bts"; |
| 923 case 0xB0: |
| 924 return "cmpxchg_b"; |
| 925 case 0xB1: |
| 926 return "cmpxchg"; |
923 case 0xBC: | 927 case 0xBC: |
924 return "bsf"; | 928 return "bsf"; |
925 case 0xBD: | 929 case 0xBD: |
926 return "bsr"; | 930 return "bsr"; |
927 default: return NULL; | 931 default: return NULL; |
928 } | 932 } |
929 } | 933 } |
930 | 934 |
931 | 935 |
932 // Disassembled instruction '*instr' and writes it into 'out_buffer'. | 936 // Disassembled instruction '*instr' and writes it into 'out_buffer'. |
933 int DisassemblerX87::InstructionDecode(v8::internal::Vector<char> out_buffer, | 937 int DisassemblerX87::InstructionDecode(v8::internal::Vector<char> out_buffer, |
934 byte* instr) { | 938 byte* instr) { |
935 tmp_buffer_pos_ = 0; // starting to write as position 0 | 939 tmp_buffer_pos_ = 0; // starting to write as position 0 |
936 byte* data = instr; | 940 byte* data = instr; |
937 // Check for hints. | 941 // Check for hints. |
938 const char* branch_hint = NULL; | 942 const char* branch_hint = NULL; |
939 // We use these two prefixes only with branch prediction | 943 // We use these two prefixes only with branch prediction |
940 if (*data == 0x3E /*ds*/) { | 944 if (*data == 0x3E /*ds*/) { |
941 branch_hint = "predicted taken"; | 945 branch_hint = "predicted taken"; |
942 data++; | 946 data++; |
943 } else if (*data == 0x2E /*cs*/) { | 947 } else if (*data == 0x2E /*cs*/) { |
944 branch_hint = "predicted not taken"; | 948 branch_hint = "predicted not taken"; |
945 data++; | 949 data++; |
| 950 } else if (*data == 0xF0 /*lock*/) { |
| 951 AppendToBuffer("lock "); |
| 952 data++; |
946 } | 953 } |
| 954 |
947 bool processed = true; // Will be set to false if the current instruction | 955 bool processed = true; // Will be set to false if the current instruction |
948 // is not in 'instructions' table. | 956 // is not in 'instructions' table. |
949 const InstructionDesc& idesc = instruction_table_->Get(*data); | 957 const InstructionDesc& idesc = instruction_table_->Get(*data); |
950 switch (idesc.type) { | 958 switch (idesc.type) { |
951 case ZERO_OPERANDS_INSTR: | 959 case ZERO_OPERANDS_INSTR: |
952 AppendToBuffer("%s", idesc.mnem); | 960 AppendToBuffer("%s", idesc.mnem); |
953 data++; | 961 data++; |
954 break; | 962 break; |
955 | 963 |
956 case TWO_OPERANDS_INSTR: | 964 case TWO_OPERANDS_INSTR: |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1155 data += 2; | 1163 data += 2; |
1156 AppendToBuffer("%s ", f0mnem); | 1164 AppendToBuffer("%s ", f0mnem); |
1157 int mod, regop, rm; | 1165 int mod, regop, rm; |
1158 get_modrm(*data, &mod, ®op, &rm); | 1166 get_modrm(*data, &mod, ®op, &rm); |
1159 data += PrintRightOperand(data); | 1167 data += PrintRightOperand(data); |
1160 if (f0byte == 0xAB) { | 1168 if (f0byte == 0xAB) { |
1161 AppendToBuffer(",%s", NameOfCPURegister(regop)); | 1169 AppendToBuffer(",%s", NameOfCPURegister(regop)); |
1162 } else { | 1170 } else { |
1163 AppendToBuffer(",%s,cl", NameOfCPURegister(regop)); | 1171 AppendToBuffer(",%s,cl", NameOfCPURegister(regop)); |
1164 } | 1172 } |
| 1173 } else if (f0byte == 0xB0) { |
| 1174 // cmpxchg_b |
| 1175 data += 2; |
| 1176 AppendToBuffer("%s ", f0mnem); |
| 1177 int mod, regop, rm; |
| 1178 get_modrm(*data, &mod, ®op, &rm); |
| 1179 data += PrintRightOperand(data); |
| 1180 AppendToBuffer(",%s", NameOfByteCPURegister(regop)); |
| 1181 } else if (f0byte == 0xB1) { |
| 1182 // cmpxchg |
| 1183 data += 2; |
| 1184 data += PrintOperands(f0mnem, OPER_REG_OP_ORDER, data); |
| 1185 } else if (f0byte == 0xBC) { |
| 1186 data += 2; |
| 1187 int mod, regop, rm; |
| 1188 get_modrm(*data, &mod, ®op, &rm); |
| 1189 AppendToBuffer("%s %s,", f0mnem, NameOfCPURegister(regop)); |
| 1190 data += PrintRightOperand(data); |
1165 } else if (f0byte == 0xBD) { | 1191 } else if (f0byte == 0xBD) { |
1166 data += 2; | 1192 data += 2; |
1167 int mod, regop, rm; | 1193 int mod, regop, rm; |
1168 get_modrm(*data, &mod, ®op, &rm); | 1194 get_modrm(*data, &mod, ®op, &rm); |
1169 AppendToBuffer("%s %s,", f0mnem, NameOfCPURegister(regop)); | 1195 AppendToBuffer("%s %s,", f0mnem, NameOfCPURegister(regop)); |
1170 data += PrintRightOperand(data); | 1196 data += PrintRightOperand(data); |
1171 } else { | 1197 } else { |
1172 UnimplementedInstruction(); | 1198 UnimplementedInstruction(); |
1173 } | 1199 } |
1174 } | 1200 } |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 AppendToBuffer("nop"); // 0x66 prefix | 1291 AppendToBuffer("nop"); // 0x66 prefix |
1266 } else if (*data == 0x90) { | 1292 } else if (*data == 0x90) { |
1267 AppendToBuffer("nop"); // 0x66 prefix | 1293 AppendToBuffer("nop"); // 0x66 prefix |
1268 } else if (*data == 0x8B) { | 1294 } else if (*data == 0x8B) { |
1269 data++; | 1295 data++; |
1270 data += PrintOperands("mov_w", REG_OPER_OP_ORDER, data); | 1296 data += PrintOperands("mov_w", REG_OPER_OP_ORDER, data); |
1271 } else if (*data == 0x87) { | 1297 } else if (*data == 0x87) { |
1272 data++; | 1298 data++; |
1273 int mod, regop, rm; | 1299 int mod, regop, rm; |
1274 get_modrm(*data, &mod, ®op, &rm); | 1300 get_modrm(*data, &mod, ®op, &rm); |
1275 AppendToBuffer("xchg_w "); | 1301 AppendToBuffer("xchg_w %s,", NameOfCPURegister(regop)); |
1276 data += PrintRightOperand(data); | 1302 data += PrintRightOperand(data); |
1277 AppendToBuffer(",%s", NameOfCPURegister(regop)); | |
1278 } else if (*data == 0x89) { | 1303 } else if (*data == 0x89) { |
1279 data++; | 1304 data++; |
1280 int mod, regop, rm; | 1305 int mod, regop, rm; |
1281 get_modrm(*data, &mod, ®op, &rm); | 1306 get_modrm(*data, &mod, ®op, &rm); |
1282 AppendToBuffer("mov_w "); | 1307 AppendToBuffer("mov_w "); |
1283 data += PrintRightOperand(data); | 1308 data += PrintRightOperand(data); |
1284 AppendToBuffer(",%s", NameOfCPURegister(regop)); | 1309 AppendToBuffer(",%s", NameOfCPURegister(regop)); |
1285 } else if (*data == 0xC7) { | 1310 } else if (*data == 0xC7) { |
1286 data++; | 1311 data++; |
1287 AppendToBuffer("%s ", "mov_w"); | 1312 AppendToBuffer("%s ", "mov_w"); |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1506 NameOfXMMRegister(rm)); | 1531 NameOfXMMRegister(rm)); |
1507 data++; | 1532 data++; |
1508 } else if (*data == 0xEB) { | 1533 } else if (*data == 0xEB) { |
1509 data++; | 1534 data++; |
1510 int mod, regop, rm; | 1535 int mod, regop, rm; |
1511 get_modrm(*data, &mod, ®op, &rm); | 1536 get_modrm(*data, &mod, ®op, &rm); |
1512 AppendToBuffer("por %s,%s", | 1537 AppendToBuffer("por %s,%s", |
1513 NameOfXMMRegister(regop), | 1538 NameOfXMMRegister(regop), |
1514 NameOfXMMRegister(rm)); | 1539 NameOfXMMRegister(rm)); |
1515 data++; | 1540 data++; |
| 1541 } else if (*data == 0xB1) { |
| 1542 data++; |
| 1543 data += PrintOperands("cmpxchg_w", OPER_REG_OP_ORDER, data); |
1516 } else { | 1544 } else { |
1517 UnimplementedInstruction(); | 1545 UnimplementedInstruction(); |
1518 } | 1546 } |
1519 } else { | 1547 } else { |
1520 UnimplementedInstruction(); | 1548 UnimplementedInstruction(); |
1521 } | 1549 } |
1522 break; | 1550 break; |
1523 | 1551 |
1524 case 0xFE: | 1552 case 0xFE: |
1525 { data++; | 1553 { data++; |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1825 fprintf(f, " "); | 1853 fprintf(f, " "); |
1826 } | 1854 } |
1827 fprintf(f, " %s\n", buffer.start()); | 1855 fprintf(f, " %s\n", buffer.start()); |
1828 } | 1856 } |
1829 } | 1857 } |
1830 | 1858 |
1831 | 1859 |
1832 } // namespace disasm | 1860 } // namespace disasm |
1833 | 1861 |
1834 #endif // V8_TARGET_ARCH_X87 | 1862 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |