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/instructions/sparcProps.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/sparc/instructions/sparcProps.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 984 - (view) (download)

1 : george 984 functor SparcProps
2 :     (structure SparcInstr : SPARCINSTR
3 :     structure MLTreeEval : MLTREE_EVAL where T = SparcInstr.T
4 :     structure MLTreeHash : MLTREE_HASH where T = SparcInstr.T
5 :     ) : INSN_PROPERTIES =
6 : monnier 245 struct
7 :     structure I = SparcInstr
8 :     structure C = I.C
9 : leunga 775 structure T = I.T
10 : george 889 structure CB = CellsBasis
11 : monnier 245
12 :     exception NegateConditional
13 :    
14 : monnier 411 fun error msg = MLRiscErrorMsg.error("SparcProps",msg)
15 : monnier 245
16 : george 545 datatype kind = IK_JUMP | IK_NOP | IK_INSTR | IK_COPY | IK_CALL
17 : leunga 796 | IK_CALL_WITH_CUTS | IK_PHI | IK_SOURCE | IK_SINK
18 : monnier 245 datatype target = LABELLED of Label.label | FALLTHROUGH | ESCAPES
19 :    
20 : george 889 val zeroR = Option.valOf(C.zeroReg CB.GP)
21 :     val r15 = C.Reg CB.GP 15
22 :     val r31 = C.Reg CB.GP 31
23 : leunga 744
24 : monnier 245 (*========================================================================
25 :     * Instruction Kinds
26 :     *========================================================================*)
27 :     fun instrKind(I.Bicc _) = IK_JUMP
28 :     | instrKind(I.FBfcc _) = IK_JUMP
29 :     | instrKind(I.JMP _) = IK_JUMP
30 :     | instrKind(I.RET _) = IK_JUMP
31 : monnier 411 | instrKind(I.BR _) = IK_JUMP
32 :     | instrKind(I.BP _) = IK_JUMP
33 :     | instrKind(I.COPY _) = IK_COPY
34 :     | instrKind(I.FCOPY _) = IK_COPY
35 : leunga 796 | instrKind(I.CALL{cutsTo=_::_,...}) = IK_CALL_WITH_CUTS
36 : monnier 411 | instrKind(I.CALL _) = IK_CALL
37 : leunga 796 | instrKind(I.JMPL{cutsTo=_::_,...}) = IK_CALL_WITH_CUTS
38 : monnier 411 | instrKind(I.JMPL _) = IK_CALL
39 : leunga 624 | instrKind(I.PHI _) = IK_PHI
40 :     | instrKind(I.SOURCE _) = IK_SOURCE
41 :     | instrKind(I.SINK _) = IK_SINK
42 : monnier 411 | instrKind(I.ANNOTATION{i,...}) = instrKind i
43 : monnier 245 | instrKind _ = IK_INSTR
44 :    
45 :     fun branchTargets(I.Bicc{b=I.BA,label,...}) = [LABELLED label]
46 :     | branchTargets(I.Bicc{label,...}) = [LABELLED label, FALLTHROUGH]
47 :     | branchTargets(I.FBfcc{b=I.FBA,label,...}) = [LABELLED label]
48 :     | branchTargets(I.FBfcc{label,...}) = [LABELLED label, FALLTHROUGH]
49 : monnier 411 | branchTargets(I.BR{label,...}) = [LABELLED label, FALLTHROUGH]
50 :     | branchTargets(I.BP{label,...}) = [LABELLED label, FALLTHROUGH]
51 : monnier 245 | branchTargets(I.JMP{labs=[],...}) = [ESCAPES]
52 :     | branchTargets(I.RET _) = [ESCAPES]
53 :     | branchTargets(I.JMP{labs,...}) = map LABELLED labs
54 : leunga 796 | branchTargets(I.CALL{cutsTo,...}) = FALLTHROUGH::map LABELLED cutsTo
55 :     | branchTargets(I.JMPL{cutsTo,...}) = FALLTHROUGH::map LABELLED cutsTo
56 : monnier 411 | branchTargets(I.ANNOTATION{i,...}) = branchTargets i
57 : monnier 245 | branchTargets _ = error "branchTargets"
58 :    
59 :     fun setTargets(I.Bicc{b=I.BA,a,nop,...},[L]) =
60 :     I.Bicc{b=I.BA,a=a,label=L,nop=nop}
61 :     | setTargets(I.Bicc{b,a,nop,...},[F,T]) =
62 :     I.Bicc{b=b,a=a,label=T,nop=nop}
63 :     | setTargets(I.FBfcc{b,a,nop,...},[F,T]) =
64 :     I.FBfcc{b=b,a=a,label=T,nop=nop}
65 : monnier 411 | setTargets(I.BR{rcond,p,r,a,nop,...},[F,T]) =
66 :     I.BR{rcond=rcond,p=p,r=r,a=a,label=T,nop=nop}
67 :     | setTargets(I.BP{b,cc,p,a,nop,...},[F,T]) =
68 :     I.BP{b=b,cc=cc,p=p,a=a,label=T,nop=nop}
69 : monnier 245 | setTargets(I.JMP{r,i,nop,...},labels) =
70 :     I.JMP{r=r,i=i,labs=labels,nop=nop}
71 : monnier 411 | setTargets(I.ANNOTATION{i,a},labs) =
72 :     I.ANNOTATION{i=setTargets(i,labs),a=a}
73 : monnier 245 | setTargets(i,_) = i
74 :    
75 : monnier 411 fun revCond I.BA = I.BN
76 :     | revCond I.BN = I.BA
77 :     | revCond I.BNE = I.BE
78 :     | revCond I.BE = I.BNE
79 :     | revCond I.BG = I.BLE
80 :     | revCond I.BLE = I.BG
81 :     | revCond I.BGE = I.BL
82 :     | revCond I.BL = I.BGE
83 :     | revCond I.BGU = I.BLEU
84 :     | revCond I.BLEU = I.BGU
85 :     | revCond I.BCC = I.BCS
86 :     | revCond I.BCS = I.BCC
87 :     | revCond I.BPOS = I.BNEG
88 :     | revCond I.BNEG = I.BPOS
89 :     | revCond I.BVC = I.BVS
90 :     | revCond I.BVS = I.BVC
91 :    
92 :     fun revFcond I.FBA = I.FBN
93 :     | revFcond I.FBN = I.FBA
94 :     | revFcond I.FBU = I.FBO
95 :     | revFcond I.FBG = I.FBULE
96 :     | revFcond I.FBUG = I.FBLE
97 :     | revFcond I.FBL = I.FBUGE
98 :     | revFcond I.FBUL = I.FBGE
99 :     | revFcond I.FBLG = I.FBUE
100 :     | revFcond I.FBNE = I.FBE
101 :     | revFcond I.FBE = I.FBNE
102 :     | revFcond I.FBUE = I.FBLG
103 :     | revFcond I.FBGE = I.FBUL
104 :     | revFcond I.FBUGE = I.FBL
105 :     | revFcond I.FBLE = I.FBUG
106 :     | revFcond I.FBULE = I.FBG
107 :     | revFcond I.FBO = I.FBU
108 :    
109 :     fun revRcond I.RZ = I.RNZ
110 :     | revRcond I.RLEZ = I.RGZ
111 :     | revRcond I.RLZ = I.RGEZ
112 :     | revRcond I.RNZ = I.RZ
113 :     | revRcond I.RGZ = I.RLEZ
114 :     | revRcond I.RGEZ = I.RLZ
115 :    
116 :     fun revP I.PT = I.PN
117 :     | revP I.PN = I.PT
118 :    
119 : monnier 245 fun negateConditional(I.Bicc{b,a,label,nop}) =
120 : monnier 411 I.Bicc{b=revCond b,a=a,label=label,nop=nop}
121 : monnier 245 | negateConditional(I.FBfcc{b,a,label,nop}) =
122 : monnier 411 I.FBfcc{b=revFcond b,a=a,label=label,nop=nop}
123 :     | negateConditional(I.BR{p,r,rcond,a,label,nop}) =
124 :     I.BR{p=revP p,a=a,r=r,rcond=revRcond rcond,label=label,nop=nop}
125 :     | negateConditional(I.BP{b,cc,p,a,label,nop}) =
126 :     I.BP{p=revP p,a=a,b=revCond b,cc=cc,label=label,nop=nop}
127 :     | negateConditional(I.ANNOTATION{i,a}) =
128 :     I.ANNOTATION{i=negateConditional i,a=a}
129 : monnier 245 | negateConditional _ = raise NegateConditional
130 :    
131 :     fun jump label = I.Bicc{b=I.BA,a=true,label=label,nop=true}
132 :    
133 : monnier 411 val immedRange = {lo= ~4096, hi = 4095}
134 :    
135 : leunga 657 fun loadImmed{immed,t} =
136 : leunga 744 I.ARITH{a=I.OR,r=zeroR,i=
137 : leunga 657 if #lo immedRange <= immed andalso immed <= #hi immedRange
138 : leunga 775 then I.IMMED immed else I.LAB(T.LI(IntInf.fromInt immed)),d=t}
139 : leunga 744 fun loadOperand{opn, t} = I.ARITH{a=I.OR,r=zeroR,i=opn, d=t}
140 : monnier 411
141 : monnier 245 fun moveInstr(I.COPY _) = true
142 :     | moveInstr(I.FCOPY _) = true
143 : monnier 411 | moveInstr(I.ANNOTATION{i,...}) = moveInstr i
144 : monnier 245 | moveInstr _ = false
145 :    
146 : leunga 744 fun nop() = I.SETHI{d=zeroR, i=0}
147 : monnier 245
148 :     (*========================================================================
149 :     * Parallel Move
150 :     *========================================================================*)
151 :     fun moveTmpR(I.COPY{tmp=SOME(I.Direct r),...}) = SOME r
152 :     | moveTmpR(I.FCOPY{tmp=SOME(I.FDirect f),...}) = SOME f
153 : monnier 411 | moveTmpR(I.ANNOTATION{i,...}) = moveTmpR i
154 : monnier 245 | moveTmpR _ = NONE
155 :    
156 :     fun moveDstSrc(I.COPY{dst,src,...}) = (dst,src)
157 :     | moveDstSrc(I.FCOPY{dst,src,...}) = (dst,src)
158 : monnier 411 | moveDstSrc(I.ANNOTATION{i,...}) = moveDstSrc i
159 : monnier 245 | moveDstSrc _ = error "moveDstSrc"
160 :    
161 : monnier 411 (*========================================================================
162 :     * Equality and hashing
163 :     *========================================================================*)
164 : george 889 fun hashOpn(I.REG r) = CB.hashCell r
165 : monnier 411 | hashOpn(I.IMMED i) = Word.fromInt i
166 : george 984 | hashOpn(I.LAB l) = MLTreeHash.hash l
167 :     | hashOpn(I.LO l) = MLTreeHash.hash l
168 :     | hashOpn(I.HI l) = MLTreeHash.hash l
169 : george 889 fun eqOpn(I.REG a,I.REG b) = CB.sameColor(a,b)
170 : monnier 411 | eqOpn(I.IMMED a,I.IMMED b) = a = b
171 : george 984 | eqOpn(I.LAB a,I.LAB b) = MLTreeEval.==(a,b)
172 :     | eqOpn(I.LO a,I.LO b) = MLTreeEval.==(a,b)
173 :     | eqOpn(I.HI a,I.HI b) = MLTreeEval.==(a,b)
174 : monnier 411 | eqOpn _ = false
175 : monnier 245
176 :     fun defUseR instr =
177 :     let
178 :     fun oper (I.REG r,def,use) = (def,r::use)
179 :     | oper (_,def,use) = (def,use)
180 :     in
181 :     case instr of
182 :     (* load/store instructions *)
183 :     I.LOAD {r,d,i,...} => oper(i,[d],[r])
184 :     | I.STORE {r,d,i,...} => oper(i,[],[r,d])
185 :     | I.FLOAD {r,d,i,...} => oper(i,[],[r])
186 :     | I.FSTORE {r,d,i,...} => oper(i,[],[r])
187 :     | I.SETHI {d,...} => ([d],[])
188 :     | I.ARITH {r,i,d,...} => oper(i,[d],[r])
189 :     | I.SHIFT {r,i,d,...} => oper(i,[d],[r])
190 : leunga 744 | I.JMPL{defs,uses,d,r,i,...} =>
191 :     oper(i,d:: C.getReg defs,r:: C.getReg uses)
192 : monnier 411 | I.BR{r,...} => ([],[r])
193 :     | I.MOVicc{i,d,...} => oper(i,[d],[d])
194 :     | I.MOVfcc{i,d,...} => oper(i,[d],[d])
195 :     | I.MOVR{r,i,d,...} => oper(i,[d],[r,d])
196 : leunga 744 | I.CALL{defs,uses,...} => (r15 :: C.getReg defs, C.getReg uses)
197 : monnier 245 | I.JMP{r,i,...} => oper(i,[],[r])
198 : leunga 744 | I.RET{leaf=false,...} => ([],[r31])
199 :     | I.RET{leaf=true,...} => ([],[r15])
200 : monnier 245 | I.COPY{src,dst,tmp=SOME(I.Direct r),...} => (r::dst,src)
201 :     | I.COPY{src,dst,...} => (dst,src)
202 :     | I.SAVE{r,i,d} => oper(i,[d],[r])
203 :     | I.RESTORE{r,i,d} => oper(i,[d],[r])
204 :     | I.Ticc{r,i,...} => oper(i,[],[r])
205 :     | I.RDY{d,...} => ([d],[])
206 :     | I.WRY{r,i,...} => oper(i,[],[r])
207 : george 889 | I.ANNOTATION{a=CB.DEF_USE{cellkind=CB.GP,defs,uses}, i, ...} =>
208 : leunga 657 let val (d,u) = defUseR i in (defs@d, u@uses) end
209 : monnier 498 | I.ANNOTATION{a, i, ...} => defUseR i
210 : monnier 245 | _ => ([],[])
211 :     end
212 :    
213 :     (* Use of FP registers *)
214 :     fun defUseF instr =
215 :     case instr of
216 :     I.FLOAD{r,d,i,...} => ([d],[])
217 :     | I.FSTORE{r,d,i,...} => ([],[d])
218 :     | I.FPop1{r,d,...} => ([d],[r])
219 :     | I.FPop2{r1,r2,d,...} => ([d],[r1,r2])
220 :     | I.FCMP{r1,r2,...} => ([],[r1,r2])
221 : leunga 744 | I.JMPL{defs,uses,...} => (C.getFreg defs,C.getFreg uses)
222 :     | I.CALL{defs,uses,...} => (C.getFreg defs,C.getFreg uses)
223 : monnier 411 | I.FMOVicc{r,d,...} => ([d],[r,d])
224 :     | I.FMOVfcc{r,d,...} => ([d],[r,d])
225 : monnier 245 | I.FCOPY{src,dst,tmp=SOME(I.FDirect r),...} => (r::dst,src)
226 :     | I.FCOPY{src,dst,...} => (dst,src)
227 : george 889 | I.ANNOTATION{a=CB.DEF_USE{cellkind=CB.FP,defs,uses}, i, ...} =>
228 : leunga 657 let val (d,u) = defUseF i in (defs@d, u@uses) end
229 : monnier 498 | I.ANNOTATION{a, i, ...} => defUseF i
230 : monnier 245 | _ => ([],[])
231 :    
232 : george 889 fun defUse CB.GP = defUseR
233 :     | defUse CB.FP = defUseF
234 : monnier 245 | defUse _ = error "defUse"
235 :    
236 : monnier 411 (*========================================================================
237 :     * Annotations
238 :     *========================================================================*)
239 : monnier 469 fun getAnnotations(I.ANNOTATION{i,a}) =
240 :     let val (i,an) = getAnnotations i in (i,a::an) end
241 :     | getAnnotations i = (i,[])
242 : monnier 411 fun annotate(i,a) = I.ANNOTATION{i=i,a=a}
243 : leunga 657
244 :     (*========================================================================
245 :     * Replicate an instruction
246 :     *========================================================================*)
247 :     fun replicate(I.ANNOTATION{i,a}) = I.ANNOTATION{i=replicate i,a=a}
248 :     | replicate(I.COPY{tmp=SOME _, dst, src, impl}) =
249 :     I.COPY{tmp=SOME(I.Direct(C.newReg())), dst=dst, src=src, impl=ref NONE}
250 :     | replicate(I.FCOPY{tmp=SOME _, dst, src, impl}) =
251 :     I.FCOPY{tmp=SOME(I.FDirect(C.newFreg())),
252 :     dst=dst, src=src, impl=ref NONE}
253 :     | replicate i = i
254 : monnier 245 end

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