@@ -84,6 +84,9 @@ catom (CL l) = reg (LVar l)
84catom (CC (I i)) = "MKINT(" ++ show i ++ ")"
84catom (CC (I i)) = "MKINT(" ++ show i ++ ")"
85catom (CC v) = "const(" ++ show v ++ ")"
85catom (CC v) = "const(" ++ show v ++ ")"
86catom (CP n) = cname n
86catom (CP n) = cname n
88+off o (CL i) = CL (i + o)
88assignCon i r tag args
91assignCon i r tag args
89 = indent i ++ reg r ++ " = MKCON(" ++ show tag ++ ", " ++
92 = indent i ++ reg r ++ " = MKCON(" ++ show tag ++ ", " ++
@@ -97,17 +100,22 @@ assignCon i r tag args
98assignFn i r f args
101assignFn i r f args
99 = indent i ++ "EXTEND(" ++ show (length args) ++ ");\n" ++
102 = indent i ++ "EXTEND(" ++ show (length args) ++ ");\n" ++
100− indent i ++ setArgs 1 (reverse args) ++ "\n"
103+ indent i ++ setArgs 1 (map (off (length args)) (reverse args)) ++ "\n" ++
101− -- indent i ++ "CALL(" ++ reg r ++ ", " ++ cname f ++ ");\n"
104+ indent i ++ cname f ++ "(vm);\n" ++
105+ indent i ++ "CLEAR(" ++ show (length args) ++ ");\n" ++
108+ r -> indent i ++ reg r ++ " = " ++ reg RVal ++ "\n"
103 setArgs i [] = ""
110 setArgs i [] = ""
104 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
111 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
105 ++ setArgs (i + 1) as
112 ++ setArgs (i + 1) as
107−tailCall i d f args
114+doTailCall i d f args
108 = indent i ++ "EXTEND(" ++ show (length args) ++ ");\n" ++
115 = indent i ++ "EXTEND(" ++ show (length args) ++ ");\n" ++
109− indent i ++ setArgs 1 (reverse args) ++ "\n"
116+ indent i ++ setArgs 1 (map (off (length args)) (reverse args)) ++ "\n" ++
110−-- indent i ++ "TAILCALL(" ++ show d ++ ", " ++ cname f ++ ");\n"
117+ indent i ++ "SLIDE(" ++ show d ++ ", " ++ show (length args) ++ ");\n" ++
118+ indent i ++ cname f ++ "(vm); return;\n"
112 setArgs i [] = ""
120 setArgs i [] = ""
113 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
121 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
@@ -116,7 +124,7 @@ tailCall i d f args
116cg :: Int -> CInst -> String
124cg :: Int -> CInst -> String
117cg i (ASSIGN r (CCon t args))
125cg i (ASSIGN r (CCon t args))
118 = assignCon i r t args
126 = assignCon i r t args
119−cg i (ASSIGN r (CApp f args))
127+cg i (ASSIGN r (CExactApp f args))
120 = assignFn i r f args
128 = assignFn i r f args
121cg i (ASSIGN r (CAtom e)) = indent i ++ reg r ++ " = " ++ catom e ++ ";\n"
129cg i (ASSIGN r (CAtom e)) = indent i ++ reg r ++ " = " ++ catom e ++ ";\n"
122cg i (RESERVE s) = indent i ++ "EXTEND(" ++ show s ++ ");\n"
130cg i (RESERVE s) = indent i ++ "EXTEND(" ++ show s ++ ");\n"
@@ -137,7 +145,7 @@ cg i (SWITCH v bs def)
137 branch (t, c) = indent i ++ "case " ++ show t ++ ":\n" ++
145 branch (t, c) = indent i ++ "case " ++ show t ++ ":\n" ++
138 concatMap (cg (i+1)) c ++
146 concatMap (cg (i+1)) c ++
139 indent (i+1) ++ "break;\n"
147 indent (i+1) ++ "break;\n"
140−cg i (TAILCALL d f args) = tailCall i d f args
148+cg i (TAILCALLEXACT d f args) = doTailCall i d f args
141cg i (ERROR s) = indent i ++ "ERROR(" ++ show s ++ ")\n";
149cg i (ERROR s) = indent i ++ "ERROR(" ++ show s ++ ")\n";
142cg i _ = indent i ++ "NOT DONE;\n"
150cg i _ = indent i ++ "NOT DONE;\n"