trunk/src/emu/cpu/i386/i386dasm.c
| r243101 | r243102 | |
| 98 | 98 | #define ALWAYS64 0x400 |
| 99 | 99 | #define SPECIAL64 0x800 |
| 100 | 100 | #define SPECIAL64_ENT(x) (SPECIAL64 | ((x) << 24)) |
| 101 | #define GROUP_MOD 0x1000 |
| 101 | 102 | |
| 102 | 103 | struct I386_OPCODE { |
| 103 | 104 | const char *mnemonic; |
| r243101 | r243102 | |
| 425 | 426 | "movupd\0" |
| 426 | 427 | "movsd\0" |
| 427 | 428 | "movss", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 }, |
| 429 | {"group0F12", GROUP|GROUP_MOD, 0, 0, 0 }, |
| 428 | 430 | {"movlps\0" |
| 429 | 431 | "movlpd\0" |
| 430 | | "movddup\0" |
| 431 | | "movsldup", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 432 | | {"movlps\0" |
| 433 | | "movlpd\0" |
| 434 | 432 | "???\0" |
| 435 | 433 | "???", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 }, |
| 436 | 434 | {"unpcklps\0" |
| r243101 | r243102 | |
| 441 | 439 | "unpckhpd\0" |
| 442 | 440 | "???\0" |
| 443 | 441 | "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 442 | { "group0F16", GROUP|GROUP_MOD, 0, 0, 0 }, |
| 444 | 443 | {"movhps\0" |
| 445 | 444 | "movhpd\0" |
| 446 | 445 | "???\0" |
| 447 | | "movshdup", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 }, |
| 448 | | {"movhps\0" |
| 449 | | "movhpd\0" |
| 450 | | "???\0" |
| 451 | | "???", MODRM|VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 446 | "???", MODRM|VAR_NAME4,PARAM_XMMM, PARAM_XMM, 0 }, |
| 452 | 447 | {"group0F18", GROUP, 0, 0, 0 }, |
| 453 | 448 | {"nop_hint", 0, PARAM_RMPTR8, 0, 0 }, |
| 454 | 449 | {"nop_hint", 0, PARAM_RMPTR8, 0, 0 }, |
| r243101 | r243102 | |
| 1810 | 1805 | {"???", 0, 0, 0, 0 } |
| 1811 | 1806 | }; |
| 1812 | 1807 | |
| 1808 | static const I386_OPCODE group0F12_table[4] = |
| 1809 | { |
| 1810 | { "movlps\0" |
| 1811 | "movlpd\0" |
| 1812 | "movddup\0" |
| 1813 | "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 1814 | { "movlps\0" |
| 1815 | "movlpd\0" |
| 1816 | "movddup\0" |
| 1817 | "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 1818 | { "movlps\0" |
| 1819 | "movlpd\0" |
| 1820 | "movddup\0" |
| 1821 | "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 1822 | { "movhlps\0" |
| 1823 | "???\0" |
| 1824 | "movddup\0" |
| 1825 | "movsldup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 } |
| 1826 | }; |
| 1827 | |
| 1828 | static const I386_OPCODE group0F16_table[4] = |
| 1829 | { |
| 1830 | { "movhps\0" |
| 1831 | "movhpd\0" |
| 1832 | "???\0" |
| 1833 | "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 1834 | { "movhps\0" |
| 1835 | "movhpd\0" |
| 1836 | "???\0" |
| 1837 | "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 1838 | { "movhps\0" |
| 1839 | "movhpd\0" |
| 1840 | "???\0" |
| 1841 | "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 }, |
| 1842 | { "movlhps\0" |
| 1843 | "movhpd\0" |
| 1844 | "???\0" |
| 1845 | "movshdup", VAR_NAME4,PARAM_XMM, PARAM_XMMM, 0 } |
| 1846 | }; |
| 1847 | |
| 1813 | 1848 | static const I386_OPCODE group0F18_table[8] = |
| 1814 | 1849 | { |
| 1815 | 1850 | {"prefetchnta", 0, PARAM_RM8, 0, 0 }, |
| r243101 | r243102 | |
| 1916 | 1951 | { "group0F00", group0F00_table }, |
| 1917 | 1952 | { "group0F01", group0F01_table }, |
| 1918 | 1953 | { "group0F0D", group0F0D_table }, |
| 1919 | | { "group0F18", group0F18_table }, |
| 1954 | { "group0F12", group0F12_table }, |
| 1955 | { "group0F16", group0F16_table }, |
| 1956 | { "group0F18", group0F18_table }, |
| 1920 | 1957 | { "group0F71", group0F71_table }, |
| 1921 | 1958 | { "group0F72", group0F72_table }, |
| 1922 | 1959 | { "group0F73", group0F73_table }, |
| r243101 | r243102 | |
| 1954 | 1991 | |
| 1955 | 1992 | #define MODRM_REG1 ((modrm >> 3) & 0x7) |
| 1956 | 1993 | #define MODRM_REG2 (modrm & 0x7) |
| 1994 | #define MODRM_MOD ((modrm >> 6) & 0x3) |
| 1957 | 1995 | |
| 1958 | 1996 | INLINE UINT8 FETCH(void) |
| 1959 | 1997 | { |
| r243101 | r243102 | |
| 2959 | 2997 | handle_modrm( modrm_string ); |
| 2960 | 2998 | for( i=0; i < ARRAY_LENGTH(group_op_table); i++ ) { |
| 2961 | 2999 | if( strcmp(op->mnemonic, group_op_table[i].mnemonic) == 0 ) { |
| 2962 | | decode_opcode( s, &group_op_table[i].opcode[MODRM_REG1], op1 ); |
| 3000 | if (op->flags & GROUP_MOD) |
| 3001 | decode_opcode( s, &group_op_table[i].opcode[MODRM_MOD], op1 ); |
| 3002 | else |
| 3003 | decode_opcode( s, &group_op_table[i].opcode[MODRM_REG1], op1 ); |
| 2963 | 3004 | return; |
| 2964 | 3005 | } |
| 2965 | 3006 | } |