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/alpha/emit/alphaMC.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/alpha/emit/alphaMC.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 409 - (view) (download)

1 : monnier 409 (*
2 :     * This file was automatically generated by MDGen
3 :     * from the machine description file "alpha/alpha.md".
4 :     *)
5 :    
6 :    
7 :     functor AlphaMCEmitter(structure Instr : ALPHAINSTR
8 :     structure Stream : INSTRUCTION_STREAM
9 :     structure CodeString : CODE_STRING
10 :     ) : INSTRUCTION_EMITTER =
11 :     struct
12 :     structure I = Instr
13 :     structure S = Stream
14 :     structure C = I.C
15 :     structure Constant = I.Constant
16 :     structure P = S.P
17 :     structure W = Word32
18 :    
19 :     (* Alpha is a little endian architecture *)
20 :    
21 :     fun error msg = MLRiscErrorMsg.error("AlphaMC",msg)
22 :     fun makeStream() =
23 :     let infix && || << >> ~>>
24 :     val op << = W.<<
25 :     val op >> = W.>>
26 :     val op ~>> = W.~>>
27 :     val op || = W.orb
28 :     val op && = W.andb
29 :     val itow = W.fromInt
30 :     fun emit_bool false = 0w0 : W.word
31 :     | emit_bool true = 0w1 : W.word
32 :     val emit_int = itow
33 :     fun emit_word w = w
34 :     fun emit_label l = itow(Label.addrOf l)
35 :     fun emit_labexp le = itow(LabelExp.valueOf le)
36 :     fun emit_const c = itow(Constant.valueOf c)
37 :     val loc = ref 0
38 :    
39 :     (* emit a byte *)
40 :     fun eByte b =
41 :     let val i = !loc in loc := i + 1; CodeString.update(i,b) end
42 :    
43 :     (* emit the low order byte of a word *)
44 :     (* note: fromLargeWord strips the high order bits! *)
45 :     fun eByteW w =
46 :     let val i = !loc
47 :     in loc := i + 1; CodeString.update(i,Word8.fromLargeWord w) end
48 :    
49 :     fun doNothing _ = ()
50 :    
51 :     fun pseudoOp pOp = P.emitValue{pOp=pOp, loc= !loc,emit=eByte}
52 :    
53 :     fun init n = (CodeString.init n; loc := 0)
54 :    
55 :    
56 :     fun emitter regmap =
57 :     let
58 :    
59 :     fun eWord32 w = let
60 :     val b8 = w
61 :     val w = (w >> 0wx8)
62 :     val b16 = w
63 :     val w = (w >> 0wx8)
64 :     val b24 = w
65 :     val w = (w >> 0wx8)
66 :     val b32 = w
67 :     in
68 :     ((eByteW b8);
69 :     (eByteW b16);
70 :     (eByteW b24);
71 :     (eByteW b32))
72 :     end
73 :    
74 :    
75 :     fun emit_CC r = (itow ((regmap r) - 64))
76 :     and emit_GP r = (itow (regmap r))
77 :     and emit_FP r = (itow ((regmap r) - 32))
78 :    
79 :     fun emit_osf_user_palcode (I.BPT) = (0wx80 : Word32.word)
80 :     | emit_osf_user_palcode (I.BUGCHK) = (0wx81 : Word32.word)
81 :     | emit_osf_user_palcode (I.CALLSYS) = (0wx83 : Word32.word)
82 :     | emit_osf_user_palcode (I.GENTRAP) = (0wxaa : Word32.word)
83 :     | emit_osf_user_palcode (I.IMB) = (0wx86 : Word32.word)
84 :     | emit_osf_user_palcode (I.RDUNIQUE) = (0wx9e : Word32.word)
85 :     | emit_osf_user_palcode (I.WRUNIQUE) = (0wx9f : Word32.word)
86 :     and emit_store (I.STL) = (0wx2c : Word32.word)
87 :     | emit_store (I.STQ) = (0wx2d : Word32.word)
88 :     | emit_store (I.STQ_U) = (0wxf : Word32.word)
89 :     and emit_fcmove (I.FCMOVEQ) = (0wx2a : Word32.word)
90 :     | emit_fcmove (I.FCMOVEGE) = (0wx2d : Word32.word)
91 :     | emit_fcmove (I.FCMOVEGT) = (0wx2f : Word32.word)
92 :     | emit_fcmove (I.FCMOVLE) = (0wx2e : Word32.word)
93 :     | emit_fcmove (I.FCMOVELT) = (0wx2c : Word32.word)
94 :     | emit_fcmove (I.FCMOVENE) = (0wx2b : Word32.word)
95 :     and emit_foperate (I.CPYS) = (0wx17, 0wx20)
96 :     | emit_foperate (I.CPYSE) = (0wx17, 0wx22)
97 :     | emit_foperate (I.CPYSN) = (0wx17, 0wx21)
98 :     | emit_foperate (I.MF_FPCR) = (0wx17, 0wx25)
99 :     | emit_foperate (I.MT_FPCR) = (0wx17, 0wx24)
100 :     | emit_foperate (I.CMPTEQ) = (0wx16, 0wxa5)
101 :     | emit_foperate (I.CMPTLT) = (0wx16, 0wxa6)
102 :     | emit_foperate (I.CMPTLE) = (0wx16, 0wxa7)
103 :     | emit_foperate (I.CMPTUN) = (0wx16, 0wxa4)
104 :     | emit_foperate (I.CMPTEQSU) = (0wx16, 0wx5a5)
105 :     | emit_foperate (I.CMPTLTSU) = (0wx16, 0wx5a6)
106 :     | emit_foperate (I.CMPTLESU) = (0wx16, 0wx5a7)
107 :     | emit_foperate (I.CMPTUNSU) = (0wx16, 0wx5a4)
108 :     and emit_cmove (I.CMOVEQ) = (0wx24 : Word32.word)
109 :     | emit_cmove (I.CMOVLBC) = (0wx16 : Word32.word)
110 :     | emit_cmove (I.CMOVLBS) = (0wx14 : Word32.word)
111 :     | emit_cmove (I.CMOVGE) = (0wx46 : Word32.word)
112 :     | emit_cmove (I.CMOVGT) = (0wx66 : Word32.word)
113 :     | emit_cmove (I.CMOVLE) = (0wx64 : Word32.word)
114 :     | emit_cmove (I.CMOVLT) = (0wx44 : Word32.word)
115 :     | emit_cmove (I.CMOVNE) = (0wx26 : Word32.word)
116 :     and emit_operateV (I.ADDLV) = (0wx10, 0wx40)
117 :     | emit_operateV (I.ADDQV) = (0wx10, 0wx60)
118 :     | emit_operateV (I.SUBLV) = (0wx10, 0wx49)
119 :     | emit_operateV (I.SUBQV) = (0wx10, 0wx69)
120 :     | emit_operateV (I.MULLV) = (0wx13, 0wx40)
121 :     | emit_operateV (I.MULQV) = (0wx13, 0wx60)
122 :     and emit_fload (I.LDF) = (0wx20 : Word32.word)
123 :     | emit_fload (I.LDG) = (0wx21 : Word32.word)
124 :     | emit_fload (I.LDS) = (0wx22 : Word32.word)
125 :     | emit_fload (I.LDT) = (0wx23 : Word32.word)
126 :     and emit_branch (I.BR) = (0wx30 : Word32.word)
127 :     | emit_branch (I.BSR) = (0wx34 : Word32.word)
128 :     | emit_branch (I.BLBC) = (0wx38 : Word32.word)
129 :     | emit_branch (I.BEQ) = (0wx39 : Word32.word)
130 :     | emit_branch (I.BLT) = (0wx3a : Word32.word)
131 :     | emit_branch (I.BLE) = (0wx3b : Word32.word)
132 :     | emit_branch (I.BLBS) = (0wx3c : Word32.word)
133 :     | emit_branch (I.BNE) = (0wx3d : Word32.word)
134 :     | emit_branch (I.BGE) = (0wx3e : Word32.word)
135 :     | emit_branch (I.BGT) = (0wx3f : Word32.word)
136 :     and emit_foperateV (I.ADDSSUD) = (0wx5c0 : Word32.word)
137 :     | emit_foperateV (I.ADDSSU) = (0wx580 : Word32.word)
138 :     | emit_foperateV (I.ADDTSUD) = (0wx5e0 : Word32.word)
139 :     | emit_foperateV (I.ADDTSU) = (0wx5a0 : Word32.word)
140 :     | emit_foperateV (I.DIVSSUD) = (0wx5c3 : Word32.word)
141 :     | emit_foperateV (I.DIVSSU) = (0wx583 : Word32.word)
142 :     | emit_foperateV (I.DIVTSUD) = (0wx5e3 : Word32.word)
143 :     | emit_foperateV (I.DIVTSU) = (0wx5a3 : Word32.word)
144 :     | emit_foperateV (I.MULSSUD) = (0wx5c2 : Word32.word)
145 :     | emit_foperateV (I.MULSSU) = (0wx582 : Word32.word)
146 :     | emit_foperateV (I.MULTSUD) = (0wx5e2 : Word32.word)
147 :     | emit_foperateV (I.MULTSU) = (0wx5a2 : Word32.word)
148 :     | emit_foperateV (I.SUBSSUD) = (0wx5c1 : Word32.word)
149 :     | emit_foperateV (I.SUBSSU) = (0wx581 : Word32.word)
150 :     | emit_foperateV (I.SUBTSUD) = (0wx5e1 : Word32.word)
151 :     | emit_foperateV (I.SUBTSU) = (0wx5a1 : Word32.word)
152 :     and emit_operate (I.ADDL) = (0wx10, 0wx0)
153 :     | emit_operate (I.ADDQ) = (0wx10, 0wx20)
154 :     | emit_operate (I.CMPBGE) = (0wx10, 0wxf)
155 :     | emit_operate (I.CMPEQ) = (0wx10, 0wx2d)
156 :     | emit_operate (I.CMPLE) = (0wx10, 0wx6d)
157 :     | emit_operate (I.CMPLT) = (0wx10, 0wx4d)
158 :     | emit_operate (I.CMPULE) = (0wx10, 0wx3d)
159 :     | emit_operate (I.CMPULT) = (0wx10, 0wx1d)
160 :     | emit_operate (I.SUBL) = (0wx10, 0wx9)
161 :     | emit_operate (I.SUBQ) = (0wx10, 0wx29)
162 :     | emit_operate (I.S4ADDL) = (0wx10, 0wx2)
163 :     | emit_operate (I.S4ADDQ) = (0wx10, 0wx22)
164 :     | emit_operate (I.S4SUBL) = (0wx10, 0wxb)
165 :     | emit_operate (I.S4SUBQ) = (0wx10, 0wx2b)
166 :     | emit_operate (I.S8ADDL) = (0wx10, 0wx12)
167 :     | emit_operate (I.S8ADDQ) = (0wx10, 0wx32)
168 :     | emit_operate (I.S8SUBL) = (0wx10, 0wx1b)
169 :     | emit_operate (I.S8SUBQ) = (0wx10, 0wx3b)
170 :     | emit_operate (I.AND) = (0wx11, 0wx0)
171 :     | emit_operate (I.BIC) = (0wx11, 0wx8)
172 :     | emit_operate (I.BIS) = (0wx11, 0wx20)
173 :     | emit_operate (I.EQV) = (0wx11, 0wx48)
174 :     | emit_operate (I.ORNOT) = (0wx11, 0wx28)
175 :     | emit_operate (I.XOR) = (0wx11, 0wx40)
176 :     | emit_operate (I.EXTBL) = (0wx12, 0wx6)
177 :     | emit_operate (I.EXTLH) = (0wx12, 0wx6a)
178 :     | emit_operate (I.EXTLL) = (0wx12, 0wx26)
179 :     | emit_operate (I.EXTQH) = (0wx12, 0wx7a)
180 :     | emit_operate (I.EXTQL) = (0wx12, 0wx36)
181 :     | emit_operate (I.EXTWH) = (0wx12, 0wx5a)
182 :     | emit_operate (I.EXTWL) = (0wx12, 0wx16)
183 :     | emit_operate (I.INSBL) = (0wx12, 0wxb)
184 :     | emit_operate (I.INSLH) = (0wx12, 0wx67)
185 :     | emit_operate (I.INSLL) = (0wx12, 0wx2b)
186 :     | emit_operate (I.INSQH) = (0wx12, 0wx77)
187 :     | emit_operate (I.INSQL) = (0wx12, 0wx3b)
188 :     | emit_operate (I.INSWH) = (0wx12, 0wx57)
189 :     | emit_operate (I.INSWL) = (0wx12, 0wx1b)
190 :     | emit_operate (I.MSKBL) = (0wx12, 0wx2)
191 :     | emit_operate (I.MSKLH) = (0wx12, 0wx62)
192 :     | emit_operate (I.MSKLL) = (0wx12, 0wx22)
193 :     | emit_operate (I.MSKQH) = (0wx12, 0wx72)
194 :     | emit_operate (I.MSKQL) = (0wx12, 0wx32)
195 :     | emit_operate (I.MSKWH) = (0wx12, 0wx52)
196 :     | emit_operate (I.MSKWL) = (0wx12, 0wx12)
197 :     | emit_operate (I.SLL) = (0wx12, 0wx39)
198 :     | emit_operate (I.SRA) = (0wx12, 0wx3c)
199 :     | emit_operate (I.SRL) = (0wx12, 0wx34)
200 :     | emit_operate (I.ZAP) = (0wx12, 0wx30)
201 :     | emit_operate (I.ZAPNOT) = (0wx12, 0wx31)
202 :     | emit_operate (I.MULL) = (0wx13, 0wx0)
203 :     | emit_operate (I.MULQ) = (0wx13, 0wx20)
204 :     | emit_operate (I.UMULH) = (0wx13, 0wx30)
205 :     | emit_operate (I.SGNXL) = (0wx10, 0wx0)
206 :     and emit_load (I.LDL) = (0wx28 : Word32.word)
207 :     | emit_load (I.LDL_L) = (0wx2a : Word32.word)
208 :     | emit_load (I.LDQ) = (0wx29 : Word32.word)
209 :     | emit_load (I.LDQ_L) = (0wx2b : Word32.word)
210 :     | emit_load (I.LDQ_U) = (0wxb : Word32.word)
211 :     and emit_funary (I.CVTLQ) = (0wx17, 0wx10)
212 :     | emit_funary (I.CVTQL) = (0wx17, 0wx30)
213 :     | emit_funary (I.CVTQLSV) = (0wx17, 0wx530)
214 :     | emit_funary (I.CVTQLV) = (0wx17, 0wx130)
215 :     | emit_funary (I.CVTQS) = (0wx16, 0wxbc)
216 :     | emit_funary (I.CVTQSC) = (0wx16, 0wx3c)
217 :     | emit_funary (I.CVTQT) = (0wx16, 0wxbe)
218 :     | emit_funary (I.CVTQTC) = (0wx16, 0wx3e)
219 :     | emit_funary (I.CVTTS) = (0wx16, 0wxac)
220 :     | emit_funary (I.CVTTSC) = (0wx16, 0wx2c)
221 :     | emit_funary (I.CVTTQ) = (0wx16, 0wxaf)
222 :     | emit_funary (I.CVTTQC) = (0wx16, 0wx2f)
223 :     and emit_fbranch (I.FBEQ) = (0wx31 : Word32.word)
224 :     | emit_fbranch (I.FBLT) = (0wx32 : Word32.word)
225 :     | emit_fbranch (I.FBLE) = (0wx33 : Word32.word)
226 :     | emit_fbranch (I.FBNE) = (0wx35 : Word32.word)
227 :     | emit_fbranch (I.FBGE) = (0wx36 : Word32.word)
228 :     | emit_fbranch (I.FBGT) = (0wx37 : Word32.word)
229 :     and emit_operand (I.REGop GP) = GP
230 :     | emit_operand (I.IMMop int) = (error "IMMop")
231 :     | emit_operand (I.HILABop labexp) = (error "HILABop")
232 :     | emit_operand (I.LOLABop labexp) = (error "LOLABop")
233 :     | emit_operand (I.LABop labexp) = (error "LABop")
234 :     | emit_operand (I.CONSTop const) = (error "CONSTop")
235 :     and emit_fstore (I.STF) = (0wx24 : Word32.word)
236 :     | emit_fstore (I.STG) = (0wx25 : Word32.word)
237 :     | emit_fstore (I.STS) = (0wx26 : Word32.word)
238 :     | emit_fstore (I.STT) = (0wx27 : Word32.word)
239 :    
240 :     fun Foperate {opc, fa, fb, func, fc} = let
241 :     val fa = (emit_FP fa)
242 :     val fb = (emit_FP fb)
243 :     val fc = (emit_FP fc)
244 :     in (eWord32 (fc + ((func << 0wx5) + ((fb << 0wx10) + ((fa << 0wx15) + (opc << 0wx1a))))))
245 :     end
246 :    
247 :     and Low {le} = let
248 :    
249 :     (*#line 195.1 "alpha/alpha.md"*)
250 :     val(_, lo) = (Split {le=le})
251 :     in lo
252 :     end
253 :    
254 :     and ILoadStore {opc, r, b, d} = let
255 :     val r = (emit_GP r)
256 :     in (LoadStore {opc=opc, ra=r, rb=b, disp=d})
257 :     end
258 :    
259 :     and Jump {ra, rb, h, disp} = let
260 :     val ra = (emit_GP ra)
261 :     val rb = (emit_GP rb)
262 :     val disp = (emit_int disp)
263 :     in (eWord32 ((disp && 0wx3fff) + ((h << 0wxe) + ((rb << 0wx10) + ((ra << 0wx15) + 0wx68000000)))))
264 :     end
265 :    
266 :     and Funary {opc, fb, func, fc} = let
267 :     val fb = (emit_FP fb)
268 :     val fc = (emit_FP fc)
269 :     in (eWord32 (fc + ((func << 0wx5) + ((fb << 0wx10) + ((opc << 0wx1a) + 0wx3e00000)))))
270 :     end
271 :    
272 :     and High {le} = let
273 :    
274 :     (*#line 194.1 "alpha/alpha.md"*)
275 :     val(hi, _) = (Split {le=le})
276 :     in hi
277 :     end
278 :    
279 :     and Operate {opc, ra, rb, func, rc} =
280 :     (
281 :     case rb of
282 :     I.REGop rb => (Operate0 {opc=opc, ra=ra, rb=rb, func=func, rc=rc})
283 :     | I.IMMop i => (Operate1 {opc=opc, ra=ra, lit=(itow i), func=func, rc=rc})
284 :     | I.HILABop le => (Operate1 {opc=opc, ra=ra, lit=(High {le=le}), func=func, rc=rc})
285 :     | I.LOLABop le => (Operate1 {opc=opc, ra=ra, lit=(Low {le=le}), func=func, rc=rc})
286 :     | I.LABop le => (Operate1 {opc=opc, ra=ra, lit=(itow (LabelExp.valueOf le)), func=func, rc=rc})
287 :     | I.CONSTop c => (Operate1 {opc=opc, ra=ra, lit=(itow (Constant.valueOf c)), func=func, rc=rc})
288 :     )
289 :     and FLoadStore {opc, r, b, d} = let
290 :     val r = (emit_FP r)
291 :     in (LoadStore {opc=opc, ra=r, rb=b, disp=d})
292 :     end
293 :    
294 :     and Pal {func} = (eWord32 func)
295 :     and Memory_fun {opc, ra, rb, func} = let
296 :     val ra = (emit_GP ra)
297 :     val rb = (emit_GP rb)
298 :     in (eWord32 (func + ((rb << 0wx10) + ((ra << 0wx15) + (opc << 0wx1a)))))
299 :     end
300 :    
301 :     and Operate0 {opc, ra, rb, func, rc} = let
302 :     val ra = (emit_GP ra)
303 :     val rb = (emit_GP rb)
304 :     val rc = (emit_GP rc)
305 :     in (eWord32 (rc + ((func << 0wx5) + ((rb << 0wx10) + ((ra << 0wx15) + (opc << 0wx1a))))))
306 :     end
307 :    
308 :     and Fbranch {opc, ra, disp} = let
309 :     val opc = (emit_fbranch opc)
310 :     val ra = (emit_FP ra)
311 :     in (eWord32 ((disp && 0wx1fffff) + ((ra << 0wx15) + (opc << 0wx1a))))
312 :     end
313 :    
314 :     and Operate1 {opc, ra, lit, func, rc} = let
315 :     val ra = (emit_GP ra)
316 :     val rc = (emit_GP rc)
317 :     in (eWord32 (rc + ((func << 0wx5) + (((lit && 0wxff) << 0wxd) + ((ra << 0wx15) + ((opc << 0wx1a) + 0wx1000))))))
318 :     end
319 :    
320 :     and Split {le} = let
321 :    
322 :     (*#line 188.1 "alpha/alpha.md"*)
323 :     val i = (LabelExp.valueOf le)
324 :    
325 :     (*#line 189.1 "alpha/alpha.md"*)
326 :     val w = (itow i)
327 :    
328 :     (*#line 190.1 "alpha/alpha.md"*)
329 :     val hi = (w ~>> 0wx10)
330 :    
331 :     (*#line 191.1 "alpha/alpha.md"*)
332 :     val lo = (w && 0wxffff)
333 :     in (if (lo < 0wx8000)
334 :     then (hi, lo)
335 :     else ((hi + 0wx1), (lo - 0wx10000)))
336 :     end
337 :    
338 :     and LoadStore {opc, ra, rb, disp} = let
339 :    
340 :     (*#line 197.1 "alpha/alpha.md"*)
341 :     val disp =
342 :     (
343 :     case disp of
344 :     I.REGop rb => (emit_GP rb)
345 :     | I.IMMop i => (itow i)
346 :     | I.HILABop le => (High {le=le})
347 :     | I.LOLABop le => (Low {le=le})
348 :     | I.LABop le => (itow (LabelExp.valueOf le))
349 :     | I.CONSTop c => (itow (Constant.valueOf c))
350 :     )
351 :     in (Memory {opc=opc, ra=ra, rb=rb, disp=disp})
352 :     end
353 :    
354 :     and Branch {opc, ra, disp} = let
355 :     val opc = (emit_branch opc)
356 :     val ra = (emit_GP ra)
357 :     in (eWord32 ((disp && 0wx1fffff) + ((ra << 0wx15) + (opc << 0wx1a))))
358 :     end
359 :    
360 :     and Memory {opc, ra, rb, disp} = let
361 :     val rb = (emit_GP rb)
362 :     in (eWord32 ((disp && 0wxffff) + ((rb << 0wx10) + ((ra << 0wx15) + (opc << 0wx1a)))))
363 :     end
364 :    
365 :    
366 :     fun disp lab = ((itow (((Label.addrOf lab) - (! loc)) - 4)) ~>> 0wx2)
367 :    
368 :     fun emitInstr (I.DEFFREG FP) = ()
369 :     | emitInstr (I.LDA{r, b, d}) = (ILoadStore {opc=0wx8, r=r, b=b, d=d})
370 :     | emitInstr (I.LDAH{r, b, d}) = (ILoadStore {opc=0wx9, r=r, b=b, d=d})
371 :     | emitInstr (I.LOAD{ldOp, r, b, d, mem}) = (ILoadStore {opc=(emit_load ldOp), r=r, b=b, d=d})
372 :     | emitInstr (I.STORE{stOp, r, b, d, mem}) = (ILoadStore {opc=(emit_store stOp), r=r, b=b, d=d})
373 :     | emitInstr (I.FLOAD{ldOp, r, b, d, mem}) = (FLoadStore {opc=(emit_fload ldOp), r=r, b=b, d=d})
374 :     | emitInstr (I.FSTORE{stOp, r, b, d, mem}) = (FLoadStore {opc=(emit_fstore stOp), r=r, b=b, d=d})
375 :     | emitInstr (I.JMPL({r, b, d}, label)) = (Jump {h=0wx0, ra=r, rb=b, disp=d})
376 :     | emitInstr (I.JSR({r, b, d}, cellset1, cellset2, region)) = (Jump {h=0wx1, ra=r, rb=b, disp=d})
377 :     | emitInstr (I.RET{r, b, d}) = (Jump {h=0wx2, ra=r, rb=b, disp=d})
378 :     | emitInstr (I.BRANCH(branch, GP, label)) = (Branch {opc=branch, ra=GP, disp=(disp label)})
379 :     | emitInstr (I.FBRANCH(fbranch, FP, label)) = (Fbranch {opc=fbranch, ra=FP, disp=(disp label)})
380 :     | emitInstr (I.OPERATE{oper, ra, rb, rc}) = let
381 :    
382 :     (*#line 321.1 "alpha/alpha.md"*)
383 :     val(opc, func) = (emit_operate oper)
384 :     in (Operate {opc=opc, func=func, ra=ra, rb=rb, rc=rc})
385 :     end
386 :    
387 :     | emitInstr (I.OPERATEV{oper, ra, rb, rc}) = let
388 :    
389 :     (*#line 327.1 "alpha/alpha.md"*)
390 :     val(opc, func) = (emit_operateV oper)
391 :     in (Operate {opc=opc, func=func, ra=ra, rb=rb, rc=rc})
392 :     end
393 :    
394 :     | emitInstr (I.CMOVE{oper, ra, rb, rc}) = (Operate {opc=0wx11, func=(emit_cmove oper), ra=ra, rb=rb, rc=rc})
395 :     | emitInstr (I.PSEUDOARITH{oper, ra, rb, rc, tmps}) = (error "PSEUDOARITH")
396 :     | emitInstr (I.COPY{dst, src, impl, tmp}) = (error "COPY")
397 :     | emitInstr (I.FCOPY{dst, src, impl, tmp}) = (error "FCOPY")
398 :     | emitInstr (I.FUNARY{oper, fb, fc}) = let
399 :    
400 :     (*#line 351.1 "alpha/alpha.md"*)
401 :     val(opc, func) = (emit_funary oper)
402 :     in (Funary {opc=opc, func=func, fb=fb, fc=fc})
403 :     end
404 :    
405 :     | emitInstr (I.FOPERATE{oper, fa, fb, fc}) = let
406 :    
407 :     (*#line 358.1 "alpha/alpha.md"*)
408 :     val(opc, func) = (emit_foperate oper)
409 :     in (Foperate {opc=opc, func=func, fa=fa, fb=fb, fc=fc})
410 :     end
411 :    
412 :     | emitInstr (I.FOPERATEV{oper, fa, fb, fc}) = (Foperate {opc=0wx16, func=(emit_foperateV oper), fa=fa, fb=fb, fc=fc})
413 :     | emitInstr (I.FCMOVE{oper, fa, fb, fc}) = (Foperate {opc=0wx17, func=(emit_fcmove oper), fa=fa, fb=fb, fc=fc})
414 :     | emitInstr (I.TRAPB) = (Memory_fun {opc=0wx18, ra=31, rb=31, func=0wx0})
415 :     | emitInstr (I.CALL_PAL{code, def, use}) = (Pal {func=(emit_osf_user_palcode code)})
416 :     | emitInstr (I.ANNOTATION{i, a}) = (emitInstr i)
417 :     | emitInstr (I.GROUP annotation) = (error "GROUP")
418 :     in
419 :     emitInstr
420 :     end
421 :    
422 :     in S.STREAM{init=init,
423 :     pseudoOp=pseudoOp,
424 :     emit=emitter,
425 :     finish=doNothing,
426 :     defineLabel=doNothing,
427 :     entryLabel=doNothing,
428 :     comment=doNothing,
429 :     exitBlock=doNothing,
430 :     blockName=doNothing,
431 :     annotation=doNothing
432 :     }
433 :     end
434 :     end
435 :    

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