on master help sign in
Tinker with bytecode
commit0bb157e1d5dfd7d915ccadbdf1292b6fb312fb76 authorEdwin Brady <eb@cs.st-andrews.ac.uk> dateWed 8 Aug 2012, 12:19 (14 years ago) parent60e9780
3 files changed+79−73
src/IRTS/Bytecode.hs+62−60 src/IRTS/LParser.hs+4−3 src/IRTS/Simplified.hs+13−10
src/IRTS/Bytecode.hs+62−60
@@ -5,65 +5,67 @@ import IRTS.Simplified
55import Core.TT
66import Data.Maybe
77
8−-- data Reg = RVal | CaseVar | L Int
8+-- TODO: Need L to refer from the bottom of the current stack frame,
9+-- T from the top.
910
10−-- data BC = ASSIGN Reg Reg
11−-- | ASSIGNCONST Reg Const
12−-- | MKCON Reg Int Int
13−-- | CASE [(Int, [BC])] (Maybe [BC])
14−-- | GETARGS Int -- discards afterwards
15−-- | CONSTCASE [(Const, [BC])] (Maybe [BC])
16−-- | CALL Name
17−-- | TAILCALL Name
18−-- | PRINTNUM
19−-- | PRINTSTR
20−-- | GROWSTACK Int
21−-- | DROPSTACK Int
22−-- | SLIDE Int Int -- number to drop, number to keep
23−-- | OP PrimFn
24−-- deriving Show
11+data Reg = RVal | L Int | T Int
12+ deriving (Show, Eq)
13+
14+data BC = ASSIGN Reg Reg
15+ | ASSIGNCONST Reg Const
16+ | MKCON Reg Int [Reg]
17+ | CASE Reg [(Int, [BC])] (Maybe [BC])
18+ | PROJECT Reg Int Int -- get all args from reg, put them from Int onwards
19+ | GETARGS Int -- discards afterwards
20+ | CONSTCASE [(Const, [BC])] (Maybe [BC])
21+ | CALL Name
22+ | TAILCALL Name
23+ | PRINTNUM
24+ | PRINTSTR
25+ | GROWSTACK Int
26+ | DROPSTACK Int
27+ | SLIDE Int Int -- number to drop, number to keep
28+ | OP Reg PrimFn [Reg]
29+ deriving Show
30+
31+toBC :: (Name, SDecl) -> (Name, [BC])
32+toBC (n, SFun n' args locs exp)
33+ = (n, GROWSTACK locs : bc RVal exp (length args + locs))
34+
35+clean 0 = []
36+clean c = [DROPSTACK c]
37+
38+bc :: Reg -> SExp -> Int -> [BC]
39+bc reg (SV (Glob n)) c = [CALL n] ++ assign reg RVal ++ clean c
40+bc reg (SV (Loc i)) c = assign reg (L i) ++ clean c
41+bc reg (SApp tc f vs) c
42+ = GROWSTACK (length vs) : moveReg (c + length vs) vs
43+ ++ [CALL f] ++ assign reg RVal ++ clean c
44+bc reg (SLet (Loc i) e sc) c = bc (L i) e 0 ++ bc reg sc c
45+bc reg (SCon i _ vs) c = MKCON reg i (map getL vs) : clean c
46+ where getL (Loc x) = L x
47+bc reg (SConst i) c = ASSIGNCONST reg i : clean c
48+bc reg (SOp p vs) c = OP reg p (map getL vs) : clean c
49+ where getL (Loc x) = L x
50+bc reg (SCase (Loc l) alts) c
51+ | isConst alts = undefined -- constCase reg c l alts
52+ | otherwise = conCase reg c (L l) alts : clean c
53+
54+isConst [] = False
55+isConst (SConstCase _ _ : xs) = True
56+isConst (SConCase _ _ _ _ _ : xs) = False
57+isConst (_ : xs) = False
58+
59+moveReg off [] = []
60+moveReg off (Loc x : xs) = assign (L off) (L x) ++ moveReg (off + 1) xs
61+
62+assign r1 r2 | r1 == r2 = []
63+ | otherwise = [ASSIGN r1 r2]
64+
65+conCase reg c l xs = CASE l (mapMaybe (caseAlt l reg c) xs)
66+ Nothing
67+
68+caseAlt l reg c (SConCase lvar tag _ args e)
69+ = Just (tag, PROJECT l lvar (length args) : bc reg e c)
70+caseAlt l reg c _ = Nothing
2571
26−-- toBC :: (Name, LDecl) -> Maybe (Name, [BC])
27−-- toBC (n, LConstructor _ _ _) = Nothing
28−-- toBC (n, LFun n' args exp) = let cleanup = [SLIDE (length args) 1] in
29−-- Just (n, bc (length args - 1) exp cleanup)
30−--
31−-- bc :: Int -> LExp -> [BC] -> [BC]
32−-- bc top (LV (Glob n)) c = [CALL n] ++ c
33−-- bc top (LV (Loc i)) c = [PUSH (top-i)] ++ c
34−-- bc top (LApp tc fn args) c
35−-- = bcArgs top args ++
36−-- if tc then [SLIDE top (length args), TAILCALL fn]
37−-- else [CALL fn] ++ c
38−-- bc top (LCon tag _ args) c
39−-- = bcArgs top args ++ [MKCON tag (length args)] ++ c
40−-- bc top (LConst i) c = [PUSHCONST i] ++ c
41−-- bc top (LCase e alts) c = bc top e [] ++
42−-- if constCase alts then bcCaseConst top alts
43−-- else bcCase top alts
44−-- ++ c
45−-- bc top (LLet _ v e) c = bc top v [] ++ bc (top + 1) e [] ++ c
46−-- bc top (LOp prim args) c = bcArgs top args ++ [OP prim] ++ c
47−--
48−-- bcArgs top [] = []
49−-- bcArgs top (x : xs) = bc top x [] ++ bcArgs (top + 1) xs
50−--
51−-- constCase (LConstCase _ _ : _) = True
52−-- constCase (LConCase _ _ _ _ : _) = False
53−-- constCase (_ : xs) = constCase xs
54−-- constCase _ = False
55−--
56−-- bcCase top xs = [CASE (mapMaybe (conClause top) xs) (defaultCase top xs)]
57−-- bcCaseConst top xs = [CONSTCASE (mapMaybe (constClause top) xs) (defaultCase top xs)]
58−--
59−-- conClause top (LConCase tag _ args e) = Just (tag, GETARGS (length args) :
60−-- bc (top + length args) e []
61−-- ++ [SLIDE (length args) 1])
62−-- conClause top _ = Nothing
63−--
64−-- constClause top (LConstCase c e) = Just (c, bc top e [])
65−-- constClause top _ = Nothing
66−--
67−-- defaultCase top [] = Nothing
68−-- defaultCase top (LDefaultCase e : xs) = Just (bc top e [])
69−-- defaultCase top (_ : xs) = defaultCase top xs
src/IRTS/LParser.hs+4−3
@@ -4,6 +4,7 @@ import Core.CoreParser
44import Core.TT
55import IRTS.Lang
66import IRTS.Simplified
7+import IRTS.Bytecode
78
89import Text.ParserCombinators.Parsec
910import Text.ParserCombinators.Parsec.Error
@@ -47,9 +48,9 @@ fovm f = do defs <- parseFOVM f
4748 let ctxtIn = addAlist tagged emptyContext
4849 let checked = checkDefs ctxtIn tagged
4950 print checked
50−-- case checked of
51−-- OK c -> do let bc = mapMaybe toBC c
52−-- print bc
51+ case checked of
52+ OK c -> do let bc = map toBC c
53+ print bc
5354
5455parseFOVM :: FilePath -> IO [(Name, LDecl)]
5556parseFOVM fname = do putStrLn $ "Reading " ++ fname
src/IRTS/Simplified.hs+13−10
@@ -17,12 +17,12 @@ data SExp = SV LVar
1717 | SOp PrimFn [LVar]
1818 deriving Show
1919
20−data SAlt = SConCase Int Name [Name] SExp
20+data SAlt = SConCase Int Int Name [Name] SExp
2121 | SConstCase Const SExp
2222 | SDefaultCase SExp
2323 deriving Show
2424
25−data SDecl = SFun Name [Name] SExp
25+data SDecl = SFun Name [Name] Int SExp
2626 deriving Show
2727
2828hvar :: State (LDefs, Int) Int
@@ -76,7 +76,7 @@ mkapp f args = mkapp' f args [] where
7676 return (SLet x e sc)
7777
7878sAlt (LConCase i n args e) = do e' <- simplify e
79− return (SConCase i n args e')
79+ return (SConCase (-1) i n args e')
8080sAlt (LConstCase c e) = do e' <- simplify e
8181 return (SConstCase c e')
8282sAlt (LDefaultCase e) = do e' <- simplify e
@@ -89,15 +89,18 @@ checkDefs ctxt (con@(n, LConstructor _ _ _) : xs)
8989 return xs'
9090checkDefs ctxt ((n, LFun n' args exp) : xs)
9191 = do let sexp = evalState (simplify exp) (ctxt, 0)
92− exp' <- scopecheck ctxt (zip args [0..]) sexp
92+ (exp', locs) <- runStateT (scopecheck ctxt (zip args [0..]) sexp) (-1)
9393 xs' <- checkDefs ctxt xs
94− return ((n, SFun n' args exp') : xs')
94+ return ((n, SFun n' args ((locs + 1) - length args) exp') : xs')
9595
96−scopecheck :: LDefs -> [(Name, Int)] -> SExp -> TC SExp
96+lvar v = do i <- get
97+ put (max i v)
98+
99+scopecheck :: LDefs -> [(Name, Int)] -> SExp -> StateT Int TC SExp
97100scopecheck ctxt env tm = sc env tm where
98101 sc env (SV (Glob n)) =
99102 case lookup n (reverse env) of -- most recent first
100− Just i -> return (SV (Loc i))
103+ Just i -> do lvar i; return (SV (Loc i))
101104 Nothing -> case lookupCtxt Nothing n ctxt of
102105 [LConstructor _ i ar] ->
103106 if ar == 0 then return (SCon i n [])
@@ -141,7 +144,7 @@ scopecheck ctxt env tm = sc env tm where
141144
142145 scVar env (Glob n) =
143146 case lookup n (reverse env) of -- most recent first
144− Just i -> return (Loc i)
147+ Just i -> do lvar i; return (Loc i)
145148 Nothing -> case lookupCtxt Nothing n ctxt of
146149 [LConstructor _ i ar] ->
147150 fail $ "Codegen error : can't pass constructor here"
@@ -149,7 +152,7 @@ scopecheck ctxt env tm = sc env tm where
149152 [] -> fail $ "Codegen error: No such variable " ++ show n
150153 scVar _ x = return x
151154
152− scalt env (SConCase i n args e)
155+ scalt env (SConCase _ i n args e)
153156 = do let env' = env ++ zip args [length env..]
154157 tag <- case lookupCtxt Nothing n ctxt of
155158 [LConstructor _ i ar] ->
@@ -158,7 +161,7 @@ scopecheck ctxt env tm = sc env tm where
158161 " has arity " ++ show ar
159162 _ -> fail $ "Codegen error: No constructor " ++ show n
160163 e' <- sc env' e
161− return (SConCase tag n args e')
164+ return (SConCase (length env) tag n args e')
162165 scalt env (SConstCase c e) = do e' <- sc env e
163166 return (SConstCase c e')
164167 scalt env (SDefaultCase e) = do e' <- sc env e