Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/branches/arith64/compiler/FLINT/cpsopt/infcnv.sml
ViewVC logotype

Diff of /sml/branches/arith64/compiler/FLINT/cpsopt/infcnv.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4809, Wed Sep 12 21:50:55 2018 UTC revision 4810, Wed Sep 12 21:52:19 2018 UTC
# Line 13  Line 13 
13    
14  structure IntInfCnv : sig  structure IntInfCnv : sig
15    
16      val elim : {      val elim : CPS.function -> CPS.function
             function : CPS.function,  
             mkKvar : unit -> LambdaVar.lvar,    (* new cont var. *)  
             mkNumVar : int -> LambdaVar.lvar    (* new num variable of the given size var. *)  
           } -> CPS.function  
17    
18  end = struct  end = struct
19    
20      structure C = CPS      structure C = CPS
21        structure LV = LambdaVar
22    
23      val boxNumSz = Target.mlValueSz     (* 32 or 64 *)      val boxNumSz = Target.mlValueSz     (* 32 or 64 *)
24    
# Line 30  Line 27 
27      val zero = C.NUM{ival = 0, ty={tag = true, sz = Target.defaultIntSz}}      val zero = C.NUM{ival = 0, ty={tag = true, sz = Target.defaultIntSz}}
28      val one  = C.NUM{ival = 1, ty={tag = true, sz = Target.defaultIntSz}}      val one  = C.NUM{ival = 1, ty={tag = true, sz = Target.defaultIntSz}}
29    
30      fun elim { function = cfun, mkKvar, mkNumVar } = let      fun elim cfun = let
           fun boxNumVar () = mkNumVar boxNumSz  
31            fun cexp (C.RECORD (rk, xl, v, e)) =            fun cexp (C.RECORD (rk, xl, v, e)) =
32                  C.RECORD (rk, xl, v, cexp e)                  C.RECORD (rk, xl, v, cexp e)
33              | cexp (C.SELECT (i, x, v, t, e)) =              | cexp (C.SELECT (i, x, v, t, e)) =
# Line 52  Line 48 
48                  C.LOOKER (l, xl, v, t, cexp e)                  C.LOOKER (l, xl, v, t, cexp e)
49              | cexp (C.PURE (C.P.copy_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)              | cexp (C.PURE (C.P.copy_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)
50                  then let                  then let
51                    val k = mkKvar ()                    val k = LV.mkLvar ()
52                    val e' = cexp e                    val e' = cexp e
53                    in                    in
54                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x, zero]))                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x, zero]))
55                    end                    end
56                  else let                  else let
57                    val k = mkKvar ()                    val k = LV.mkLvar ()
58                    val v' = boxNumVar ()                    val v' = LV.mkLvar ()
59                    val e' = cexp e                    val e' = cexp e
60                    in                    in
61                      C.FIX ([(C.CONT, k, [v], [t], e')],                      C.FIX ([(C.CONT, k, [v], [t], e')],
# Line 68  Line 64 
64                    end                    end
65              | cexp (C.PURE (C.P.extend_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)              | cexp (C.PURE (C.P.extend_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)
66                  then let                  then let
67                    val k = mkKvar ()                    val k = LV.mkLvar ()
68                    val e' = cexp e                    val e' = cexp e
69                    in                    in
70                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x, one]))                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x, one]))
71                    end                    end
72                  else let                  else let
73                    val k = mkKvar ()                    val k = LV.mkLvar ()
74                    val v' = boxNumVar ()                    val v' = LV.mkLvar ()
75                    val e' = cexp e                    val e' = cexp e
76                    in                    in
77                      C.FIX ([(C.CONT, k, [v], [t], e')],                      C.FIX ([(C.CONT, k, [v], [t], e')],
# Line 84  Line 80 
80                    end                    end
81              | cexp (C.ARITH (C.P.test_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)              | cexp (C.ARITH (C.P.test_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)
82                  then let                  then let
83                    val k = mkKvar ()                    val k = LV.mkLvar ()
84                    val e' = cexp e                    val e' = cexp e
85                    in                    in
86                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x]))                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x]))
87                    end                    end
88                  else let                  else let
89                    val k = mkKvar ()                    val k = LV.mkLvar ()
90                    val v' = boxNumVar ()                    val v' = LV.mkLvar ()
91                    val e' = cexp e                    val e' = cexp e
92                    in                    in
93                      C.FIX ([(C.CONT, k, [v'], [boxNumTy],                      C.FIX ([(C.CONT, k, [v'], [boxNumTy],
# Line 100  Line 96 
96                    end                    end
97              | cexp (C.PURE (C.P.trunc_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)              | cexp (C.PURE (C.P.trunc_inf sz, [x, f], v, t, e)) = if (sz = boxNumSz)
98                  then let                  then let
99                    val k = mkKvar ()                    val k = LV.mkLvar ()
100                    val e' = cexp e                    val e' = cexp e
101                    in                    in
102                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x]))                      C.FIX ([(C.CONT, k, [v], [t], e')], C.APP (f, [C.VAR k, x]))
103                    end                    end
104                  else let                  else let
105                    val k = mkKvar ()                    val k = LV.mkLvar ()
106                    val v' = boxNumVar ()                    val v' = LV.mkLvar ()
107                    val e' = cexp e                    val e' = cexp e
108                    in                    in
109                      C.FIX ([(C.CONT, k, [v'], [boxNumTy],                      C.FIX ([(C.CONT, k, [v'], [boxNumTy],

Legend:
Removed from v.4809  
changed lines
  Added in v.4810

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0