summaryrefslogtreecommitdiffstats
path: root/codegen.sml
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
committerRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
commit5737e8430d43b3b5bd448f761cd2f3c35707a174 (patch)
treeb24f44ea5245a56b2f712c2eef6a3897f53bd098 /codegen.sml
parentAdd integer arithmetic. (diff)
downloadsml-5737e8430d43b3b5bd448f761cd2f3c35707a174.tar.zst
Add case over int.
Diffstat (limited to 'codegen.sml')
-rw-r--r--codegen.sml15
1 files changed, 13 insertions, 2 deletions
diff --git a/codegen.sml b/codegen.sml
index 30928d4..a4fef6c 100644
--- a/codegen.sml
+++ b/codegen.sml
@@ -2,8 +2,8 @@ structure CodeGen =
struct
fun enumerate l = ListPair.zip (List.tabulate (length l, (fn x => x)), l)
- (* There are 8 registers *)
- val tempReg = 7
+ (* There are 256 registers *)
+ val tempReg = 255
structure VarMap = Map (type k = Syntax.var
val cmp = Int.compare)
@@ -149,6 +149,17 @@ struct
| Syntax.CPrimop (Syntax.PSub, [x, y], [res], [k]) => Syntax.OSub (translate res, translateVal x, translateVal y) :: go k
| Syntax.CPrimop (Syntax.PMul, [x, y], [res], [k]) => Syntax.OMul (translate res, translateVal x, translateVal y) :: go k
| Syntax.CPrimop (Syntax.PDiv, [x, y], [res], [k]) => Syntax.ODiv (translate res, translateVal x, translateVal y) :: go k
+ | Syntax.CPrimop (Syntax.PLess, [x, y], [res], [k]) => Syntax.OLess (translate res, translateVal x, translateVal y) :: go k
+ | Syntax.CPrimop (Syntax.PEq, [x, y], [res], [k]) => Syntax.OEq (translate res, translateVal x, translateVal y) :: go k
+ | Syntax.CPrimop (Syntax.PIf, [b], [], [k1, k2]) =>
+ let
+ val trueLabel = Gensym.new ()
+ in
+ Syntax.OIf (translateVal b, trueLabel)
+ :: go k2
+ @ Syntax.OLabel trueLabel
+ :: go k1
+ end
| _ => raise Fail ("malformed CPS:\n" ^ Syntax.cexpToString expr)
in go expr
end