| 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 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 } | 312 } |
| 313 | 313 |
| 314 bool vex_f2() { | 314 bool vex_f2() { |
| 315 DCHECK(vex_byte0_ == 0xc4 || vex_byte0_ == 0xc5); | 315 DCHECK(vex_byte0_ == 0xc4 || vex_byte0_ == 0xc5); |
| 316 byte checked = vex_byte0_ == 0xc4 ? vex_byte2_ : vex_byte1_; | 316 byte checked = vex_byte0_ == 0xc4 ? vex_byte2_ : vex_byte1_; |
| 317 return (checked & 3) == 3; | 317 return (checked & 3) == 3; |
| 318 } | 318 } |
| 319 | 319 |
| 320 bool vex_w() { | 320 bool vex_w() { |
| 321 if (vex_byte0_ == 0xc5) return false; | 321 if (vex_byte0_ == 0xc5) return false; |
| 322 return (vex_byte2_ & 0x80) == 1; | 322 return (vex_byte2_ & 0x80) != 0; |
| 323 } | 323 } |
| 324 | 324 |
| 325 bool vex_0f() { | 325 bool vex_0f() { |
| 326 if (vex_byte0_ == 0xc5) return true; | 326 if (vex_byte0_ == 0xc5) return true; |
| 327 return (vex_byte1_ & 3) == 1; | 327 return (vex_byte1_ & 3) == 1; |
| 328 } | 328 } |
| 329 | 329 |
| 330 bool vex_0f38() { | 330 bool vex_0f38() { |
| 331 if (vex_byte0_ == 0xc5) return false; | 331 if (vex_byte0_ == 0xc5) return false; |
| 332 return (vex_byte1_ & 3) == 2; | 332 return (vex_byte1_ & 3) == 2; |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 733 byte cond = *(data + 1) & 0x0F; | 733 byte cond = *(data + 1) & 0x0F; |
| 734 const char* mnem = conditional_move_mnem[cond]; | 734 const char* mnem = conditional_move_mnem[cond]; |
| 735 int op_size = PrintOperands(mnem, REG_OPER_OP_ORDER, data + 2); | 735 int op_size = PrintOperands(mnem, REG_OPER_OP_ORDER, data + 2); |
| 736 return 2 + op_size; // includes 0x0F | 736 return 2 + op_size; // includes 0x0F |
| 737 } | 737 } |
| 738 | 738 |
| 739 | 739 |
| 740 int DisassemblerIA32::AVXInstruction(byte* data) { | 740 int DisassemblerIA32::AVXInstruction(byte* data) { |
| 741 byte opcode = *data; | 741 byte opcode = *data; |
| 742 byte* current = data + 1; | 742 byte* current = data + 1; |
| 743 if (vex_f2() && vex_0f()) { | 743 if (vex_66() && vex_0f38()) { |
| 744 int mod, regop, rm, vvvv = vex_vreg(); | 744 int mod, regop, rm, vvvv = vex_vreg(); |
| 745 get_modrm(*current, &mod, ®op, &rm); | 745 get_modrm(*current, &mod, ®op, &rm); |
| 746 switch (opcode) { | 746 switch (opcode) { |
| 747 case 0x99: |
| 748 AppendToBuffer("vfmadd132s%c %s,%s,", float_size_code(), |
| 749 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 750 current += PrintRightXMMOperand(current); |
| 751 break; |
| 752 case 0xa9: |
| 753 AppendToBuffer("vfmadd213s%c %s,%s,", float_size_code(), |
| 754 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 755 current += PrintRightXMMOperand(current); |
| 756 break; |
| 757 case 0xb9: |
| 758 AppendToBuffer("vfmadd231s%c %s,%s,", float_size_code(), |
| 759 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 760 current += PrintRightXMMOperand(current); |
| 761 break; |
| 762 case 0x9b: |
| 763 AppendToBuffer("vfmsub132s%c %s,%s,", float_size_code(), |
| 764 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 765 current += PrintRightXMMOperand(current); |
| 766 break; |
| 767 case 0xab: |
| 768 AppendToBuffer("vfmsub213s%c %s,%s,", float_size_code(), |
| 769 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 770 current += PrintRightXMMOperand(current); |
| 771 break; |
| 772 case 0xbb: |
| 773 AppendToBuffer("vfmsub231s%c %s,%s,", float_size_code(), |
| 774 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 775 current += PrintRightXMMOperand(current); |
| 776 break; |
| 777 case 0x9d: |
| 778 AppendToBuffer("vfnmadd132s%c %s,%s,", float_size_code(), |
| 779 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 780 current += PrintRightXMMOperand(current); |
| 781 break; |
| 782 case 0xad: |
| 783 AppendToBuffer("vfnmadd213s%c %s,%s,", float_size_code(), |
| 784 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 785 current += PrintRightXMMOperand(current); |
| 786 break; |
| 787 case 0xbd: |
| 788 AppendToBuffer("vfnmadd231s%c %s,%s,", float_size_code(), |
| 789 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 790 current += PrintRightXMMOperand(current); |
| 791 break; |
| 792 case 0x9f: |
| 793 AppendToBuffer("vfnmsub132s%c %s,%s,", float_size_code(), |
| 794 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 795 current += PrintRightXMMOperand(current); |
| 796 break; |
| 797 case 0xaf: |
| 798 AppendToBuffer("vfnmsub213s%c %s,%s,", float_size_code(), |
| 799 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 800 current += PrintRightXMMOperand(current); |
| 801 break; |
| 802 case 0xbf: |
| 803 AppendToBuffer("vfnmsub231s%c %s,%s,", float_size_code(), |
| 804 NameOfXMMRegister(regop), NameOfXMMRegister(vvvv)); |
| 805 current += PrintRightXMMOperand(current); |
| 806 break; |
| 807 default: |
| 808 UnimplementedInstruction(); |
| 809 } |
| 810 } else if (vex_f2() && vex_0f()) { |
| 811 int mod, regop, rm, vvvv = vex_vreg(); |
| 812 get_modrm(*current, &mod, ®op, &rm); |
| 813 switch (opcode) { |
| 747 case 0x58: | 814 case 0x58: |
| 748 AppendToBuffer("vaddsd %s,%s,", NameOfXMMRegister(regop), | 815 AppendToBuffer("vaddsd %s,%s,", NameOfXMMRegister(regop), |
| 749 NameOfXMMRegister(vvvv)); | 816 NameOfXMMRegister(vvvv)); |
| 750 current += PrintRightXMMOperand(current); | 817 current += PrintRightXMMOperand(current); |
| 751 break; | 818 break; |
| 752 case 0x59: | 819 case 0x59: |
| 753 AppendToBuffer("vmulsd %s,%s,", NameOfXMMRegister(regop), | 820 AppendToBuffer("vmulsd %s,%s,", NameOfXMMRegister(regop), |
| 754 NameOfXMMRegister(vvvv)); | 821 NameOfXMMRegister(vvvv)); |
| 755 current += PrintRightXMMOperand(current); | 822 current += PrintRightXMMOperand(current); |
| 756 break; | 823 break; |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1152 AppendToBuffer("%s", f0mnem); | 1219 AppendToBuffer("%s", f0mnem); |
| 1153 data += 2; | 1220 data += 2; |
| 1154 } else if (f0byte == 0x28) { | 1221 } else if (f0byte == 0x28) { |
| 1155 data += 2; | 1222 data += 2; |
| 1156 int mod, regop, rm; | 1223 int mod, regop, rm; |
| 1157 get_modrm(*data, &mod, ®op, &rm); | 1224 get_modrm(*data, &mod, ®op, &rm); |
| 1158 AppendToBuffer("movaps %s,%s", | 1225 AppendToBuffer("movaps %s,%s", |
| 1159 NameOfXMMRegister(regop), | 1226 NameOfXMMRegister(regop), |
| 1160 NameOfXMMRegister(rm)); | 1227 NameOfXMMRegister(rm)); |
| 1161 data++; | 1228 data++; |
| 1229 } else if (f0byte == 0x2e) { |
| 1230 data += 2; |
| 1231 int mod, regop, rm; |
| 1232 get_modrm(*data, &mod, ®op, &rm); |
| 1233 AppendToBuffer("ucomiss %s,", NameOfXMMRegister(regop)); |
| 1234 data += PrintRightXMMOperand(data); |
| 1162 } else if (f0byte >= 0x53 && f0byte <= 0x5F) { | 1235 } else if (f0byte >= 0x53 && f0byte <= 0x5F) { |
| 1163 const char* const pseudo_op[] = { | 1236 const char* const pseudo_op[] = { |
| 1164 "rcpps", | 1237 "rcpps", |
| 1165 "andps", | 1238 "andps", |
| 1166 "andnps", | 1239 "andnps", |
| 1167 "orps", | 1240 "orps", |
| 1168 "xorps", | 1241 "xorps", |
| 1169 "addps", | 1242 "addps", |
| 1170 "mulps", | 1243 "mulps", |
| 1171 "cvtps2pd", | 1244 "cvtps2pd", |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1722 int mod, regop, rm; | 1795 int mod, regop, rm; |
| 1723 get_modrm(*data, &mod, ®op, &rm); | 1796 get_modrm(*data, &mod, ®op, &rm); |
| 1724 AppendToBuffer("movss %s,", NameOfXMMRegister(regop)); | 1797 AppendToBuffer("movss %s,", NameOfXMMRegister(regop)); |
| 1725 data += PrintRightXMMOperand(data); | 1798 data += PrintRightXMMOperand(data); |
| 1726 } else if (b2 == 0x2C) { | 1799 } else if (b2 == 0x2C) { |
| 1727 data += 3; | 1800 data += 3; |
| 1728 int mod, regop, rm; | 1801 int mod, regop, rm; |
| 1729 get_modrm(*data, &mod, ®op, &rm); | 1802 get_modrm(*data, &mod, ®op, &rm); |
| 1730 AppendToBuffer("cvttss2si %s,", NameOfCPURegister(regop)); | 1803 AppendToBuffer("cvttss2si %s,", NameOfCPURegister(regop)); |
| 1731 data += PrintRightXMMOperand(data); | 1804 data += PrintRightXMMOperand(data); |
| 1805 } else if (b2 == 0x58) { |
| 1806 data += 3; |
| 1807 int mod, regop, rm; |
| 1808 get_modrm(*data, &mod, ®op, &rm); |
| 1809 AppendToBuffer("addss %s,", NameOfXMMRegister(regop)); |
| 1810 data += PrintRightXMMOperand(data); |
| 1811 } else if (b2 == 0x59) { |
| 1812 data += 3; |
| 1813 int mod, regop, rm; |
| 1814 get_modrm(*data, &mod, ®op, &rm); |
| 1815 AppendToBuffer("mulss %s,", NameOfXMMRegister(regop)); |
| 1816 data += PrintRightXMMOperand(data); |
| 1732 } else if (b2 == 0x5A) { | 1817 } else if (b2 == 0x5A) { |
| 1733 data += 3; | 1818 data += 3; |
| 1734 int mod, regop, rm; | 1819 int mod, regop, rm; |
| 1735 get_modrm(*data, &mod, ®op, &rm); | 1820 get_modrm(*data, &mod, ®op, &rm); |
| 1736 AppendToBuffer("cvtss2sd %s,", NameOfXMMRegister(regop)); | 1821 AppendToBuffer("cvtss2sd %s,", NameOfXMMRegister(regop)); |
| 1737 data += PrintRightXMMOperand(data); | 1822 data += PrintRightXMMOperand(data); |
| 1823 } else if (b2 == 0x5c) { |
| 1824 data += 3; |
| 1825 int mod, regop, rm; |
| 1826 get_modrm(*data, &mod, ®op, &rm); |
| 1827 AppendToBuffer("subss %s,", NameOfXMMRegister(regop)); |
| 1828 data += PrintRightXMMOperand(data); |
| 1829 } else if (b2 == 0x5e) { |
| 1830 data += 3; |
| 1831 int mod, regop, rm; |
| 1832 get_modrm(*data, &mod, ®op, &rm); |
| 1833 AppendToBuffer("divss %s,", NameOfXMMRegister(regop)); |
| 1834 data += PrintRightXMMOperand(data); |
| 1738 } else if (b2 == 0x6F) { | 1835 } else if (b2 == 0x6F) { |
| 1739 data += 3; | 1836 data += 3; |
| 1740 int mod, regop, rm; | 1837 int mod, regop, rm; |
| 1741 get_modrm(*data, &mod, ®op, &rm); | 1838 get_modrm(*data, &mod, ®op, &rm); |
| 1742 AppendToBuffer("movdqu %s,", NameOfXMMRegister(regop)); | 1839 AppendToBuffer("movdqu %s,", NameOfXMMRegister(regop)); |
| 1743 data += PrintRightXMMOperand(data); | 1840 data += PrintRightXMMOperand(data); |
| 1744 } else if (b2 == 0x7F) { | 1841 } else if (b2 == 0x7F) { |
| 1745 AppendToBuffer("movdqu "); | 1842 AppendToBuffer("movdqu "); |
| 1746 data += 3; | 1843 data += 3; |
| 1747 int mod, regop, rm; | 1844 int mod, regop, rm; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1891 fprintf(f, " "); | 1988 fprintf(f, " "); |
| 1892 } | 1989 } |
| 1893 fprintf(f, " %s\n", buffer.start()); | 1990 fprintf(f, " %s\n", buffer.start()); |
| 1894 } | 1991 } |
| 1895 } | 1992 } |
| 1896 | 1993 |
| 1897 | 1994 |
| 1898 } // namespace disasm | 1995 } // namespace disasm |
| 1899 | 1996 |
| 1900 #endif // V8_TARGET_ARCH_IA32 | 1997 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |