diff options
Diffstat (limited to 'x86/gen/parser.hgen')
| -rw-r--r-- | x86/gen/parser.hgen | 600 |
1 files changed, 0 insertions, 600 deletions
diff --git a/x86/gen/parser.hgen b/x86/gen/parser.hgen deleted file mode 100644 index b3c9dc72..00000000 --- a/x86/gen/parser.hgen +++ /dev/null @@ -1,600 +0,0 @@ -| BINOP imm COMMA addr - { `X86BINOP (false, $1.op, suffix_size $1.sz, Rm_i ($4, bit64_of_int $2)) } -| LOCK BINOP imm COMMA addr - { check_binop_lockable $2.op - ; `X86BINOP (true, $2.op, suffix_size $2.sz, Rm_i ($5, bit64_of_int $3)) } -| BINOP imm COMMA breg - { check_size ($1.sz, X86BYTE) - ; `X86BINOP (false, $1.op, X86S8 ($4.high), Rm_i (Reg (IReg ($4.reg)), bit64_of_int $2)) - } -| BINOP breg COMMA breg - { check_size ($1.sz, X86BYTE) - ; check_byte_regs ($2, $4) - ; `X86BINOP (false, $1.op, X86S8 ($4.high), Rm_r (Reg (IReg ($4.reg)), IReg ($2.reg))) - } -| BINOP addr COMMA breg - { check_size ($1.sz, X86BYTE) - ; `X86BINOP (false, $1.op, X86S8 ($4.high), R_rm (IReg ($4.reg), $2)) - } -| BINOP breg COMMA addr - { check_size ($1.sz, X86BYTE) - ; `X86BINOP (false, $1.op, X86S8 ($2.high), Rm_r ($4, IReg ($2.reg))) - } -| LOCK BINOP breg COMMA addr - { check_binop_lockable $2.op - ; check_size ($2.sz, X86BYTE) - ; `X86BINOP (true, $2.op, X86S8 ($3.high), Rm_r ($5, IReg ($3.reg))) - } -| BINOP imm COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86BINOP (false, $1.op, X86S16, Rm_i (Reg $4, bit64_of_int $2)) - } -| BINOP wreg COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86BINOP (false, $1.op, X86S16, Rm_r (Reg $4, $2)) - } -| BINOP addr COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86BINOP (false, $1.op, X86S16, R_rm ($4, $2)) - } -| BINOP wreg COMMA addr - { check_size ($1.sz, X86WORD) - ; `X86BINOP (false, $1.op, X86S16, Rm_r ($4, $2)) - } -| LOCK BINOP wreg COMMA addr - { check_binop_lockable $2.op - ; check_size ($2.sz, X86WORD) - ; `X86BINOP (true, $2.op, X86S16, Rm_r ($5, $3)) - } -| BINOP imm COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86BINOP (false, $1.op, X86S32, Rm_i (Reg $4, bit64_of_int $2)) - } -| BINOP lreg COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86BINOP (false, $1.op, X86S32, Rm_r (Reg $4, $2)) - } -| BINOP addr COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86BINOP (false, $1.op, X86S32, R_rm ($4, $2)) - } -| BINOP lreg COMMA addr - { check_size ($1.sz, X86LONG) - ; `X86BINOP (false, $1.op, X86S32, Rm_r ($4, $2)) - } -| LOCK BINOP lreg COMMA addr - { check_binop_lockable $2.op - ; check_size ($2.sz, X86LONG) - ; `X86BINOP (true, $2.op, X86S32, Rm_r ($5, $3)) - } -| BINOP imm COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86BINOP (false, $1.op, X86S64, Rm_i (Reg $4, bit64_of_int $2)) - } -| BINOP qreg COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86BINOP (false, $1.op, X86S64, Rm_r (Reg $4, $2)) - } -| BINOP addr COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86BINOP (false, $1.op, X86S64, R_rm ($4, $2)) - } -| BINOP qreg COMMA addr - { check_size ($1.sz, X86QUAD) - ; `X86BINOP (false, $1.op, X86S64, Rm_r ($4, $2)) - } -| LOCK BINOP qreg COMMA addr - { check_binop_lockable $2.op - ; check_size ($2.sz, X86QUAD) - ; `X86BINOP (true, $2.op, X86S64, Rm_r ($5, $3)) - } -| BITOP imm COMMA addr - { `X86BITOP (false, $1.op, suffix_size $1.sz, Bit_rm_imm ($4, $2)) - } -| LOCK BITOP imm COMMA addr - { `X86BITOP (true, $2.op, suffix_size $2.sz, Bit_rm_imm ($5, $3)) - } -| BITOP imm COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86BITOP (false, $1.op, X86S16, Bit_rm_imm (Reg $4, $2)) - } -| LOCK BITOP imm COMMA wreg - { check_size ($2.sz, X86WORD) - ; `X86BITOP (true, $2.op, X86S16, Bit_rm_imm (Reg $5, $3)) - } -| BITOP wreg COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86BITOP (true, $1.op, X86S16, Bit_rm_r (Reg $4, $2)) - } -| LOCK BITOP wreg COMMA wreg - { check_size ($2.sz, X86WORD) - ; `X86BITOP (false, $2.op, X86S16, Bit_rm_r (Reg $5, $3)) - } -| BITOP wreg COMMA addr - { check_size ($1.sz, X86WORD) - ; `X86BITOP (false, $1.op, X86S16, Bit_rm_r ($4, $2)) - } -| LOCK BITOP wreg COMMA addr - { check_size ($2.sz, X86WORD) - ; `X86BITOP (true, $2.op, X86S16, Bit_rm_r ($5, $3)) - } -| BITOP imm COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86BITOP (false, $1.op, X86S32, Bit_rm_imm (Reg $4, $2)) - } -| LOCK BITOP imm COMMA lreg - { check_size ($2.sz, X86LONG) - ; `X86BITOP (true, $2.op, X86S32, Bit_rm_imm (Reg $5, $3)) - } -| BITOP lreg COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86BITOP (false, $1.op, X86S32, Bit_rm_r (Reg $4, $2)) - } -| LOCK BITOP lreg COMMA lreg - { check_size ($2.sz, X86LONG) - ; `X86BITOP (true, $2.op, X86S32, Bit_rm_r (Reg $5, $3)) - } -| BITOP lreg COMMA addr - { check_size ($1.sz, X86LONG) - ; `X86BITOP (false, $1.op, X86S32, Bit_rm_r ($4, $2)) - } -| LOCK BITOP lreg COMMA addr - { check_size ($2.sz, X86LONG) - ; `X86BITOP (true, $2.op, X86S32, Bit_rm_r ($5, $3)) - } -| BITOP imm COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86BITOP (false, $1.op, X86S64, Bit_rm_imm (Reg $4, $2)) - } -| LOCK BITOP imm COMMA qreg - { check_size ($2.sz, X86QUAD) - ; `X86BITOP (true, $2.op, X86S64, Bit_rm_imm (Reg $5, $3)) - } -| BITOP qreg COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86BITOP (false, $1.op, X86S64, Bit_rm_r (Reg $4, $2)) - } -| LOCK BITOP qreg COMMA qreg - { check_size ($2.sz, X86QUAD) - ; `X86BITOP (true, $2.op, X86S64, Bit_rm_r (Reg $5, $3)) - } -| BITOP qreg COMMA addr - { check_size ($1.sz, X86QUAD) - ; `X86BITOP (false, $1.op, X86S64, Bit_rm_r ($4, $2)) - } -| LOCK BITOP qreg COMMA addr - { check_size ($2.sz, X86QUAD) - ; `X86BITOP (true, $2.op, X86S64, Bit_rm_r ($5, $3)) - } -| CALL big_imm - { `X86CALL (Imm $2) } -| CALL addr - { `X86CALL (Rm $2) } -| CALL qreg - { `X86CALL (Rm (Reg $2)) } -| CLC - { `X86CLC } -| CMC - { `X86CMC } -| CMOV addr COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86MOV ($1.cond, X86S16, R_rm ($4, $2)) - } -| CMOV addr COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86MOV ($1.cond, X86S32, R_rm ($4, $2)) - } -| CMOV addr COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86MOV ($1.cond, X86S64, R_rm ($4, $2)) - } -| CMOV wreg COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86MOV ($1.cond, X86S16, R_rm ($4, Reg $2)) - } -| CMOV lreg COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86MOV ($1.cond, X86S32, R_rm ($4, Reg $2)) - } -| CMOV qreg COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86MOV ($1.cond, X86S64, R_rm ($4, Reg $2)) - } -| CMPXCHG breg COMMA breg - { check_size ($1.sz, X86BYTE) - ; check_byte_regs ($2, $4) - ; `X86CMPXCHG (false, X86S8 ($2.high), Reg (IReg ($4.reg)), IReg ($2.reg)) - } -| CMPXCHG breg COMMA addr - { check_size ($1.sz, X86BYTE) - ; `X86CMPXCHG (false, X86S8 ($2.high), $4, IReg ($2.reg)) - } -| LOCK CMPXCHG breg COMMA addr - { check_size ($2.sz, X86BYTE) - ; `X86CMPXCHG (true, X86S8 ($3.high), $5, IReg ($3.reg)) - } -| CMPXCHG wreg COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86CMPXCHG (false, X86S16, Reg $4, $2) - } -| CMPXCHG wreg COMMA addr - { check_size ($1.sz, X86WORD) - ; `X86CMPXCHG (false, X86S16, $4, $2) - } -| LOCK CMPXCHG wreg COMMA addr - { check_size ($2.sz, X86WORD) - ; `X86CMPXCHG (true, X86S16, $5, $3) - } -| CMPXCHG lreg COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86CMPXCHG (false, X86S32, Reg $4, $2) - } -| CMPXCHG lreg COMMA addr - { check_size ($1.sz, X86LONG) - ; `X86CMPXCHG (false, X86S32, $4, $2) - } -| LOCK CMPXCHG lreg COMMA addr - { check_size ($2.sz, X86LONG) - ; `X86CMPXCHG (true, X86S32, $5, $3) - } -| CMPXCHG qreg COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86CMPXCHG (false, X86S64, Reg $4, $2) - } -| CMPXCHG qreg COMMA addr - { check_size ($1.sz, X86QUAD) - ; `X86CMPXCHG (false, X86S64, $4, $2) - } -| LOCK CMPXCHG qreg COMMA addr - { check_size ($2.sz, X86QUAD) - ; `X86CMPXCHG (true, X86S64, $5, $3) - } -| DIV addr - { `X86DIV (suffix_size $1.sz, $2) } -| DIV breg - { check_size ($1.sz, X86BYTE) - ; `X86DIV (X86S8 ($2.high), Reg (IReg ($2.reg))) - } -| DIV wreg - { check_size ($1.sz, X86WORD) - ; `X86DIV (X86S16, Reg $2) - } -| DIV lreg - { check_size ($1.sz, X86LONG) - ; `X86DIV (X86S32, Reg $2) - } -| DIV qreg - { check_size ($1.sz, X86QUAD) - ; `X86DIV (X86S64, Reg $2) - } -| JCC big_num - { `X86JCC ($1.cond, $2) } -| JMP big_num - { `X86JCC (X86ALWAYS, $2) } -| JMP addr - { `X86JMP $2 } -| JMP qreg - { `X86JMP (Reg $2) } -| LEA addr COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86LEA (X86S16, R_rm ($4, $2)) - } -| LEA addr COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86LEA (X86S32, R_rm ($4, $2)) - } -| LEA addr COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86LEA (X86S64, R_rm ($4, $2)) - } -| LEAVE - { `X86LEAVE } -| LOOP big_num - { `X86LOOP ($1.cond, $2) } -| MFENCE - { `X86MFENCE } -| MONOP addr - { `X86MONOP (false, $1.op, suffix_size $1.sz, $2) } -| LOCK MONOP addr - { `X86MONOP (true, $2.op, suffix_size $2.sz, $3) } -| MONOP breg - { check_size ($1.sz, X86BYTE) - ; `X86MONOP (false, $1.op, X86S8 ($2.high), Reg (IReg $2.reg)) - } -| MONOP wreg - { check_size ($1.sz, X86WORD) - ; `X86MONOP (false, $1.op, X86S16, Reg $2) - } -| MONOP lreg - { check_size ($1.sz, X86LONG) - ; `X86MONOP (false, $1.op, X86S32, Reg $2) - } -| MONOP qreg - { check_size ($1.sz, X86QUAD) - ; `X86MONOP (false, $1.op, X86S64, Reg $2) - } -| MOV big_imm COMMA addr - { `X86MOV (X86ALWAYS, suffix_size $1.sz, Rm_i ($4, $2)) } -| MOV imm COMMA breg - { check_size ($1.sz, X86BYTE) - ; `X86MOV (X86ALWAYS, X86S8 ($4.high), Rm_i (Reg (IReg $4.reg), bit64_of_int $2)) - } -| MOV breg COMMA breg - { check_size ($1.sz, X86BYTE) - ; check_byte_regs ($2, $4) - ; `X86MOV (X86ALWAYS, X86S8 ($4.high), Rm_r (Reg (IReg $4.reg), (IReg $2.reg))) - } -| MOV addr COMMA breg - { check_size ($1.sz, X86BYTE) - ; `X86MOV (X86ALWAYS, X86S8 ($4.high), R_rm (IReg $4.reg, $2)) - } -| MOV breg COMMA addr - { check_size ($1.sz, X86BYTE) - ; `X86MOV (X86ALWAYS, X86S8 ($2.high), Rm_r ($4, IReg $2.reg)) - } -| MOV imm COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86MOV (X86ALWAYS, X86S16, Rm_i (Reg $4, bit64_of_int $2)) - } -| MOV wreg COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86MOV (X86ALWAYS, X86S16, Rm_r (Reg $4, $2)) - } -| MOV addr COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86MOV (X86ALWAYS, X86S16, R_rm ($4, $2)) - } -| MOV wreg COMMA addr - { check_size ($1.sz, X86WORD) - ; `X86MOV (X86ALWAYS, X86S16, Rm_r ($4, $2)) - } -| MOV imm COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86MOV (X86ALWAYS, X86S32, Rm_i (Reg $4, bit64_of_int $2)) - } -| MOV lreg COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86MOV (X86ALWAYS, X86S32, Rm_r (Reg $4, $2)) - } -| MOV addr COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86MOV (X86ALWAYS, X86S32, R_rm ($4, $2)) - } -| MOV lreg COMMA addr - { check_size ($1.sz, X86LONG) - ; `X86MOV (X86ALWAYS, X86S32, Rm_r ($4, $2)) - } -| MOV big_imm COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86MOV (X86ALWAYS, X86S64, Rm_i (Reg $4, $2)) - } -| MOV qreg COMMA qreg - { check_size ($1.sz, X86QUAD) - ; if $1.txt = "MOVABS" then failwith "movabs expects and immediate" else () - ; `X86MOV (X86ALWAYS, X86S64, Rm_r (Reg $4, $2)) - } -| MOV addr COMMA qreg - { check_size ($1.sz, X86QUAD) - ; if $1.txt = "MOVABS" then failwith "movabs expects and immediate" else () - ; `X86MOV (X86ALWAYS, X86S64, R_rm ($4, $2)) - } -| MOV qreg COMMA addr - { check_size ($1.sz, X86QUAD) - ; if $1.txt = "MOVABS" then failwith "movabs expects and immediate" else () - ; `X86MOV (X86ALWAYS, X86S64, Rm_r ($4, $2)) - } -| MOVSX breg COMMA wreg - { check_size ($1.sz1, X86BYTE) - ; check_size ($1.sz2, X86WORD) - ; `X86MOVSX (X86S16, R_rm ($4, Reg (IReg $2.reg)), X86S8 $2.high) - } -| MOVSX breg COMMA lreg - { check_size ($1.sz1, X86BYTE) - ; check_size ($1.sz2, X86LONG) - ; `X86MOVSX (X86S32, R_rm ($4, Reg (IReg $2.reg)), X86S8 $2.high) - } -| MOVSX breg COMMA qreg - { check_size ($1.sz1, X86BYTE) - ; check_size ($1.sz2, X86QUAD) - ; `X86MOVSX (X86S64, R_rm ($4, Reg (IReg $2.reg)), X86S8 $2.high) - } -| MOVSX wreg COMMA lreg - { check_size ($1.sz1, X86WORD) - ; check_size ($1.sz2, X86LONG) - ; `X86MOVSX (X86S32, R_rm ($4, Reg $2), X86S16) - } -| MOVSX wreg COMMA qreg - { check_size ($1.sz1, X86WORD) - ; check_size ($1.sz2, X86QUAD) - ; `X86MOVSX (X86S64, R_rm ($4, Reg $2), X86S16) - } -| MOVSX lreg COMMA qreg - { check_size ($1.sz1, X86LONG) - ; check_size ($1.sz2, X86QUAD) - ; `X86MOVSX (X86S64, R_rm ($4, Reg $2), X86S32) - } -| MOVSX addr COMMA wreg - { check_size ($1.sz2, X86WORD) - ; `X86MOVSX (X86S16, R_rm ($4, $2), suffix_size $1.sz1) - } -| MOVSX addr COMMA lreg - { check_size ($1.sz2, X86LONG) - ; `X86MOVSX (X86S32, R_rm ($4, $2), suffix_size $1.sz1) - } -| MOVSX addr COMMA qreg - { check_size ($1.sz2, X86QUAD) - ; `X86MOVSX (X86S64, R_rm ($4, $2), suffix_size $1.sz1) - } -| MOVZX breg COMMA wreg - { check_size ($1.sz1, X86BYTE) - ; check_size ($1.sz2, X86WORD) - ; `X86MOVZX (X86S16, R_rm ($4, Reg (IReg $2.reg)), X86S8 $2.high) - } -| MOVZX breg COMMA lreg - { check_size ($1.sz1, X86BYTE) - ; check_size ($1.sz2, X86LONG) - ; `X86MOVZX (X86S32, R_rm ($4, Reg (IReg $2.reg)), X86S8 $2.high) - } -| MOVZX breg COMMA qreg - { check_size ($1.sz1, X86BYTE) - ; check_size ($1.sz2, X86QUAD) - ; `X86MOVZX (X86S64, R_rm ($4, Reg (IReg $2.reg)), X86S8 $2.high) - } -| MOVZX wreg COMMA lreg - { check_size ($1.sz1, X86WORD) - ; check_size ($1.sz2, X86LONG) - ; `X86MOVZX (X86S32, R_rm ($4, Reg $2), X86S16) - } -| MOVZX wreg COMMA qreg - { check_size ($1.sz1, X86WORD) - ; check_size ($1.sz2, X86QUAD) - ; `X86MOVZX (X86S64, R_rm ($4, Reg $2), X86S16) - } -| MOVZX addr COMMA wreg - { check_size ($1.sz2, X86WORD) - ; `X86MOVZX (X86S16, R_rm ($4, $2), suffix_size $1.sz1) - } -| MOVZX addr COMMA lreg - { check_size ($1.sz2, X86LONG) - ; `X86MOVZX (X86S32, R_rm ($4, $2), suffix_size $1.sz1) - } -| MOVZX addr COMMA qreg - { check_size ($1.sz2, X86QUAD) - ; `X86MOVZX (X86S64, R_rm ($4, $2), suffix_size $1.sz1) - } -| MUL addr - { `X86MUL (suffix_size $1.sz, $2) } -| MUL breg - { check_size ($1.sz, X86BYTE) - ; `X86MUL (X86S8 ($2.high), Reg (IReg $2.reg)) - } -| MUL wreg - { check_size ($1.sz, X86WORD) - ; `X86MUL (X86S16, Reg $2) - } -| MUL lreg - { check_size ($1.sz, X86LONG) - ; `X86MUL (X86S32, Reg $2) - } -| MUL qreg - { check_size ($1.sz, X86QUAD) - ; `X86MUL (X86S64, Reg $2) - } -| NOP - { `X86NOP } -| POP qreg - { `X86POP (Reg $2) } -| POP addr - { `X86POP $2 } -| PUSH big_imm - { `X86PUSH (Imm $2) } -| PUSH addr - { `X86PUSH (Rm $2) } -| PUSH qreg - { `X86PUSH (Rm (Reg $2)) } -| RET big_imm - { `X86RET $2 } -| SET breg - { `X86SET ($1.cond, $2.high, Reg (IReg $2.reg)) } -| SET addr - { `X86SET ($1.cond, false, $2) } -| STC - { `X86STC } -| XADD breg COMMA breg - { check_size ($1.sz, X86BYTE) - ; check_byte_regs ($2, $4) - ; `X86XADD (false, X86S8 ($2.high), Reg (IReg $4.reg), (IReg $2.reg)) - } -| XADD breg COMMA addr - { check_size ($1.sz, X86BYTE) - ; `X86XADD (false, X86S8 ($2.high), $4, (IReg $2.reg)) - } -| LOCK XADD breg COMMA addr - { check_size ($2.sz, X86BYTE) - ; `X86XADD (true, X86S8 ($3.high), $5, (IReg $3.reg)) - } -| XADD wreg COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86XADD (false, X86S16, Reg $4, $2) - } -| XADD wreg COMMA addr - { check_size ($1.sz, X86WORD) - ; `X86XADD (false, X86S16, $4, $2) - } -| LOCK XADD wreg COMMA addr - { check_size ($2.sz, X86WORD) - ; `X86XADD (true, X86S16, $5, $3) - } -| XADD lreg COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86XADD (false, X86S32, Reg $4, $2) - } -| XADD lreg COMMA addr - { check_size ($1.sz, X86LONG) - ; `X86XADD (false, X86S32, $4, $2) - } -| LOCK XADD lreg COMMA addr - { check_size ($2.sz, X86LONG) - ; `X86XADD (true, X86S32, $5, $3) - } -| XADD qreg COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86XADD (false, X86S64, Reg $4, $2) - } -| XADD qreg COMMA addr - { check_size ($1.sz, X86QUAD) - ; `X86XADD (false, X86S64, $4, $2) - } -| LOCK XADD qreg COMMA addr - { check_size ($2.sz, X86QUAD) - ; `X86XADD (true, X86S64, $5, $3) - } -| XCHG breg COMMA breg - { check_size ($1.sz, X86BYTE) - ; check_byte_regs ($2, $4) - ; `X86XCHG (false, X86S8 ($2.high), Reg (IReg $4.reg), IReg $2.reg) - } -| XCHG breg COMMA addr - { check_size ($1.sz, X86BYTE) - ; `X86XCHG (false, X86S8 ($2.high), $4, (IReg $2.reg)) - } -| LOCK XCHG breg COMMA addr - { check_size ($2.sz, X86BYTE) - ; `X86XCHG (true, X86S8 ($3.high), $5, (IReg $3.reg)) - } -| XCHG wreg COMMA wreg - { check_size ($1.sz, X86WORD) - ; `X86XCHG (false, X86S16, Reg $4, $2) - } -| XCHG wreg COMMA addr - { check_size ($1.sz, X86WORD) - ; `X86XCHG (false, X86S16, $4, $2) - } -| LOCK XCHG wreg COMMA addr - { check_size ($2.sz, X86WORD) - ; `X86XCHG (true, X86S16, $5, $3) - } -| XCHG lreg COMMA lreg - { check_size ($1.sz, X86LONG) - ; `X86XCHG (false, X86S32, Reg $4, $2) - } -| XCHG lreg COMMA addr - { check_size ($1.sz, X86LONG) - ; `X86XCHG (false, X86S32, $4, $2) - } -| LOCK XCHG lreg COMMA addr - { check_size ($2.sz, X86LONG) - ; `X86XCHG (true, X86S32, $5, $3) - } -| XCHG qreg COMMA qreg - { check_size ($1.sz, X86QUAD) - ; `X86XCHG (false, X86S64, Reg $4, $2) - } -| XCHG qreg COMMA addr - { check_size ($1.sz, X86QUAD) - ; `X86XCHG (false, X86S64, $4, $2) - } -| LOCK XCHG qreg COMMA addr - { check_size ($2.sz, X86QUAD) - ; `X86XCHG (true, X86S64, $5, $3) - } |
