@@ -108,8 +108,8 @@ bcc i (ASSIGNCONST l c)
108 mkConst _ = "MKINT(42424242)"
108 mkConst _ = "MKINT(42424242)"
109bcc i (UPDATE l r) = indent i ++ creg l ++ " = " ++ creg r ++ ";\n"
109bcc i (UPDATE l r) = indent i ++ creg l ++ " = " ++ creg r ++ ";\n"
110bcc i (MKCON l tag args)
110bcc i (MKCON l tag args)
111− = indent i ++ creg Tmp ++ " = allocCon(vm, " ++ show (length args) ++
111+ = indent i ++ "allocCon(" ++ creg Tmp ++ ", vm, " ++ show tag ++ "," ++
112− ", 0); " ++ "SETTAG(" ++ creg Tmp ++ ", " ++ show tag ++ ");\n" ++
112+ show (length args) ++ ", 0);\n" ++
113 indent i ++ setArgs 0 args ++ "\n" ++
113 indent i ++ setArgs 0 args ++ "\n" ++
114 indent i ++ creg l ++ " = " ++ creg Tmp ++ ";\n"
114 indent i ++ creg l ++ " = " ++ creg Tmp ++ ";\n"
@@ -124,12 +124,15 @@ bcc i (PROJECT l loc a) = indent i ++ "PROJECT(vm, " ++ creg l ++ ", " ++ show l
124 ", " ++ show a ++ ");\n"
124 ", " ++ show a ++ ");\n"
125bcc i (PROJECTINTO r t idx)
125bcc i (PROJECTINTO r t idx)
126 = indent i ++ creg r ++ " = GETARG(" ++ creg t ++ ", " ++ show idx ++ ");\n"
126 = indent i ++ creg r ++ " = GETARG(" ++ creg t ++ ", " ++ show idx ++ ");\n"
127−bcc i (CASE r code def)
127+bcc i (CASE safe r code def)
128− = indent i ++ "switch(TAG(" ++ creg r ++ ")) {\n" ++
128+ = indent i ++ "switch(" ++ ctag safe ++ "(" ++ creg r ++ ")) {\n" ++
129 concatMap (showCase i) code ++
129 concatMap (showCase i) code ++
130 showDef i def ++
130 showDef i def ++
131 indent i ++ "}\n"
131 indent i ++ "}\n"
133 showCase i (t, bc) = indent i ++ "case " ++ show t ++ ":\n"
136 showCase i (t, bc) = indent i ++ "case " ++ show t ++ ":\n"
134 ++ concatMap (bcc (i+1)) bc ++ indent (i + 1) ++ "break;\n"
137 ++ concatMap (bcc (i+1)) bc ++ indent (i + 1) ++ "break;\n"
135 showDef i Nothing = ""
138 showDef i Nothing = ""
@@ -180,7 +183,9 @@ bcc i (CALL n) = indent i ++ "CALL(" ++ cname n ++ ");\n"
180bcc i (TAILCALL n) = indent i ++ "TAILCALL(" ++ cname n ++ ");\n"
183bcc i (TAILCALL n) = indent i ++ "TAILCALL(" ++ cname n ++ ");\n"
181bcc i (SLIDE n) = indent i ++ "SLIDE(vm, " ++ show n ++ ");\n"
184bcc i (SLIDE n) = indent i ++ "SLIDE(vm, " ++ show n ++ ");\n"
182bcc i REBASE = indent i ++ "REBASE;\n"
185bcc i REBASE = indent i ++ "REBASE;\n"
186+bcc i (RESERVE 0) = ""
183bcc i (RESERVE n) = indent i ++ "RESERVE(" ++ show n ++ ");\n"
187bcc i (RESERVE n) = indent i ++ "RESERVE(" ++ show n ++ ");\n"
188+bcc i (ADDTOP 0) = ""
184bcc i (ADDTOP n) = indent i ++ "ADDTOP(" ++ show n ++ ");\n"
189bcc i (ADDTOP n) = indent i ++ "ADDTOP(" ++ show n ++ ");\n"
185bcc i (TOPBASE n) = indent i ++ "TOPBASE(" ++ show n ++ ");\n"
190bcc i (TOPBASE n) = indent i ++ "TOPBASE(" ++ show n ++ ");\n"
186bcc i (BASETOP n) = indent i ++ "BASETOP(" ++ show n ++ ");\n"
191bcc i (BASETOP n) = indent i ++ "BASETOP(" ++ show n ++ ");\n"
@@ -240,6 +245,7 @@ doOp v LFGe [l, r] = v ++ "FLOATBOP(>=," ++ creg l ++ ", " ++ creg r ++ ")"
241doOp v LBPlus [l, r] = v ++ "idris_bigPlus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
246doOp v LBPlus [l, r] = v ++ "idris_bigPlus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
242doOp v LBMinus [l, r] = v ++ "idris_bigMinus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
247doOp v LBMinus [l, r] = v ++ "idris_bigMinus(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
248+doOp v LBDec [l] = v ++ "idris_bigMinus(vm, " ++ creg l ++ ", MKINT(1))"
243doOp v LBTimes [l, r] = v ++ "idris_bigTimes(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
249doOp v LBTimes [l, r] = v ++ "idris_bigTimes(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
244doOp v LBDiv [l, r] = v ++ "idris_bigDivide(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
250doOp v LBDiv [l, r] = v ++ "idris_bigDivide(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
245doOp v LBMod [l, r] = v ++ "idris_bigMod(vm, " ++ creg l ++ ", " ++ creg r ++ ")"
251doOp v LBMod [l, r] = v ++ "idris_bigMod(vm, " ++ creg l ++ ", " ++ creg r ++ ")"