diff options
| author | Andrew Chambers <[email protected]> | 2021-10-12 19:42:01 +1300 |
|---|---|---|
| committer | Andrew Chambers <[email protected]> | 2021-10-12 19:42:01 +1300 |
| commit | 25fa3f8e631f26b09303b1263d9bf5cf4e564c64 (patch) | |
| tree | f3abf4d65645c5f1327dd81a9af8249f95dcc1bb /asm.peg | |
| parent | b4e630f77661aae9e030e9dabead9ba5b0370368 (diff) | |
More types of call.
Diffstat (limited to 'asm.peg')
| -rw-r--r-- | asm.peg | 33 |
1 files changed, 20 insertions, 13 deletions
@@ -118,9 +118,14 @@ pop = | 'q' ws d:m { $$ = INSTR1(1, d); } ) { $$.instr.kind = ASM_POP; } -call = - "call" 'q'? ws t:ident - { $$.call = (Call){ .kind = ASM_CALL, .target=t.charptr } ; } +call = "call" 'q'? ws ( + '*' t:m + { $$.call = (Call){ .kind = ASM_CALL, .target.indirect=dupv(&t), .indirect=1 } ; } + | '*' t:r64 + { $$.call = (Call){ .kind = ASM_CALL, .target.indirect=dupv(&t), .indirect=1 } ; } + | t:value + { $$.call = (Call){ .kind = ASM_CALL, .target.direct=t.value, .indirect=0 } ; } +) jmp = 'j' v:jmp-variant ws t:ident { $$.jmp = (Jmp) {.kind = ASM_JMP, .variant=v.i64, .target=t.charptr}; } @@ -408,19 +413,21 @@ r64-or-rip = ( | r:rip ) { $$ = r; } -scale-index-base = +m = + d:value ws? sib:opt-scale-index-base { $$ = sib; $$.memarg.disp = d.value; } + | sib:scale-index-base { $$ = sib; } + +opt-scale-index-base = + sib:scale-index-base { $$ = sib; } + | { $$.memarg = (Memarg){.kind=ASM_MEMARG, .scale = 0, .index=ASM_NO_REG, .base = ASM_NO_REG, .disp = {0} }; } + +scale-index-base = '(' ws? b:r64 ws? ',' ws? i:r64 ws? ',' ws? s:number ws? ')' - { $$.memarg = (Memarg){.kind=ASM_MEMARG, .scale = s.i64, .index=i.kind, .base = b.kind, .disp = (Value){ .c = 0, .l = NULL } }; } + { $$.memarg = (Memarg){.kind=ASM_MEMARG, .scale = s.i64, .index=i.kind, .base = b.kind, .disp = {0} }; } | '(' ws? b:r64 ws? ',' ws? i:r64 ')' - { $$.memarg = (Memarg){.kind=ASM_MEMARG, .scale = 1, .index=i.kind, .base = b.kind, .disp = (Value){ .c = 0, .l = NULL } }; } + { $$.memarg = (Memarg){.kind=ASM_MEMARG, .scale = 1, .index=i.kind, .base = b.kind, .disp = {0} }; } | '(' ws? b:r64-or-rip ws? ')' - { $$.memarg = (Memarg){.kind=ASM_MEMARG, .scale = 0, .index=ASM_NO_REG, .base = b.kind, .disp = (Value){ .c = 0, .l = NULL } }; } - -m = - sib:scale-index-base - { $$ = sib; } - | d:value ws? sib:scale-index-base - { sib.memarg.disp = d.value; $$ = sib; } + { $$.memarg = (Memarg){.kind=ASM_MEMARG, .scale = 0, .index=ASM_NO_REG, .base = b.kind, .disp = {0} }; } imm8 = i:imm { i.imm.nbytes = 1; $$ = i; } imm16 = i:imm { i.imm.nbytes = 2; $$ = i; } |
