diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2024-04-28 15:06:43 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2024-04-28 15:06:43 -0700 |
| commit | 5737e8430d43b3b5bd448f761cd2f3c35707a174 (patch) | |
| tree | b24f44ea5245a56b2f712c2eef6a3897f53bd098 /codegen.sml | |
| parent | Add integer arithmetic. (diff) | |
| download | sml-5737e8430d43b3b5bd448f761cd2f3c35707a174.tar.zst | |
Add case over int.
Diffstat (limited to 'codegen.sml')
| -rw-r--r-- | codegen.sml | 15 |
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 |
