1 |
functor PPCRewrite(Instr : PPCINSTR) = struct |
functor PPCRewrite(Instr : PPCINSTR) = struct |
2 |
structure I = Instr |
structure I = Instr |
3 |
structure C = I.C |
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) = |
| ea(e as SOME(I.Direct r), rs, rt) = |
8 |
if C.sameColor(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) = |
| ea(e as SOME(I.FDirect r), rs, rt) = |
10 |
if C.sameColor(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) = |
| ea(e as SOME(I.Displace{base, disp}), rs, rt) = |
12 |
if C.sameColor(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(instr, rs, rt) = let |
fun rewriteUse(instr, rs, rt) = let |
16 |
fun rplac r = if C.sameColor(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 C.sameColor(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 |
52 |
| I.ANNOTATION{i,a} => |
| I.ANNOTATION{i,a} => |
53 |
I.ANNOTATION{i=rewriteUse(i,rs,rt), |
I.ANNOTATION{i=rewriteUse(i,rs,rt), |
54 |
a=case a of |
a=case a of |
55 |
C.DEF_USE{cellkind=C.GP,defs,uses} => |
CB.DEF_USE{cellkind=CB.GP,defs,uses} => |
56 |
C.DEF_USE{cellkind=C.GP,uses=map rplac uses, |
CB.DEF_USE{cellkind=CB.GP,uses=map rplac uses, |
57 |
defs=defs} |
defs=defs} |
58 |
| _ => a} |
| _ => a} |
59 |
| _ => instr |
| _ => instr |
60 |
end |
end |
61 |
|
|
62 |
fun rewriteDef(instr, rs, rt) = let |
fun rewriteDef(instr, rs, rt) = let |
63 |
fun rplac r = if C.sameColor(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 {ld, rt, ra, d, mem} => |
of I.L {ld, rt, ra, d, mem} => |
84 |
| I.ANNOTATION{i,a} => |
| I.ANNOTATION{i,a} => |
85 |
I.ANNOTATION{i=rewriteDef(i,rs,rt), |
I.ANNOTATION{i=rewriteDef(i,rs,rt), |
86 |
a=case a of |
a=case a of |
87 |
C.DEF_USE{cellkind=C.GP,defs,uses} => |
CB.DEF_USE{cellkind=CB.GP,defs,uses} => |
88 |
C.DEF_USE{cellkind=C.GP,uses=uses, |
CB.DEF_USE{cellkind=CB.GP,uses=uses, |
89 |
defs=map rplac defs} |
defs=map rplac defs} |
90 |
| _ => a} |
| _ => a} |
91 |
| _ => instr |
| _ => instr |
92 |
end |
end |
93 |
|
|
94 |
fun frewriteUse(instr, fs, ft) = let |
fun frewriteUse(instr, fs, ft) = let |
95 |
fun rplac r = if C.sameColor(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.STF {st, fs, ra, d, mem} => |
of I.STF {st, fs, ra, d, mem} => |
113 |
| I.ANNOTATION{i,a} => |
| I.ANNOTATION{i,a} => |
114 |
I.ANNOTATION{i=frewriteUse(i,fs,ft), |
I.ANNOTATION{i=frewriteUse(i,fs,ft), |
115 |
a=case a of |
a=case a of |
116 |
C.DEF_USE{cellkind=C.FP,defs,uses} => |
CB.DEF_USE{cellkind=CB.FP,defs,uses} => |
117 |
C.DEF_USE{cellkind=C.FP,uses=map rplac uses, |
CB.DEF_USE{cellkind=CB.FP,uses=map rplac uses, |
118 |
defs=defs} |
defs=defs} |
119 |
| _ => a} |
| _ => a} |
120 |
| _ => instr |
| _ => instr |
122 |
|
|
123 |
|
|
124 |
fun frewriteDef(instr, fs, ft) = let |
fun frewriteDef(instr, fs, ft) = let |
125 |
fun rplac r = if C.sameColor(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.LF{ld, ft, ra, d, mem} => |
of I.LF{ld, ft, ra, d, mem} => |
142 |
| I.ANNOTATION{i,a} => |
| I.ANNOTATION{i,a} => |
143 |
I.ANNOTATION{i=frewriteDef(i,fs,ft), |
I.ANNOTATION{i=frewriteDef(i,fs,ft), |
144 |
a=case a of |
a=case a of |
145 |
C.DEF_USE{cellkind=C.FP,defs,uses} => |
CB.DEF_USE{cellkind=CB.FP,defs,uses} => |
146 |
C.DEF_USE{cellkind=C.FP,uses=uses, |
CB.DEF_USE{cellkind=CB.FP,uses=uses, |
147 |
defs=map rplac defs} |
defs=map rplac defs} |
148 |
| _ => a} |
| _ => a} |
149 |
| _ => instr |
| _ => instr |