diff options
| author | Andrew Chambers <[email protected]> | 2021-10-19 14:47:56 +1300 |
|---|---|---|
| committer | Andrew Chambers <[email protected]> | 2021-10-19 14:47:56 +1300 |
| commit | af8317ad3bf63ef7954174a68e1db1a325b390ef (patch) | |
| tree | 0ec2b966588e7204328a5ded394ee0dfbaa16522 | |
| parent | 56e797b4845e436a198cc8bbd1bbdf393cd71b13 (diff) | |
Align parser tables.
| -rw-r--r-- | asm.peg | 828 | ||||
| -rw-r--r-- | parse.c | 54 |
2 files changed, 449 insertions, 433 deletions
@@ -190,367 +190,379 @@ nop = "nop" { $$ = OP(0x90); } ret = "ret" { $$ = OP(0xc3); } push = "push" ( - 'q'? ws s:r64 { $$ = R(-1, (Rex){0}, 0x50, s); } - | 'q' ws s:mem { $$ = OPMEM(-1, (Rex){0}, 0xff, 0x06, s); } + 'q'? ws s:r64 { $$ = R({.w=0}, -1, 0x50, s); } + | 'q' ws s:mem { $$ = OPMEM({.w=0}, -1, 0xff, 0x06, s); } ) pop = "pop" ( - 'q'? ws d:r64 { $$ = R(-1, (Rex){0}, 0x58, d); } - | 'q' ws d:mem { $$ = OPMEM(-1, (Rex){0}, 0x8f, 0x00, d); } + 'q'? ws d:r64 { $$ = R({.w=0}, -1, 0x58, d); } + | 'q' ws d:mem { $$ = OPMEM({.w=0}, -1, 0x8f, 0x00, d); } ) div = "div" ( - 'b' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf6, 0x06, a); } - | 'w' ws a:mem { $$ = OPMEM(0x66, (Rex){0}, 0xf7, 0x06, a); } - | 'l' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf7, 0x06, a); } - | 'q' ws a:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xf7, 0x06, a); } - | 'b'? ws a:r8 { $$ = OPREG(-1, (Rex){0}, 0xf6, 0x06, a); } - | 'w'? ws a:r16 { $$ = OPREG(0x66, (Rex){0}, 0xf7, 0x06, a); } - | 'l'? ws a:r32 { $$ = OPREG(-1, (Rex){0}, 0xf7, 0x06, a); } - | 'q'? ws a:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xf7, 0x06, a); } + 'b' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf6, 0x06, a); } + | 'w' ws a:mem { $$ = OPMEM({.w=0}, 0x66, 0xf7, 0x06, a); } + | 'l' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf7, 0x06, a); } + | 'q' ws a:mem { $$ = OPMEM({.w=1}, -1, 0xf7, 0x06, a); } + | 'b'? ws a:r8 { $$ = OPREG({.w=0}, -1, 0xf6, 0x06, a); } + | 'w'? ws a:r16 { $$ = OPREG({.w=0}, 0x66, 0xf7, 0x06, a); } + | 'l'? ws a:r32 { $$ = OPREG({.w=0}, -1, 0xf7, 0x06, a); } + | 'q'? ws a:r64 { $$ = OPREG({.w=1}, -1, 0xf7, 0x06, a); } ) idiv = "idiv" ( - 'b' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf6, 0x07, a); } - | 'w' ws a:mem { $$ = OPMEM(0x66, (Rex){0}, 0xf7, 0x07, a); } - | 'l' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf7, 0x07, a); } - | 'q' ws a:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xf7, 0x07, a); } - | 'b'? ws a:r8 { $$ = OPREG(-1, (Rex){0}, 0xf6, 0x07, a); } - | 'w'? ws a:r16 { $$ = OPREG(0x66, (Rex){0}, 0xf7, 0x07, a); } - | 'l'? ws a:r32 { $$ = OPREG(-1, (Rex){0}, 0xf7, 0x07, a); } - | 'q'? ws a:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xf7, 0x07, a); } + 'b' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf6, 0x07, a); } + | 'w' ws a:mem { $$ = OPMEM({.w=0}, 0x66, 0xf7, 0x07, a); } + | 'l' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf7, 0x07, a); } + | 'q' ws a:mem { $$ = OPMEM({.w=1}, -1, 0xf7, 0x07, a); } + | 'b'? ws a:r8 { $$ = OPREG({.w=0}, -1, 0xf6, 0x07, a); } + | 'w'? ws a:r16 { $$ = OPREG({.w=0}, 0x66, 0xf7, 0x07, a); } + | 'l'? ws a:r32 { $$ = OPREG({.w=0}, -1, 0xf7, 0x07, a); } + | 'q'? ws a:r64 { $$ = OPREG({.w=1}, -1, 0xf7, 0x07, a); } ) mul = "mul" ( - 'b' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf6, 0x04, a); } - | 'w' ws a:mem { $$ = OPMEM(0x66, (Rex){0}, 0xf7, 0x04, a); } - | 'l' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf7, 0x04, a); } - | 'q' ws a:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xf7, 0x04, a); } - | 'b'? ws a:r8 { $$ = OPREG(-1, (Rex){0}, 0xf6, 0x04, a); } - | 'w'? ws a:r16 { $$ = OPREG(0x66, (Rex){0}, 0xf7, 0x04, a); } - | 'l'? ws a:r32 { $$ = OPREG(-1, (Rex){0}, 0xf7, 0x04, a); } - | 'q'? ws a:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xf7, 0x04, a); } + 'b' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf6, 0x04, a); } + | 'w' ws a:mem { $$ = OPMEM({.w=0}, 0x66, 0xf7, 0x04, a); } + | 'l' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf7, 0x04, a); } + | 'q' ws a:mem { $$ = OPMEM({.w=1}, -1, 0xf7, 0x04, a); } + | 'b'? ws a:r8 { $$ = OPREG({.w=0}, -1, 0xf6, 0x04, a); } + | 'w'? ws a:r16 { $$ = OPREG({.w=0}, 0x66, 0xf7, 0x04, a); } + | 'l'? ws a:r32 { $$ = OPREG({.w=0}, -1, 0xf7, 0x04, a); } + | 'q'? ws a:r64 { $$ = OPREG({.w=1}, -1, 0xf7, 0x04, a); } ) neg = "neg" ( - 'b' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf6, 0x03, a); } - | 'w' ws a:mem { $$ = OPMEM(0x66, (Rex){0}, 0xf7, 0x03, a); } - | 'l' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf7, 0x03, a); } - | 'q' ws a:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xf7, 0x03, a); } - | 'b'? ws a:r8 { $$ = OPREG(-1, (Rex){0}, 0xf6, 0x03, a); } - | 'w'? ws a:r16 { $$ = OPREG(0x66, (Rex){0}, 0xf7, 0x03, a); } - | 'l'? ws a:r32 { $$ = OPREG(-1, (Rex){0}, 0xf7, 0x03, a); } - | 'q'? ws a:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xf7, 0x03, a); } + 'b' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf6, 0x03, a); } + | 'w' ws a:mem { $$ = OPMEM({.w=0}, 0x66, 0xf7, 0x03, a); } + | 'l' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf7, 0x03, a); } + | 'q' ws a:mem { $$ = OPMEM({.w=1}, -1, 0xf7, 0x03, a); } + | 'b'? ws a:r8 { $$ = OPREG({.w=0}, -1, 0xf6, 0x03, a); } + | 'w'? ws a:r16 { $$ = OPREG({.w=0}, 0x66, 0xf7, 0x03, a); } + | 'l'? ws a:r32 { $$ = OPREG({.w=0}, -1, 0xf7, 0x03, a); } + | 'q'? ws a:r64 { $$ = OPREG({.w=1}, -1, 0xf7, 0x03, a); } ) imul = "imul" ( - 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG2(0x66, (Rex){0}, 0x01000faf, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG2(-1, (Rex){0}, 0x01000faf, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG2(-1, (Rex){.w=1}, 0x01000faf, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x01000faf, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x01000faf, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x01000faf, s, d); } - | 'w'? ws i:imm16 ws? ',' ws? s:r16 ws? ',' ws? d:r16 { $$ = IMMREGREG2(0x66, (Rex){0}, 0x69, i, s, d); } - | 'l'? ws i:imm32 ws? ',' ws? s:r32 ws? ',' ws? d:r32 { $$ = IMMREGREG2(-1, (Rex){0}, 0x69, i, s, d); } - | 'q'? ws i:imm32 ws? ',' ws? s:r64 ws? ',' ws? d:r64 { $$ = IMMREGREG2(-1, (Rex){.w=1}, 0x69, i, s, d); } - | 'w'? ws i:imm16 ws? ',' ws? s:mem ws? ',' ws? d:r16 { $$ = IMMMEMREG(0x66, (Rex){0}, 0x69, i, s, d); } - | 'l'? ws i:imm32 ws? ',' ws? s:mem ws? ',' ws? d:r32 { $$ = IMMMEMREG(-1, (Rex){0}, 0x69, i, s, d); } - | 'q'? ws i:imm32 ws? ',' ws? s:mem ws? ',' ws? d:r64 { $$ = IMMMEMREG(-1, (Rex){.w=1}, 0x69, i, s, d); } + 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG2({.w=0}, 0x66, 0x01000faf, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG2({.w=0}, -1, 0x01000faf, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, -1, 0x01000faf, s, d); } + + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x01000faf, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x01000faf, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x01000faf, s, d); } + + | 'w'? ws i:imm16 ws? ',' ws? s:r16 ws? ',' ws? d:r16 { $$ = IMMREGREG2({.w=0}, 0x66, 0x69, i, s, d); } + | 'l'? ws i:imm32 ws? ',' ws? s:r32 ws? ',' ws? d:r32 { $$ = IMMREGREG2({.w=0}, -1, 0x69, i, s, d); } + | 'q'? ws i:imm32 ws? ',' ws? s:r64 ws? ',' ws? d:r64 { $$ = IMMREGREG2({.w=1}, -1, 0x69, i, s, d); } + + | 'w'? ws i:imm16 ws? ',' ws? s:mem ws? ',' ws? d:r16 { $$ = IMMMEMREG({.w=0}, 0x66, 0x69, i, s, d); } + | 'l'? ws i:imm32 ws? ',' ws? s:mem ws? ',' ws? d:r32 { $$ = IMMMEMREG({.w=0}, -1, 0x69, i, s, d); } + | 'q'? ws i:imm32 ws? ',' ws? s:mem ws? ',' ws? d:r64 { $$ = IMMMEMREG({.w=1}, -1, 0x69, i, s, d); } + # Must come last due to peg ordering. - | 'b' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf6, 0x05, a); } - | 'w' ws a:mem { $$ = OPMEM(0x66, (Rex){0}, 0xf7, 0x05, a); } - | 'l' ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0xf7, 0x05, a); } - | 'q' ws a:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xf7, 0x05, a); } - | 'b'? ws a:r8 { $$ = OPREG(-1, (Rex){0}, 0xf6, 0x05, a); } - | 'w'? ws a:r16 { $$ = OPREG(0x66, (Rex){0}, 0xf7, 0x05, a); } - | 'l'? ws a:r32 { $$ = OPREG(-1, (Rex){0}, 0xf7, 0x05, a); } - | 'q'? ws a:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xf7, 0x05, a); } + | 'b' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf6, 0x05, a); } + | 'w' ws a:mem { $$ = OPMEM({.w=0}, 0x66, 0xf7, 0x05, a); } + | 'l' ws a:mem { $$ = OPMEM({.w=0}, -1, 0xf7, 0x05, a); } + | 'q' ws a:mem { $$ = OPMEM({.w=1}, -1, 0xf7, 0x05, a); } + + | 'b'? ws a:r8 { $$ = OPREG({.w=0}, -1, 0xf6, 0x05, a); } + | 'w'? ws a:r16 { $$ = OPREG({.w=0}, 0x66, 0xf7, 0x05, a); } + | 'l'? ws a:r32 { $$ = OPREG({.w=0}, -1, 0xf7, 0x05, a); } + | 'q'? ws a:r64 { $$ = OPREG({.w=1}, -1, 0xf7, 0x05, a); } ) lea = "lea" ( - 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x8d, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x8d, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x8d, s, d); } + 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x8d, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x8d, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x8d, s, d); } ) mov = "mov" ( - 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x88, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x89, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x89, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x89, s, d); } + 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x88, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x89, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x89, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x89, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x088, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x89, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x89, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x89, s, d); } - - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x8a, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x8b, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x8b, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x8b, s, d); } - - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = RIMM(-1, (Rex){0}, 0xb0, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = RIMM(0x66, (Rex){0}, 0xb8, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = RIMM(-1, (Rex){0}, 0xb8, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x88, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x89, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x89, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x89, s, d); } + + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x8a, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x8b, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x8b, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x8b, s, d); } + + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = RIMM({.w=0}, -1, 0xb0, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = RIMM({.w=0}, 0x66, 0xb8, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = RIMM({.w=0}, -1, 0xb8, s, d); } | 'q'? ws s:imm ws? ',' ws? d:r64 { if (needsmovabs(&s.imm)){ s.imm.nbytes = 8; - $$ = RIMM(-1, (Rex){.w=1}, 0xb8, s, d); + $$ = RIMM({.w=1}, -1, 0xb8, s, d); } else { s.imm.nbytes = 4; s.imm.v.c = ((uint64_t)s.imm.v.c) & 0xffffffff; - $$ = IMMREG(-1, (Rex){.w=1}, 0xc7, 0x00, s, d); + $$ = IMMREG({.w=1}, -1, 0xc7, 0x00, s, d); } } - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xc6, 0x00, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0xc7, 0x00, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xc7, 0x00, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0xc7, 0x00, s, d); } + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xc6, 0x00, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0xc7, 0x00, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xc7, 0x00, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0xc7, 0x00, s, d); } ) movsx = "movs" ( - 'bw' ws s:r8 ws? ',' ws? d:r16 { $$ = REGREG2(0x66, (Rex){0}, 0x01000fbe, s, d); } - | 'bl' ws s:r8 ws? ',' ws? d:r32 { $$ = REGREG2(-1, (Rex){0}, 0x01000fbe, s, d); } - | 'bq' ws s:r8 ws? ',' ws? d:r64 { $$ = REGREG2(-1, (Rex){.w=1}, 0x01000fbe, s, d); } - | 'wl' ws s:r16 ws? ',' ws? d:r32 { $$ = REGREG2(-1, (Rex){0}, 0x01000fbf, s, d); } - | 'wq' ws s:r16 ws? ',' ws? d:r64 { $$ = REGREG2(-1, (Rex){.w=1}, 0x01000fbf, s, d); } - | 'lq' ws s:r32 ws? ',' ws? d:r64 { $$ = REGREG2(-1, (Rex){.w=1}, 0x63, s, d); } - | 'bw' ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x01000fbe, s, d); } - | 'bl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x01000fbe, s, d); } - | 'bq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x01000fbe, s, d); } - | 'wl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x01000fbf, s, d); } - | 'wq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x01000fbf, s, d); } - | 'lq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x63, s, d); } + 'bw' ws s:r8 ws? ',' ws? d:r16 { $$ = REGREG2({.w=0}, 0x66, 0x01000fbe, s, d); } + | 'bl' ws s:r8 ws? ',' ws? d:r32 { $$ = REGREG2({.w=0}, -1, 0x01000fbe, s, d); } + | 'bq' ws s:r8 ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, -1, 0x01000fbe, s, d); } + + | 'wl' ws s:r16 ws? ',' ws? d:r32 { $$ = REGREG2({.w=0}, -1, 0x01000fbf, s, d); } + | 'wq' ws s:r16 ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, -1, 0x01000fbf, s, d); } + + | 'lq' ws s:r32 ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, -1, 0x63, s, d); } + + | 'bw' ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x01000fbe, s, d); } + | 'bl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x01000fbe, s, d); } + | 'bq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x01000fbe, s, d); } + + | 'wl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x01000fbf, s, d); } + | 'wq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x01000fbf, s, d); } + | 'lq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x63, s, d); } ) movzx = "movz" ( - 'bw' ws s:r8 ws? ',' ws? d:r16 { $$ = REGREG2(0x66, (Rex){0}, 0x01000fb6, s, d); } - | 'bl' ws s:r8 ws? ',' ws? d:r32 { $$ = REGREG2(-1, (Rex){0}, 0x01000fb6, s, d); } - | 'bq' ws s:r8 ws? ',' ws? d:r64 { $$ = REGREG2(-1, (Rex){.w=1}, 0x01000fb6, s, d); } - | 'wl' ws s:r16 ws? ',' ws? d:r32 { $$ = REGREG2(-1, (Rex){0}, 0x01000fb7, s, d); } - | 'wq' ws s:r16 ws? ',' ws? d:r64 { $$ = REGREG2(-1, (Rex){.w=1}, 0x01000fb7, s, d); } - | 'bw' ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x01000fb6, s, d); } - | 'bl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x01000fb6, s, d); } - | 'bq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x01000fb6, s, d); } - | 'wl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x01000fb7, s, d); } - | 'wq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x01000fb7, s, d); } + 'bw' ws s:r8 ws? ',' ws? d:r16 { $$ = REGREG2({.w=0}, 0x66, 0x01000fb6, s, d); } + | 'bl' ws s:r8 ws? ',' ws? d:r32 { $$ = REGREG2({.w=0}, -1, 0x01000fb6, s, d); } + | 'bq' ws s:r8 ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, -1, 0x01000fb6, s, d); } + + | 'wl' ws s:r16 ws? ',' ws? d:r32 { $$ = REGREG2({.w=0}, -1, 0x01000fb7, s, d); } + | 'wq' ws s:r16 ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, -1, 0x01000fb7, s, d); } + + | 'bw' ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x01000fb6, s, d); } + | 'bl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x01000fb6, s, d); } + | 'bq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x01000fb6, s, d); } + + | 'wl' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x01000fb7, s, d); } + | 'wq' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x01000fb7, s, d); } ) add = "add" ( - 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM(-1, (Rex){0}, 0x04, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM(0x66, (Rex){0}, 0x05, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM(-1, (Rex){0}, 0x05, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM(-1, (Rex){.w=1}, 0x05, s, d); } - - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG(-1, (Rex){0}, 0x80, 0x00, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0x81, 0x00, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0x81, 0x00, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0x81, 0x00, s, d); } - - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x80, 0x00, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0x81, 0x00, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x81, 0x00, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0x81, 0x00, s, d); } + 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM({.w=0}, -1, 0x04, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM({.w=0}, 0x66, 0x05, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM({.w=0}, -1, 0x05, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM({.w=1}, -1, 0x05, s, d); } + + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG({.w=0}, -1, 0x80, 0x00, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0x81, 0x00, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0x81, 0x00, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0x81, 0x00, s, d); } + + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x80, 0x00, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0x81, 0x00, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x81, 0x00, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0x81, 0x00, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x00, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x01, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x01, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x01, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x00, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x01, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x01, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x01, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x00, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x01, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x01, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x01, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x00, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x01, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x01, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x01, s, d); } - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x02, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x03, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x03, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x03, s, d); } + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x02, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x03, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x03, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x03, s, d); } ) and = "and" ( - 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM(-1, (Rex){0}, 0x24, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM(0x66, (Rex){0}, 0x25, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM(-1, (Rex){0}, 0x25, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM(-1, (Rex){.w=1}, 0x25, s, d); } - - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG(-1, (Rex){0}, 0x80, 0x04, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0x81, 0x04, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0x81, 0x04, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0x81, 0x04, s, d); } - - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x80, 0x04, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0x81, 0x04, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x81, 0x04, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0x81, 0x04, s, d); } + 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM({.w=0}, -1, 0x24, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM({.w=0}, 0x66, 0x25, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM({.w=0}, -1, 0x25, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM({.w=1}, -1, 0x25, s, d); } + + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG({.w=0}, -1, 0x80, 0x04, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0x81, 0x04, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0x81, 0x04, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0x81, 0x04, s, d); } + + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x80, 0x04, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0x81, 0x04, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x81, 0x04, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0x81, 0x04, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x20, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x21, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x21, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x21, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x20, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x21, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x21, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x21, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x20, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x21, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x21, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x21, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x20, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x21, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x21, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x21, s, d); } - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x22, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x23, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x23, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x23, s, d); } + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x22, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x23, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x23, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x23, s, d); } ) cmp = "cmp" ( - 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM(-1, (Rex){0}, 0x3c, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM(0x66, (Rex){0}, 0x3d, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM(-1, (Rex){0}, 0x3d, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM(-1, (Rex){.w=1}, 0x3d, s, d); } - - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG(-1, (Rex){0}, 0x80, 0x07, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0x81, 0x07, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0x81, 0x07, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0x81, 0x07, s, d); } - - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x80, 0x07, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0x81, 0x07, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x81, 0x07, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0x81, 0x07, s, d); } + 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM({.w=0}, -1, 0x3c, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM({.w=0}, 0x66, 0x3d, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM({.w=0}, -1, 0x3d, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM({.w=1}, -1, 0x3d, s, d); } + + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG({.w=0}, -1, 0x80, 0x07, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0x81, 0x07, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0x81, 0x07, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0x81, 0x07, s, d); } + + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x80, 0x07, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0x81, 0x07, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x81, 0x07, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0x81, 0x07, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x38, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x39, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x39, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x39, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x38, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x39, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x39, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x39, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x38, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x39, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x39, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x39, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x38, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x39, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x39, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x39, s, d); } - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x3a, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x3b, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x3b, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x3b, s, d); } + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x3a, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x3b, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x3b, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x3b, s, d); } ) or = "or" ( - 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM(-1, (Rex){0}, 0x0c, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM(0x66, (Rex){0}, 0x0d, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM(-1, (Rex){0}, 0x0d, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM(-1, (Rex){.w=1}, 0x0d, s, d); } - - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG(-1, (Rex){0}, 0x80, 0x01, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0x81, 0x01, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0x81, 0x01, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0x81, 0x01, s, d); } - - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x80, 0x01, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0x81, 0x01, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x81, 0x01, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0x81, 0x01, s, d); } + 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM({.w=0}, -1, 0x0c, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM({.w=0}, 0x66, 0x0d, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM({.w=0}, -1, 0x0d, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM({.w=1}, -1, 0x0d, s, d); } + + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG({.w=0}, -1, 0x80, 0x01, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0x81, 0x01, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0x81, 0x01, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0x81, 0x01, s, d); } + + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x80, 0x01, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0x81, 0x01, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x81, 0x01, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0x81, 0x01, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x08, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x09, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x09, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x09, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x08, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x09, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x09, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x09, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x08, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x09, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x09, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x09, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x08, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x09, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x09, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x09, s, d); } - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x0a, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x0b, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x0b, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x0b, s, d); } + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x0a, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x0b, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x0b, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x0b, s, d); } ) sub = "sub" ( - 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM(-1, (Rex){0}, 0x2c, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM(0x66, (Rex){0}, 0x2d, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM(-1, (Rex){0}, 0x2d, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM(-1, (Rex){.w=1}, 0x2d, s, d); } - - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG(-1, (Rex){0}, 0x80, 0x05, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0x81, 0x05, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0x81, 0x05, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0x81, 0x05, s, d); } - - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x80, 0x05, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0x81, 0x05, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x81, 0x05, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0x81, 0x05, s, d); } + 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM({.w=0}, -1, 0x2c, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM({.w=0}, 0x66, 0x2d, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM({.w=0}, -1, 0x2d, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM({.w=1}, -1, 0x2d, s, d); } + + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG({.w=0}, -1, 0x80, 0x05, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0x81, 0x05, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0x81, 0x05, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0x81, 0x05, s, d); } + + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x80, 0x05, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0x81, 0x05, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x81, 0x05, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0x81, 0x05, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x28, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x29, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x29, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x29, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x28, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x29, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x29, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x29, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x28, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x29, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x29, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x29, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x28, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x29, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x29, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x29, s, d); } - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x2a, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x2b, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x2b, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x2b, s, d); } + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x2a, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x2b, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x2b, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x2b, s, d); } ) xor = "xor" ( - 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM(-1, (Rex){0}, 0x34, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM(0x66, (Rex){0}, 0x35, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM(-1, (Rex){0}, 0x35, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM(-1, (Rex){.w=1}, 0x35, s, d); } - - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG(-1, (Rex){0}, 0x80, 0x06, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0x81, 0x06, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0x81, 0x06, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0x81, 0x06, s, d); } - - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x80, 0x06, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0x81, 0x06, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0x81, 0x06, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0x81, 0x06, s, d); } + 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM({.w=0}, -1, 0x34, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM({.w=0}, 0x66, 0x35, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM({.w=0}, -1, 0x35, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM({.w=1}, -1, 0x35, s, d); } + + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG({.w=0}, -1, 0x80, 0x06, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0x81, 0x06, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0x81, 0x06, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0x81, 0x06, s, d); } + + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x80, 0x06, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0x81, 0x06, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0x81, 0x06, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0x81, 0x06, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x30, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x31, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x31, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x31, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x30, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x31, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x31, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x31, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x30, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x31, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x31, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x31, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x30, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x31, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x31, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x31, s, d); } - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x32, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x33, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x33, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x33, s, d); } + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x32, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x33, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x33, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x33, s, d); } ) xchg = "xchg" ( - 'w'? ws s:ax ws? ',' ws? d:r16 { $$ = R(0x66, (Rex){0}, 0x90, d) } - | 'w'? ws s:r16 ws? ',' ws? d:ax { $$ = R(0x66, (Rex){0}, 0x90, s) } - | 'l'? ws s:eax ws? ',' ws? d:r32 { $$ = R(-1, (Rex){0}, 0x90, d) } - | 'l'? ws s:r32 ws? ',' ws? d:eax { $$ = R(-1, (Rex){0}, 0x90, s) } - | 'q'? ws s:rax ws? ',' ws? d:r64 { $$ = R(-1, (Rex){.w=1}, 0x90, d) } - | 'q'? ws s:r64 ws? ',' ws? d:rax { $$ = R(-1, (Rex){.w=1}, 0x90, s) } + 'w'? ws s:ax ws? ',' ws? d:r16 { $$ = R({.w=0}, 0x66, 0x90, d) } + | 'w'? ws s:r16 ws? ',' ws? d:ax { $$ = R({.w=0}, 0x66, 0x90, s) } + | 'l'? ws s:eax ws? ',' ws? d:r32 { $$ = R({.w=0}, -1, 0x90, d) } + | 'l'? ws s:r32 ws? ',' ws? d:eax { $$ = R({.w=0}, -1, 0x90, s) } + | 'q'? ws s:rax ws? ',' ws? d:r64 { $$ = R({.w=1}, -1, 0x90, d) } + | 'q'? ws s:r64 ws? ',' ws? d:rax { $$ = R({.w=1}, -1, 0x90, s) } - | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x86, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x87, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x87, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x87, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x86, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x87, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x87, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x87, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x86, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x87, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x87, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x87, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x86, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x87, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x87, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x87, s, d); } - | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG(-1, (Rex){0}, 0x86, s, d); } - | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG(0x66, (Rex){0}, 0x87, s, d); } - | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(-1, (Rex){0}, 0x87, s, d); } - | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(-1, (Rex){.w=1}, 0x87, s, d); } + | 'b'? ws s:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x86, s, d); } + | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x87, s, d); } + | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x87, s, d); } + | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x87, s, d); } ) %{ @@ -562,225 +574,227 @@ xchg = "xchg" ( %} set = "set" cc:condition-code ( - 'b'? ws a:r8 { $$ = OPREG(-1, (Rex){0}, 0x01000f00 | cc2setop[cc.i64], 0x00, a) } - | 'b'? ws a:mem { $$ = OPMEM(-1, (Rex){0}, 0x01000f00 | cc2setop[cc.i64], 0x00, a) } + 'b'? ws a:r8 { $$ = OPREG({.w=0}, -1, 0x01000f00 | cc2setop[cc.i64], 0x00, a) } + | 'b'? ws a:mem { $$ = OPMEM({.w=0}, -1, 0x01000f00 | cc2setop[cc.i64], 0x00, a) } ) sal = "sal" ( - 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(0x66, (Rex){0},0xd3, 0x04, d); } - | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){0}, 0xd3, 0x04, d); } - | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xd3, 0x04, d); } - | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG(0x66, (Rex){0}, 0xd3, 0x04, d); } - | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG(-1, (Rex){0}, 0xd3, 0x04, d); } - | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xd3, 0x04, d); } - | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0xc1, 0x04, i, d); } - | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xc1, 0x04, i, d); } - | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0xc1, 0x04, i, d); } - | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0xc1, 0x04, i, d); } - | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0xc1, 0x04, i, d); } - | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0xc1, 0x04, i, d); } + 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=0}, 0x66, 0xd3, 0x04, d); } + | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=0}, -1, 0xd3, 0x04, d); } + | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=1}, -1, 0xd3, 0x04, d); } + | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG ({.w=0}, 0x66, 0xd3, 0x04, d); } + | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG ({.w=0}, -1, 0xd3, 0x04, d); } + | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG ({.w=1}, -1, 0xd3, 0x04, d); } + | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0xc1, 0x04, i, d); } + | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xc1, 0x04, i, d); } + | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0xc1, 0x04, i, d); } + | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0xc1, 0x04, i, d); } + | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0xc1, 0x04, i, d); } + | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0xc1, 0x04, i, d); } ) sar = "sar" ( - 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(0x66, (Rex){0},0xd3, 0x07, d); } - | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){0}, 0xd3, 0x07, d); } - | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xd3, 0x07, d); } - | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG(0x66, (Rex){0}, 0xd3, 0x07, d); } - | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG(-1, (Rex){0}, 0xd3, 0x07, d); } - | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xd3, 0x07, d); } - | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0xc1, 0x07, i, d); } - | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xc1, 0x07, i, d); } - | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0xc1, 0x07, i, d); } - | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0xc1, 0x07, i, d); } - | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0xc1, 0x07, i, d); } - | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0xc1, 0x07, i, d); } + 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=0}, 0x66, 0xd3, 0x07, d); } + | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=0}, -1, 0xd3, 0x07, d); } + | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=1}, -1, 0xd3, 0x07, d); } + | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG ({.w=0}, 0x66, 0xd3, 0x07, d); } + | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG ({.w=0}, -1, 0xd3, 0x07, d); } + | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG ({.w=1}, -1, 0xd3, 0x07, d); } + | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0xc1, 0x07, i, d); } + | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xc1, 0x07, i, d); } + | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0xc1, 0x07, i, d); } + | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0xc1, 0x07, i, d); } + | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0xc1, 0x07, i, d); } + | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0xc1, 0x07, i, d); } ) shl = "shl" ( - 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(0x66, (Rex){0},0xd3, 0x04, d); } - | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){0}, 0xd3, 0x04, d); } - | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xd3, 0x04, d); } - | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG(0x66, (Rex){0}, 0xd3, 0x04, d); } - | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG(-1, (Rex){0}, 0xd3, 0x04, d); } - | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xd3, 0x04, d); } - | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0xc1, 0x04, i, d); } - | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xc1, 0x04, i, d); } - | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0xc1, 0x04, i, d); } - | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0xc1, 0x04, i, d); } - | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0xc1, 0x04, i, d); } - | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0xc1, 0x04, i, d); } + 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=0}, 0x66, 0xd3, 0x04, d); } + | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=0}, -1, 0xd3, 0x04, d); } + | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM ({.w=1}, -1, 0xd3, 0x04, d); } + | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG ({.w=0}, 0x66, 0xd3, 0x04, d); } + | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG ({.w=0}, -1, 0xd3, 0x04, d); } + | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG ({.w=1}, -1, 0xd3, 0x04, d); } + | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0xc1, 0x04, i, d); } + | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xc1, 0x04, i, d); } + | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0xc1, 0x04, i, d); } + | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0xc1, 0x04, i, d); } + | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0xc1, 0x04, i, d); } + | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0xc1, 0x04, i, d); } ) shr = "shr" ( - 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(0x66, (Rex){0},0xd3, 0x05, d); } - | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){0}, 0xd3, 0x05, d); } - | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM(-1, (Rex){.w=1}, 0xd3, 0x05, d); } - | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG(0x66, (Rex){0}, 0xd3, 0x05, d); } - | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG(-1, (Rex){0}, 0xd3, 0x05, d); } - | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG(-1, (Rex){.w=1}, 0xd3, 0x05, d); } - | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0xc1, 0x05, i, d); } - | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xc1, 0x05, i, d); } - | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0xc1, 0x05, i, d); } - | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0xc1, 0x05, i, d); } - | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0xc1, 0x05, i, d); } - | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0xc1, 0x05, i, d); } + 'w' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM({.w=0}, 0x66, 0xd3, 0x05, d); } + | 'l' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM({.w=0}, -1, 0xd3, 0x05, d); } + | 'q' ws c:cl ws? ',' ws? d:mem { $$ = OPMEM({.w=1}, -1, 0xd3, 0x05, d); } + | 'w'? ws c:cl ws? ',' ws? d:r16 { $$ = OPREG({.w=0}, 0x66, 0xd3, 0x05, d); } + | 'l'? ws c:cl ws? ',' ws? d:r32 { $$ = OPREG({.w=0}, -1, 0xd3, 0x05, d); } + | 'q'? ws c:cl ws? ',' ws? d:r64 { $$ = OPREG({.w=1}, -1, 0xd3, 0x05, d); } + | 'w' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0xc1, 0x05, i, d); } + | 'l' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xc1, 0x05, i, d); } + | 'q' ws i:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0xc1, 0x05, i, d); } + | 'w'? ws i:imm8 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0xc1, 0x05, i, d); } + | 'l'? ws i:imm8 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0xc1, 0x05, i, d); } + | 'q'? ws i:imm8 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0xc1, 0x05, i, d); } ) test = "test" ( - 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG(-1, (Rex){0}, 0x84, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG(0x66, (Rex){0}, 0x85, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG(-1, (Rex){0}, 0x85, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG(-1, (Rex){.w=1}, 0x85, s, d); } + 'b'? ws s:r8 ws? ',' ws? d:r8 { $$ = REGREG({.w=0}, -1, 0x84, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = REGREG({.w=0}, 0x66, 0x85, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = REGREG({.w=0}, -1, 0x85, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = REGREG({.w=1}, -1, 0x85, s, d); } - | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x84, s, d); } - | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x85, s, d); } - | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x85, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){.w=1}, 0x85, s, d); } + | 'b'? ws s:r8 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x84, s, d); } + | 'w'? ws s:r16 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, 0x66, 0x85, s, d); } + | 'l'? ws s:r32 ws? ',' ws? d:mem { $$ = REGMEM({.w=0}, -1, 0x85, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:mem { $$ = REGMEM({.w=1}, -1, 0x85, s, d); } - | 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM(-1, (Rex){0}, 0xa8, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM(0x66, (Rex){0}, 0xa9, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM(-1, (Rex){0}, 0xa9, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM(-1, (Rex){.w=1}, 0xa9, s, d); } + | 'b'? ws s:imm8 ws? ',' ws? d:al { $$ = IMM({.w=0}, -1, 0xa8, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:ax { $$ = IMM({.w=0}, 0x66, 0xa9, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:eax { $$ = IMM({.w=0}, -1, 0xa9, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:rax { $$ = IMM({.w=1}, -1, 0xa9, s, d); } - | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG(-1, (Rex){0}, 0xf6, 0x00, s, d); } - | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG(0x66, (Rex){0}, 0xf7, 0x00, s, d); } - | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG(-1, (Rex){0}, 0xf7, 0x00, s, d); } - | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG(-1, (Rex){.w=1}, 0xf7, 0x00, s, d); } + | 'b'? ws s:imm8 ws? ',' ws? d:r8 { $$ = IMMREG({.w=0}, -1, 0xf6, 0x00, s, d); } + | 'w'? ws s:imm16 ws? ',' ws? d:r16 { $$ = IMMREG({.w=0}, 0x66, 0xf7, 0x00, s, d); } + | 'l'? ws s:imm32 ws? ',' ws? d:r32 { $$ = IMMREG({.w=0}, -1, 0xf7, 0x00, s, d); } + | 'q'? ws s:imm32 ws? ',' ws? d:r64 { $$ = IMMREG({.w=1}, -1, 0xf7, 0x00, s, d); } - | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xf6, 0x00, s, d); } - | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM(0x66, (Rex){0}, 0xf7, 0x00, s, d); } - | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){0}, 0xf7, 0x00, s, d); } - | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM(-1, (Rex){.w=1}, 0xf7, 0x00, s, d); } + | 'b' ws s:imm8 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xf6, 0x00, s, d); } + | 'w' ws s:imm16 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, 0x66, 0xf7, 0x00, s, d); } + | 'l' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=0}, -1, 0xf7, 0x00, s, d); } + | 'q' ws s:imm32 ws? ',' ws? d:mem { $$ = IMMMEM({.w=1}, -1, 0xf7, 0x00, s, d); } ) # Floating point instructions. addsd = "addsd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf2, (Rex){0}, 0x01000f58, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf2, (Rex){0}, 0x01000f58, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf2, 0x01000f58, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf2, 0x01000f58, s, d); } ) addss = "addss" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f58, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f58, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf3, 0x01000f58, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f58, s, d); } ) subsd = "subsd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf2, (Rex){0}, 0x01000f5c, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf2, (Rex){0}, 0x01000f5c, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf2, 0x01000f5c, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf2, 0x01000f5c, s, d); } ) subss = "subss" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f5c, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f5c, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf3, 0x01000f5c, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f5c, s, d); } ) cvtsi2sd = "cvtsi2sd" ( - ws s:r32 ws? ',' ws? d:xmm { $$ = REGREG2(0xf2, (Rex){0}, 0x01000f2a, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf2, (Rex){0}, 0x01000f2a, s, d); } - | ws s:r64 ws? ',' ws? d:xmm { $$ = REGREG2(0xf2, (Rex){.w=1}, 0x01000f2a, s, d); } - # XXX | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf2, (Rex){.w=1}, 0x01000f2a, s, d); } + ws s:r32 ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf2, 0x01000f2a, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf2, 0x01000f2a, s, d); } + | ws s:r64 ws? ',' ws? d:xmm { $$ = REGREG2({.w=1}, 0xf2, 0x01000f2a, s, d); } + + # XXX | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG({.w=1},0xf2, 0x01000f2a, s, d); } ) cvtsi2ss = "cvtsi2ss" ( - ws s:r32 ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f2a, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f2a, s, d); } - | ws s:r64 ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){.w=1}, 0x01000f2a, s, d); } - # XXX | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){.w=1}, 0x01000f2a, s, d); } + ws s:r32 ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf3, 0x01000f2a, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f2a, s, d); } + | ws s:r64 ws? ',' ws? d:xmm { $$ = REGREG2({.w=1}, 0xf3, 0x01000f2a, s, d); } + + # XXX | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG({.w=1}, 0xf3, 0x01000f2a, s, d); } ) cvtss2sd = "cvtss2sd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f5a, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f5a, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf3, 0x01000f5a, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f5a, s, d); } ) cvtsd2ss = "cvtsd2ss" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0x010066f3, (Rex){0}, 0x5a, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0x010066f3, (Rex){0}, 0x5a, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0x010066f3, 0x5a, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0x010066f3, 0x5a, s, d); } ) cvttss2si = "cvttss2si" ( - 'l'? ws s:xmm ws? ',' ws? d:r32 { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f2c, s, d); } - | 'q'? ws s:xmm ws? ',' ws? d:r64 { $$ = REGREG2(0xf3, (Rex){.w=1}, 0x01000f2c, s, d); } - | 'l' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f7e, s, d); } - | 'q' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(0xf3, (Rex){.w=1}, 0x01000f2c, s, d); } + 'l'? ws s:xmm ws? ',' ws? d:r32 { $$ = REGREG2({.w=0}, 0xf3, 0x01000f2c, s, d); } + | 'q'? ws s:xmm ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, 0xf3, 0x01000f2c, s, d); } + | 'l' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f7e, s, d); } + | 'q' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG ({.w=1}, 0xf3, 0x01000f2c, s, d); } ) cvttsd2si = "cvttsd2si" ( - 'l'? ws s:xmm ws? ',' ws? d:r32 { $$ = REGREG2(0xf2, (Rex){0}, 0x01000f2c, s, d); } - | 'q'? ws s:xmm ws? ',' ws? d:r64 { $$ = REGREG2(0xf2, (Rex){.w=1}, 0x01000f2c, s, d); } - | 'l' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG(0xf2, (Rex){0}, 0x01000f7e, s, d); } - | 'q' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG(0xf2, (Rex){.w=1}, 0x01000f2c, s, d); } + 'l'? ws s:xmm ws? ',' ws? d:r32 { $$ = REGREG2({.w=0}, 0xf2, 0x01000f2c, s, d); } + | 'q'? ws s:xmm ws? ',' ws? d:r64 { $$ = REGREG2({.w=1}, 0xf2, 0x01000f2c, s, d); } + | 'l' ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG ({.w=0}, 0xf2, 0x01000f7e, s, d); } + | 'q' ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG ({.w=1} ,0xf2, 0x01000f2c, s, d); } ) divsd = "divsd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf2, (Rex){0}, 0x01000f5e, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf2, (Rex){0}, 0x01000f5e, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf2, 0x01000f5e, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf2, 0x01000f5e, s, d); } ) divss = "divss" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f5e, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f5e, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf3, 0x01000f5e, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f5e, s, d); } ) movaps = "movaps" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(-1, (Rex){0}, 0x01000f28, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(-1, (Rex){0}, 0x01000f28, s, d); } - | ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM(-1, (Rex){0}, 0x01000f29, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, -1, 0x01000f28, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, -1, 0x01000f28, s, d); } + | ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM ({.w=0}, -1, 0x01000f29, s, d); } ) mulsd = "mulsd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf2, (Rex){0}, 0x01000f59, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf2, (Rex){0}, 0x01000f59, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf2, 0x01000f59, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf2, 0x01000f59, s, d); } ) mulss = "mulss" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f59, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f59, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf3, 0x01000f59, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f59, s, d); } ) movss = "movss" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf3, (Rex){0}, 0x01000f10, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f10, s, d); } - | ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM(0xf3, (Rex){0}, 0x01000f11, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf3, 0x01000f10, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f10, s, d); } + | ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM ({.w=0}, 0xf3, 0x01000f11, s, d); } ) movsd = "movsd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0xf2, (Rex){0}, 0x01000f10, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf2, (Rex){0}, 0x01000f10, s, d); } - | ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM(0xf2, (Rex){0}, 0x01000f11, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0xf2, 0x01000f10, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf2, 0x01000f10, s, d); } + | ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM ({.w=0}, 0xf2, 0x01000f11, s, d); } ) movq = "mov" ( - 'q'? ws s:xmm ws? ',' ws? d:r64 { $$ = REGREG(0x66, (Rex){.w=1}, 0x01000f7e, s, d); } - | 'q'? ws s:r64 ws? ',' ws? d:xmm { $$ = REGREG2(0x66, (Rex){.w=1}, 0x01000f6e, s, d); } - | 'q' ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM(0x66, (Rex){0}, 0x01000fd6, s, d); } - | 'q' ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0xf3, (Rex){0}, 0x01000f7e, s, d); } + 'q'? ws s:xmm ws? ',' ws? d:r64 { $$ = REGREG ({.w=1}, 0x66, 0x01000f7e, s, d); } + | 'q'? ws s:r64 ws? ',' ws? d:xmm { $$ = REGREG2({.w=1}, 0x66, 0x01000f6e, s, d); } + | 'q' ws s:xmm ws? ',' ws? d:mem { $$ = REGMEM ({.w=0}, 0x66, 0x01000fd6, s, d); } + | 'q' ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0xf3, 0x01000f7e, s, d); } ) ucomiss = "ucomiss" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(-1, (Rex){0}, 0x01000f2e, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(-1, (Rex){0}, 0x01000f2e, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, -1, 0x01000f2e, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, -1, 0x01000f2e, s, d); } ) ucomisd = "ucomisd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0x66, (Rex){0}, 0x01000f2e, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0x66, (Rex){0}, 0x01000f2e, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0x66, 0x01000f2e, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0x66, 0x01000f2e, s, d); } ) pxor = "pxor" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0x66, (Rex){0}, 0x01000fef, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0x66, (Rex){0}, 0x01000fef, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0x66, 0x01000fef, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0x66, 0x01000fef, s, d); } ) xorpd = "xorpd" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(0x66, (Rex){0}, 0x01000f57, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(0x66, (Rex){0}, 0x01000f57, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, 0x66, 0x01000f57, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, 0x66, 0x01000f57, s, d); } ) xorps = "xorps" ( - ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2(-1, (Rex){0}, 0x01000f57, s, d); } - | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG(-1, (Rex){0}, 0x01000f57, s, d); } + ws s:xmm ws? ',' ws? d:xmm { $$ = REGREG2({.w=0}, -1, 0x01000f57, s, d); } + | ws s:mem ws? ',' ws? d:xmm { $$ = MEMREG ({.w=0}, -1, 0x01000f57, s, d); } ) r64-or-rip = ( @@ -104,116 +104,118 @@ static int needsmovabs(Imm *imm) { } \ } -#define OPREG(PREFIX, REX, OPCODE, REG, A1) \ +#define OPREG(REX, PREFIX, OPCODE, REG, A1) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_OPREG, .prefix = PREFIX, \ - .rex = REX, .fixedreg = REG, .opcode = OPCODE, .arg1 = internparsev(&A1) \ + .rex = (Rex)REX, .fixedreg = REG, .opcode = OPCODE, \ + .arg1 = internparsev(&A1) \ } \ } -#define OPMEM(PREFIX, REX, OPCODE, REG, A1) \ +#define OPMEM(REX, PREFIX, OPCODE, REG, A1) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_OPMEM, .prefix = PREFIX, \ - .rex = REX, .fixedreg = REG, .opcode = OPCODE, .arg1 = internparsev(&A1) \ + .rex = (Rex)REX, .fixedreg = REG, .opcode = OPCODE, \ + .arg1 = internparsev(&A1) \ } \ } -#define R(PREFIX, REX, OPCODE, A1) \ +#define R(REX, PREFIX, OPCODE, A1) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_R, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ } \ } -#define IMM(PREFIX, REX, OPCODE, A1, A2) \ +#define IMM(REX, PREFIX, OPCODE, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_IMM, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2) \ } \ } -#define RIMM(PREFIX, REX, OPCODE, A1, A2) \ +#define RIMM(REX, PREFIX, OPCODE, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_RIMM, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2) \ } \ } -#define IMMREG(PREFIX, REX, OPCODE, IMMREG, A1, A2) \ +#define IMMREG(REX, PREFIX, OPCODE, IMMREG, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_IMMREG, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .fixedreg = IMMREG, \ + .opcode = OPCODE, .rex = (Rex)REX, .fixedreg = IMMREG, \ .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ } \ } -#define IMMMEM(PREFIX, REX, OPCODE, IMMREG, A1, A2) \ +#define IMMMEM(REX, PREFIX, OPCODE, IMMREG, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_IMMMEM, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .fixedreg = IMMREG, \ + .opcode = OPCODE, .rex = (Rex)REX, .fixedreg = IMMREG, \ .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ } \ } -#define REGMEM(PREFIX, REX, OPCODE, A1, A2) \ +#define REGMEM(REX, PREFIX, OPCODE, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_REGMEM, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2) \ } \ } -#define MEMREG(PREFIX, REX, OPCODE, A1, A2) \ +#define MEMREG(REX, PREFIX, OPCODE, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_MEMREG, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2) \ } \ } -#define REGREG(PREFIX, REX, OPCODE, A1, A2) \ +#define REGREG(REX, PREFIX, OPCODE, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_REGREG, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2) \ } \ } -#define REGREG2(PREFIX, REX, OPCODE, A1, A2) \ +#define REGREG2(REX, PREFIX, OPCODE, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_REGREG2, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2) \ } \ } -#define IMMREGREG2(PREFIX, REX, OPCODE, A1, A2, A3) \ +#define IMMREGREG2(REX, PREFIX, OPCODE, A1, A2, A3) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_IMMREGREG2, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2), .arg3 = internparsev(&A3) \ } \ } -#define IMMMEMREG(PREFIX, REX, OPCODE, A1, A2, A3) \ +#define IMMMEMREG(REX, PREFIX, OPCODE, A1, A2, A3) \ (Parsev) { \ .instr = (Instr) { \ .kind = ASM_INSTR, .encoder = ENCODER_IMMMEMREG, .prefix = PREFIX, \ - .opcode = OPCODE, .rex = REX, .arg1 = internparsev(&A1), \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ .arg2 = internparsev(&A2), .arg3 = internparsev(&A3) \ } \ } |
