diff --git a/src/arch/i386.ins b/src/arch/i386.ins index 710c4bc..cfc7e4d 100644 --- a/src/arch/i386.ins +++ b/src/arch/i386.ins @@ -403,16 +403,61 @@ /* FBLD 0xdf /4 1 m80dec */ /* FIXME implement */ /* FBSTP 0xdf /6 1 m80bcd */ +/* FIXME implement */ /* FCHS 0xd9e0 2 */ { "fchs", 0xd9e0, OP2F, AOT_NONE, AOT_NONE, AOT_NONE }, /* FCLEX 0x9bdbe2 3 */ { "fclex", 0x9bdbe2, OP3F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* FCMOVcc */ /* FIXME implement */ /* FIADD 0xda /0 1 m32int */ /* FIXME implement */ /* FIADD 0xde /0 1 m64int */ +/* FIXME implement */ /* FNCLEX 0xdbe2 2 */ { "fnclex", 0xdbe2, OP2F, AOT_NONE, AOT_NONE, AOT_NONE }, -/* FIXME implement */ /* NOP 0x90 1 */ { "nop", 0x90, OP1F, AOT_NONE, AOT_NONE, AOT_NONE }, +/* XOR 0x30 /r 1 r/m8 r8 */ +{ "xor", 0x30, OP1F, OP_RM8_D0_R,OP_R8, AOT_NONE }, +{ "xor", 0x30, OP1F, OP_RM8_D8_R,OP_R8, AOT_NONE }, +{ "xor", 0x30, OP1F, OP_RM8_DW_R,OP_R8, AOT_NONE }, +{ "xor", 0x30, OP1F, OP_RM8_R8_R,OP_R8, AOT_NONE }, +/* XOR 0x31 /r 1 r/mW rW */ +{ "xor", 0x31, OP1F, OP_RMW_D0_R,OP_RW, AOT_NONE }, +{ "xor", 0x31, OP1F, OP_RMW_D8_R,OP_RW, AOT_NONE }, +{ "xor", 0x31, OP1F, OP_RMW_DW_R,OP_RW, AOT_NONE }, +{ "xor", 0x31, OP1F, OP_RMW_RW_R,OP_RW, AOT_NONE }, +/* XOR 0x32 /r 1 r8 r/m8 */ +#if 1 /* FIXME doesn't work at the moment */ +{ "xor", 0x32, OP1F, OP_RM8_R8_R,OP_RM8_D0_R,AOT_NONE }, +{ "xor", 0x32, OP1F, OP_RM8_R8_R,OP_RM8_D8_R,AOT_NONE }, +{ "xor", 0x32, OP1F, OP_RM8_R8_R,OP_RM8_DW_R,AOT_NONE }, +{ "xor", 0x32, OP1F, OP_RM8_R8_R,OP_RM8_R8_R,AOT_NONE }, +#endif +/* XOR 0x33 /r 1 rW r/mW */ +#if 1 /* FIXME doesn't work at the moment */ +{ "xor", 0x33, OP1F, OP_RMW_RW_R,OP_RMW_D0_R,AOT_NONE }, +{ "xor", 0x33, OP1F, OP_RMW_RW_R,OP_RMW_D8_R,AOT_NONE }, +{ "xor", 0x33, OP1F, OP_RMW_RW_R,OP_RMW_DW_R,AOT_NONE }, +{ "xor", 0x33, OP1F, OP_RMW_RW_R,OP_RMW_RW_R,AOT_NONE }, +#endif +/* XOR 0x34 ib 1 al imm8 */ +{ "xor", 0x34, OP1F, OP_al, OP_S8, AOT_NONE }, +/* XOR 0x35 iW 1 AX immW */ +{ "xor", 0x35, OP1F, OP_AX, OP_SW, AOT_NONE }, +/* XOR 0x80 /6 ib 1 r/m8 imm8 */ +{ "xor", 0x80, OP1F, OP_RM8_D0+6,OP_S8, AOT_NONE }, +{ "xor", 0x80, OP1F, OP_RM8_D8+6,OP_S8, AOT_NONE }, +{ "xor", 0x80, OP1F, OP_RM8_DW+6,OP_S8, AOT_NONE }, +{ "xor", 0x80, OP1F, OP_RM8_R8+6,OP_S8, AOT_NONE }, +/* XOR 0x81 /6 iW 1 r/mW imm8 */ +{ "xor", 0x81, OP1F, OP_RMW_D0+6,OP_SW, AOT_NONE }, +{ "xor", 0x81, OP1F, OP_RMW_D8+6,OP_SW, AOT_NONE }, +{ "xor", 0x81, OP1F, OP_RMW_DW+6,OP_SW, AOT_NONE }, +{ "xor", 0x81, OP1F, OP_RMW_RW+6,OP_SW, AOT_NONE }, +/* XOR 0x83 /6 i8 1 r/mW imm8 */ +{ "xor", 0x83, OP1F, OP_RMW_D0+6,OP_S8, AOT_NONE }, +{ "xor", 0x83, OP1F, OP_RMW_D8+6,OP_S8, AOT_NONE }, +{ "xor", 0x83, OP1F, OP_RMW_DW+6,OP_S8, AOT_NONE }, +{ "xor", 0x83, OP1F, OP_RMW_RW+6,OP_S8, AOT_NONE }, diff --git a/test/i386.S b/test/i386.S index 9e29714..5985cdf 100644 --- a/test/i386.S +++ b/test/i386.S @@ -145,3 +145,28 @@ fclex fnclex nop /* 0x90 */ + /* XOR */ + xor [%ecx], %dh /* 30 31 */ + xor [%ecx+$0x50], %dh /* 30 71 50 */ + xor %bl, %bh /* 30 fb */ + xor %eax, %eax /* 31 c0 */ + xor [%eax], %eax /* 31 00 */ +#if 1 /* FIXME doesn't work at the moment */ + xor %dh, [%ecx] /* 32 */ + xor %bl, %bh /* 32 */ + xor %edx, [%ecx] /* 33 */ + xor %ebx, %ebx /* 33 */ +#endif + xor %al, $0x40 /* 34 40 */ + xor %eax, $0x41424344 /* 35 44 43 42 41 */ + xor [%edx], $0x46 /* 80 32 46 */ + xor [%ebx + $0x15], $0x47 /* 80 73 15 47 */ + xor [%ebx + $0x16171819], $0x48 /* 80 b3 19 18 17 16 48 */ + xor %cl, $0x45 /* 80 f1 45 */ + xor [%edx], $0x46474849 /* 81 32 46 47 48 49 */ + xor [%ebx + $0x14], $0x4748494a /* 81 73 14 47 48 49 4a */ + xor [%ebx + $0x16171819], $0x48494a4b + /* 81 b3 19 18 17 16 4b */ + /* 4a 49 48 */ + xor %ecx, $0x45464748 /* 81 f1 45 46 47 48 */ + xor [%eax], -$0x02 /* 83 30 fe */