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

Annotation of /sml/trunk/src/MLRISC/sparc/emit/sparcAsm.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 545 - (view) (download)

1 : monnier 411 (*
2 : george 545 * This file was automatically generated by MDGen (v2.0)
3 : monnier 411 * from the machine description file "sparc/sparc.md".
4 :     *)
5 :    
6 :    
7 :     functor SparcAsmEmitter(structure Instr : SPARCINSTR
8 :     structure Stream : INSTRUCTION_STREAM
9 :     structure Shuffle : SPARCSHUFFLE
10 :     where I = Instr
11 :    
12 : george 545 (*#line 468.21 "sparc/sparc.md"*)
13 : monnier 411 val V9 : bool
14 :     ) : INSTRUCTION_EMITTER =
15 : monnier 247 struct
16 : monnier 411 structure I = Instr
17 :     structure C = I.C
18 :     structure S = Stream
19 :     structure P = S.P
20 : george 545 structure LabelExp = I.LabelExp
21 : monnier 247 structure Constant = I.Constant
22 : monnier 411
23 : monnier 498 val show_cellset = MLRiscControl.getFlag "asm-show-cellset"
24 : george 545 val show_region = MLRiscControl.getFlag "asm-show-region"
25 : monnier 498
26 : george 545 fun error msg = MLRiscErrorMsg.error("SparcAsmEmitter",msg)
27 : monnier 411
28 : monnier 429 fun makeStream formatAnnotations =
29 : monnier 411 let val stream = !AsmStream.asmOutStream
30 : monnier 429 fun emit' s = TextIO.output(stream,s)
31 :     val newline = ref true
32 :     val tabs = ref 0
33 :     fun tabbing 0 = ()
34 :     | tabbing n = (emit' "\t"; tabbing(n-1))
35 :     fun emit s = (tabbing(!tabs); tabs := 0; newline := false; emit' s)
36 :     fun nl() = (tabs := 0; if !newline then () else (newline := true; emit' "\n"))
37 : monnier 411 fun comma() = emit ","
38 : monnier 429 fun tab() = tabs := !tabs + 1
39 :     fun ms n = let val s = Int.toString n
40 :     in if n<0 then "-"^String.substring(s,1,size s-1)
41 :     else s
42 :     end
43 : monnier 411 fun emit_label lab = emit(Label.nameOf lab)
44 :     fun emit_labexp le = emit(LabelExp.toString le)
45 :     fun emit_const c = emit(Constant.toString c)
46 :     fun emit_int i = emit(ms i)
47 :     fun paren f = (emit "("; f(); emit ")")
48 :     fun defineLabel lab = emit(Label.nameOf lab^":\n")
49 :     fun entryLabel lab = defineLabel lab
50 :     fun comment msg = emit("\t/* " ^ msg ^ " */")
51 :     fun annotation a = (comment(Annotations.toString a); nl())
52 : george 545 fun doNothing _ = ()
53 : monnier 411 fun emit_region mem = comment(I.Region.toString mem)
54 : george 545 val emit_region =
55 :     if !show_region then emit_region else doNothing
56 : monnier 411 fun pseudoOp pOp = emit(P.toString pOp)
57 :     fun init size = (comment("Code Size = " ^ ms size); nl())
58 :     fun emitter regmap =
59 :     let
60 : george 545 val emitRegInfo = AsmFormatUtil.reginfo
61 :     (emit,regmap,formatAnnotations)
62 :     fun emit_GP r =
63 :     ( emit (C.showGP (regmap r));
64 :     emitRegInfo r )
65 :     and emit_FP r =
66 :     ( emit (C.showFP (regmap r));
67 :     emitRegInfo r )
68 : monnier 429 and emit_Y r =
69 : george 545 ( emit (C.showY (regmap r));
70 :     emitRegInfo r )
71 :     and emit_PSR r =
72 :     ( emit (C.showPSR (regmap r));
73 :     emitRegInfo r )
74 : monnier 429 and emit_FSR r =
75 : george 545 ( emit (C.showFSR (regmap r));
76 :     emitRegInfo r )
77 :     and emit_CC r =
78 :     ( emit (C.showCC (regmap r));
79 :     emitRegInfo r )
80 :     and emit_MEM r =
81 :     ( emit (C.showMEM (regmap r));
82 :     emitRegInfo r )
83 :     and emit_CTRL r =
84 :     ( emit (C.showCTRL (regmap r));
85 :     emitRegInfo r )
86 : monnier 498
87 :     fun emit_cellset(title,cellset) =
88 :     (nl(); comment(title^C.cellsetToString' regmap cellset))
89 : george 545 val emit_cellset =
90 :     if !show_cellset then emit_cellset else doNothing
91 : monnier 498 fun emit_defs cellset = emit_cellset("defs: ",cellset)
92 :     fun emit_uses cellset = emit_cellset("uses: ",cellset)
93 : george 545 fun asm_load (I.LDSB) = "ldsb"
94 :     | asm_load (I.LDSH) = "ldsh"
95 :     | asm_load (I.LDUB) = "ldub"
96 :     | asm_load (I.LDUH) = "lduh"
97 :     | asm_load (I.LD) = "ld"
98 :     | asm_load (I.LDX) = "ldx"
99 :     | asm_load (I.LDD) = "ldd"
100 :     and emit_load x = emit (asm_load x)
101 : monnier 429 and asm_store (I.STB) = "stb"
102 :     | asm_store (I.STH) = "sth"
103 :     | asm_store (I.ST) = "st"
104 :     | asm_store (I.STX) = "stx"
105 :     | asm_store (I.STD) = "std"
106 : george 545 and emit_store x = emit (asm_store x)
107 : monnier 429 and asm_fload (I.LDF) = "ldf"
108 :     | asm_fload (I.LDDF) = "lddf"
109 :     | asm_fload (I.LDQF) = "ldqf"
110 :     | asm_fload (I.LDFSR) = "ldfsr"
111 :     | asm_fload (I.LDXFSR) = "ldxfsr"
112 : george 545 and emit_fload x = emit (asm_fload x)
113 : monnier 429 and asm_fstore (I.STF) = "stf"
114 :     | asm_fstore (I.STDF) = "stdf"
115 :     | asm_fstore (I.STFSR) = "stfsr"
116 : george 545 and emit_fstore x = emit (asm_fstore x)
117 : monnier 411 and asm_arith (I.AND) = "and"
118 :     | asm_arith (I.ANDCC) = "andcc"
119 :     | asm_arith (I.ANDN) = "andn"
120 :     | asm_arith (I.ANDNCC) = "andncc"
121 :     | asm_arith (I.OR) = "or"
122 :     | asm_arith (I.ORCC) = "orcc"
123 :     | asm_arith (I.ORN) = "orn"
124 :     | asm_arith (I.ORNCC) = "orncc"
125 :     | asm_arith (I.XOR) = "xor"
126 :     | asm_arith (I.XORCC) = "xorcc"
127 :     | asm_arith (I.XNOR) = "xnor"
128 :     | asm_arith (I.XNORCC) = "xnorcc"
129 :     | asm_arith (I.ADD) = "add"
130 :     | asm_arith (I.ADDCC) = "addcc"
131 :     | asm_arith (I.TADD) = "tadd"
132 :     | asm_arith (I.TADDCC) = "taddcc"
133 :     | asm_arith (I.TADDTV) = "taddtv"
134 :     | asm_arith (I.TADDTVCC) = "taddtvcc"
135 :     | asm_arith (I.SUB) = "sub"
136 :     | asm_arith (I.SUBCC) = "subcc"
137 :     | asm_arith (I.TSUB) = "tsub"
138 :     | asm_arith (I.TSUBCC) = "tsubcc"
139 :     | asm_arith (I.TSUBTV) = "tsubtv"
140 :     | asm_arith (I.TSUBTVCC) = "tsubtvcc"
141 :     | asm_arith (I.UMUL) = "umul"
142 :     | asm_arith (I.UMULCC) = "umulcc"
143 :     | asm_arith (I.SMUL) = "smul"
144 :     | asm_arith (I.SMULCC) = "smulcc"
145 :     | asm_arith (I.UDIV) = "udiv"
146 :     | asm_arith (I.UDIVCC) = "udivcc"
147 :     | asm_arith (I.SDIV) = "sdiv"
148 :     | asm_arith (I.SDIVCC) = "sdivcc"
149 :     | asm_arith (I.MULX) = "mulx"
150 :     | asm_arith (I.SDIVX) = "sdivx"
151 :     | asm_arith (I.UDIVX) = "udivx"
152 : george 545 and emit_arith x = emit (asm_arith x)
153 :     and asm_shift (I.SLL) = "sll"
154 :     | asm_shift (I.SRL) = "srl"
155 :     | asm_shift (I.SRA) = "sra"
156 :     | asm_shift (I.SLLX) = "sllx"
157 :     | asm_shift (I.SRLX) = "srlx"
158 :     | asm_shift (I.SRAX) = "srax"
159 :     and emit_shift x = emit (asm_shift x)
160 :     and asm_farith1 (I.FiTOs) = "fitos"
161 :     | asm_farith1 (I.FiTOd) = "fitod"
162 :     | asm_farith1 (I.FiTOq) = "fitoq"
163 :     | asm_farith1 (I.FsTOi) = "fstoi"
164 :     | asm_farith1 (I.FdTOi) = "fdtoi"
165 :     | asm_farith1 (I.FqTOi) = "fqtoi"
166 :     | asm_farith1 (I.FsTOd) = "fstod"
167 :     | asm_farith1 (I.FsTOq) = "fstoq"
168 :     | asm_farith1 (I.FdTOs) = "fdtos"
169 :     | asm_farith1 (I.FdTOq) = "fdtoq"
170 :     | asm_farith1 (I.FqTOs) = "fqtos"
171 :     | asm_farith1 (I.FqTOd) = "fqtod"
172 :     | asm_farith1 (I.FMOVs) = "fmovs"
173 :     | asm_farith1 (I.FNEGs) = "fnegs"
174 :     | asm_farith1 (I.FABSs) = "fabss"
175 :     | asm_farith1 (I.FMOVd) = "fmovd"
176 :     | asm_farith1 (I.FNEGd) = "fnegd"
177 :     | asm_farith1 (I.FABSd) = "fabsd"
178 :     | asm_farith1 (I.FMOVq) = "fmovq"
179 :     | asm_farith1 (I.FNEGq) = "fnegq"
180 :     | asm_farith1 (I.FABSq) = "fabsq"
181 :     | asm_farith1 (I.FSQRTs) = "fsqrts"
182 :     | asm_farith1 (I.FSQRTd) = "fsqrtd"
183 :     | asm_farith1 (I.FSQRTq) = "fsqrtq"
184 :     and emit_farith1 x = emit (asm_farith1 x)
185 :     and asm_farith2 (I.FADDs) = "fadds"
186 :     | asm_farith2 (I.FADDd) = "faddd"
187 :     | asm_farith2 (I.FADDq) = "faddq"
188 :     | asm_farith2 (I.FSUBs) = "fsubs"
189 :     | asm_farith2 (I.FSUBd) = "fsubd"
190 :     | asm_farith2 (I.FSUBq) = "fsubq"
191 :     | asm_farith2 (I.FMULs) = "fmuls"
192 :     | asm_farith2 (I.FMULd) = "fmuld"
193 :     | asm_farith2 (I.FMULq) = "fmulq"
194 :     | asm_farith2 (I.FsMULd) = "fsmuld"
195 :     | asm_farith2 (I.FdMULq) = "fdmulq"
196 :     | asm_farith2 (I.FDIVs) = "fdivs"
197 :     | asm_farith2 (I.FDIVd) = "fdivd"
198 :     | asm_farith2 (I.FDIVq) = "fdivq"
199 :     and emit_farith2 x = emit (asm_farith2 x)
200 : monnier 411 and asm_fcmp (I.FCMPs) = "fcmps"
201 :     | asm_fcmp (I.FCMPd) = "fcmpd"
202 :     | asm_fcmp (I.FCMPq) = "fcmpq"
203 :     | asm_fcmp (I.FCMPEs) = "fcmpes"
204 :     | asm_fcmp (I.FCMPEd) = "fcmped"
205 :     | asm_fcmp (I.FCMPEq) = "fcmpeq"
206 : george 545 and emit_fcmp x = emit (asm_fcmp x)
207 :     and asm_branch (I.BN) = "n"
208 :     | asm_branch (I.BE) = "e"
209 :     | asm_branch (I.BLE) = "le"
210 :     | asm_branch (I.BL) = "l"
211 :     | asm_branch (I.BLEU) = "leu"
212 :     | asm_branch (I.BCS) = "cs"
213 :     | asm_branch (I.BNEG) = "neg"
214 :     | asm_branch (I.BVS) = "vs"
215 :     | asm_branch (I.BA) = ""
216 :     | asm_branch (I.BNE) = "ne"
217 :     | asm_branch (I.BG) = "g"
218 :     | asm_branch (I.BGE) = "ge"
219 :     | asm_branch (I.BGU) = "gu"
220 :     | asm_branch (I.BCC) = "cc"
221 :     | asm_branch (I.BPOS) = "pos"
222 :     | asm_branch (I.BVC) = "vs"
223 :     and emit_branch x = emit (asm_branch x)
224 : monnier 429 and asm_rcond (I.RZ) = "rz"
225 :     | asm_rcond (I.RLEZ) = "rlez"
226 :     | asm_rcond (I.RLZ) = "rlz"
227 :     | asm_rcond (I.RNZ) = "rnz"
228 :     | asm_rcond (I.RGZ) = "rgz"
229 :     | asm_rcond (I.RGEZ) = "rgez"
230 : george 545 and emit_rcond x = emit (asm_rcond x)
231 :     and asm_prediction (I.PT) = "pt"
232 :     | asm_prediction (I.PN) = "pn"
233 :     and emit_prediction x = emit (asm_prediction x)
234 : monnier 411 and asm_fbranch (I.FBN) = "fbn"
235 :     | asm_fbranch (I.FBNE) = "fbne"
236 :     | asm_fbranch (I.FBLG) = "fblg"
237 :     | asm_fbranch (I.FBUL) = "fbul"
238 :     | asm_fbranch (I.FBL) = "fbl"
239 :     | asm_fbranch (I.FBUG) = "fbug"
240 :     | asm_fbranch (I.FBG) = "fbg"
241 :     | asm_fbranch (I.FBU) = "fbu"
242 :     | asm_fbranch (I.FBA) = "fb"
243 :     | asm_fbranch (I.FBE) = "fbe"
244 :     | asm_fbranch (I.FBUE) = "fbue"
245 :     | asm_fbranch (I.FBGE) = "fbge"
246 :     | asm_fbranch (I.FBUGE) = "fbuge"
247 :     | asm_fbranch (I.FBLE) = "fble"
248 :     | asm_fbranch (I.FBULE) = "fbule"
249 :     | asm_fbranch (I.FBO) = "fbo"
250 : george 545 and emit_fbranch x = emit (asm_fbranch x)
251 :     and asm_fsize (I.S) = "s"
252 :     | asm_fsize (I.D) = "d"
253 :     | asm_fsize (I.Q) = "q"
254 :     and emit_fsize x = emit (asm_fsize x)
255 :     and emit_operand (I.REG GP) = emit_GP GP
256 :     | emit_operand (I.IMMED int) = emit_int int
257 :     | emit_operand (I.LAB labexp) = emit_labexp labexp
258 :     | emit_operand (I.LO labexp) =
259 :     ( emit "%lo(";
260 :     emit_labexp labexp;
261 :     emit ")" )
262 :     | emit_operand (I.HI labexp) =
263 :     ( emit "%hi(";
264 :     emit_labexp labexp;
265 :     emit ")" )
266 : monnier 247
267 : george 545 (*#line 471.7 "sparc/sparc.md"*)
268 : monnier 411 fun emit_leaf false = ()
269 : george 545 | emit_leaf true = emit "l"
270 : monnier 247
271 : george 545 (*#line 472.7 "sparc/sparc.md"*)
272 : monnier 411 fun emit_nop false = ()
273 : george 545 | emit_nop true = emit "\n\tnop"
274 : monnier 247
275 : george 545 (*#line 473.7 "sparc/sparc.md"*)
276 : monnier 411 fun emit_a false = ()
277 : george 545 | emit_a true = emit ",a"
278 : monnier 247
279 : george 545 (*#line 474.7 "sparc/sparc.md"*)
280 : monnier 411 fun emit_cc false = ()
281 : george 545 | emit_cc true = emit "cc"
282 : monnier 411 fun emitInstr instr =
283 : george 545 ( tab ();
284 : monnier 411
285 :     (
286 :     case instr of
287 :     I.LOAD{l, d, r, i, mem} =>
288 : george 545 ( emit_load l;
289 :     emit "\t[";
290 :     emit_GP r;
291 :     emit "+";
292 :     emit_operand i;
293 :     emit "], ";
294 :     emit_GP d;
295 :     emit_region mem )
296 : monnier 411 | I.STORE{s, d, r, i, mem} =>
297 : george 545 ( emit_store s;
298 :     emit "\t";
299 :     emit_GP d;
300 :     emit ", [";
301 :     emit_GP r;
302 :     emit "+";
303 :     emit_operand i;
304 :     emit "]";
305 :     emit_region mem )
306 : monnier 411 | I.FLOAD{l, r, i, d, mem} =>
307 : george 545 ( emit_fload l;
308 :     emit "\t[";
309 :     emit_GP r;
310 :     emit "+";
311 :     emit_operand i;
312 :     emit "], ";
313 :     emit_FP d;
314 :     emit_region mem )
315 : monnier 411 | I.FSTORE{s, d, r, i, mem} =>
316 : george 545 ( emit_fstore s;
317 :     emit "\t[";
318 :     emit_GP r;
319 :     emit "+";
320 :     emit_operand i;
321 :     emit "], ";
322 :     emit_FP d;
323 :     emit_region mem )
324 :     | I.SETHI{i, d} => let
325 :    
326 :     (*#line 627.18 "sparc/sparc.md"*)
327 :     val i = Word32.toString (Word32 .<< (Word32.fromInt i, 0wxa))
328 :     in
329 :     ( emit "sethi\t%hi(0x";
330 :     emit i;
331 :     emit "), ";
332 :     emit_GP d )
333 :     end
334 :    
335 : monnier 411 | I.ARITH{a, r, i, d} =>
336 : george 545 ( emit_arith a;
337 :     emit "\t";
338 :     emit_GP r;
339 :     emit ", ";
340 :     emit_operand i;
341 :     emit ", ";
342 :     emit_GP d )
343 : monnier 411 | I.SHIFT{s, r, i, d} =>
344 : george 545 ( emit_shift s;
345 :     emit "\t";
346 :     emit_GP r;
347 :     emit ", ";
348 :     emit_operand i;
349 :     emit ", ";
350 :     emit_GP d )
351 : monnier 411 | I.MOVicc{b, i, d} =>
352 : george 545 ( emit "mov";
353 :     emit_branch b;
354 :     emit "\t";
355 :     emit_operand i;
356 :     emit ", ";
357 :     emit_GP d )
358 : monnier 411 | I.MOVfcc{b, i, d} =>
359 : george 545 ( emit "mov";
360 :     emit_fbranch b;
361 :     emit "\t";
362 :     emit_operand i;
363 :     emit ", ";
364 :     emit_GP d )
365 : monnier 411 | I.MOVR{rcond, r, i, d} =>
366 : george 545 ( emit "movr";
367 :     emit_rcond rcond;
368 :     emit "\t";
369 :     emit_GP r;
370 :     emit ", ";
371 :     emit_operand i;
372 :     emit ", ";
373 :     emit_GP d )
374 : monnier 411 | I.FMOVicc{sz, b, r, d} =>
375 : george 545 ( emit "fmov";
376 :     emit_fsize sz;
377 :     emit_branch b;
378 :     emit "\t";
379 :     emit_FP r;
380 :     emit ", ";
381 :     emit_FP d )
382 : monnier 411 | I.FMOVfcc{sz, b, r, d} =>
383 : george 545 ( emit "fmov";
384 :     emit_fsize sz;
385 :     emit_fbranch b;
386 :     emit "\t";
387 :     emit_FP r;
388 :     emit ", ";
389 :     emit_FP d )
390 : monnier 411 | I.Bicc{b, a, label, nop} =>
391 : george 545 ( emit "b";
392 :     emit_branch b;
393 :     emit_a a;
394 :     emit "\t";
395 :     emit_label label;
396 :     emit_nop nop )
397 : monnier 411 | I.FBfcc{b, a, label, nop} =>
398 : george 545 ( emit_fbranch b;
399 :     emit_a a;
400 :     emit "\t";
401 :     emit_label label;
402 :     emit_nop nop )
403 : monnier 411 | I.BR{rcond, p, r, a, label, nop} =>
404 : george 545 ( emit "b";
405 :     emit_rcond rcond;
406 :     emit_a a;
407 :     emit_prediction p;
408 :     emit "\t";
409 :     emit_GP r;
410 :     emit ", ";
411 :     emit_label label;
412 :     emit_nop nop )
413 : monnier 411 | I.BP{b, p, cc, a, label, nop} =>
414 : george 545 ( emit "bp";
415 :     emit_branch b;
416 :     emit_a a;
417 :     emit_prediction p;
418 :     emit "\t%";
419 :     emit (if (cc = I.ICC)
420 : monnier 411 then "i"
421 : george 545 else "x");
422 :     emit "cc, ";
423 :     emit_label label;
424 :     emit_nop nop )
425 : monnier 411 | I.JMP{r, i, labs, nop} =>
426 : george 545 ( emit "jmp\t[";
427 :     emit_GP r;
428 :     emit "+";
429 :     emit_operand i;
430 :     emit "]";
431 :     emit_nop nop )
432 : monnier 411 | I.JMPL{r, i, d, defs, uses, nop, mem} =>
433 : george 545 ( emit "jmpl\t[";
434 :     emit_GP r;
435 :     emit "+";
436 :     emit_operand i;
437 :     emit "], ";
438 :     emit_GP d;
439 :     emit_region mem;
440 :     emit_defs defs;
441 :     emit_uses uses;
442 :     emit_nop nop )
443 : monnier 411 | I.CALL{defs, uses, label, nop, mem} =>
444 : george 545 ( emit "call\t";
445 :     emit_label label;
446 :     emit_region mem;
447 :     emit_defs defs;
448 :     emit_uses uses;
449 :     emit_nop nop )
450 : monnier 411 | I.Ticc{t, cc, r, i} =>
451 : george 545 ( emit "t";
452 :     emit_branch t;
453 :     emit "\t";
454 : monnier 411 (if (cc = I.ICC)
455 :     then ()
456 :     else (emit "%xcc, "));
457 : george 545 emit_GP r;
458 :     emit ", ";
459 :     emit_operand i )
460 : monnier 411 | I.FPop1{a, r, d} => let
461 : monnier 247
462 : george 545 (*#line 724.18 "sparc/sparc.md"*)
463 : monnier 411 fun f (a, r, d) =
464 : george 545 ( emit a;
465 :     emit "\t";
466 :     emit_FP r;
467 :     emit ", ";
468 :     emit_FP d )
469 : monnier 247
470 : george 545 (*#line 726.18 "sparc/sparc.md"*)
471 : monnier 411 fun g (a, r, d) = let
472 : monnier 247
473 : george 545 (*#line 727.25 "sparc/sparc.md"*)
474 :     val r = regmap r
475 :     and d = regmap d
476 :     in f (a, r, d);
477 :     emit "\n\t";
478 :     f ("fmovs", r + 1, d + 1)
479 : monnier 411 end
480 : monnier 247
481 :    
482 : george 545 (*#line 731.18 "sparc/sparc.md"*)
483 : monnier 411 fun h (a, r, d) = let
484 :    
485 : george 545 (*#line 732.25 "sparc/sparc.md"*)
486 :     val r = regmap r
487 :     and d = regmap d
488 :     in f (a, r, d);
489 :     emit "\n\t";
490 :     f ("fmovs", r + 1, d + 1);
491 :     emit "\n\t";
492 :     f ("fmovs", r + 2, d + 2);
493 :     emit "\n\t";
494 :     f ("fmovs", r + 3, d + 3)
495 : monnier 411 end
496 :    
497 :     in (if V9
498 : george 545 then
499 :     ( emit_farith1 a;
500 :     emit "\t";
501 :     emit_FP r;
502 :     emit ", ";
503 :     emit_FP d )
504 : monnier 411 else
505 :     (
506 :     case a of
507 : george 545 I.FMOVd => g ("fmovs", r, d)
508 :     | I.FNEGd => g ("fnegs", r, d)
509 :     | I.FABSd => g ("fabss", r, d)
510 :     | I.FMOVq => h ("fmovs", r, d)
511 :     | I.FNEGq => h ("fnegs", r, d)
512 :     | I.FABSq => h ("fabss", r, d)
513 :     | _ =>
514 :     ( emit_farith1 a;
515 :     emit "\t";
516 :     emit_FP r;
517 :     emit ", ";
518 :     emit_FP d )
519 : monnier 411 ))
520 :     end
521 :    
522 :     | I.FPop2{a, r1, r2, d} =>
523 : george 545 ( emit_farith2 a;
524 :     emit "\t";
525 :     emit_FP r1;
526 :     emit ", ";
527 :     emit_FP r2;
528 :     emit ", ";
529 :     emit_FP d )
530 : monnier 411 | I.FCMP{cmp, r1, r2, nop} =>
531 : george 545 ( emit_fcmp cmp;
532 :     emit "\t";
533 :     emit_FP r1;
534 :     emit ", ";
535 :     emit_FP r2;
536 :     emit_nop nop )
537 :     | I.COPY{dst, src, impl, tmp} => emitInstrs (Shuffle.shuffle {regmap=regmap, tmp=tmp, src=src, dst=dst})
538 :     | I.FCOPY{dst, src, impl, tmp} => emitInstrs (Shuffle.shufflefp {regmap=regmap, tmp=tmp, src=src, dst=dst})
539 : monnier 411 | I.SAVE{r, i, d} =>
540 : george 545 ( emit "save\t";
541 :     emit_GP r;
542 :     emit ", ";
543 :     emit_operand i;
544 :     emit ", ";
545 :     emit_GP d )
546 : monnier 411 | I.RESTORE{r, i, d} =>
547 : george 545 ( emit "restore\t";
548 :     emit_GP r;
549 :     emit ", ";
550 :     emit_operand i;
551 :     emit ", ";
552 :     emit_GP d )
553 : monnier 411 | I.RDY{d} =>
554 : george 545 ( emit "rd\t%y, ";
555 :     emit_GP d )
556 : monnier 411 | I.WRY{r, i} =>
557 : george 545 ( emit "wr\t";
558 :     emit_GP r;
559 :     emit ", ";
560 :     emit_operand i;
561 :     emit ", %y" )
562 : monnier 411 | I.RET{leaf, nop} =>
563 : george 545 ( emit "ret";
564 :     emit_leaf leaf;
565 :     emit_nop nop )
566 : monnier 411 | I.ANNOTATION{i, a} =>
567 : george 545 ( emitInstr i;
568 :     comment (Annotations.toString a))
569 : monnier 411 );
570 : george 545 nl ())
571 : monnier 411 and emitInstrs [] = ()
572 :     | emitInstrs (i::is) =
573 :     (emitInstr i; app (fn i => (tab(); emitInstr i)) is)
574 :     in emitInstr end
575 :    
576 : monnier 429 in S.STREAM{beginCluster=init,
577 : monnier 411 pseudoOp=pseudoOp,
578 :     emit=emitter,
579 : monnier 429 endCluster=doNothing,
580 : monnier 411 defineLabel=defineLabel,
581 :     entryLabel=entryLabel,
582 :     comment=comment,
583 :     exitBlock=doNothing,
584 : monnier 429 annotation=annotation,
585 :     phi=doNothing,
586 :     alias=doNothing
587 : monnier 411 }
588 : monnier 247 end
589 : monnier 411 end
590 :    

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