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/trunk/src/MLRISC/ppc/ra/ppcRewrite.sml
 [smlnj] / sml / trunk / src / MLRISC / ppc / ra / ppcRewrite.sml

# Diff of /sml/trunk/src/MLRISC/ppc/ra/ppcRewrite.sml

sml/branches/SMLNJ/src/MLRISC/ppc/ra/ppcRewrite.sml revision 245, Sat Apr 17 18:47:12 1999 UTC sml/trunk/src/MLRISC/ppc/ra/ppcRewrite.sml revision 889, Thu Jul 19 20:35:20 2001 UTC
# Line 1  Line 1
1  functor PPCRewrite(Instr : PPCINSTR) = struct  functor PPCRewrite(Instr : PPCINSTR) = struct
2    structure I = Instr    structure I = Instr
3      structure C = I.C
4      structure CB = CellsBasis
5
6    fun ea(NONE, _, _, _) = NONE    fun ea(NONE, _, _) = NONE
7      | ea(e as SOME(I.Direct r), rs, rt, mapr) =      | ea(e as SOME(I.Direct r), rs, rt) =
8         if mapr r=rs then SOME(I.Direct rt) else e         if CB.sameColor(r,rs) then SOME(I.Direct rt) else e
9      | ea(e as SOME(I.FDirect r), rs, rt, mapr) =      | ea(e as SOME(I.FDirect r), rs, rt) =
10         if mapr r=rs then SOME(I.FDirect rt) else e         if CB.sameColor(r,rs) then SOME(I.FDirect rt) else e
11      | ea(e as SOME(I.Displace{base, disp}), rs, rt, mapr) =      | ea(e as SOME(I.Displace{base, disp}), rs, rt) =
12         if mapr base=rs then SOME(I.Displace{base=rt, disp=disp})         if CB.sameColor(base,rs) then SOME(I.Displace{base=rt, disp=disp})
13         else e         else e
14
15    fun rewriteUse(mapr, instr, rs, rt) = let    fun rewriteUse(instr, rs, rt) = let
16      fun rplac r = if mapr r=rs then rt else r      fun rplac r = if CB.sameColor(r,rs) then rt else r
17      fun rwOperand(opnd as I.RegOp r) =      fun rwOperand(opnd as I.RegOp r) =
18           if mapr r = rs then I.RegOp rt else opnd           if CB.sameColor(r,rs) then I.RegOp rt else opnd
19        | rwOperand opnd = opnd        | rwOperand opnd = opnd
20    in    in
21      case instr      case instr
22      of I.L {sz, rt, ra, d, mem} =>      of I.L {ld, rt, ra, d, mem} =>
23          I.L{sz=sz, rt=rt, ra=rplac ra, d=rwOperand d, mem=mem}          I.L{ld=ld, rt=rt, ra=rplac ra, d=rwOperand d, mem=mem}
24       | I.ST {sz, rs, ra, d, mem} =>       | I.LF {ld, ft, ra, d, mem} =>
25          I.ST{sz=sz, rs=rplac rs, ra=rplac ra, d=rwOperand d, mem=mem}          I.LF{ld=ld, ft=ft, ra=rplac ra, d=rwOperand d, mem=mem}
26         | I.ST {st, rs, ra, d, mem} =>
27            I.ST{st=st, rs=rplac rs, ra=rplac ra, d=rwOperand d, mem=mem}
28         | I.STF {st, fs, ra, d, mem} =>
29            I.STF{st=st, fs=fs, ra=rplac ra, d=rwOperand d, mem=mem}
30         | I.UNARY {oper, rt, ra, Rc, OE} =>
31            I.UNARY{oper=oper, rt=rt, ra=rplac ra, Rc=Rc, OE=OE}
32       | I.ARITH{oper, rt, ra, rb, Rc, OE} =>       | I.ARITH{oper, rt, ra, rb, Rc, OE} =>
33          I.ARITH{oper=oper, rt=rt, ra=rplac ra, rb=rplac rb, Rc=Rc, OE=OE}          I.ARITH{oper=oper, rt=rt, ra=rplac ra, rb=rplac rb, Rc=Rc, OE=OE}
34       | I.ARITHI{oper, rt, ra, im} =>       | I.ARITHI{oper, rt, ra, im} =>
35          I.ARITHI{oper=oper, rt=rt, ra=rplac ra, im=rwOperand im}          I.ARITHI{oper=oper, rt=rt, ra=rplac ra, im=rwOperand im}
36       | I.ROTATE {oper, ra, rs, sh, mb, me} =>       | I.ROTATE {oper, ra, rs, sh, mb, me} =>
37          I.ROTATE{oper=oper, ra=ra, rs=rplac rs, sh=rwOperand sh, mb=mb, me=me}          I.ROTATE{oper=oper, ra=ra, rs=rplac rs, sh=rplac sh, mb=mb, me=me}
38       | I.COMPARE {cmp, bf, ra, rb} =>       | I.ROTATEI {oper, ra, rs, sh, mb, me} =>
39          I.COMPARE{cmp=cmp, bf=bf, ra=rplac ra, rb=rwOperand rb}          I.ROTATEI{oper=oper, ra=ra, rs=rplac rs, sh=rwOperand sh, mb=mb, me=me}
40         | I.COMPARE {cmp, bf, l, ra, rb} =>
41            I.COMPARE{cmp=cmp, bf=bf, l=l, ra=rplac ra, rb=rwOperand rb}
42       | I.MTSPR{rs, spr} => I.MTSPR{rs=rplac rs, spr=spr}       | I.MTSPR{rs, spr} => I.MTSPR{rs=rplac rs, spr=spr}
43       | I.TWI {to, ra, si} => I.TWI{to=to, ra=rplac ra, si=si}       | I.TW {to, ra, si} => I.TW{to=to, ra=rplac ra, si=rwOperand si}
44       | I.CALL {def, use=(r,f,c)} => I.CALL{def=def, use=(map rplac r,f,c)}       | I.TD {to, ra, si} => I.TD{to=to, ra=rplac ra, si=rwOperand si}
45         | I.CALL {def, use, cutsTo, mem} =>
46              I.CALL{def=def, use=C.CellSet.map {from=rs,to=rt} use,
47                     cutsTo=cutsTo, mem=mem}
48       | I.COPY{dst, src, impl, tmp} =>       | I.COPY{dst, src, impl, tmp} =>
49          I.COPY{dst=dst, src=map rplac src, impl=impl, tmp=tmp}          I.COPY{dst=dst, src=map rplac src, impl=impl, tmp=tmp}
50       | I.FCOPY{dst, src, impl, tmp} =>       | I.FCOPY{dst, src, impl, tmp} =>
51          I.FCOPY{dst=dst, src=src, impl=impl, tmp=ea(tmp, rs, rt, mapr)}          I.FCOPY{dst=dst, src=src, impl=impl, tmp=ea(tmp, rs, rt)}
52         | I.ANNOTATION{i,a} =>
53             I.ANNOTATION{i=rewriteUse(i,rs,rt),
54                            a=case a of
55                               CB.DEF_USE{cellkind=CB.GP,defs,uses} =>
56                                 CB.DEF_USE{cellkind=CB.GP,uses=map rplac uses,
57                                           defs=defs}
58                              | _ => a}
59       | _ => instr       | _ => instr
60    end    end
61
62    fun rewriteDef(mapr, instr, rs, rt) = let    fun rewriteDef(instr, rs, rt) = let
63      fun rplac r = if mapr r = rs then rt else r      fun rplac r = if CB.sameColor(r,rs) then rt else r
64    in    in
65      case instr      case instr
66      of I.L {sz, rt, ra, d, mem} =>      of I.L {ld, rt, ra, d, mem} =>
67          I.L{sz=sz, rt=rplac rt, ra=ra, d=d, mem=mem}          I.L{ld=ld, rt=rplac rt, ra=ra, d=d, mem=mem}
68       | I.UNARY {oper, rt, ra, Rc, OE} =>       | I.UNARY {oper, rt, ra, Rc, OE} =>
69          I.UNARY{oper=oper, rt=rplac rt, ra=ra, Rc=Rc, OE=OE}          I.UNARY{oper=oper, rt=rplac rt, ra=ra, Rc=Rc, OE=OE}
70       | I.ARITH {oper, rt, ra, rb, Rc, OE} =>       | I.ARITH {oper, rt, ra, rb, Rc, OE} =>
# Line 53  Line 73
73          I.ARITHI {oper=oper, rt=rplac rt, ra=ra, im=im}          I.ARITHI {oper=oper, rt=rplac rt, ra=ra, im=im}
74       | I.ROTATE {oper, ra, rs, sh, mb, me} =>       | I.ROTATE {oper, ra, rs, sh, mb, me} =>
75          I.ROTATE {oper=oper, ra=rplac ra, rs=rs, sh=sh, mb=mb, me=me}          I.ROTATE {oper=oper, ra=rplac ra, rs=rs, sh=sh, mb=mb, me=me}
76         | I.ROTATEI {oper, ra, rs, sh, mb, me} =>
77            I.ROTATEI {oper=oper, ra=rplac ra, rs=rs, sh=sh, mb=mb, me=me}
78       | I.MFSPR {rt, spr} => I.MFSPR{rt=rplac rt, spr=spr}       | I.MFSPR {rt, spr} => I.MFSPR{rt=rplac rt, spr=spr}
79       | I.CALL {def=(r,f,c), use} => I.CALL{def=(map rplac r, f, c), use=use}       | I.CALL {def, use, cutsTo, mem} =>
80            I.CALL{def=C.CellSet.map {from=rs,to=rt} def, use=use,
81                   cutsTo=cutsTo, mem=mem}
82       | I.COPY {dst, src, impl, tmp} =>       | I.COPY {dst, src, impl, tmp} =>
83          I.COPY{dst=map rplac dst, src=src, impl=impl, tmp=ea(tmp,rs,rt,mapr)}          I.COPY{dst=map rplac dst, src=src, impl=impl, tmp=ea(tmp,rs,rt)}
84         | I.ANNOTATION{i,a} =>
85            I.ANNOTATION{i=rewriteDef(i,rs,rt),
86                            a=case a of
87                               CB.DEF_USE{cellkind=CB.GP,defs,uses} =>
88                                 CB.DEF_USE{cellkind=CB.GP,uses=uses,
89                                           defs=map rplac defs}
90                              | _ => a}
91       | _ => instr       | _ => instr
92    end    end
93
94    fun frewriteUse(mapr, instr, fs, ft) = let    fun frewriteUse(instr, fs, ft) = let
95      fun rplac r = if mapr r = fs then ft else r      fun rplac r = if CB.sameColor(r,fs) then ft else r
96    in    in
97      case instr      case instr
98      of I.ST {sz, rs, ra, d, mem} =>      of I.STF {st, fs, ra, d, mem} =>
99           I.ST{sz=sz, rs=rplac rs, ra=ra, d=d, mem=mem}           I.STF{st=st, fs=rplac fs, ra=ra, d=d, mem=mem}
100       | I.CALL{def, use=(r,f,c)} => I.CALL{def=def, use=(r, map rplac f, c)}       | I.CALL{def, use, cutsTo, mem} =>
101             I.CALL{def=def, use=C.CellSet.map {from=fs,to=ft} use,
102                    cutsTo=cutsTo, mem=mem}
103       | I.FCOMPARE {cmp, bf, fa, fb} =>       | I.FCOMPARE {cmp, bf, fa, fb} =>
104           I.FCOMPARE{cmp=cmp, bf=bf, fa=rplac fa, fb=rplac fb}           I.FCOMPARE{cmp=cmp, bf=bf, fa=rplac fa, fb=rplac fb}
105       | I.FUNARY {oper, ft, fb, Rc} =>       | I.FUNARY {oper, ft, fb, Rc} =>
106           I.FUNARY{oper=oper, ft=ft, fb=rplac fb, Rc=Rc}           I.FUNARY{oper=oper, ft=ft, fb=rplac fb, Rc=Rc}
107       | I.FARITH {oper, ft, fa, fb, Rc} =>       | I.FARITH {oper, ft, fa, fb, Rc} =>
108           I.FARITH{oper=oper, ft=ft, fa=rplac fa, fb=rplac fb, Rc=Rc}           I.FARITH{oper=oper, ft=ft, fa=rplac fa, fb=rplac fb, Rc=Rc}
109         | I.FARITH3 {oper, ft, fa, fb, fc, Rc} =>
110             I.FARITH3{oper=oper,ft=ft,fa=rplac fa, fb=rplac fb, fc=rplac fc,Rc=Rc}
111       | I.FCOPY {dst, src, impl, tmp} =>       | I.FCOPY {dst, src, impl, tmp} =>
112           I.FCOPY{dst=dst, src=map rplac src, impl=impl, tmp=tmp}           I.FCOPY{dst=dst, src=map rplac src, impl=impl, tmp=tmp}
113         | I.ANNOTATION{i,a} =>
114             I.ANNOTATION{i=frewriteUse(i,fs,ft),
115                            a=case a of
116                               CB.DEF_USE{cellkind=CB.FP,defs,uses} =>
117                                 CB.DEF_USE{cellkind=CB.FP,uses=map rplac uses,
118                                           defs=defs}
119                              | _ => a}
120       | _ => instr       | _ => instr
121    end    end
122
123
124    fun frewriteDef(mapr, instr, fs, ft) = let    fun frewriteDef(instr, fs, ft) = let
125      fun rplac r = if mapr r = fs then ft else r      fun rplac r = if CB.sameColor(r,fs) then ft else r
126    in    in
127      case instr      case instr
128      of I.L{sz, rt, ra, d, mem} =>      of I.LF{ld, ft, ra, d, mem} =>
129          I.L{sz=sz, rt=rplac rt, ra=ra, d=d, mem=mem}          I.LF{ld=ld, ft=rplac ft, ra=ra, d=d, mem=mem}
130       | I.FUNARY {oper, ft, fb, Rc} =>       | I.FUNARY {oper, ft, fb, Rc} =>
131          I.FUNARY{oper=oper, ft=rplac ft, fb=fb, Rc=Rc}          I.FUNARY{oper=oper, ft=rplac ft, fb=fb, Rc=Rc}
132       | I.FARITH{oper, ft, fa, fb, Rc} =>       | I.FARITH{oper, ft, fa, fb, Rc} =>
133          I.FARITH{oper=oper, ft=rplac ft, fa=fa, fb=fb, Rc=Rc}          I.FARITH{oper=oper, ft=rplac ft, fa=fa, fb=fb, Rc=Rc}
134         | I.FARITH3{oper, ft, fa, fb, fc, Rc} =>
135            I.FARITH3{oper=oper, ft=rplac ft, fa=fa, fb=fb, fc=fc, Rc=Rc}
136      (* CALL = BCLR {bo=ALWAYS, bf=0, bit=0, LK=true, labels=[] *)      (* CALL = BCLR {bo=ALWAYS, bf=0, bit=0, LK=true, labels=[] *)
137       | I.CALL{def=(r,f,c), use} => I.CALL{def=(r, map rplac f, c), use=use}       | I.CALL{def, use, cutsTo, mem} =>
138            I.CALL{def=C.CellSet.map {from=fs,to=ft} def, use=use,
139                   cutsTo=cutsTo, mem=mem}
140       | I.FCOPY {dst, src, impl, tmp} =>       | I.FCOPY {dst, src, impl, tmp} =>
141          I.FCOPY{dst=map rplac dst, src=src, impl=impl, tmp=ea(tmp,fs,ft,mapr)}          I.FCOPY{dst=map rplac dst, src=src, impl=impl, tmp=ea(tmp,fs,ft)}
142         | I.ANNOTATION{i,a} =>
143            I.ANNOTATION{i=frewriteDef(i,fs,ft),
144                            a=case a of
145                               CB.DEF_USE{cellkind=CB.FP,defs,uses} =>
146                                 CB.DEF_USE{cellkind=CB.FP,uses=uses,
147                                           defs=map rplac defs}
148                              | _ => a}
149       | _ => instr       | _ => instr
150    end    end
151  end  end

Legend:
 Removed from v.245 changed lines Added in v.889