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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 245 - (view) (download)
Original Path: sml/branches/SMLNJ/src/MLRISC/sparc/ra/sparcRewrite.sml

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

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