aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm.peg17
-rw-r--r--test/test.sh6
2 files changed, 18 insertions, 5 deletions
diff --git a/asm.peg b/asm.peg
index 089bfb2..d228cb0 100644
--- a/asm.peg
+++ b/asm.peg
@@ -583,12 +583,15 @@ sal = "sal" (
'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); }
@@ -598,12 +601,15 @@ sar = "sar" (
'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); }
@@ -613,12 +619,15 @@ shl = "shl" (
'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); }
@@ -628,12 +637,15 @@ shr = "shr" (
'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); }
@@ -650,6 +662,11 @@ test = "test" (
| '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:mem ws? ',' ws? d:r8 { $$ = MEMREG({.w=0}, -1, 0x84, s, d); }
+ | 'w'? ws s:mem ws? ',' ws? d:r16 { $$ = MEMREG({.w=0}, 0x66, 0x85, s, d); }
+ | 'l'? ws s:mem ws? ',' ws? d:r32 { $$ = MEMREG({.w=0}, -1, 0x85, s, d); }
+ | 'q'? ws s:mem ws? ',' ws? d:r64 { $$ = MEMREG({.w=1}, -1, 0x85, 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); }
diff --git a/test/test.sh b/test/test.sh
index 0b959ae..4f33634 100644
--- a/test/test.sh
+++ b/test/test.sh
@@ -31,6 +31,7 @@ t () {
}
# Various regression tests first.
+t "testl -740(%rbp), %r11d"
t "movss %xmm15,-0x128(%rbp)"
t "xchgq %r13, %rax"
t "movl \$1000, %r8d"
@@ -306,11 +307,6 @@ do
t "${op}l %e${r}x, %eax"
t "${op}q %r${r}x, %rax"
- if test "$op" = "test" # m -> r variants are not supported by test
- then
- continue
- fi
-
# m -> r variants
t "${op}b (%rip), %${r}l"
t "${op}b (%rax), %${r}l"