summaryrefslogtreecommitdiff
path: root/2019/ic-asm.hs
diff options
context:
space:
mode:
Diffstat (limited to '2019/ic-asm.hs')
-rw-r--r--2019/ic-asm.hs16
1 files changed, 8 insertions, 8 deletions
diff --git a/2019/ic-asm.hs b/2019/ic-asm.hs
index f3f5540..aec6e51 100644
--- a/2019/ic-asm.hs
+++ b/2019/ic-asm.hs
@@ -25,9 +25,9 @@ data Stmt
| Halt
deriving (Show)
-assemble :: [Stmt] -> [Int]
+assemble :: [Stmt] -> [Integer]
assemble stmts =
- IC.unparse (IC.Jnz (IC.Imm 1) (IC.Imm (3 + nvars)))
+ IC.unparse (IC.Jnz (IC.Imm 1) (IC.mkImm (3 + nvars)))
++ replicate nvars 0
++ concatMap IC.unparse (snd (goL nvars stmts))
where
@@ -49,25 +49,25 @@ assemble stmts =
go off (Ceq n a b) = ([IC.Clt (ref a) (ref b) (ref (Var n))], off + 4)
go off (If a [] s2) =
let (off', ics2) = goL (off + 3) s2
- in (IC.Jnz (ref a) (IC.Imm off') : ics2
+ in (IC.Jnz (ref a) (IC.mkImm off') : ics2
, off')
go off (If a s1 s2) =
let (offAfterThen, ics2) = goL (off + 3) s2
(offAfterElse, ics1) = goL (offAfterThen + 3) s1
- in ([IC.Jez (ref a) (IC.Imm (offAfterThen + 3))]
+ in ([IC.Jez (ref a) (IC.mkImm (offAfterThen + 3))]
++ ics2
- ++ [IC.Jnz (IC.Imm 1) (IC.Imm offAfterElse)]
+ ++ [IC.Jnz (IC.Imm 1) (IC.mkImm offAfterElse)]
++ ics1
, offAfterElse)
go off (While a s) =
let (offAfterBody, ics) = goL (off + 3) s
- in ([IC.Jez (ref a) (IC.Imm (offAfterBody + 3))]
+ in ([IC.Jez (ref a) (IC.mkImm (offAfterBody + 3))]
++ ics
- ++ [IC.Jnz (ref a) (IC.Imm (off + 3))]
+ ++ [IC.Jnz (ref a) (IC.mkImm (off + 3))]
, offAfterBody + 3)
go off Halt = ([IC.Hlt], off + 1)
- ref (Imm n) = IC.Imm n
+ ref (Imm n) = IC.mkImm n
ref (Var n) = case Map.lookup n var2idx of
Just idx -> IC.Addr idx
Nothing -> error $ "Undeclared variable '" ++ n ++ "'"