diff options
Diffstat (limited to '2019/ic-asm.hs')
-rw-r--r-- | 2019/ic-asm.hs | 16 |
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 ++ "'" |