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 |