aboutsummaryrefslogtreecommitdiff
path: root/asm.peg
diff options
context:
space:
mode:
authorAndrew Chambers <[email protected]>2021-10-05 18:58:52 +1300
committerAndrew Chambers <[email protected]>2021-10-05 18:58:52 +1300
commite0b52ff23ca304d581f80f0d9bd2de76fb042d03 (patch)
tree6ab1cef175157cbab62f9b379dbdb5f573b7cdbc /asm.peg
parent5c0af4055474834542e2813f36f4dd9a16479e53 (diff)
Add more add variants.
Diffstat (limited to 'asm.peg')
-rw-r--r--asm.peg18
1 files changed, 18 insertions, 0 deletions
diff --git a/asm.peg b/asm.peg
index 946f6e6..5bcd972 100644
--- a/asm.peg
+++ b/asm.peg
@@ -34,10 +34,19 @@ add = "addq" ws s:r-m64 ws? ',' ws? d:r64
{ $$.add = (Add){ .kind = ASM_ADD, .type = 'q', .src = dupv(&s), .dst = dupv(&d) } }
| "addq" ws s:imm ws? ',' ws? d:r-m64
{ $$.add = (Add){ .kind = ASM_ADD, .type = 'q', .src = dupv(&s), .dst = dupv(&d) } }
+ | "addl" ws s:r-m32 ws? ',' ws? d:r32
+ { $$.add = (Add){ .kind = ASM_ADD, .type = 'l', .src = dupv(&s), .dst = dupv(&d) } }
+ | "addl" ws s:r32 ws? ',' ws? d:r-m32
+ { $$.add = (Add){ .kind = ASM_ADD, .type = 'l', .src = dupv(&s), .dst = dupv(&d) } }
+ | "addl" ws s:imm ws? ',' ws? d:r-m32
+ { $$.add = (Add){ .kind = ASM_ADD, .type = 'l', .src = dupv(&s), .dst = dupv(&d) } }
r-m64 = r:r64 { $$ = r; }
| m:m { $$ = m; }
+r-m32 = r:r32 { $$ = r; }
+ | m:m { $$ = m; }
+
m = '(' ws? r:r64 ws? ')'
{ $$.memarg = (Memarg){ .kind = ASM_MEMARG, .c = 0, .l = NULL, .reg = r.kind } }
| <'-'?[0-9]+> ws? '(' ws? r:r64 ws? ')'
@@ -62,6 +71,15 @@ r64 = "%rax" { $$.kind = ASM_RAX }
| "%r14" { $$.kind = ASM_R14 }
| "%r15" { $$.kind = ASM_R15 }
+r32 = "%eax" { $$.kind = ASM_EAX }
+ | "%ecx" { $$.kind = ASM_ECX }
+ | "%edx" { $$.kind = ASM_EDX }
+ | "%ebx" { $$.kind = ASM_EBX }
+ | "%esp" { $$.kind = ASM_ESP }
+ | "%ebp" { $$.kind = ASM_EBP }
+ | "%esi" { $$.kind = ASM_ESI }
+ | "%edi" { $$.kind = ASM_EDI }
+
imm = '$' i:ident
{ $$.imm = (Imm){.kind = ASM_IMM, .l = i.ident.name, .c = 0 }; }