aboutsummaryrefslogtreecommitdiff
path: root/asm.peg
diff options
context:
space:
mode:
authorAndrew Chambers <[email protected]>2021-10-10 02:21:07 +1300
committerAndrew Chambers <[email protected]>2021-10-10 02:21:07 +1300
commita1c13cabff6e80e6f3d025294b355a26300894e5 (patch)
tree6e4f67e8adaa1e70b22c6fc561737d97d1996648 /asm.peg
parent9e47a6b71ac6e3b4e3b9802f3a3d4b78d79c1b47 (diff)
Encode more imul variants.
Diffstat (limited to 'asm.peg')
-rw-r--r--asm.peg22
1 files changed, 15 insertions, 7 deletions
diff --git a/asm.peg b/asm.peg
index 75a43d9..08c5884 100644
--- a/asm.peg
+++ b/asm.peg
@@ -97,7 +97,7 @@ lea =
) { $$.instr.kind = ASM_LEA; }
div = "div" (
- args:divmul-opargs { $$ = args; }
+ args:divmul-opargs { $$ = args; }
) { $$.instr.kind = ASM_DIV; }
idiv = "idiv" (
@@ -105,18 +105,26 @@ idiv = "idiv" (
) { $$.instr.kind = ASM_IDIV; }
mul = "mul" (
- args:divmul-opargs { $$ = args; }
+ args:divmul-opargs { $$ = args; }
) { $$.instr.kind = ASM_MUL; }
imul = "imul" (
- args:divmul-opargs { $$ = args; }
+ (
+ 'w'? ws s:m ws? ',' ws? d:r16 { $$ = INSTR2(8, s, d); }
+ | 'l'? ws s:m ws? ',' ws? d:r32 { $$ = INSTR2(9, s, d); }
+ | 'q'? ws s:m ws? ',' ws? d:r64 { $$ = INSTR2(10, s, d); }
+ | 'w'? ws s:r16 ws? ',' ws? d:r16 { $$ = INSTR2(11, s, d); }
+ | 'l'? ws s:r32 ws? ',' ws? d:r32 { $$ = INSTR2(12, s, d); }
+ | 'q'? ws s:r64 ws? ',' ws? d:r64 { $$ = INSTR2(13, s, d); }
+ )
+ | args:divmul-opargs { $$ = args; } # Must come last due to peg ordering.
) { $$.instr.kind = ASM_IMUL; }
divmul-opargs =
- 'b' ws a:m { $$ = INSTR1(0, a); }
- | 'w' ws a:m { $$ = INSTR1(1, a); }
- | 'l' ws a:m { $$ = INSTR1(2, a); }
- | 'q' ws a:m { $$ = INSTR1(3, a); }
+ 'b' ws a:m { $$ = INSTR1(0, a); }
+ | 'w' ws a:m { $$ = INSTR1(1, a); }
+ | 'l' ws a:m { $$ = INSTR1(2, a); }
+ | 'q' ws a:m { $$ = INSTR1(3, a); }
| 'b'? ws a:r8 { $$ = INSTR1(4, a); }
| 'w'? ws a:r16 { $$ = INSTR1(5, a); }
| 'l'? ws a:r32 { $$ = INSTR1(6, a); }