|
|
| version 1.2, 2003/12/11 15:06:50 | version 1.14, 2012/01/29 03:22:24 |
|---|---|
| Line 1 | Line 1 |
| /* $Id$ */ | |
| /* | /* |
| * Copyright (c) 2002-2003 NONAKA Kimihiro | * Copyright (c) 2002-2003 NONAKA Kimihiro |
| * All rights reserved. | * All rights reserved. |
| Line 12 | Line 10 |
| * 2. Redistributions in binary form must reproduce the above copyright | * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the | * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. | * documentation and/or other materials provided with the distribution. |
| * 3. The name of the author may not be used to endorse or promote products | |
| * derived from this software without specific prior written permission. | |
| * | * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| Line 46 | Line 42 |
| #include "string_inst.h" | #include "string_inst.h" |
| #include "system_inst.h" | #include "system_inst.h" |
| #include "fp.h" | #include "instructions/fpu/fp.h" |
| /* | /* |
| Line 59 undef_op(void) | Line 55 undef_op(void) |
| EXCEPTION(UD_EXCEPTION, 0); | EXCEPTION(UD_EXCEPTION, 0); |
| } | } |
| static void | static void CPUCALL |
| undef_op2(DWORD v) | undef_op2(UINT32 v) |
| { | { |
| (void)v; | |
| EXCEPTION(UD_EXCEPTION, 0); | EXCEPTION(UD_EXCEPTION, 0); |
| } | } |
| BYTE insttable_info[256] = { | UINT8 insttable_info[256] = { |
| 0, /* 00 */ | 0, /* 00 */ |
| 0, | 0, |
| 0, | 0, |
| Line 557 void (*insttable_1byte[2][256])(void) = | Line 552 void (*insttable_1byte[2][256])(void) = |
| LDS_GwMp, | LDS_GwMp, |
| MOV_EbIb, | MOV_EbIb, |
| MOV_EwIw, | MOV_EwIw, |
| ENTER_IwIb, /* C8 */ | ENTER16_IwIb, /* C8 */ |
| LEAVE16, | LEAVE, |
| RETfar16_Iw, | RETfar16_Iw, |
| RETfar16, | RETfar16, |
| INT3, | INT3, |
| Line 768 void (*insttable_1byte[2][256])(void) = | Line 763 void (*insttable_1byte[2][256])(void) = |
| MOV_EdGd, | MOV_EdGd, |
| MOV_GbEb, | MOV_GbEb, |
| MOV_GdEd, | MOV_GdEd, |
| MOV_EwSw, | MOV_EdSw, |
| LEA_GdM, | LEA_GdM, |
| MOV_SwEw, | MOV_SwEw, |
| POP_Ed, | POP_Ed, |
| Line 832 void (*insttable_1byte[2][256])(void) = | Line 827 void (*insttable_1byte[2][256])(void) = |
| LDS_GdMp, | LDS_GdMp, |
| MOV_EbIb, | MOV_EbIb, |
| MOV_EdId, | MOV_EdId, |
| ENTER_IwIb, /* C8 */ | ENTER32_IwIb, /* C8 */ |
| LEAVE32, | LEAVE, |
| RETfar32_Iw, | RETfar32_Iw, |
| RETfar32, | RETfar32, |
| INT3, | INT3, |
| INT_Ib, | INT_Ib, |
| INTO, | INTO, |
| IRETD, | IRET, |
| Grp2_Eb, /* D0 */ | Grp2_Eb, /* D0 */ |
| Grp2_Ed, | Grp2_Ed, |
| Line 897 void (*insttable_1byte[2][256])(void) = | Line 892 void (*insttable_1byte[2][256])(void) = |
| void (*insttable_2byte[2][256])(void) = { | void (*insttable_2byte[2][256])(void) = { |
| /* 16bit */ | /* 16bit */ |
| { | { |
| Grp6_16, /* 00 */ | Grp6, /* 00 */ |
| Grp7_16, | Grp7, |
| LAR_GwEw, | LAR_GwEw, |
| LSL_GwEw, | LSL_GwEw, |
| undef_op, | undef_op, |
| LOADALL286, /* undoc(286) */ | LOADALL286, /* undoc(286) */ |
| CLTS, | CLTS, |
| undef_op, | LOADALL, |
| INVD, /* 08 */ | INVD, /* 08 */ |
| WBINVD, | WBINVD, |
| undef_op, | undef_op, |
| Line 1091 void (*insttable_2byte[2][256])(void) = | Line 1086 void (*insttable_2byte[2][256])(void) = |
| LFS_GwMp, | LFS_GwMp, |
| LGS_GwMp, | LGS_GwMp, |
| MOVZX_GwEb, | MOVZX_GwEb, |
| MOVZX_GdEw, | MOVZX_GwEw, |
| undef_op, /* B8 */ | undef_op, /* B8 */ |
| UD2, | UD2, |
| Grp8_EwIb, | Grp8_EwIb, |
| Line 1099 void (*insttable_2byte[2][256])(void) = | Line 1094 void (*insttable_2byte[2][256])(void) = |
| BSF_GwEw, | BSF_GwEw, |
| BSR_GwEw, | BSR_GwEw, |
| MOVSX_GwEb, | MOVSX_GwEb, |
| MOVSX_GdEw, | MOVSX_GwEw, |
| XADD_EbGb, /* C0 */ | XADD_EbGb, /* C0 */ |
| XADD_EwGw, | XADD_EwGw, |
| Line 1172 void (*insttable_2byte[2][256])(void) = | Line 1167 void (*insttable_2byte[2][256])(void) = |
| /* 32bit */ | /* 32bit */ |
| { | { |
| Grp6_32, /* 00 */ | Grp6, /* 00 */ |
| Grp7_32, | Grp7, |
| LAR_GdEw, | LAR_GdEw, |
| LSL_GdEw, | LSL_GdEw, |
| undef_op, | undef_op, |
| LOADALL, /* undoc(286) */ | LOADALL286, /* undoc(286) */ |
| CLTS, | CLTS, |
| undef_op, | LOADALL, |
| INVD, /* 08 */ | INVD, /* 08 */ |
| WBINVD, | WBINVD, |
| undef_op, | undef_op, |
| Line 1452 void (*insttable_2byte[2][256])(void) = | Line 1447 void (*insttable_2byte[2][256])(void) = |
| */ | */ |
| /* group 1 */ | /* group 1 */ |
| void (*insttable_G1EbIb[])(BYTE *, DWORD) = { | void (CPUCALL *insttable_G1EbIb[])(UINT8 *, UINT32) = { |
| ADD_EbIb, | ADD_EbIb, |
| OR_EbIb, | OR_EbIb, |
| ADC_EbIb, | ADC_EbIb, |
| Line 1462 void (*insttable_G1EbIb[])(BYTE *, DWORD | Line 1457 void (*insttable_G1EbIb[])(BYTE *, DWORD |
| XOR_EbIb, | XOR_EbIb, |
| CMP_EbIb, | CMP_EbIb, |
| }; | }; |
| void (*insttable_G1EbIb_ext[])(DWORD, DWORD) = { | void (CPUCALL *insttable_G1EbIb_ext[])(UINT32, UINT32) = { |
| ADD_EbIb_ext, | ADD_EbIb_ext, |
| OR_EbIb_ext, | OR_EbIb_ext, |
| ADC_EbIb_ext, | ADC_EbIb_ext, |
| Line 1473 void (*insttable_G1EbIb_ext[])(DWORD, DW | Line 1468 void (*insttable_G1EbIb_ext[])(DWORD, DW |
| CMP_EbIb_ext, | CMP_EbIb_ext, |
| }; | }; |
| void (*insttable_G1EwIx[])(WORD *, DWORD) = { | void (CPUCALL *insttable_G1EwIx[])(UINT16 *, UINT32) = { |
| ADD_EwIx, | ADD_EwIx, |
| OR_EwIx, | OR_EwIx, |
| ADC_EwIx, | ADC_EwIx, |
| Line 1483 void (*insttable_G1EwIx[])(WORD *, DWORD | Line 1478 void (*insttable_G1EwIx[])(WORD *, DWORD |
| XOR_EwIx, | XOR_EwIx, |
| CMP_EwIx, | CMP_EwIx, |
| }; | }; |
| void (*insttable_G1EwIx_ext[])(DWORD, DWORD) = { | void (CPUCALL *insttable_G1EwIx_ext[])(UINT32, UINT32) = { |
| ADD_EwIx_ext, | ADD_EwIx_ext, |
| OR_EwIx_ext, | OR_EwIx_ext, |
| ADC_EwIx_ext, | ADC_EwIx_ext, |
| Line 1494 void (*insttable_G1EwIx_ext[])(DWORD, DW | Line 1489 void (*insttable_G1EwIx_ext[])(DWORD, DW |
| CMP_EwIx_ext, | CMP_EwIx_ext, |
| }; | }; |
| void (*insttable_G1EdIx[])(DWORD *, DWORD) = { | void (CPUCALL *insttable_G1EdIx[])(UINT32 *, UINT32) = { |
| ADD_EdIx, | ADD_EdIx, |
| OR_EdIx, | OR_EdIx, |
| ADC_EdIx, | ADC_EdIx, |
| Line 1504 void (*insttable_G1EdIx[])(DWORD *, DWOR | Line 1499 void (*insttable_G1EdIx[])(DWORD *, DWOR |
| XOR_EdIx, | XOR_EdIx, |
| CMP_EdIx, | CMP_EdIx, |
| }; | }; |
| void (*insttable_G1EdIx_ext[])(DWORD, DWORD) = { | void (CPUCALL *insttable_G1EdIx_ext[])(UINT32, UINT32) = { |
| ADD_EdIx_ext, | ADD_EdIx_ext, |
| OR_EdIx_ext, | OR_EdIx_ext, |
| ADC_EdIx_ext, | ADC_EdIx_ext, |
| Line 1517 void (*insttable_G1EdIx_ext[])(DWORD, DW | Line 1512 void (*insttable_G1EdIx_ext[])(DWORD, DW |
| /* group 2 */ | /* group 2 */ |
| void (*insttable_G2Eb[])(BYTE *) = { | void (CPUCALL *insttable_G2Eb[])(UINT8 *) = { |
| ROL_Eb, | ROL_Eb, |
| ROR_Eb, | ROR_Eb, |
| RCL_Eb, | RCL_Eb, |
| Line 1527 void (*insttable_G2Eb[])(BYTE *) = { | Line 1522 void (*insttable_G2Eb[])(BYTE *) = { |
| SHL_Eb, | SHL_Eb, |
| SAR_Eb, | SAR_Eb, |
| }; | }; |
| void (*insttable_G2Eb_ext[])(DWORD) = { | void (CPUCALL *insttable_G2Eb_ext[])(UINT32) = { |
| ROL_Eb_ext, | ROL_Eb_ext, |
| ROR_Eb_ext, | ROR_Eb_ext, |
| RCL_Eb_ext, | RCL_Eb_ext, |
| Line 1538 void (*insttable_G2Eb_ext[])(DWORD) = { | Line 1533 void (*insttable_G2Eb_ext[])(DWORD) = { |
| SAR_Eb_ext, | SAR_Eb_ext, |
| }; | }; |
| void (*insttable_G2Ew[])(WORD *) = { | void (CPUCALL *insttable_G2Ew[])(UINT16 *) = { |
| ROL_Ew, | ROL_Ew, |
| ROR_Ew, | ROR_Ew, |
| RCL_Ew, | RCL_Ew, |
| Line 1548 void (*insttable_G2Ew[])(WORD *) = { | Line 1543 void (*insttable_G2Ew[])(WORD *) = { |
| SHL_Ew, | SHL_Ew, |
| SAR_Ew, | SAR_Ew, |
| }; | }; |
| void (*insttable_G2Ew_ext[])(DWORD) = { | void (CPUCALL *insttable_G2Ew_ext[])(UINT32) = { |
| ROL_Ew_ext, | ROL_Ew_ext, |
| ROR_Ew_ext, | ROR_Ew_ext, |
| RCL_Ew_ext, | RCL_Ew_ext, |
| Line 1559 void (*insttable_G2Ew_ext[])(DWORD) = { | Line 1554 void (*insttable_G2Ew_ext[])(DWORD) = { |
| SAR_Ew_ext, | SAR_Ew_ext, |
| }; | }; |
| void (*insttable_G2Ed[])(DWORD *) = { | void (CPUCALL *insttable_G2Ed[])(UINT32 *) = { |
| ROL_Ed, | ROL_Ed, |
| ROR_Ed, | ROR_Ed, |
| RCL_Ed, | RCL_Ed, |
| Line 1569 void (*insttable_G2Ed[])(DWORD *) = { | Line 1564 void (*insttable_G2Ed[])(DWORD *) = { |
| SHL_Ed, | SHL_Ed, |
| SAR_Ed, | SAR_Ed, |
| }; | }; |
| void (*insttable_G2Ed_ext[])(DWORD) = { | void (CPUCALL *insttable_G2Ed_ext[])(UINT32) = { |
| ROL_Ed_ext, | ROL_Ed_ext, |
| ROR_Ed_ext, | ROR_Ed_ext, |
| RCL_Ed_ext, | RCL_Ed_ext, |
| Line 1580 void (*insttable_G2Ed_ext[])(DWORD) = { | Line 1575 void (*insttable_G2Ed_ext[])(DWORD) = { |
| SAR_Ed_ext, | SAR_Ed_ext, |
| }; | }; |
| void (*insttable_G2EbCL[])(BYTE *, BYTE) = { | void (CPUCALL *insttable_G2EbCL[])(UINT8 *, UINT) = { |
| ROL_EbCL, | ROL_EbCL, |
| ROR_EbCL, | ROR_EbCL, |
| RCL_EbCL, | RCL_EbCL, |
| Line 1590 void (*insttable_G2EbCL[])(BYTE *, BYTE) | Line 1585 void (*insttable_G2EbCL[])(BYTE *, BYTE) |
| SHL_EbCL, | SHL_EbCL, |
| SAR_EbCL, | SAR_EbCL, |
| }; | }; |
| void (*insttable_G2EbCL_ext[])(DWORD, BYTE) = { | void (CPUCALL *insttable_G2EbCL_ext[])(UINT32, UINT) = { |
| ROL_EbCL_ext, | ROL_EbCL_ext, |
| ROR_EbCL_ext, | ROR_EbCL_ext, |
| RCL_EbCL_ext, | RCL_EbCL_ext, |
| Line 1601 void (*insttable_G2EbCL_ext[])(DWORD, BY | Line 1596 void (*insttable_G2EbCL_ext[])(DWORD, BY |
| SAR_EbCL_ext, | SAR_EbCL_ext, |
| }; | }; |
| void (*insttable_G2EwCL[])(WORD *, BYTE) = { | void (CPUCALL *insttable_G2EwCL[])(UINT16 *, UINT) = { |
| ROL_EwCL, | ROL_EwCL, |
| ROR_EwCL, | ROR_EwCL, |
| RCL_EwCL, | RCL_EwCL, |
| Line 1611 void (*insttable_G2EwCL[])(WORD *, BYTE) | Line 1606 void (*insttable_G2EwCL[])(WORD *, BYTE) |
| SHL_EwCL, | SHL_EwCL, |
| SAR_EwCL, | SAR_EwCL, |
| }; | }; |
| void (*insttable_G2EwCL_ext[])(DWORD, BYTE) = { | void (CPUCALL *insttable_G2EwCL_ext[])(UINT32, UINT) = { |
| ROL_EwCL_ext, | ROL_EwCL_ext, |
| ROR_EwCL_ext, | ROR_EwCL_ext, |
| RCL_EwCL_ext, | RCL_EwCL_ext, |
| Line 1622 void (*insttable_G2EwCL_ext[])(DWORD, BY | Line 1617 void (*insttable_G2EwCL_ext[])(DWORD, BY |
| SAR_EwCL_ext, | SAR_EwCL_ext, |
| }; | }; |
| void (*insttable_G2EdCL[])(DWORD *, BYTE) = { | void (CPUCALL *insttable_G2EdCL[])(UINT32 *, UINT) = { |
| ROL_EdCL, | ROL_EdCL, |
| ROR_EdCL, | ROR_EdCL, |
| RCL_EdCL, | RCL_EdCL, |
| Line 1632 void (*insttable_G2EdCL[])(DWORD *, BYTE | Line 1627 void (*insttable_G2EdCL[])(DWORD *, BYTE |
| SHL_EdCL, | SHL_EdCL, |
| SAR_EdCL, | SAR_EdCL, |
| }; | }; |
| void (*insttable_G2EdCL_ext[])(DWORD, BYTE) = { | void (CPUCALL *insttable_G2EdCL_ext[])(UINT32, UINT) = { |
| ROL_EdCL_ext, | ROL_EdCL_ext, |
| ROR_EdCL_ext, | ROR_EdCL_ext, |
| RCL_EdCL_ext, | RCL_EdCL_ext, |
| Line 1644 void (*insttable_G2EdCL_ext[])(DWORD, BY | Line 1639 void (*insttable_G2EdCL_ext[])(DWORD, BY |
| }; | }; |
| /* group 3 */ | /* group 3 */ |
| void (*insttable_G3Eb[])(DWORD) = { | void (CPUCALL *insttable_G3Eb[])(UINT32) = { |
| TEST_EbIb, | TEST_EbIb, |
| TEST_EbIb, | TEST_EbIb, |
| NOT_Eb, | NOT_Eb, |
| Line 1655 void (*insttable_G3Eb[])(DWORD) = { | Line 1650 void (*insttable_G3Eb[])(DWORD) = { |
| IDIV_ALEb, | IDIV_ALEb, |
| }; | }; |
| void (*insttable_G3Ew[])(DWORD) = { | void (CPUCALL *insttable_G3Ew[])(UINT32) = { |
| TEST_EwIw, | TEST_EwIw, |
| TEST_EwIw, | TEST_EwIw, |
| NOT_Ew, | NOT_Ew, |
| Line 1666 void (*insttable_G3Ew[])(DWORD) = { | Line 1661 void (*insttable_G3Ew[])(DWORD) = { |
| IDIV_AXEw, | IDIV_AXEw, |
| }; | }; |
| void (*insttable_G3Ed[])(DWORD) = { | void (CPUCALL *insttable_G3Ed[])(UINT32) = { |
| TEST_EdId, | TEST_EdId, |
| TEST_EdId, | TEST_EdId, |
| NOT_Ed, | NOT_Ed, |
| Line 1678 void (*insttable_G3Ed[])(DWORD) = { | Line 1673 void (*insttable_G3Ed[])(DWORD) = { |
| }; | }; |
| /* group 4 */ | /* group 4 */ |
| void (*insttable_G4[])(DWORD) = { | void (CPUCALL *insttable_G4[])(UINT32) = { |
| INC_Eb, | INC_Eb, |
| DEC_Eb, | DEC_Eb, |
| undef_op2, | undef_op2, |
| Line 1690 void (*insttable_G4[])(DWORD) = { | Line 1685 void (*insttable_G4[])(DWORD) = { |
| }; | }; |
| /* group 5 */ | /* group 5 */ |
| void (*insttable_G5Ew[])(DWORD) = { | void (CPUCALL *insttable_G5Ew[])(UINT32) = { |
| INC_Ew, | INC_Ew, |
| DEC_Ew, | DEC_Ew, |
| CALL_Ew, | CALL_Ew, |
| Line 1701 void (*insttable_G5Ew[])(DWORD) = { | Line 1696 void (*insttable_G5Ew[])(DWORD) = { |
| undef_op2, /* POP_Ew_G5 */ | undef_op2, /* POP_Ew_G5 */ |
| }; | }; |
| void (*insttable_G5Ed[])(DWORD) = { | void (CPUCALL *insttable_G5Ed[])(UINT32) = { |
| INC_Ed, | INC_Ed, |
| DEC_Ed, | DEC_Ed, |
| CALL_Ed, | CALL_Ed, |
| Line 1713 void (*insttable_G5Ed[])(DWORD) = { | Line 1708 void (*insttable_G5Ed[])(DWORD) = { |
| }; | }; |
| /* group 6 */ | /* group 6 */ |
| void (*insttable_G6_16[])(DWORD) = { | void (CPUCALL *insttable_G6[])(UINT32) = { |
| SLDT_Ew, | SLDT_Ew, |
| STR_Ew, | STR_Ew, |
| LLDT_Ew, | LLDT_Ew, |
| Line 1724 void (*insttable_G6_16[])(DWORD) = { | Line 1719 void (*insttable_G6_16[])(DWORD) = { |
| undef_op2, | undef_op2, |
| }; | }; |
| void (*insttable_G6_32[])(DWORD) = { | |
| SLDT_Ed, | |
| STR_Ed, | |
| LLDT_Ew, | |
| LTR_Ew, | |
| VERR_Ew, | |
| VERW_Ew, | |
| undef_op2, | |
| undef_op2, | |
| }; | |
| /* group 7 */ | /* group 7 */ |
| void (*insttable_G7_16[])(DWORD) = { | void (CPUCALL *insttable_G7[])(UINT32) = { |
| SGDT16_Ms, | SGDT_Ms, |
| SIDT16_Ms, | SIDT_Ms, |
| LGDT16_Ms, | LGDT_Ms, |
| LIDT16_Ms, | LIDT_Ms, |
| SMSW_Ew, | SMSW_Ew, |
| undef_op2, | undef_op2, |
| LMSW_Ew, | LMSW_Ew, |
| INVLPG, | INVLPG, |
| }; | }; |
| void (*insttable_G7_32[])(DWORD) = { | |
| SGDT32_Ms, | |
| SIDT32_Ms, | |
| LGDT32_Ms, | |
| LIDT32_Ms, | |
| SMSW_Ed, | |
| undef_op2, | |
| LMSW_Ew, | |
| INVLPG, | |
| }; | |
| /* group 8 */ | /* group 8 */ |
| void (*insttable_G8EwIb[])(DWORD) = { | void (CPUCALL *insttable_G8EwIb[])(UINT32) = { |
| undef_op2, | undef_op2, |
| undef_op2, | undef_op2, |
| undef_op2, | undef_op2, |
| Line 1770 void (*insttable_G8EwIb[])(DWORD) = { | Line 1743 void (*insttable_G8EwIb[])(DWORD) = { |
| BTC_EwIb, | BTC_EwIb, |
| }; | }; |
| void (*insttable_G8EdIb[])(DWORD) = { | void (CPUCALL *insttable_G8EdIb[])(UINT32) = { |
| undef_op2, | undef_op2, |
| undef_op2, | undef_op2, |
| undef_op2, | undef_op2, |
| Line 1782 void (*insttable_G8EdIb[])(DWORD) = { | Line 1755 void (*insttable_G8EdIb[])(DWORD) = { |
| }; | }; |
| /* group 9 */ | /* group 9 */ |
| void (*insttable_G9[])(DWORD) = { | void (CPUCALL *insttable_G9[])(UINT32) = { |
| undef_op2, | undef_op2, |
| CMPXCHG8B, | CMPXCHG8B, |
| undef_op2, | undef_op2, |