@ -5,8 +5,8 @@
DEF_ASM_OP0 ( cmc , 0xf5 )
DEF_ASM_OP0 ( lahf , 0x9f )
DEF_ASM_OP0 ( sahf , 0x9e )
DEF_ASM_OP0 ( pushfl , 0x9c )
DEF_ASM_OP0 ( popfl , 0x9d )
DEF_ASM_OP0 ( pushfq , 0x9c )
DEF_ASM_OP0 ( popfq , 0x9d )
DEF_ASM_OP0 ( pushf , 0x9c )
DEF_ASM_OP0 ( popf , 0x9d )
DEF_ASM_OP0 ( stc , 0xf9 )
@ -34,14 +34,15 @@
DEF_ASM_OP0 ( hlt , 0xf4 )
DEF_ASM_OP0 ( wait , 0x9b )
DEF_ASM_OP0 ( nop , 0x90 )
DEF_ASM_OP0 ( pause , 0xf390 )
DEF_ASM_OP0 ( xlat , 0xd7 )
/* strings */
ALT ( DEF_ASM_OP0L ( cmpsb , 0xa6 , 0 , OPC_BWLQ ) )
ALT ( DEF_ASM_OP0L ( scmpb , 0xa6 , 0 , OPC_BWLQ ) )
ALT ( DEF_ASM_OP0L ( insb , 0x6c , 0 , OPC_BWLQ ) )
ALT ( DEF_ASM_OP0L ( outsb , 0x6e , 0 , OPC_BWLQ ) )
ALT ( DEF_ASM_OP0L ( insb , 0x6c , 0 , OPC_BWL ) )
ALT ( DEF_ASM_OP0L ( outsb , 0x6e , 0 , OPC_BWL ) )
ALT ( DEF_ASM_OP0L ( lodsb , 0xac , 0 , OPC_BWLQ ) )
ALT ( DEF_ASM_OP0L ( slodb , 0xac , 0 , OPC_BWLQ ) )
@ -90,8 +91,10 @@ ALT(DEF_ASM_OP2(btcw, 0x0fba, 7, OPC_MODRM | OPC_WLQ, OPT_IM8, OPT_REGW | OPT_EA
DEF_ASM_OP0 ( ud2 , 0x0f0b )
/* NOTE: we took the same order as gas opcode definition order */
/* Right now we can't express the fact that 0xa1/0xa3 can't use $eax and a
32 bit moffset as operands .
ALT ( DEF_ASM_OP2 ( movb , 0xa0 , 0 , OPC_BWLQ , OPT_ADDR , OPT_EAX ) )
ALT ( DEF_ASM_OP2 ( movb , 0xa2 , 0 , OPC_BWLQ , OPT_EAX , OPT_ADDR ) )
ALT ( DEF_ASM_OP2 ( movb , 0xa2 , 0 , OPC_BWLQ , OPT_EAX , OPT_ADDR ) ) */
ALT ( DEF_ASM_OP2 ( movb , 0x88 , 0 , OPC_MODRM | OPC_BWLQ , OPT_REG , OPT_EA | OPT_REG ) )
ALT ( DEF_ASM_OP2 ( movb , 0x8a , 0 , OPC_MODRM | OPC_BWLQ , OPT_EA | OPT_REG , OPT_REG ) )
ALT ( DEF_ASM_OP2 ( movb , 0xb0 , 0 , OPC_REG | OPC_BWLQ , OPT_IM , OPT_REG ) )
@ -102,25 +105,28 @@ ALT(DEF_ASM_OP2(movw, 0x8e, 0, OPC_MODRM | OPC_WLQ, OPT_EA | OPT_REG, OPT_SEG))
ALT ( DEF_ASM_OP2 ( movw , 0x0f20 , 0 , OPC_MODRM | OPC_WLQ , OPT_CR , OPT_REG64 ) )
ALT ( DEF_ASM_OP2 ( movw , 0x0f21 , 0 , OPC_MODRM | OPC_WLQ , OPT_DB , OPT_REG64 ) )
ALT ( DEF_ASM_OP2 ( movw , 0x0f24 , 0 , OPC_MODRM | OPC_WLQ , OPT_TR , OPT_REG64 ) )
ALT ( DEF_ASM_OP2 ( movw , 0x0f22 , 0 , OPC_MODRM | OPC_WLQ , OPT_REG64 , OPT_CR ) )
ALT ( DEF_ASM_OP2 ( movw , 0x0f23 , 0 , OPC_MODRM | OPC_WLQ , OPT_REG64 , OPT_DB ) )
ALT ( DEF_ASM_OP2 ( movw , 0x0f26 , 0 , OPC_MODRM | OPC_WLQ , OPT_REG64 , OPT_TR ) )
ALT ( DEF_ASM_OP2 ( movsbl , 0x0fbe , 0 , OPC_MODRM , OPT_REG8 | OPT_EA , OPT_REG32 ) )
ALT ( DEF_ASM_OP2 ( movsbw , 0x0fbe , 0 , OPC_MODRM | OPC_D16 , OPT_REG8 | OPT_EA , OPT_REG16 ) )
ALT ( DEF_ASM_OP2 ( movswl , 0x0fbf , 0 , OPC_MODRM , OPT_REG16 | OPT_EA , OPT_REG32 ) )
ALT ( DEF_ASM_OP2 ( movslq , 0x4863 , 0 , OPC_MODRM , OPT_REG32 | OPT_EA , OPT_REG ) )
ALT ( DEF_ASM_OP2 ( movzbw , 0x0fb6 , 0 , OPC_MODRM | OPC_WL , OPT_REG8 | OPT_EA , OPT_REGW ) )
ALT ( DEF_ASM_OP2 ( movzbw , 0x0fb6 , 0 , OPC_MODRM | OPC_WLQ , OPT_REG8 | OPT_EA , OPT_REGW ) )
ALT ( DEF_ASM_OP2 ( movzwl , 0x0fb7 , 0 , OPC_MODRM , OPT_REG16 | OPT_EA , OPT_REG32 ) )
ALT ( DEF_ASM_OP1 ( pushq , 0x6a , 0 , 0 , OPT_IM8S ) )
ALT ( DEF_ASM_OP1 ( push , 0x6a , 0 , 0 , OPT_IM8S ) )
ALT ( DEF_ASM_OP1 ( pushw , 0x6a , 0 , OPC_D16 , OPT_IM8S ) )
ALT ( DEF_ASM_OP1 ( pushw , 0x50 , 0 , OPC_REG | OPC_WLQ , OPT_REG64 ) )
ALT ( DEF_ASM_OP1 ( pushw , 0x50 , 0 , OPC_REG | OPC_WLQ , OPT_REG16 ) )
ALT ( DEF_ASM_OP1 ( pushw , 0xff , 6 , OPC_MODRM | OPC_WLQ , OPT_REG64 | OPT_EA ) )
ALT ( DEF_ASM_OP1 ( pushw , 0x68 , 0 , OPC_D16 , OPT_IM16 ) )
ALT ( DEF_ASM_OP1 ( pushw , 0x68 , 0 , OPC_WLQ , OPT_IM32 ) )
ALT ( DEF_ASM_OP1 ( pushw , 0x06 , 0 , OPC_WLQ , OPT_SEG ) )
DEF_ASM_OP1 ( pushb , 0x6a , 0 , OPC_B , OPT_IM8S )
ALT ( DEF_ASM_OP1 ( popw , 0x58 , 0 , OPC_REG | OPC_WLQ , OPT_REGW ) )
ALT ( DEF_ASM_OP1 ( popw , 0x58 , 0 , OPC_REG | OPC_WLQ , OPT_REG64 ) )
ALT ( DEF_ASM_OP1 ( popw , 0x58 , 0 , OPC_REG | OPC_WLQ , OPT_REG16 ) )
ALT ( DEF_ASM_OP1 ( popw , 0x8f , 0 , OPC_MODRM | OPC_WLQ , OPT_REGW | OPT_EA ) )
ALT ( DEF_ASM_OP1 ( popw , 0x07 , 0 , OPC_WLQ , OPT_SEG ) )
@ -154,8 +160,8 @@ ALT(DEF_ASM_OP2(addb, 0x04, 0, OPC_ARITH | OPC_BWLQ, OPT_IMNO64, OPT_EAX))
ALT ( DEF_ASM_OP2 ( addb , 0x80 , 0 , OPC_ARITH | OPC_MODRM | OPC_BWLQ , OPT_IMNO64 , OPT_EA | OPT_REG ) )
ALT ( DEF_ASM_OP2 ( addw , 0x83 , 0 , OPC_ARITH | OPC_MODRM | OPC_WLQ , OPT_IM8S , OPT_EA | OPT_REG ) )
ALT ( DEF_ASM_OP2 ( testb , 0x84 , 0 , OPC_MODRM | OPC_BWLQ , OPT_EA | OPT_REG , OPT_REG ) )
ALT ( DEF_ASM_OP2 ( testb , 0x84 , 0 , OPC_MODRM | OPC_BWLQ , OPT_REG , OPT_EA | OPT_REG ) )
ALT ( DEF_ASM_OP2 ( testb , 0x84 , 0 , OPC_MODRM | OPC_BWLQ , OPT_EA | OPT_REG , OPT_REG ) )
ALT ( DEF_ASM_OP2 ( testb , 0xa8 , 0 , OPC_BWLQ , OPT_IMNO64 , OPT_EAX ) )
ALT ( DEF_ASM_OP2 ( testb , 0xf6 , 0 , OPC_MODRM | OPC_BWLQ , OPT_IMNO64 , OPT_EA | OPT_REG ) )
@ -206,7 +212,9 @@ ALT(DEF_ASM_OP1(setob, 0x0f90, 0, OPC_MODRM | OPC_TEST, OPT_REG8 | OPT_EA))
DEF_ASM_OP2 ( enter , 0xc8 , 0 , 0 , OPT_IM16 , OPT_IM8 )
DEF_ASM_OP0 ( leave , 0xc9 )
DEF_ASM_OP0 ( ret , 0xc3 )
DEF_ASM_OP0 ( retq , 0xc3 )
ALT ( DEF_ASM_OP1 ( ret , 0xc2 , 0 , 0 , OPT_IM16 ) )
ALT ( DEF_ASM_OP1 ( retq , 0xc2 , 0 , 0 , OPT_IM16 ) )
DEF_ASM_OP0 ( lret , 0xcb )
ALT ( DEF_ASM_OP1 ( lret , 0xca , 0 , 0 , OPT_IM16 ) )
@ -216,7 +224,7 @@ ALT(DEF_ASM_OP1(jo, 0x70, 0, OPC_SHORTJMP | OPC_JMP | OPC_TEST, OPT_ADDR))
DEF_ASM_OP1 ( loope , 0xe1 , 0 , OPC_SHORTJMP , OPT_ADDR )
DEF_ASM_OP1 ( loopz , 0xe1 , 0 , OPC_SHORTJMP , OPT_ADDR )
DEF_ASM_OP1 ( loop , 0xe2 , 0 , OPC_SHORTJMP , OPT_ADDR )
DEF_ASM_OP1 ( jecxz , 0xe3 , 0 , OPC_SHORTJMP , OPT_ADDR )
DEF_ASM_OP1 ( jecxz , 0x67 e3 , 0 , OPC_SHORTJMP , OPT_ADDR )
/* float */
/* specific fcomp handling */
@ -224,6 +232,8 @@ ALT(DEF_ASM_OP0L(fcomp, 0xd8d9, 0, 0))
ALT ( DEF_ASM_OP1 ( fadd , 0xd8c0 , 0 , OPC_FARITH | OPC_REG , OPT_ST ) )
ALT ( DEF_ASM_OP2 ( fadd , 0xd8c0 , 0 , OPC_FARITH | OPC_REG , OPT_ST , OPT_ST0 ) )
ALT ( DEF_ASM_OP2 ( fadd , 0xdcc0 , 0 , OPC_FARITH | OPC_REG , OPT_ST0 , OPT_ST ) )
ALT ( DEF_ASM_OP2 ( fmul , 0xdcc8 , 0 , OPC_FARITH | OPC_REG , OPT_ST0 , OPT_ST ) )
ALT ( DEF_ASM_OP0L ( fadd , 0xdec1 , 0 , OPC_FARITH ) )
ALT ( DEF_ASM_OP1 ( faddp , 0xdec0 , 0 , OPC_FARITH | OPC_REG , OPT_ST ) )
ALT ( DEF_ASM_OP2 ( faddp , 0xdec0 , 0 , OPC_FARITH | OPC_REG , OPT_ST , OPT_ST0 ) )
@ -334,7 +344,7 @@ ALT(DEF_ASM_OP1(fstsw, 0xdd, 7, OPC_MODRM | OPC_FWAIT, OPT_EA ))
DEF_ASM_OP1 ( lidt , 0x0f01 , 3 , OPC_MODRM , OPT_EA )
DEF_ASM_OP1 ( lldt , 0x0f00 , 2 , OPC_MODRM , OPT_EA | OPT_REG )
DEF_ASM_OP1 ( lmsw , 0x0f01 , 6 , OPC_MODRM , OPT_EA | OPT_REG )
ALT ( DEF_ASM_OP2 ( lslw , 0x0f03 , 0 , OPC_MODRM | OPC_WL , OPT_EA | OPT_REG , OPT_REG ) )
ALT ( DEF_ASM_OP2 ( lslw , 0x0f03 , 0 , OPC_MODRM | OPC_WLQ , OPT_EA | OPT_REG , OPT_REG ) )
DEF_ASM_OP1 ( ltr , 0x0f00 , 3 , OPC_MODRM , OPT_EA | OPT_REG )
DEF_ASM_OP1 ( sgdt , 0x0f01 , 0 , OPC_MODRM , OPT_EA )
DEF_ASM_OP1 ( sidt , 0x0f01 , 1 , OPC_MODRM , OPT_EA )
@ -346,8 +356,8 @@ ALT(DEF_ASM_OP2(lslw, 0x0f03, 0, OPC_MODRM | OPC_WL, OPT_EA | OPT_REG, OPT_REG))
/* 486 */
DEF_ASM_OP1 ( bswap , 0x0fc8 , 0 , OPC_REG , OPT_REG32 )
ALT ( DEF_ASM_OP2 ( xaddb , 0x0fc0 , 0 , OPC_MODRM | OPC_BWL , OPT_REG , OPT_REG | OPT_EA ) )
ALT ( DEF_ASM_OP2 ( cmpxchgb , 0x0fb0 , 0 , OPC_MODRM | OPC_BWL , OPT_REG , OPT_REG | OPT_EA ) )
ALT ( DEF_ASM_OP2 ( xaddb , 0x0fc0 , 0 , OPC_MODRM | OPC_BWLQ , OPT_REG , OPT_REG | OPT_EA ) )
ALT ( DEF_ASM_OP2 ( cmpxchgb , 0x0fb0 , 0 , OPC_MODRM | OPC_BWLQ , OPT_REG , OPT_REG | OPT_EA ) )
DEF_ASM_OP1 ( invlpg , 0x0f01 , 7 , OPC_MODRM , OPT_EA )
DEF_ASM_OP2 ( boundl , 0x62 , 0 , OPC_MODRM , OPT_REG32 , OPT_EA )
@ -383,6 +393,7 @@ ALT(DEF_ASM_OP2(cmova, 0x0f47, 0, OPC_MODRM | OPC_TEST, OPT_REG32 | OPT_EA, OPT_
/* mmx */
DEF_ASM_OP0 ( emms , 0x0f77 ) /* must be last OP0 */
DEF_ASM_OP2 ( movd , 0x0f6e , 0 , OPC_MODRM , OPT_EA | OPT_REG32 , OPT_MMX )
ALT ( DEF_ASM_OP2 ( movd , 0x0f6e , 0 , OPC_MODRM , OPT_EA | OPT_REG64 , OPT_MMX ) )
ALT ( DEF_ASM_OP2 ( movd , 0x0f7e , 0 , OPC_MODRM , OPT_MMX , OPT_EA | OPT_REG32 ) )
ALT ( DEF_ASM_OP2 ( movq , 0x0f6f , 0 , OPC_MODRM , OPT_EA | OPT_MMX , OPT_MMX ) )
ALT ( DEF_ASM_OP2 ( movq , 0x0f7f , 0 , OPC_MODRM , OPT_MMX , OPT_EA | OPT_MMX ) )