Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Diff of /sml/trunk/src/MLRISC/sparc/emit/sparcAsm.sml
ViewVC logotype

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 544, Tue Feb 22 22:56:38 2000 UTC revision 545, Thu Feb 24 13:56:44 2000 UTC
# Line 1  Line 1 
1  (*  (*
2   * This file was automatically generated by MDGen   * This file was automatically generated by MDGen (v2.0)
3   * from the machine description file "sparc/sparc.md".   * from the machine description file "sparc/sparc.md".
4   *)   *)
5    
# Line 9  Line 9 
9                          structure Shuffle : SPARCSHUFFLE                          structure Shuffle : SPARCSHUFFLE
10                             where I = Instr                             where I = Instr
11    
12  (*#line 251.1 "sparc/sparc.md"*)  (*#line 468.21 "sparc/sparc.md"*)
13                          val V9 : bool                          val V9 : bool
14                         ) : INSTRUCTION_EMITTER =                         ) : INSTRUCTION_EMITTER =
15  struct  struct
# Line 17  Line 17 
17     structure C  = I.C     structure C  = I.C
18     structure S  = Stream     structure S  = Stream
19     structure P  = S.P     structure P  = S.P
20     structure LE = LabelExp     structure LabelExp = I.LabelExp
21     structure Constant = I.Constant     structure Constant = I.Constant
22    
23     val show_cellset = MLRiscControl.getFlag "asm-show-cellset"     val show_cellset = MLRiscControl.getFlag "asm-show-cellset"
24       val show_region  = MLRiscControl.getFlag "asm-show-region"
25    
26     fun error msg = MLRiscErrorMsg.error("SparcAsm",msg)     fun error msg = MLRiscErrorMsg.error("SparcAsmEmitter",msg)
27    
28     fun makeStream formatAnnotations =     fun makeStream formatAnnotations =
29     let val stream = !AsmStream.asmOutStream     let val stream = !AsmStream.asmOutStream
# Line 48  Line 49 
49         fun entryLabel lab = defineLabel lab         fun entryLabel lab = defineLabel lab
50         fun comment msg = emit("\t/* " ^ msg ^ " */")         fun comment msg = emit("\t/* " ^ msg ^ " */")
51         fun annotation a = (comment(Annotations.toString a); nl())         fun annotation a = (comment(Annotations.toString a); nl())
52           fun doNothing _ = ()
53         fun emit_region mem = comment(I.Region.toString mem)         fun emit_region mem = comment(I.Region.toString mem)
54           val emit_region =
55              if !show_region then emit_region else doNothing
56         fun pseudoOp pOp = emit(P.toString pOp)         fun pseudoOp pOp = emit(P.toString pOp)
57         fun init size = (comment("Code Size = " ^ ms size); nl())         fun init size = (comment("Code Size = " ^ ms size); nl())
        fun doNothing _ = ()  
        val emitRegInfo = AsmFormatUtil.reginfo(emit,formatAnnotations)  
58         fun emitter regmap =         fun emitter regmap =
59         let         let
60               val emitRegInfo = AsmFormatUtil.reginfo
61     fun emit_PSR r =                                  (emit,regmap,formatAnnotations)
62         ((emit (C.showPSR (regmap r)));     fun emit_GP r =
63         (emitRegInfo r))         ( emit (C.showGP (regmap r));
64     and emit_CC r =         emitRegInfo r )
        ((emit (C.showCC (regmap r)));  
        (emitRegInfo r))  
    and emit_Y r =  
        ((emit (C.showY (regmap r)));  
        (emitRegInfo r))  
65     and emit_FP r =     and emit_FP r =
66         ((emit (C.showFP (regmap r)));         ( emit (C.showFP (regmap r));
67         (emitRegInfo r))         emitRegInfo r )
68     and emit_GP r =     and emit_Y r =
69         ((emit (C.showGP (regmap r)));         ( emit (C.showY (regmap r));
70         (emitRegInfo r))         emitRegInfo r )
71       and emit_PSR r =
72           ( emit (C.showPSR (regmap r));
73           emitRegInfo r )
74     and emit_FSR r =     and emit_FSR r =
75         ((emit (C.showFSR (regmap r)));         ( emit (C.showFSR (regmap r));
76         (emitRegInfo r))         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    
87         fun emit_cellset(title,cellset) =         fun emit_cellset(title,cellset) =
        if !show_cellset then  
88           (nl(); comment(title^C.cellsetToString' regmap cellset))           (nl(); comment(title^C.cellsetToString' regmap cellset))
89         else ()         val emit_cellset =
90             if !show_cellset then emit_cellset else doNothing
91         fun emit_defs cellset = emit_cellset("defs: ",cellset)         fun emit_defs cellset = emit_cellset("defs: ",cellset)
92         fun emit_uses cellset = emit_cellset("uses: ",cellset)         fun emit_uses cellset = emit_cellset("uses: ",cellset)
93       fun asm_load (I.LDSB) = "ldsb"
94     fun asm_farith1 (I.FiTOs) = "fitos"       | asm_load (I.LDSH) = "ldsh"
95       | asm_farith1 (I.FiTOd) = "fitod"       | asm_load (I.LDUB) = "ldub"
96       | asm_farith1 (I.FiTOq) = "fitoq"       | asm_load (I.LDUH) = "lduh"
97       | asm_farith1 (I.FsTOi) = "fstoi"       | asm_load (I.LD) = "ld"
98       | asm_farith1 (I.FdTOi) = "fdtoi"       | asm_load (I.LDX) = "ldx"
99       | asm_farith1 (I.FqTOi) = "fqtoi"       | asm_load (I.LDD) = "ldd"
100       | asm_farith1 (I.FsTOd) = "fstod"     and emit_load x = emit (asm_load x)
      | asm_farith1 (I.FsTOq) = "fstoq"  
      | asm_farith1 (I.FdTOs) = "fdtos"  
      | asm_farith1 (I.FdTOq) = "fdtoq"  
      | asm_farith1 (I.FqTOs) = "fqtos"  
      | asm_farith1 (I.FqTOd) = "fqtod"  
      | asm_farith1 (I.FMOVs) = "fmovs"  
      | asm_farith1 (I.FNEGs) = "fnegs"  
      | asm_farith1 (I.FABSs) = "fabss"  
      | asm_farith1 (I.FMOVd) = "fmovd"  
      | asm_farith1 (I.FNEGd) = "fnegd"  
      | asm_farith1 (I.FABSd) = "fabsd"  
      | asm_farith1 (I.FMOVq) = "fmovq"  
      | asm_farith1 (I.FNEGq) = "fnegq"  
      | asm_farith1 (I.FABSq) = "fabsq"  
      | asm_farith1 (I.FSQRTs) = "fsqrts"  
      | asm_farith1 (I.FSQRTd) = "fsqrtd"  
      | asm_farith1 (I.FSQRTq) = "fsqrtq"  
    and emit_farith1 x = (emit (asm_farith1 x))  
101     and asm_store (I.STB) = "stb"     and asm_store (I.STB) = "stb"
102       | asm_store (I.STH) = "sth"       | asm_store (I.STH) = "sth"
103       | asm_store (I.ST) = "st"       | asm_store (I.ST) = "st"
104       | asm_store (I.STX) = "stx"       | asm_store (I.STX) = "stx"
105       | asm_store (I.STD) = "std"       | asm_store (I.STD) = "std"
106     and emit_store x = (emit (asm_store x))     and emit_store x = emit (asm_store x)
    and emit_operand (I.REG GP) = (emit_GP GP)  
      | emit_operand (I.IMMED int) = (emit_int int)  
      | emit_operand (I.LAB labexp) = (emit_labexp labexp)  
      | emit_operand (I.LO labexp) =  
        ((emit "%lo(");  
        (emit_labexp labexp);  
        (emit ")"))  
      | emit_operand (I.HI labexp) =  
        ((emit "%hi(");  
        (emit_labexp labexp);  
        (emit ")"))  
      | emit_operand (I.CONST const) = (emit_const const)  
107     and asm_fload (I.LDF) = "ldf"     and asm_fload (I.LDF) = "ldf"
108       | asm_fload (I.LDDF) = "lddf"       | asm_fload (I.LDDF) = "lddf"
109       | asm_fload (I.LDQF) = "ldqf"       | asm_fload (I.LDQF) = "ldqf"
110       | asm_fload (I.LDFSR) = "ldfsr"       | asm_fload (I.LDFSR) = "ldfsr"
111       | asm_fload (I.LDXFSR) = "ldxfsr"       | asm_fload (I.LDXFSR) = "ldxfsr"
112     and emit_fload x = (emit (asm_fload x))     and emit_fload x = emit (asm_fload x)
113     and asm_fstore (I.STF) = "stf"     and asm_fstore (I.STF) = "stf"
114       | asm_fstore (I.STDF) = "stdf"       | asm_fstore (I.STDF) = "stdf"
115       | asm_fstore (I.STFSR) = "stfsr"       | asm_fstore (I.STFSR) = "stfsr"
116     and emit_fstore x = (emit (asm_fstore x))     and emit_fstore x = emit (asm_fstore x)
    and asm_prediction (I.PT) = "pt"  
      | asm_prediction (I.PN) = "pn"  
    and emit_prediction x = (emit (asm_prediction x))  
    and asm_fsize (I.S) = "s"  
      | asm_fsize (I.D) = "d"  
      | asm_fsize (I.Q) = "q"  
    and emit_fsize x = (emit (asm_fsize x))  
    and asm_shift (I.SLL) = "sll"  
      | asm_shift (I.SRL) = "srl"  
      | asm_shift (I.SRA) = "sra"  
      | asm_shift (I.SLLX) = "sllx"  
      | asm_shift (I.SRLX) = "srlx"  
      | asm_shift (I.SRAX) = "srax"  
    and emit_shift x = (emit (asm_shift x))  
    and asm_branch (I.BN) = "n"  
      | asm_branch (I.BE) = "e"  
      | asm_branch (I.BLE) = "le"  
      | asm_branch (I.BL) = "l"  
      | asm_branch (I.BLEU) = "leu"  
      | asm_branch (I.BCS) = "cs"  
      | asm_branch (I.BNEG) = "neg"  
      | asm_branch (I.BVS) = "vs"  
      | asm_branch (I.BA) = ""  
      | asm_branch (I.BNE) = "ne"  
      | asm_branch (I.BG) = "g"  
      | asm_branch (I.BGE) = "ge"  
      | asm_branch (I.BGU) = "gu"  
      | asm_branch (I.BCC) = "cc"  
      | asm_branch (I.BPOS) = "pos"  
      | asm_branch (I.BVC) = "vs"  
    and emit_branch x = (emit (asm_branch x))  
117     and asm_arith (I.AND) = "and"     and asm_arith (I.AND) = "and"
118       | asm_arith (I.ANDCC) = "andcc"       | asm_arith (I.ANDCC) = "andcc"
119       | asm_arith (I.ANDN) = "andn"       | asm_arith (I.ANDN) = "andn"
# Line 201  Line 149 
149       | asm_arith (I.MULX) = "mulx"       | asm_arith (I.MULX) = "mulx"
150       | asm_arith (I.SDIVX) = "sdivx"       | asm_arith (I.SDIVX) = "sdivx"
151       | asm_arith (I.UDIVX) = "udivx"       | asm_arith (I.UDIVX) = "udivx"
152     and emit_arith x = (emit (asm_arith x))     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     and asm_fcmp (I.FCMPs) = "fcmps"     and asm_fcmp (I.FCMPs) = "fcmps"
201       | asm_fcmp (I.FCMPd) = "fcmpd"       | asm_fcmp (I.FCMPd) = "fcmpd"
202       | asm_fcmp (I.FCMPq) = "fcmpq"       | asm_fcmp (I.FCMPq) = "fcmpq"
203       | asm_fcmp (I.FCMPEs) = "fcmpes"       | asm_fcmp (I.FCMPEs) = "fcmpes"
204       | asm_fcmp (I.FCMPEd) = "fcmped"       | asm_fcmp (I.FCMPEd) = "fcmped"
205       | asm_fcmp (I.FCMPEq) = "fcmpeq"       | asm_fcmp (I.FCMPEq) = "fcmpeq"
206     and emit_fcmp x = (emit (asm_fcmp x))     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     and asm_rcond (I.RZ) = "rz"     and asm_rcond (I.RZ) = "rz"
225       | asm_rcond (I.RLEZ) = "rlez"       | asm_rcond (I.RLEZ) = "rlez"
226       | asm_rcond (I.RLZ) = "rlz"       | asm_rcond (I.RLZ) = "rlz"
227       | asm_rcond (I.RNZ) = "rnz"       | asm_rcond (I.RNZ) = "rnz"
228       | asm_rcond (I.RGZ) = "rgz"       | asm_rcond (I.RGZ) = "rgz"
229       | asm_rcond (I.RGEZ) = "rgez"       | asm_rcond (I.RGEZ) = "rgez"
230     and emit_rcond x = (emit (asm_rcond x))     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     and asm_fbranch (I.FBN) = "fbn"     and asm_fbranch (I.FBN) = "fbn"
235       | asm_fbranch (I.FBNE) = "fbne"       | asm_fbranch (I.FBNE) = "fbne"
236       | asm_fbranch (I.FBLG) = "fblg"       | asm_fbranch (I.FBLG) = "fblg"
# Line 232  Line 247 
247       | asm_fbranch (I.FBLE) = "fble"       | asm_fbranch (I.FBLE) = "fble"
248       | asm_fbranch (I.FBULE) = "fbule"       | asm_fbranch (I.FBULE) = "fbule"
249       | asm_fbranch (I.FBO) = "fbo"       | asm_fbranch (I.FBO) = "fbo"
250     and emit_fbranch x = (emit (asm_fbranch x))     and emit_fbranch x = emit (asm_fbranch x)
251     and asm_load (I.LDSB) = "ldsb"     and asm_fsize (I.S) = "s"
252       | asm_load (I.LDSH) = "ldsh"       | asm_fsize (I.D) = "d"
253       | asm_load (I.LDUB) = "ldub"       | asm_fsize (I.Q) = "q"
254       | asm_load (I.LDUH) = "lduh"     and emit_fsize x = emit (asm_fsize x)
255       | asm_load (I.LD) = "ld"     and emit_operand (I.REG GP) = emit_GP GP
256       | asm_load (I.LDX) = "ldx"       | emit_operand (I.IMMED int) = emit_int int
257       | asm_load (I.LDD) = "ldd"       | emit_operand (I.LAB labexp) = emit_labexp labexp
258     and emit_load x = (emit (asm_load x))       | emit_operand (I.LO labexp) =
259     and asm_farith2 (I.FADDs) = "fadds"         ( emit "%lo(";
260       | asm_farith2 (I.FADDd) = "faddd"         emit_labexp labexp;
261       | asm_farith2 (I.FADDq) = "faddq"         emit ")" )
262       | asm_farith2 (I.FSUBs) = "fsubs"       | emit_operand (I.HI labexp) =
263       | asm_farith2 (I.FSUBd) = "fsubd"         ( emit "%hi(";
264       | asm_farith2 (I.FSUBq) = "fsubq"         emit_labexp labexp;
265       | asm_farith2 (I.FMULs) = "fmuls"         emit ")" )
      | asm_farith2 (I.FMULd) = "fmuld"  
      | asm_farith2 (I.FMULq) = "fmulq"  
      | asm_farith2 (I.FsMULd) = "fsmuld"  
      | asm_farith2 (I.FdMULq) = "fdmulq"  
      | asm_farith2 (I.FDIVs) = "fdivs"  
      | asm_farith2 (I.FDIVd) = "fdivd"  
      | asm_farith2 (I.FDIVq) = "fdivq"  
    and emit_farith2 x = (emit (asm_farith2 x))  
266    
267    (*#line 471.7 "sparc/sparc.md"*)
268     fun emit_leaf false = ()     fun emit_leaf false = ()
269       | emit_leaf true = (emit "l")       | emit_leaf true = emit "l"
270    
271    (*#line 472.7 "sparc/sparc.md"*)
272     fun emit_nop false = ()     fun emit_nop false = ()
273       | emit_nop true = (emit "\n\tnop")       | emit_nop true = emit "\n\tnop"
274    
275    (*#line 473.7 "sparc/sparc.md"*)
276     fun emit_a false = ()     fun emit_a false = ()
277       | emit_a true = (emit ",a")       | emit_a true = emit ",a"
278    
279    (*#line 474.7 "sparc/sparc.md"*)
280     fun emit_cc false = ()     fun emit_cc false = ()
281       | emit_cc true = (emit "cc")       | emit_cc true = emit "cc"
   
282     fun emitInstr instr =     fun emitInstr instr =
283         ((tab ());         ( tab ();
284    
285         (         (
286          case instr of          case instr of
287          I.LOAD{l, d, r, i, mem} =>          I.LOAD{l, d, r, i, mem} =>
288          ((emit_load l);          ( emit_load l;
289          (emit "\t[");          emit "\t[";
290          (emit_GP r);          emit_GP r;
291          (emit "+");          emit "+";
292          (emit_operand i);          emit_operand i;
293          (emit "], ");          emit "], ";
294          (emit_GP d);          emit_GP d;
295          (emit_region mem))          emit_region mem )
296        | I.STORE{s, d, r, i, mem} =>        | I.STORE{s, d, r, i, mem} =>
297          ((emit_store s);          ( emit_store s;
298          (emit "\t");          emit "\t";
299          (emit_GP d);          emit_GP d;
300          (emit ", [");          emit ", [";
301          (emit_GP r);          emit_GP r;
302          (emit "+");          emit "+";
303          (emit_operand i);          emit_operand i;
304          (emit "]");          emit "]";
305          (emit_region mem))          emit_region mem )
306        | I.FLOAD{l, r, i, d, mem} =>        | I.FLOAD{l, r, i, d, mem} =>
307          ((emit_fload l);          ( emit_fload l;
308          (emit "\t[");          emit "\t[";
309          (emit_GP r);          emit_GP r;
310          (emit "+");          emit "+";
311          (emit_operand i);          emit_operand i;
312          (emit "], ");          emit "], ";
313          (emit_FP d);          emit_FP d;
314          (emit_region mem))          emit_region mem )
315        | I.FSTORE{s, d, r, i, mem} =>        | I.FSTORE{s, d, r, i, mem} =>
316          ((emit_fstore s);          ( emit_fstore s;
317          (emit "\t[");          emit "\t[";
318          (emit_GP r);          emit_GP r;
319          (emit "+");          emit "+";
320          (emit_operand i);          emit_operand i;
321          (emit "], ");          emit "], ";
322          (emit_FP d);          emit_FP d;
323          (emit_region mem))          emit_region mem )
324        | I.SETHI{i, d} =>        | I.SETHI{i, d} => let
325          ((emit "sethi\t%hi(0x");  
326          (emit (Word32.toString (Word32.<< ((Word32.fromInt i), 0wxa))));  (*#line 627.18 "sparc/sparc.md"*)
327          (emit "), ");             val i = Word32.toString (Word32  .<< (Word32.fromInt i, 0wxa))
328          (emit_GP d))          in
329               ( emit "sethi\t%hi(0x";
330               emit i;
331               emit "), ";
332               emit_GP d )
333            end
334    
335        | I.ARITH{a, r, i, d} =>        | I.ARITH{a, r, i, d} =>
336          ((emit_arith a);          ( emit_arith a;
337          (emit "\t");          emit "\t";
338          (emit_GP r);          emit_GP r;
339          (emit ", ");          emit ", ";
340          (emit_operand i);          emit_operand i;
341          (emit ", ");          emit ", ";
342          (emit_GP d))          emit_GP d )
343        | I.SHIFT{s, r, i, d} =>        | I.SHIFT{s, r, i, d} =>
344          ((emit_shift s);          ( emit_shift s;
345          (emit "\t");          emit "\t";
346          (emit_GP r);          emit_GP r;
347          (emit ", ");          emit ", ";
348          (emit_operand i);          emit_operand i;
349          (emit ", ");          emit ", ";
350          (emit_GP d))          emit_GP d )
351        | I.MOVicc{b, i, d} =>        | I.MOVicc{b, i, d} =>
352          ((emit "mov");          ( emit "mov";
353          (emit_branch b);          emit_branch b;
354          (emit "\t");          emit "\t";
355          (emit_operand i);          emit_operand i;
356          (emit ", ");          emit ", ";
357          (emit_GP d))          emit_GP d )
358        | I.MOVfcc{b, i, d} =>        | I.MOVfcc{b, i, d} =>
359          ((emit "mov");          ( emit "mov";
360          (emit_fbranch b);          emit_fbranch b;
361          (emit "\t");          emit "\t";
362          (emit_operand i);          emit_operand i;
363          (emit ", ");          emit ", ";
364          (emit_GP d))          emit_GP d )
365        | I.MOVR{rcond, r, i, d} =>        | I.MOVR{rcond, r, i, d} =>
366          ((emit "movr");          ( emit "movr";
367          (emit_rcond rcond);          emit_rcond rcond;
368          (emit "\t");          emit "\t";
369          (emit_GP r);          emit_GP r;
370          (emit ", ");          emit ", ";
371          (emit_operand i);          emit_operand i;
372          (emit ", ");          emit ", ";
373          (emit_GP d))          emit_GP d )
374        | I.FMOVicc{sz, b, r, d} =>        | I.FMOVicc{sz, b, r, d} =>
375          ((emit "fmov");          ( emit "fmov";
376          (emit_fsize sz);          emit_fsize sz;
377          (emit_branch b);          emit_branch b;
378          (emit "\t");          emit "\t";
379          (emit_FP r);          emit_FP r;
380          (emit ", ");          emit ", ";
381          (emit_FP d))          emit_FP d )
382        | I.FMOVfcc{sz, b, r, d} =>        | I.FMOVfcc{sz, b, r, d} =>
383          ((emit "fmov");          ( emit "fmov";
384          (emit_fsize sz);          emit_fsize sz;
385          (emit_fbranch b);          emit_fbranch b;
386          (emit "\t");          emit "\t";
387          (emit_FP r);          emit_FP r;
388          (emit ", ");          emit ", ";
389          (emit_FP d))          emit_FP d )
390        | I.Bicc{b, a, label, nop} =>        | I.Bicc{b, a, label, nop} =>
391          ((emit "b");          ( emit "b";
392          (emit_branch b);          emit_branch b;
393          (emit_a a);          emit_a a;
394          (emit "\t");          emit "\t";
395          (emit_label label);          emit_label label;
396          (emit_nop nop))          emit_nop nop )
397        | I.FBfcc{b, a, label, nop} =>        | I.FBfcc{b, a, label, nop} =>
398          ((emit_fbranch b);          ( emit_fbranch b;
399          (emit_a a);          emit_a a;
400          (emit "\t");          emit "\t";
401          (emit_label label);          emit_label label;
402          (emit_nop nop))          emit_nop nop )
403        | I.BR{rcond, p, r, a, label, nop} =>        | I.BR{rcond, p, r, a, label, nop} =>
404          ((emit "b");          ( emit "b";
405          (emit_rcond rcond);          emit_rcond rcond;
406          (emit_a a);          emit_a a;
407          (emit_prediction p);          emit_prediction p;
408          (emit "\t");          emit "\t";
409          (emit_GP r);          emit_GP r;
410          (emit ", ");          emit ", ";
411          (emit_label label);          emit_label label;
412          (emit_nop nop))          emit_nop nop )
413        | I.BP{b, p, cc, a, label, nop} =>        | I.BP{b, p, cc, a, label, nop} =>
414          ((emit "bp");          ( emit "bp";
415          (emit_branch b);          emit_branch b;
416          (emit_a a);          emit_a a;
417          (emit_prediction p);          emit_prediction p;
418          (emit "\t%");          emit "\t%";
419          (emit (if (cc = I.ICC)          emit (if (cc = I.ICC)
420             then "i"             then "i"
421             else "x"));             else "x");
422          (emit "cc, ");          emit "cc, ";
423          (emit_label label);          emit_label label;
424          (emit_nop nop))          emit_nop nop )
425        | I.JMP{r, i, labs, nop} =>        | I.JMP{r, i, labs, nop} =>
426          ((emit "jmp\t[");          ( emit "jmp\t[";
427          (emit_GP r);          emit_GP r;
428          (emit "+");          emit "+";
429          (emit_operand i);          emit_operand i;
430          (emit "]");          emit "]";
431          (emit_nop nop))          emit_nop nop )
432        | I.JMPL{r, i, d, defs, uses, nop, mem} =>        | I.JMPL{r, i, d, defs, uses, nop, mem} =>
433          ((emit "jmpl\t[");          ( emit "jmpl\t[";
434          (emit_GP r);          emit_GP r;
435          (emit "+");          emit "+";
436          (emit_operand i);          emit_operand i;
437          (emit "], ");          emit "], ";
438          (emit_GP d);          emit_GP d;
439          (emit_region mem);          emit_region mem;
440          (emit_defs defs);          emit_defs defs;
441          (emit_uses uses);          emit_uses uses;
442          (emit_nop nop))          emit_nop nop )
443        | I.CALL{defs, uses, label, nop, mem} =>        | I.CALL{defs, uses, label, nop, mem} =>
444          ((emit "call\t");          ( emit "call\t";
445          (emit_label label);          emit_label label;
446          (emit_region mem);          emit_region mem;
447          (emit_defs defs);          emit_defs defs;
448          (emit_uses uses);          emit_uses uses;
449          (emit_nop nop))          emit_nop nop )
450        | I.Ticc{t, cc, r, i} =>        | I.Ticc{t, cc, r, i} =>
451          ((emit "t");          ( emit "t";
452          (emit_branch t);          emit_branch t;
453          (emit "\t");          emit "\t";
454          (if (cc = I.ICC)          (if (cc = I.ICC)
455             then ()             then ()
456             else (emit "%xcc, "));             else (emit "%xcc, "));
457          (emit_GP r);          emit_GP r;
458          (emit ", ");          emit ", ";
459          (emit_operand i))          emit_operand i )
460        | I.FPop1{a, r, d} => let        | I.FPop1{a, r, d} => let
461    
462  (*#line 508.1 "sparc/sparc.md"*)  (*#line 724.18 "sparc/sparc.md"*)
   
463             fun f (a, r, d) =             fun f (a, r, d) =
464                 ((emit a);                 ( emit a;
465                 (emit "\t");                 emit "\t";
466                 (emit_FP r);                 emit_FP r;
467                 (emit ", ");                 emit ", ";
468                 (emit_FP d))                 emit_FP d )
   
 (*#line 510.1 "sparc/sparc.md"*)  
469    
470    (*#line 726.18 "sparc/sparc.md"*)
471             fun g (a, r, d) = let             fun g (a, r, d) = let
472    
473  (*#line 511.1 "sparc/sparc.md"*)  (*#line 727.25 "sparc/sparc.md"*)
474                    val r = (regmap r)                    val r = regmap r
475                   and d = (regmap d)                    and d = regmap d
476                 in (f (a, r, d));                 in f (a, r, d);
477                    (emit "\n\t");                    emit "\n\t";
478                    (f ("fmovs", (r + 1), (d + 1)))                    f ("fmovs", r + 1, d + 1)
479                 end                 end
480    
481    
482  (*#line 515.1 "sparc/sparc.md"*)  (*#line 731.18 "sparc/sparc.md"*)
   
483             fun h (a, r, d) = let             fun h (a, r, d) = let
484    
485  (*#line 516.1 "sparc/sparc.md"*)  (*#line 732.25 "sparc/sparc.md"*)
486                    val r = (regmap r)                    val r = regmap r
487                   and d = (regmap d)                    and d = regmap d
488                 in (f (a, r, d));                 in f (a, r, d);
489                    (emit "\n\t");                    emit "\n\t";
490                    (f ("fmovs", (r + 1), (d + 1)));                    f ("fmovs", r + 1, d + 1);
491                    (emit "\n\t");                    emit "\n\t";
492                    (f ("fmovs", (r + 2), (d + 2)));                    f ("fmovs", r + 2, d + 2);
493                    (emit "\n\t");                    emit "\n\t";
494                    (f ("fmovs", (r + 3), (d + 3)))                    f ("fmovs", r + 3, d + 3)
495                 end                 end
496    
497          in (if V9          in (if V9
498                then (f ((asm_farith1 a), r, d))                then
499                  ( emit_farith1 a;
500                  emit "\t";
501                  emit_FP r;
502                  emit ", ";
503                  emit_FP d )
504                else                else
505                (                (
506                 case a of                 case a of
507                 I.FMOVd => (g ("fmovs", r, d))                 I.FMOVd => g ("fmovs", r, d)
508               | I.FNEGd => (g ("fnegs", r, d))               | I.FNEGd => g ("fnegs", r, d)
509               | I.FABSd => (g ("fabss", r, d))               | I.FABSd => g ("fabss", r, d)
510               | I.FMOVq => (h ("fmovs", r, d))               | I.FMOVq => h ("fmovs", r, d)
511               | I.FNEGq => (h ("fnegs", r, d))               | I.FNEGq => h ("fnegs", r, d)
512               | I.FABSq => (h ("fabss", r, d))               | I.FABSq => h ("fabss", r, d)
513               | _ => (f ((asm_farith1 a), r, d))               | _ =>
514                   ( emit_farith1 a;
515                   emit "\t";
516                   emit_FP r;
517                   emit ", ";
518                   emit_FP d )
519                ))                ))
520          end          end
521    
522        | I.FPop2{a, r1, r2, d} =>        | I.FPop2{a, r1, r2, d} =>
523          ((emit_farith2 a);          ( emit_farith2 a;
524          (emit "\t");          emit "\t";
525          (emit_FP r1);          emit_FP r1;
526          (emit ", ");          emit ", ";
527          (emit_FP r2);          emit_FP r2;
528          (emit ", ");          emit ", ";
529          (emit_FP d))          emit_FP d )
530        | I.FCMP{cmp, r1, r2, nop} =>        | I.FCMP{cmp, r1, r2, nop} =>
531          ((emit_fcmp cmp);          ( emit_fcmp cmp;
532          (emit "\t");          emit "\t";
533          (emit_FP r1);          emit_FP r1;
534          (emit ", ");          emit ", ";
535          (emit_FP r2);          emit_FP r2;
536          (emit_nop nop))          emit_nop nop )
537        | I.COPY{dst, src, impl, tmp} => (emitInstrs (Shuffle.shuffle {regmap=regmap, tmp=tmp, src=src, dst=dst}))        | 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}))        | I.FCOPY{dst, src, impl, tmp} => emitInstrs (Shuffle.shufflefp {regmap=regmap, tmp=tmp, src=src, dst=dst})
539        | I.SAVE{r, i, d} =>        | I.SAVE{r, i, d} =>
540          ((emit "save\t");          ( emit "save\t";
541          (emit_GP r);          emit_GP r;
542          (emit ", ");          emit ", ";
543          (emit_operand i);          emit_operand i;
544          (emit ", ");          emit ", ";
545          (emit_GP d))          emit_GP d )
546        | I.RESTORE{r, i, d} =>        | I.RESTORE{r, i, d} =>
547          ((emit "restore\t");          ( emit "restore\t";
548          (emit_GP r);          emit_GP r;
549          (emit ", ");          emit ", ";
550          (emit_operand i);          emit_operand i;
551          (emit ", ");          emit ", ";
552          (emit_GP d))          emit_GP d )
553        | I.RDY{d} =>        | I.RDY{d} =>
554          ((emit "rd\t%y, ");          ( emit "rd\t%y, ";
555          (emit_GP d))          emit_GP d )
556        | I.WRY{r, i} =>        | I.WRY{r, i} =>
557          ((emit "wr\t");          ( emit "wr\t";
558          (emit_GP r);          emit_GP r;
559          (emit ", ");          emit ", ";
560          (emit_operand i);          emit_operand i;
561          (emit ", %y"))          emit ", %y" )
562        | I.RET{leaf, nop} =>        | I.RET{leaf, nop} =>
563          ((emit "ret");          ( emit "ret";
564          (emit_leaf leaf);          emit_leaf leaf;
565          (emit_nop nop))          emit_nop nop )
566        | I.ANNOTATION{i, a} =>        | I.ANNOTATION{i, a} =>
567          ((emitInstr i);          ( emitInstr i;
568          (comment (Annotations.toString a)))          comment (Annotations.toString a))
       | I.GROUP annotation => (comment (Annotations.toString annotation))  
569         );         );
570         (nl ()))         nl ())
571            and emitInstrs [] = ()            and emitInstrs [] = ()
572              | emitInstrs (i::is) =              | emitInstrs (i::is) =
573             (emitInstr i; app (fn i => (tab(); emitInstr i)) is)             (emitInstr i; app (fn i => (tab(); emitInstr i)) is)

Legend:
Removed from v.544  
changed lines
  Added in v.545

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