| 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_X64 |     9 #if V8_TARGET_ARCH_X64 | 
|    10  |    10  | 
| (...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   987       case 0x2a: |   987       case 0x2a: | 
|   988         AppendToBuffer("%s %s,%s,", vex_w() ? "vcvtqsi2ss" : "vcvtlsi2ss", |   988         AppendToBuffer("%s %s,%s,", vex_w() ? "vcvtqsi2ss" : "vcvtlsi2ss", | 
|   989                        NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |   989                        NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); | 
|   990         current += PrintRightOperand(current); |   990         current += PrintRightOperand(current); | 
|   991         break; |   991         break; | 
|   992       case 0x2c: |   992       case 0x2c: | 
|   993         AppendToBuffer("vcvttss2si%s %s,", vex_w() ? "q" : "", |   993         AppendToBuffer("vcvttss2si%s %s,", vex_w() ? "q" : "", | 
|   994                        NameOfCPURegister(regop)); |   994                        NameOfCPURegister(regop)); | 
|   995         current += PrintRightXMMOperand(current); |   995         current += PrintRightXMMOperand(current); | 
|   996         break; |   996         break; | 
 |   997       case 0x2d: | 
 |   998         AppendToBuffer("vcvtss2si%s %s,", vex_w() ? "q" : "", | 
 |   999                        NameOfCPURegister(regop)); | 
 |  1000         current += PrintRightXMMOperand(current); | 
 |  1001         break; | 
|   997       case 0x58: |  1002       case 0x58: | 
|   998         AppendToBuffer("vaddss %s,%s,", NameOfXMMRegister(regop), |  1003         AppendToBuffer("vaddss %s,%s,", NameOfXMMRegister(regop), | 
|   999                        NameOfXMMRegister(vvvv)); |  1004                        NameOfXMMRegister(vvvv)); | 
|  1000         current += PrintRightXMMOperand(current); |  1005         current += PrintRightXMMOperand(current); | 
|  1001         break; |  1006         break; | 
|  1002       case 0x59: |  1007       case 0x59: | 
|  1003         AppendToBuffer("vmulss %s,%s,", NameOfXMMRegister(regop), |  1008         AppendToBuffer("vmulss %s,%s,", NameOfXMMRegister(regop), | 
|  1004                        NameOfXMMRegister(vvvv)); |  1009                        NameOfXMMRegister(vvvv)); | 
|  1005         current += PrintRightXMMOperand(current); |  1010         current += PrintRightXMMOperand(current); | 
|  1006         break; |  1011         break; | 
| (...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1704       AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop)); |  1709       AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop)); | 
|  1705       current += PrintRightOperand(current); |  1710       current += PrintRightOperand(current); | 
|  1706     } else if (opcode == 0x2C) { |  1711     } else if (opcode == 0x2C) { | 
|  1707       // CVTTSS2SI: |  1712       // CVTTSS2SI: | 
|  1708       // Convert with truncation scalar single-precision FP to dword integer. |  1713       // Convert with truncation scalar single-precision FP to dword integer. | 
|  1709       int mod, regop, rm; |  1714       int mod, regop, rm; | 
|  1710       get_modrm(*current, &mod, ®op, &rm); |  1715       get_modrm(*current, &mod, ®op, &rm); | 
|  1711       AppendToBuffer("cvttss2si%c %s,", |  1716       AppendToBuffer("cvttss2si%c %s,", | 
|  1712           operand_size_code(), NameOfCPURegister(regop)); |  1717           operand_size_code(), NameOfCPURegister(regop)); | 
|  1713       current += PrintRightXMMOperand(current); |  1718       current += PrintRightXMMOperand(current); | 
 |  1719     } else if (opcode == 0x2D) { | 
 |  1720       // CVTSS2SI: | 
 |  1721       // Convert with rounded scalar single-precision FP to dword integer. | 
 |  1722       int mod, regop, rm; | 
 |  1723       get_modrm(*current, &mod, ®op, &rm); | 
 |  1724       AppendToBuffer("cvtss2si%c %s,", operand_size_code(), | 
 |  1725                      NameOfCPURegister(regop)); | 
 |  1726       current += PrintRightXMMOperand(current); | 
|  1714     } else if (opcode == 0x7E) { |  1727     } else if (opcode == 0x7E) { | 
|  1715       int mod, regop, rm; |  1728       int mod, regop, rm; | 
|  1716       get_modrm(*current, &mod, ®op, &rm); |  1729       get_modrm(*current, &mod, ®op, &rm); | 
|  1717       AppendToBuffer("movq %s,", NameOfXMMRegister(regop)); |  1730       AppendToBuffer("movq %s,", NameOfXMMRegister(regop)); | 
|  1718       current += PrintRightXMMOperand(current); |  1731       current += PrintRightXMMOperand(current); | 
|  1719     } else if ((opcode & 0xF8) == 0x58 || opcode == 0x51) { |  1732     } else if ((opcode & 0xF8) == 0x58 || opcode == 0x51) { | 
|  1720       // XMM arithmetic. Mnemonic was retrieved at the start of this function. |  1733       // XMM arithmetic. Mnemonic was retrieved at the start of this function. | 
|  1721       int mod, regop, rm; |  1734       int mod, regop, rm; | 
|  1722       get_modrm(*current, &mod, ®op, &rm); |  1735       get_modrm(*current, &mod, ®op, &rm); | 
|  1723       AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop)); |  1736       AppendToBuffer("%s %s,", mnemonic, NameOfXMMRegister(regop)); | 
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1864     } |  1877     } | 
|  1865   } else if (opcode == 0xB8 || opcode == 0xBC || opcode == 0xBD) { |  1878   } else if (opcode == 0xB8 || opcode == 0xBC || opcode == 0xBD) { | 
|  1866     // POPCNT, CTZ, CLZ. |  1879     // POPCNT, CTZ, CLZ. | 
|  1867     AppendToBuffer("%s%c ", mnemonic, operand_size_code()); |  1880     AppendToBuffer("%s%c ", mnemonic, operand_size_code()); | 
|  1868     int mod, regop, rm; |  1881     int mod, regop, rm; | 
|  1869     get_modrm(*current, &mod, ®op, &rm); |  1882     get_modrm(*current, &mod, ®op, &rm); | 
|  1870     AppendToBuffer("%s,", NameOfCPURegister(regop)); |  1883     AppendToBuffer("%s,", NameOfCPURegister(regop)); | 
|  1871     current += PrintRightOperand(current); |  1884     current += PrintRightOperand(current); | 
|  1872   } else if (opcode == 0x0B) { |  1885   } else if (opcode == 0x0B) { | 
|  1873     AppendToBuffer("ud2"); |  1886     AppendToBuffer("ud2"); | 
 |  1887   } else if (opcode == 0xAE) { | 
 |  1888     byte modrm = *(data + 2); | 
 |  1889     int mod, regop, rm; | 
 |  1890     get_modrm(modrm, &mod, ®op, &rm); | 
 |  1891     regop &= 0x7;  // The REX.R bit does not affect the operation. | 
 |  1892     const char* mnem = NULL; | 
 |  1893     switch (regop) { | 
 |  1894       case 2: | 
 |  1895         mnem = "ldmxcsr"; | 
 |  1896         break; | 
 |  1897       case 3: | 
 |  1898         mnem = "stmxcsr"; | 
 |  1899         break; | 
 |  1900       default: | 
 |  1901         UnimplementedInstruction(); | 
 |  1902         return 2; | 
 |  1903     } | 
 |  1904     DCHECK_NOT_NULL(mnem); | 
 |  1905     AppendToBuffer("%s ", mnem); | 
 |  1906     current += | 
 |  1907         PrintRightOperandHelper(current, &DisassemblerX64::NameOfCPURegister); | 
|  1874   } else { |  1908   } else { | 
|  1875     UnimplementedInstruction(); |  1909     UnimplementedInstruction(); | 
|  1876   } |  1910   } | 
|  1877   return static_cast<int>(current - data); |  1911   return static_cast<int>(current - data); | 
|  1878 } |  1912 } | 
|  1879  |  1913  | 
|  1880  |  1914  | 
|  1881 // Mnemonics for two-byte opcode instructions starting with 0x0F. |  1915 // Mnemonics for two-byte opcode instructions starting with 0x0F. | 
|  1882 // The argument is the second byte of the two-byte opcode. |  1916 // The argument is the second byte of the two-byte opcode. | 
|  1883 // Returns NULL if the instruction is not handled here. |  1917 // Returns NULL if the instruction is not handled here. | 
| (...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2490     for (int i = 6 - static_cast<int>(pc - prev_pc); i >= 0; i--) { |  2524     for (int i = 6 - static_cast<int>(pc - prev_pc); i >= 0; i--) { | 
|  2491       fprintf(f, "  "); |  2525       fprintf(f, "  "); | 
|  2492     } |  2526     } | 
|  2493     fprintf(f, "  %s\n", buffer.start()); |  2527     fprintf(f, "  %s\n", buffer.start()); | 
|  2494   } |  2528   } | 
|  2495 } |  2529 } | 
|  2496  |  2530  | 
|  2497 }  // namespace disasm |  2531 }  // namespace disasm | 
|  2498  |  2532  | 
|  2499 #endif  // V8_TARGET_ARCH_X64 |  2533 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW |