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-rewrite.sml
ViewVC logotype

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 591 - (view) (download)

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

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