aboutsummaryrefslogtreecommitdiff
path: root/asm.peg
diff options
context:
space:
mode:
authorAndrew Chambers <[email protected]>2021-10-10 23:14:33 +1300
committerAndrew Chambers <[email protected]>2021-10-10 23:14:33 +1300
commit157d4414e25132f99e0248ebe9a954236e6f50f7 (patch)
treec82d92061e1457a0fef6cf436dff8a8ed9c9a2ae /asm.peg
parent455ad9e979015cde50cd1f89a028aa0dd165b8b3 (diff)
Implement sign extension.
Diffstat (limited to 'asm.peg')
-rw-r--r--asm.peg26
1 files changed, 24 insertions, 2 deletions
diff --git a/asm.peg b/asm.peg
index a4db0a5..e8cd805 100644
--- a/asm.peg
+++ b/asm.peg
@@ -70,6 +70,8 @@ instr =
| i:lea { $$ = i; }
| i:mul { $$ = i; }
| i:imul { $$ = i; }
+ | i:movsx { $$ = i; }
+ | i:movzx { $$ = i; }
| i:mov { $$ = i; }
| i:or { $$ = i; }
| i:set { $$ = i; }
@@ -233,7 +235,27 @@ r-rm-opargs =
mov = "mov" (
args:imm-rm-opargs { $$ = args; }
| args:r-rm-opargs { args.instr.variant += 8; $$ = args; }
-) { $$.instr.kind = ASM_MOV; }
+) { $$.instr.kind = ASM_MOV; }
+
+movsx = "movs" (
+ args:mov-extend-opargs { $$ = args; }
+ | 'lq' ws s:m ws? ',' ws? d:r64 { $$ = INSTR2(10, s, d); }
+ | 'lq' ws s:r32 ws? ',' ws? d:r64 { $$ = INSTR2(10, s, d); }
+) { $$.instr.kind = ASM_MOVSX; }
+
+movzx = "movz" args:mov-extend-opargs { $$ = args; $$.instr.kind = ASM_MOVZX; }
+
+mov-extend-opargs =
+ 'bw' ws s:m ws? ',' ws? d:r16 { $$ = INSTR2(0, s, d); }
+ | 'bl' ws s:m ws? ',' ws? d:r32 { $$ = INSTR2(1, s, d); }
+ | 'bq' ws s:m ws? ',' ws? d:r64 { $$ = INSTR2(2, s, d); }
+ | 'wl' ws s:m ws? ',' ws? d:r32 { $$ = INSTR2(3, s, d); }
+ | 'wq' ws s:m ws? ',' ws? d:r64 { $$ = INSTR2(4, s, d); }
+ | 'bw' ws s:r8 ws? ',' ws? d:r16 { $$ = INSTR2(5, s, d); }
+ | 'bl' ws s:r8 ws? ',' ws? d:r32 { $$ = INSTR2(6, s, d); }
+ | 'bq' ws s:r8 ws? ',' ws? d:r64 { $$ = INSTR2(7, s, d); }
+ | 'wl' ws s:r16 ws? ',' ws? d:r32 { $$ = INSTR2(8, s, d); }
+ | 'wq' ws s:r16 ws? ',' ws? d:r64 { $$ = INSTR2(9, s, d); }
xchg =
'xchg' (
@@ -249,7 +271,7 @@ xchg =
add = "cmp" a:basic-op-args { a.instr.kind = ASM_CMP; $$ = a; }
cmp = "add" a:basic-op-args { a.instr.kind = ASM_ADD; $$ = a; }
and = "and" a:basic-op-args { a.instr.kind = ASM_AND; $$ = a; }
-or = "or" a:basic-op-args { a.instr.kind = ASM_OR; $$ = a; }
+or = "or" a:basic-op-args { a.instr.kind = ASM_OR; $$ = a; }
sub = "sub" a:basic-op-args { a.instr.kind = ASM_SUB; $$ = a; }
xor = "xor" a:basic-op-args { a.instr.kind = ASM_XOR; $$ = a; }