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/sparc/ra/sparcRewrite.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/sparc/ra/sparcRewrite.sml

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

sml/branches/SMLNJ/src/MLRISC/sparc/ra/sparcRewrite.sml revision 245, Sat Apr 17 18:47:12 1999 UTC sml/trunk/src/MLRISC/sparc/ra/sparcRewrite.sml revision 657, Fri Jun 9 05:20:54 2000 UTC
# Line 1  Line 1 
1  functor SparcRewrite(Instr:SPARCINSTR) =  functor SparcRewrite(Instr:SPARCINSTR) =
2  struct  struct
3     structure I = Instr     structure I = Instr
4       structure C = I.C
5    
6     fun rwset(S,rw) = SortedList.uniq(map rw S)     fun rwset(S,rw) = SortedList.uniq(map rw S)
7    
8     fun rewriteUse(mapr,instr,rs,rt) =     fun rewriteUse(mapr : I.C.cell -> I.C.cell,instr,rs,rt) =
9     let fun R r = if mapr r = rs then rt else r     let fun R r = if mapr r = rs then rt else r
10         fun O(i as I.REG r) = if mapr r = rs then I.REG rt else i         fun O(i as I.REG r) = if mapr r = rs then I.REG rt else i
11           | O i = i           | O i = i
# Line 13  Line 14 
14         | I.STORE{s,d,r,i,mem} => I.STORE{s=s,d=R d,r=R r,i=O i,mem=mem}         | I.STORE{s,d,r,i,mem} => I.STORE{s=s,d=R d,r=R r,i=O i,mem=mem}
15         | I.FLOAD{l,r,i,d,mem} => I.FLOAD{l=l,r=R r,i=O i,d=d,mem=mem}         | I.FLOAD{l,r,i,d,mem} => I.FLOAD{l=l,r=R r,i=O i,d=d,mem=mem}
16         | I.FSTORE{s,d,r,i,mem} => I.FSTORE{s=s,d=d,r=R r,i=O i,mem=mem}         | I.FSTORE{s,d,r,i,mem} => I.FSTORE{s=s,d=d,r=R r,i=O i,mem=mem}
17         | I.ARITH{a,r,i,d,cc} => I.ARITH{a=a,r=R r,i=O i,d=d,cc=cc}         | I.ARITH{a,r,i,d} => I.ARITH{a=a,r=R r,i=O i,d=d}
18         | I.SHIFT{s,r,i,d} => I.SHIFT{s=s,r=R r,i=O i,d=d}         | I.SHIFT{s,r,i,d} => I.SHIFT{s=s,r=R r,i=O i,d=d}
19           | I.BR{r,p,rcond,a,nop,label} =>
20                I.BR{r=R r,p=p,rcond=rcond,a=a,nop=nop,label=label}
21           | I.MOVicc{b,i,d} => I.MOVicc{b=b,i=O i,d=R d}
22           | I.MOVfcc{b,i,d} => I.MOVfcc{b=b,i=O i,d=R d}
23           | I.MOVR{rcond,r,i,d} => I.MOVR{rcond=rcond,r=R r,i=O i,d=R d}
24         | I.JMP{r,i,labs,nop} => I.JMP{r=R r,i=O i,labs=labs,nop=nop}         | I.JMP{r,i,labs,nop} => I.JMP{r=R r,i=O i,labs=labs,nop=nop}
25         | I.JMPL{r,i,d,defs,uses=(A,B),nop} =>         | I.JMPL{r,i,d,defs,uses=(A,B,C),nop,mem} =>
26              I.JMPL{r=R r,i=O i,d=d,defs=defs,uses=(rwset(A,R),B),nop=nop}              I.JMPL{r=R r,i=O i,d=d,defs=defs,uses=(rwset(A,R),B,C),nop=nop,mem=mem}
27         | I.CALL{defs,uses=(A,B),label,nop} =>         | I.CALL{defs,uses=(A,B,C),label,nop,mem} =>
28              I.CALL{defs=defs,uses=(rwset(A,R),B),label=label,nop=nop}              I.CALL{defs=defs,uses=(rwset(A,R),B,C),label=label,nop=nop,mem=mem}
29         | I.SAVE{r,i,d} => I.SAVE{r=R r,i=O i,d=d}         | I.SAVE{r,i,d} => I.SAVE{r=R r,i=O i,d=d}
30         | I.RESTORE{r,i,d} => I.RESTORE{r=R r,i=O i,d=d}         | I.RESTORE{r,i,d} => I.RESTORE{r=R r,i=O i,d=d}
31         | I.WRY{r,i} => I.WRY{r=R r,i=O i}         | I.WRY{r,i} => I.WRY{r=R r,i=O i}
32         | I.Ticc{t,r,i} => I.Ticc{t=t,r=R r,i=O i}         | I.Ticc{t,cc,r,i} => I.Ticc{t=t,cc=cc,r=R r,i=O i}
33         | I.COPY{src,dst,tmp,impl} =>         | I.COPY{src,dst,tmp,impl} =>
34             I.COPY{src=map R src,dst=dst,tmp=tmp,impl=impl}             I.COPY{src=map R src,dst=dst,tmp=tmp,impl=impl}
35  (*         | I.ANNOTATION{i,a} =>
36         | I.ANNOTATION(i,a) => I.ANNOTATION(rewriteUse(mapr,i,rs,rt),a)             I.ANNOTATION{i=rewriteUse(mapr,i,rs,rt),
37  *)                          a=case a of
38                               C.DEF_USE{cellkind=C.GP,defs,uses} =>
39                                 C.DEF_USE{cellkind=C.GP,uses=map R uses,
40                                           defs=defs}
41                              | _ => a}
42         | _ => instr         | _ => instr
43     end     end
44    
45     fun rewriteDef(mapr,instr,rs,rt) =     fun rewriteDef(mapr : I.C.cell -> I.C.cell,instr,rs,rt) =
46     let fun R r = if mapr r = rs then rt else r     let fun R r = if mapr r = rs then rt else r
47         fun ea(SOME(I.Direct r)) = SOME(I.Direct(R r))         fun ea(SOME(I.Direct r)) = SOME(I.Direct(R r))
48           | ea x = x           | ea x = x
49     in  case instr of     in  case instr of
50           I.LOAD{l,r,i,d,mem} => I.LOAD{l=l,r=r,i=i,d=R d,mem=mem}           I.LOAD{l,r,i,d,mem} => I.LOAD{l=l,r=r,i=i,d=R d,mem=mem}
51         | I.ARITH{a,r,i,d,cc} => I.ARITH{a=a,r=r,i=i,d=R d,cc=cc}         | I.ARITH{a,r,i,d} => I.ARITH{a=a,r=r,i=i,d=R d}
52         | I.SHIFT{s,r,i,d} => I.SHIFT{s=s,r=r,i=i,d=R d}         | I.SHIFT{s,r,i,d} => I.SHIFT{s=s,r=r,i=i,d=R d}
53         | I.SETHI{i,d} => I.SETHI{i=i,d=R d}         | I.SETHI{i,d} => I.SETHI{i=i,d=R d}
54         | I.JMPL{r,i,d,defs=(A,B),uses,nop=nop} =>         | I.MOVicc{b,i,d} => I.MOVicc{b=b,i=i,d=R d}
55              I.JMPL{r=r,i=i,d=R d,defs=(rwset(A,R),B),uses=uses,nop=nop}         | I.MOVfcc{b,i,d} => I.MOVfcc{b=b,i=i,d=R d}
56         | I.CALL{defs=(A,B),uses,label,nop} =>         | I.MOVR{rcond,r,i,d} => I.MOVR{rcond=rcond,r=r,i=i,d=R d}
57              I.CALL{defs=(rwset(A,R),B),uses=uses,label=label,nop=nop}         | I.JMPL{r,i,d,defs=(A,B,C),uses,nop,mem} =>
58                I.JMPL{r=r,i=i,d=R d,defs=(rwset(A,R),B,C),uses=uses,nop=nop,mem=mem}
59           | I.CALL{defs=(A,B,C),uses,label,nop,mem} =>
60                I.CALL{defs=(rwset(A,R),B,C),uses=uses,label=label,nop=nop,mem=mem}
61         | I.SAVE{r,i,d} => I.SAVE{r=r,i=i,d=R d}         | I.SAVE{r,i,d} => I.SAVE{r=r,i=i,d=R d}
62         | I.RESTORE{r,i,d} => I.RESTORE{r=r,i=i,d=R d}         | I.RESTORE{r,i,d} => I.RESTORE{r=r,i=i,d=R d}
63         | I.RDY{d} => I.RDY{d=R d}         | I.RDY{d} => I.RDY{d=R d}
64         | I.COPY{src,dst,tmp,impl} =>         | I.COPY{src,dst,tmp,impl} =>
65             I.COPY{src=src,dst=map R dst,tmp=ea tmp,impl=impl}             I.COPY{src=src,dst=map R dst,tmp=ea tmp,impl=impl}
66  (*         | I.ANNOTATION{i,a} =>
67         | I.ANNOTATION(i,a) => I.ANNOTATION(rewriteDef(mapr,i,rs,rt),a)             I.ANNOTATION{i=rewriteDef(mapr,i,rs,rt),
68  *)                          a=case a of
69                               C.DEF_USE{cellkind=C.GP,defs,uses} =>
70                                 C.DEF_USE{cellkind=C.GP,uses=uses,
71                                           defs=map R defs}
72                              | _ => a}
73         | _ => instr         | _ => instr
74     end     end
75    
76     fun frewriteUse(mapr,instr,rs,rt) =     fun frewriteUse(mapr : I.C.cell -> I.C.cell,instr,rs,rt) =
77     let fun R r = if mapr r = rs then rt else r     let fun R r = if mapr r = rs then rt else r
78     in  case instr of     in  case instr of
79           I.FPop1{a,r,d} => I.FPop1{a=a,r=R r,d=d}           I.FPop1{a,r,d} => I.FPop1{a=a,r=R r,d=d}
80         | I.FPop2{a,r1,r2,d} => I.FPop2{a=a,r1=R r1,r2=R r2,d=d}         | I.FPop2{a,r1,r2,d} => I.FPop2{a=a,r1=R r1,r2=R r2,d=d}
81         | I.FCMP{cmp,r1,r2,nop} => I.FCMP{cmp=cmp,r1=R r1,r2=R r2,nop=nop}         | I.FCMP{cmp,r1,r2,nop} => I.FCMP{cmp=cmp,r1=R r1,r2=R r2,nop=nop}
82         | I.FSTORE{s,r,i,d,mem} => I.FSTORE{s=s,r=r,i=i,d=R d,mem=mem}         | I.FSTORE{s,r,i,d,mem} => I.FSTORE{s=s,r=r,i=i,d=R d,mem=mem}
83         | I.JMPL{r,i,d,defs,uses=(A,B),nop} =>         | I.FMOVicc{sz,b,r,d} => I.FMOVicc{sz=sz,b=b,r=R r,d=R d}
84             I.JMPL{r=r,i=i,d=d,defs=defs,uses=(A,rwset(B,R)),nop=nop}         | I.FMOVfcc{sz,b,r,d} => I.FMOVfcc{sz=sz,b=b,r=R r,d=R d}
85         | I.CALL{defs,uses=(A,B),label,nop} =>         | I.JMPL{r,i,d,defs,uses=(A,B,C),nop,mem} =>
86             I.CALL{defs=defs,uses=(A,rwset(B,R)),label=label,nop=nop}             I.JMPL{r=r,i=i,d=d,defs=defs,uses=(A,rwset(B,R),C),nop=nop,mem=mem}
87           | I.CALL{defs,uses=(A,B,C),label,nop,mem} =>
88               I.CALL{defs=defs,uses=(A,rwset(B,R),C),label=label,nop=nop,mem=mem}
89         | I.FCOPY{src,dst,tmp,impl} =>         | I.FCOPY{src,dst,tmp,impl} =>
90             I.FCOPY{src=map R src,dst=dst,tmp=tmp,impl=impl}             I.FCOPY{src=map R src,dst=dst,tmp=tmp,impl=impl}
91  (*         | I.ANNOTATION{i,a} =>
92         | I.ANNOTATION(i,a)=> I.ANNOTATION(frewriteUse(mapr,i,rs,rt),a)             I.ANNOTATION{i=frewriteUse(mapr,i,rs,rt),
93  *)                          a=case a of
94                               C.DEF_USE{cellkind=C.FP,defs,uses} =>
95                                 C.DEF_USE{cellkind=C.FP,uses=map R uses,
96                                           defs=defs}
97                              | _ => a}
98         | _ => instr         | _ => instr
99     end     end
100    
101     fun frewriteDef(mapr,instr,rs,rt) =     fun frewriteDef(mapr : I.C.cell -> I.C.cell,instr,rs,rt) =
102     let fun R r = if mapr r = rs then rt else r     let fun R r = if mapr r = rs then rt else r
103         fun ea(SOME(I.FDirect r)) = SOME(I.FDirect(R r))         fun ea(SOME(I.FDirect r)) = SOME(I.FDirect(R r))
104           | ea x = x           | ea x = x
# Line 83  Line 106 
106           I.FPop1{a,r,d} => I.FPop1{a=a,r=r,d=R d}           I.FPop1{a,r,d} => I.FPop1{a=a,r=r,d=R d}
107         | I.FPop2{a,r1,r2,d} => I.FPop2{a=a,r1=r1,r2=r2,d=R d}         | I.FPop2{a,r1,r2,d} => I.FPop2{a=a,r1=r1,r2=r2,d=R d}
108         | I.FLOAD{l,r,i,d,mem} => I.FLOAD{l=l,r=r,i=i,d=R d,mem=mem}         | I.FLOAD{l,r,i,d,mem} => I.FLOAD{l=l,r=r,i=i,d=R d,mem=mem}
109         | I.JMPL{r,i,d,defs=(A,B),uses,nop} =>         | I.FMOVicc{sz,b,r,d} => I.FMOVicc{sz=sz,b=b,r=r,d=R d}
110             I.JMPL{r=r,i=i,d=d,defs=(A,rwset(B,R)),uses=uses,nop=nop}         | I.FMOVfcc{sz,b,r,d} => I.FMOVfcc{sz=sz,b=b,r=r,d=R d}
111         | I.CALL{defs=(A,B),uses,label,nop} =>         | I.JMPL{r,i,d,defs=(A,B,C),uses,nop,mem} =>
112             I.CALL{defs=(A,rwset(B,R)),uses=uses,label=label,nop=nop}             I.JMPL{r=r,i=i,d=d,defs=(A,rwset(B,R),C),uses=uses,nop=nop,mem=mem}
113           | I.CALL{defs=(A,B,C),uses,label,nop,mem} =>
114               I.CALL{defs=(A,rwset(B,R),C),uses=uses,label=label,nop=nop,mem=mem}
115         | I.FCOPY{src,dst,tmp,impl} =>         | I.FCOPY{src,dst,tmp,impl} =>
116             I.FCOPY{src=src,dst=map R dst,tmp=ea tmp,impl=impl}             I.FCOPY{src=src,dst=map R dst,tmp=ea tmp,impl=impl}
117  (*         | I.ANNOTATION{i,a}=>
118         | I.ANNOTATION(i,a)=> I.ANNOTATION(frewriteDef(mapr,i,rs,rt),a)             I.ANNOTATION{i=frewriteDef(mapr,i,rs,rt),
119  *)                          a=case a of
120                               C.DEF_USE{cellkind=C.FP,defs,uses} =>
121                                 C.DEF_USE{cellkind=C.FP,uses=uses,
122                                           defs=map R defs}
123                              | _ => a}
124         | _ => instr         | _ => instr
125     end     end
126    
127  end  end
128    
 (*  
  * $Log: sparcRewrite.sml,v $  
  * Revision 1.1.1.1  1999/01/04 21:56:27  george  
  *   Version 110.12  
  *  
  * Revision 1.2  1998/08/12 13:36:27  leunga  
  *   Fixed the 2.0 + 2.0 == nan bug by treating FCMP as instrs with delay slots  
  *  
  * Revision 1.1.1.1  1998/08/05 19:38:49  george  
  *   Release 110.7.4  
  *  
  *)  

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

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