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/compiler/OldCGen/rs6000/rs6000depend.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/OldCGen/rs6000/rs6000depend.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (view) (download)

1 : monnier 16 (* rs6000depend.sml
2 :     *
3 :     * COPYRIGHT (c) 1996 Bell Laboratories.
4 :     *
5 :     *)
6 :    
7 :     (** IBM RS6000 specific dependences **)
8 :    
9 :     structure RS6000Depend : MACHINSTR = struct
10 :     structure M = RS6000InstrSet
11 :     open M
12 :    
13 :     fun error msg = ErrorMsg.impossible ("RS6kDepend." ^ msg)
14 :    
15 :     val branchDelayedArch = false
16 :    
17 :     datatype ikind = IK_NOP | IK_JUMP | IK_INSTR
18 :    
19 :     fun isSdiBranch (M.BRANCH _) = true
20 :     | isSdiBranch (M.FBRANCH _) = true
21 :     | isSdiBranch _ = false
22 :    
23 :     fun instrKind instr =
24 :     case instr of
25 :     M.NOP => IK_NOP
26 :     | M.B _ => IK_JUMP
27 :     | M.BB _ => IK_JUMP
28 :     | M.BBF _ => IK_JUMP
29 :     | M.BR _ => IK_JUMP
30 :     | _ => IK_INSTR
31 :    
32 :     val nop = M.A(Reg 0,Reg 0,RegOp(Reg 0))
33 :    
34 :     fun minSize _ = 4
35 :    
36 :     fun sizeOf (info as INFO{addrOf,...}) (sdi,loc) = let
37 :     fun lab_value (lab,k) = M.labelValue info
38 :     (POSLAB lab,k-M.constBaseRegOffset)
39 :     fun is_short n = ~32768 <= n andalso n <= 32767
40 :     fun is_short_branch lab = let val displ = (addrOf lab - loc) div 4
41 :     in displ >= ~8192 andalso displ < 8192
42 :     end
43 :     in
44 :     case sdi
45 :     of M.SETBASEADDR(lab,reg) => let
46 :     val const = M.constBaseRegOffset - addrOf lab
47 :     in
48 :     if is_short const then (false, 4) else (true, 12)
49 :     end
50 :     | M.LOADADDR(_,lab,k) =>
51 :     if is_short(lab_value(lab,k)) then (false,4) else (true,12)
52 :     | M.LOAD(_,lab,k) =>
53 :     if is_short(lab_value(lab,k)) then (false,4) else (true,12)
54 :     | M.LOADF(_,lab,offset,_) => let
55 :     val labexp1 = (POSLAB lab,offset-M.constBaseRegOffset)
56 :     val labexp2 = (POSLAB lab,offset-M.constBaseRegOffset+4)
57 :     val labval1 = M.labelValue info labexp1
58 :     val labval2 = M.labelValue info labexp2
59 :     in
60 :     if (is_short labval1 andalso is_short labval2)
61 :     then (false,20)
62 :     else (true,32)
63 :     end
64 :     | M.BRANCH(_,_,lab,_,_) =>
65 :     if is_short_branch lab then (false,4) else (true,24)
66 :     | M.FBRANCH(_,_,_,lab,_,_) =>
67 :     if is_short_branch lab then (false,4) else (true,24)
68 :     end
69 :    
70 :     fun expand _ (sdi,size,loc) =
71 :     case sdi of
72 :     M.SETBASEADDR(lab,reg) =>
73 :     let val labexp = (M.NEGLAB lab,M.constBaseRegOffset)
74 :     in case size of
75 :     4 =>
76 :     [M.A(M.baseReg,reg,M.LabelOp labexp)]
77 :     | 12 =>
78 :     [M.LIU(M.baseReg,M.HiLabOp labexp),
79 :     M.A(M.baseReg,M.baseReg,M.LoLabOp labexp),
80 :     M.A(M.baseReg,reg,RegOp M.baseReg)]
81 :     | _ => error "expand: SETBASEADDR"
82 :     end
83 :     | M.LOADADDR(r,lab,k) =>
84 :     let val labexp = (POSLAB lab,k-M.constBaseRegOffset)
85 :     in case size
86 :     of 4 =>
87 :     [M.A(r,M.baseReg,LabelOp labexp)]
88 :     | 12 =>
89 :     [M.LIU(r,HiLabOp labexp),
90 :     M.A(r,r,LoLabOp labexp),
91 :     M.A(r,M.baseReg,RegOp r)]
92 :     | _ => error "expand: LOADADDR"
93 :     end
94 :     | LOAD(r,lab,k) =>
95 :     let val labexp = (POSLAB lab,k-M.constBaseRegOffset)
96 :     in case size
97 :     of 4 => [M.L(r,M.baseReg,LabelOp labexp)]
98 :     | 12 => [M.LIU(r,HiLabOp labexp),
99 :     M.A(r,M.baseReg,RegOp r),
100 :     M.L(r,r,LoLabOp labexp)]
101 :     | _ => error "expand: LOAD"
102 :     end
103 :     | M.LOADF(Freg fp,lab,offset,tmpR) =>
104 :     let val labexp1 = (POSLAB lab,offset-M.constBaseRegOffset)
105 :     val labexp2 = (POSLAB lab,offset-M.constBaseRegOffset+4)
106 :     val stackptr = Reg 1
107 :     in case size
108 :     of 20 =>
109 :     [M.L(Reg 0,M.baseReg,LabelOp labexp1),
110 :     M.L(tmpR,M.baseReg,LabelOp labexp2),
111 :     M.ST(Reg 0,stackptr,Immed16Op M.fLoadStoreOff),
112 :     M.ST(tmpR,stackptr,Immed16Op(M.fLoadStoreOff+4)),
113 :     M.LFD(Freg fp,stackptr,Immed16Op M.fLoadStoreOff)]
114 :     | 32 =>
115 :     [M.LIU(tmpR,HiLabOp labexp1),
116 :     M.A(tmpR,tmpR,RegOp M.baseReg),
117 :     M.A(tmpR,tmpR,LoLabOp labexp1),
118 :     M.L(Reg 0,tmpR,Immed16Op 0),
119 :     M.ST(Reg 0,stackptr,Immed16Op(M.fLoadStoreOff)),
120 :     M.L(Reg 0,tmpR,Immed16Op 4),
121 :     M.ST(Reg 0,stackptr,Immed16Op(M.fLoadStoreOff+4)),
122 :     M.LFD(Freg fp,stackptr,Immed16Op M.fLoadStoreOff)]
123 :     | _ => error "expand: LOADF"
124 :     end
125 :     | M.BRANCH(cc,bool,tlab,tmpR,flab) =>
126 :     (case size
127 :     of 4 => [M.BB(cc,bool,Label16Off(POSLAB tlab,0))]
128 :    
129 :     | 24 =>
130 :     let val labexp = (POSLAB tlab,~M.constBaseRegOffset)
131 :     in
132 :     [M.BB(cc,not bool,Label16Off(POSLAB flab,0)),
133 :    
134 :     (** Could use a branch24 **)
135 :     M.LIU(tmpR,HiLabOp labexp),
136 :     M.A(tmpR,tmpR,LoLabOp labexp),
137 :     M.A(tmpR,tmpR,RegOp M.baseReg),
138 :     M.MTSPR(M.LR,tmpR),
139 :     M.BR ()]
140 :     end
141 :     | _ => error "expand: BRANCH")
142 :     | M.FBRANCH(cc,cr,bool,tlab,tmpR,flab) =>
143 :     (case size
144 :     of 4 => [M.BBF(cc,cr,bool,Label16Off (POSLAB tlab,0))]
145 :     | 24 =>
146 :     let val labexp = (POSLAB tlab,~M.constBaseRegOffset)
147 :     in
148 :     [M.BBF(cc,cr,not bool,Label16Off(POSLAB flab,0)),
149 :    
150 :     M.LIU(tmpR,HiLabOp labexp),
151 :     M.A(tmpR,tmpR,LoLabOp labexp),
152 :     M.A(tmpR,tmpR,RegOp M.baseReg),
153 :     M.MTSPR(M.LR,tmpR),
154 :     M.BR ()]
155 :     end
156 :     | _ => error "expand: FBRANCH")
157 :     | _ => error "expand"
158 :    
159 :    
160 :     (*
161 :     * Resources: ($0-$31)+($f0,$f1-$f31)+cc+fcc+npc+LR+mem+fpscr+stack+MQ
162 :     *)
163 :    
164 :     val numResources = 72
165 :    
166 :     structure RId = struct
167 :     fun reg (Reg r) = [r] | reg _ = error "RId.reg"
168 :     fun fregd (Freg i) = [32 + i] | fregd _ = error "RId.fregd"
169 :     fun anyreg r = case r of Reg _ => reg r | Freg _ => fregd r
170 :     val cc = 64
171 :     val fcc = 65
172 :     val npc = 66
173 :     val lr = 67
174 :     val mem = 68
175 :     val fpscr = 69
176 :     val stack = 70
177 :     val mq = 71
178 :    
179 :     val Reg(alloc) = M.allocReg (* resource no. for reg = reg no. *)
180 :     val Reg(exnptr) = M.exnptrReg
181 :     val Reg(stackptr) = M.stackReg
182 :     end
183 :    
184 :     local
185 :     open RId
186 :     fun is_allocR reg = reg = M.allocReg
187 :     fun is_stackR reg = reg = M.stackReg
188 :     fun arithOpndUse opnd = case opnd of RegOp r => RId.reg r | _ => []
189 :    
190 :     val allR = let fun f(~1,l) = l | f(i,l) = f(i-1,i::l)
191 :     in f(numResources-1,[])
192 :     end
193 :    
194 :     fun arith_ud(rd,rs,ea) = (reg rs @ arithOpndUse ea, reg rd)
195 :     fun arith_3reg_ud(rd,ra,rb)= (reg ra @ reg rb,reg rd)
196 :     fun logical_ud(rd,rs,ea) = (reg rs @ arithOpndUse ea, cc::reg rd)
197 :     fun logical_3reg_ud(rd,ra,rb)
198 :     = (reg ra @ reg rb, cc::reg rd)
199 :     fun double_cc_ud(fd,fs,ft)= (fregd fs @ fregd ft, cc::fregd fd)
200 :    
201 :     fun load_ud(rt,base,ea) = let val u = anyreg base @ arithOpndUse ea
202 :     val d = anyreg rt
203 :     in
204 :     if is_stackR base then (stack::u,d)
205 :     else (mem::u,d)
206 :     end
207 :     fun store_ud(rt,base,ea) = let val use = anyreg rt @ anyreg base @
208 :     arithOpndUse ea
209 :     in if is_stackR base then (use,[stack])
210 :     else if is_allocR base then (use, [])
211 :     else (use,[mem])
212 :     end
213 :     fun shift_ud(ra,rs,sh) = let val (u,d) = (reg rs, reg ra)
214 :     in case sh
215 :     of RegShift sh => (reg sh @ u, d)
216 :     | _ => (u,d)
217 :     end
218 :     in
219 :     fun rUseDef I =
220 :     case I
221 :     of NOP => error "rUseDef: NOP"
222 :    
223 :     | M.B _ => ([],[npc])
224 :     | M.BB _ => ([lr,cc], [npc])
225 :     | M.BBF _ => ([lr,fcc],[npc])
226 :     | M.BR _ => ([lr],[npc])
227 :    
228 :     | M.LBZ arg => load_ud arg
229 :     | M.L arg => load_ud arg
230 :     | M.LFD arg => load_ud arg
231 :     | M.LIU (rt,_) => ([],RId.reg rt)
232 :     | M.MTSPR(M.LR,ra) => (RId.reg ra,[lr])
233 :     | M.MTSPR(M.MQ,ra) => (RId.reg ra,[mq])
234 :     | M.CAL arg => arith_ud arg
235 :    
236 :     | M.STB arg => store_ud arg
237 :     | M.ST arg => store_ud arg
238 :     | M.STFD arg => store_ud arg
239 :    
240 :     | M.A(arg as (Reg rd,_, _)) => let
241 :     val (u,d) = arith_ud arg
242 :     in
243 :     if is_allocR (Reg rd) then (u,mem::d) else (u,d)
244 :     end
245 :     | M.A _ => error "rUseDef: M.A"
246 :     | M.AO arg => logical_3reg_ud arg
247 :     | M.FAO arg => double_cc_ud arg
248 :    
249 :     | M.SF arg => arith_ud arg
250 :     | M.SFO arg => logical_3reg_ud arg
251 :     | M.FSO arg => double_cc_ud arg
252 :    
253 :     | M.MULSO arg => logical_3reg_ud arg
254 :     | M.MULS arg => arith_3reg_ud arg
255 :     | M.FMO arg => double_cc_ud arg
256 :    
257 :     | M.DIVS arg => logical_3reg_ud arg
258 :     | M.DIV arg => arith_3reg_ud arg
259 :     | M.FDO arg => double_cc_ud arg
260 :    
261 :     | M.FNEG(ra,rb) => (RId.fregd rb, fcc::RId.fregd ra)
262 :     | M.FABS(frt,frb) => (RId.fregd frb, RId.fregd frt)
263 :    
264 :     | M.CMP(ra,ea) => (reg ra @ arithOpndUse ea, [cc])
265 :     | M.CMPL(ra,rb) => (reg ra @ reg rb, [cc])
266 :     | M.FCMP(fra,frb) => (fregd fra @ fregd frb, [fcc])
267 :     | M.CROR _ => ([fcc], [fcc])
268 :    
269 :     | M.AND arg => logical_ud arg
270 :     | M.OR arg => logical_ud arg
271 :     | M.XOR arg => logical_ud arg
272 :     | M.XORU arg => logical_ud arg
273 :    
274 :     | M.SL arg => shift_ud arg
275 :     | M.SRA arg => shift_ud arg
276 :     | M.SRL arg => shift_ud arg
277 :    
278 :     | M.FMR(frt,frb) => (RId.fregd frb, RId.fregd frt)
279 :     | M.MTFSB1 n => ([], [fpscr])
280 :     | M.TRAP() => ([fpscr,exnptr,alloc], [npc])
281 :     end
282 :    
283 :     fun latency (M.LBZ _) = 2
284 :     | latency (M.L _) = 2
285 :     | latency (M.LFD _) = 2
286 :     | latency (M.CMP _) = 3
287 :     | latency (M.CMPL _) = 3
288 :     | latency (M.FCMP _) = 8
289 :     | latency (M.MTSPR _) = 4
290 :     | latency (M.FAO _) = 2
291 :     | latency (M.FSO _) = 2
292 :     | latency (M.FMO _) = 2
293 :     | latency (M.FDO _) = 2
294 :     | latency _ = 1
295 :    
296 :     fun mayNeedNop _ = 0
297 :    
298 :     fun needsNop _ = 0
299 :     end
300 :    
301 :    
302 :     (*
303 :     * $Log: rs6000depend.sml,v $
304 :     * Revision 1.4 1997/11/14 21:48:09 jhr
305 :     * Restored the support for the Power architecture; the PowerPC code
306 :     * generator will be MLRisc based.
307 :     *
308 :     * Revision 1.3 1997/08/25 16:43:33 jhr
309 :     * Replaced some old Power architecture instructions with PowerPC instructions.
310 :     * This means that the Power architecture is no longer supported by this
311 :     * code generator. Also improved implementation of emitString.
312 :     *
313 :     * Revision 1.2 1997/05/05 19:58:02 george
314 :     * Add the allocation pointer to the list of source registers for the
315 :     * tvs instruction. This fixed the subtle bug on interactions between
316 :     * the allocation-pointer-adjustment instruction and the addi
317 :     * instruction. -- george
318 :     *
319 :     * Revision 1.1.1.1 1997/01/14 01:38:45 george
320 :     * Version 109.24
321 :     *
322 :     *)

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