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

SCM Repository

[smlnj] Annotation of /sml/trunk/src/MLRISC/mltree/mltree-fold.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/mltree/mltree-fold.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 591 - (view) (download)

1 : leunga 591 functor MLTreeFold
2 :     (structure T : MLTREE
3 :     (* Extension mechnism *)
4 :     val sext : 'b T.folder -> T.sext * 'b -> 'b
5 :     val rext : 'b T.folder -> T.ty * T.rext * 'b -> 'b
6 :     val fext : 'b T.folder -> T.fty * T.fext * 'b -> 'b
7 :     val ccext : 'b T.folder -> T.ty * T.ccext * 'b -> 'b
8 :     ) : MLTREE_FOLD =
9 :     struct
10 :     structure T = T
11 :    
12 :     fun fold{rexp=doRexp, fexp=doFexp, ccexp=doCCexp, stm=doStm} =
13 :     let fun stm(s,x) =
14 :     let val x =
15 :     case s of
16 :     T.MV(ty,dst,e) => rexp(e,x)
17 :     | T.CCMV(dst,e) => ccexp(e,x)
18 :     | T.FMV(fty,dst,e) => fexp(e,x)
19 :     | T.COPY _ => x
20 :     | T.FCOPY _ => x
21 :     | T.JMP(ctrls,e,cf) => rexp(e,x)
22 :     | T.BCC(ctrls,cc,l) => ccexp(cc,x)
23 :     | T.CALL{funct,defs,uses,...} =>
24 :     mlriscs(uses,mlriscs(defs,rexp(funct,x)))
25 :     | T.RET _ => x
26 :     | T.JOIN _ => x
27 :     | T.IF(ctrls,cc,yes,no) => stm(no,stm(yes,ccexp(cc,x)))
28 :     | T.STORE(ty,ea,d,r) => rexp(d,rexp(ea,x))
29 :     | T.FSTORE(fty,ea,d,r) => fexp(d,rexp(ea,x))
30 :     | T.REGION(s,ctrl) => stm(s,x)
31 :     | T.SEQ s => stms(s,x)
32 :     | T.DEFINE _ => x
33 :     | T.ANNOTATION(s,an) => stm(s,x)
34 :     | T.EXT s =>
35 :     sext {stm=stm, rexp=rexp, fexp=fexp, ccexp=ccexp} (s,x)
36 :     | T.PHI _ => x
37 :     | T.PINNED s => stm(s,x)
38 :     | T.RTL _ => x
39 :     in doStm(s,x) end
40 :    
41 :     and stms(ss,x) = foldr stm x ss
42 :    
43 :     and rexp(e,x) =
44 :     let val x = case e of
45 :     T.REG _ => x
46 :     | T.LI _ => x
47 :     | T.LI32 _ => x
48 :     | T.LI64 _ => x
49 :     | T.LABEL _ => x
50 :     | T.CONST _ => x
51 :     | T.NEG(ty,a) => rexp(a,x)
52 :     | T.ADD(ty,a,b) => rexp2(a,b,x)
53 :     | T.SUB(ty,a,b) => rexp2(a,b,x)
54 :     | T.MULS(ty,a,b) => rexp2(a,b,x)
55 :     | T.DIVS(ty,a,b) => rexp2(a,b,x)
56 :     | T.QUOTS(ty,a,b) => rexp2(a,b,x)
57 :     | T.REMS(ty,a,b) => rexp2(a,b,x)
58 :     | T.MULU(ty,a,b) => rexp2(a,b,x)
59 :     | T.DIVU(ty,a,b) => rexp2(a,b,x)
60 :     | T.REMU(ty,a,b) => rexp2(a,b,x)
61 :     | T.NEGT(ty,a) => rexp(a,x)
62 :     | T.ADDT(ty,a,b) => rexp2(a,b,x)
63 :     | T.SUBT(ty,a,b) => rexp2(a,b,x)
64 :     | T.MULT(ty,a,b) => rexp2(a,b,x)
65 :     | T.DIVT(ty,a,b) => rexp2(a,b,x)
66 :     | T.QUOTT(ty,a,b) => rexp2(a,b,x)
67 :     | T.REMT(ty,a,b) => rexp2(a,b,x)
68 :     | T.ANDB(ty,a,b) => rexp2(a,b,x)
69 :     | T.ORB(ty,a,b) => rexp2(a,b,x)
70 :     | T.XORB(ty,a,b) => rexp2(a,b,x)
71 :     | T.NOTB(ty,a) => rexp(a,x)
72 :     | T.SRA(ty,a,b) => rexp2(a,b,x)
73 :     | T.SRL(ty,a,b) => rexp2(a,b,x)
74 :     | T.SLL(ty,a,b) => rexp2(a,b,x)
75 :     | T.CVTI2I(t,ext,t',e) => rexp(e,x)
76 :     | T.CVTF2I(ty,mode,fty,e) => fexp(e,x)
77 :     | T.COND(ty,cc,yes,no) => rexp(no,rexp(yes,ccexp(cc,x)))
78 :     | T.LOAD(ty,ea,r) => rexp(ea,x)
79 :     | T.PRED(e,ctrl) => rexp(e,x)
80 :     | T.LET(s,e) => rexp(e,stm(s,x))
81 :     | T.REXT(t,e) =>
82 :     rext{stm=stm, rexp=rexp, fexp=fexp, ccexp=ccexp} (t,e,x)
83 :     | T.MARK(e,an) => rexp(e,x)
84 :     in doRexp(e,x) end
85 :    
86 :     and rexp2(a,b,x) = rexp(b,rexp(a,x))
87 :    
88 :     and rexps(es,x) = foldr rexp x es
89 :    
90 :     and fexp(e,x) =
91 :     let val x = case e of
92 :     T.FREG _ => x
93 :     | T.FLOAD(fty,e,r) => rexp(e,x)
94 :     | T.FADD(fty,a,b) => fexp2(a,b,x)
95 :     | T.FSUB(fty,a,b) => fexp2(a,b,x)
96 :     | T.FMUL(fty,a,b) => fexp2(a,b,x)
97 :     | T.FDIV(fty,a,b) => fexp2(a,b,x)
98 :     | T.FABS(fty,e) => fexp(e,x)
99 :     | T.FNEG(fty,e) => fexp(e,x)
100 :     | T.FSQRT(fty,e) => fexp(e,x)
101 :     | T.FCOPYSIGN(fty,a,b) => fexp2(a,b,x)
102 :     | T.FCOND(fty,c,a,b) => fexp2(a,b,ccexp(c,x))
103 :     | T.CVTI2F(fty,ty,e) => rexp(e,x)
104 :     | T.CVTF2F(fty,fty',e) => fexp(e,x)
105 :     | T.FPRED(e,ctrl) => fexp(e,x)
106 :     | T.FEXT(t,e) =>
107 :     fext {stm=stm, rexp=rexp, fexp=fexp, ccexp=ccexp} (t,e,x)
108 :     | T.FMARK(e,an) => fexp(e,x)
109 :     in doFexp(e,x) end
110 :    
111 :     and fexp2(a,b,x) = fexp(b,fexp(a,x))
112 :    
113 :     and fexps(es,x) = foldr fexp x es
114 :    
115 :     and ccexp(e,x) =
116 :     let val x = case e of
117 :     T.CC _ => x
118 :     | T.FCC _ => x
119 :     | T.TRUE => x
120 :     | T.FALSE => x
121 :     | T.NOT e => ccexp(e,x)
122 :     | T.AND(a,b) => ccexp2(a,b,x)
123 :     | T.OR(a,b) => ccexp2(a,b,x)
124 :     | T.XOR(a,b) => ccexp2(a,b,x)
125 :     | T.CMP(ty,cond,a,b) => rexp2(a,b,x)
126 :     | T.FCMP(ty,fcond,a,b) => fexp2(a,b,x)
127 :     | T.CCMARK(e,an) => ccexp(e,x)
128 :     | T.CCEXT(t,e) =>
129 :     ccext{stm=stm, rexp=rexp, fexp=fexp, ccexp=ccexp}(t,e,x)
130 :     in doCCexp(e,x) end
131 :    
132 :     and ccexp2(a,b,x) = ccexp(b,ccexp(a,x))
133 :    
134 :     and mlriscs(m,x) = foldr mlrisc x m
135 :    
136 :     and mlrisc(m,x) =
137 :     let val x =
138 :     case m of
139 :     T.CCR e => ccexp(e,x)
140 :     | T.GPR e => rexp(e,x)
141 :     | T.FPR e => fexp(e,x)
142 :     in x end
143 :    
144 :     in { rexp=rexp, fexp=fexp, ccexp=ccexp, stm=stm } end
145 :     end (* MLTreeFold *)
146 :    

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