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 909, Fri Aug 24 17:48:53 2001 UTC revision 1017, Wed Jan 16 14:48:16 2002 UTC
# Line 5  Line 5 
5   *)   *)
6    
7    
8  functor SparcAsmEmitter(structure Instr : SPARCINSTR  functor SparcAsmEmitter(structure S : INSTRUCTION_STREAM
9                            structure Instr : SPARCINSTR
10                               where T = S.P.T
11                          structure Shuffle : SPARCSHUFFLE                          structure Shuffle : SPARCSHUFFLE
12                             where I = Instr                             where I = Instr
13                            structure MLTreeEval : MLTREE_EVAL
14                               where T = Instr.T
15    
16  (*#line 466.21 "sparc/sparc.mdl"*)  (*#line 466.21 "sparc/sparc.mdl"*)
17                          val V9 : bool                          val V9 : bool
# Line 16  Line 20 
20     structure I  = Instr     structure I  = Instr
21     structure C  = I.C     structure C  = I.C
22     structure T  = I.T     structure T  = I.T
23     structure S  = T.Stream     structure S  = S
24     structure P  = S.P     structure P  = S.P
    structure LabelExp = I.LabelExp  
25     structure Constant = I.Constant     structure Constant = I.Constant
26    
27     val show_cellset = MLRiscControl.getFlag "asm-show-cellset"     val show_cellset = MLRiscControl.getFlag "asm-show-cellset"
# Line 44  Line 47 
47                    in  if n<0 then "-"^String.substring(s,1,size s-1)                    in  if n<0 then "-"^String.substring(s,1,size s-1)
48                        else s                        else s
49                    end                    end
50         fun emit_label lab = emit(Label.toString lab)         fun emit_label lab = emit(P.Client.AsmPseudoOps.lexpToString(T.LABEL lab))
51         fun emit_labexp le = emit(LabelExp.toString le)         fun emit_labexp le = emit(P.Client.AsmPseudoOps.lexpToString (T.LABEXP le))
52         fun emit_const c = emit(Constant.toString c)         fun emit_const c = emit(Constant.toString c)
53         fun emit_int i = emit(ms i)         fun emit_int i = emit(ms i)
54         fun paren f = (emit "("; f(); emit ")")         fun paren f = (emit "("; f(); emit ")")
55         fun defineLabel lab = emit(Label.toString lab^":\n")         fun defineLabel lab = emit(P.Client.AsmPseudoOps.defineLabel lab^"\n")
56         fun entryLabel lab = defineLabel lab         fun entryLabel lab = defineLabel lab
57         fun comment msg = (tab(); emit("/* " ^ msg ^ " */\n"))         fun comment msg = (tab(); emit("/* " ^ msg ^ " */\n"))
58         fun annotation a = (comment(Annotations.toString a); nl())         fun annotation a = (comment(Annotations.toString a); nl())
# Line 59  Line 62 
62         fun emit_region mem = comment(I.Region.toString mem)         fun emit_region mem = comment(I.Region.toString mem)
63         val emit_region =         val emit_region =
64            if !show_region then emit_region else doNothing            if !show_region then emit_region else doNothing
65         fun pseudoOp pOp = emit(P.toString pOp)         fun pseudoOp pOp = (emit(P.toString pOp); emit "\n")
66         fun init size = (comment("Code Size = " ^ ms size); nl())         fun init size = (comment("Code Size = " ^ ms size); nl())
67         val emitCellInfo = AsmFormatUtil.reginfo         val emitCellInfo = AsmFormatUtil.reginfo
68                                  (emit,formatAnnotations)                                  (emit,formatAnnotations)
# Line 317  Line 320 
320                emitCell d )                emitCell d )
321           end           end
322         | I.ARITH{a, r, i, d} =>         | I.ARITH{a, r, i, d} =>
323           (case (a, CellsBasis.registerId r, CellsBasis.registerId d) of           (case (a, CellsBasis.registerId r, CellsBasis.registerId d, i) of
324             (I.OR, 0, _) =>             (I.OR, 0, _, I.REG _) =>
325             ( emit "mov\t";             ( emit "mov\t";
326               emit_operand i;               emit_operand i;
327               emit ", ";               emit ", ";
328               emitCell d )               emitCell d )
329           | (I.SUBCC, _, 0) =>           | (I.OR, 0, _, _) =>
330               ( emit "set\t";
331                 emit_operand i;
332                 emit ", ";
333                 emitCell d )
334             | (I.SUBCC, _, 0, _) =>
335             ( emit "cmp\t";             ( emit "cmp\t";
336               emitCell r;               emitCell r;
337               emit ", ";               emit ", ";
# Line 458  Line 466 
466             emit_operand i )             emit_operand i )
467         | I.FPop1{a, r, d} =>         | I.FPop1{a, r, d} =>
468           let           let
469  (*#line 763.18 "sparc/sparc.mdl"*)  (*#line 764.18 "sparc/sparc.mdl"*)
470               fun f (a, r, d) =               fun f (a, r, d) =
471                   ( emit a;                   ( emit a;
472                     emit "\t";                     emit "\t";
# Line 466  Line 474 
474                     emit ", ";                     emit ", ";
475                     emit (C.showFP d))                     emit (C.showFP d))
476    
477  (*#line 768.18 "sparc/sparc.mdl"*)  (*#line 769.18 "sparc/sparc.mdl"*)
478               fun g (a, r, d) =               fun g (a, r, d) =
479                   let                   let
480  (*#line 769.22 "sparc/sparc.mdl"*)  (*#line 770.22 "sparc/sparc.mdl"*)
481                       val r = CellsBasis.registerNum r                       val r = CellsBasis.registerNum r
482                       and d = CellsBasis.registerNum d                       and d = CellsBasis.registerNum d
483                   in f (a, r, d);                   in f (a, r, d);
# Line 477  Line 485 
485                      f ("fmovs", r + 1, d + 1)                      f ("fmovs", r + 1, d + 1)
486                   end                   end
487    
488  (*#line 773.18 "sparc/sparc.mdl"*)  (*#line 774.18 "sparc/sparc.mdl"*)
489               fun h (a, r, d) =               fun h (a, r, d) =
490                   let                   let
491  (*#line 774.22 "sparc/sparc.mdl"*)  (*#line 775.22 "sparc/sparc.mdl"*)
492                       val r = CellsBasis.registerNum r                       val r = CellsBasis.registerNum r
493                       and d = CellsBasis.registerNum d                       and d = CellsBasis.registerNum d
494                   in f (a, r, d);                   in f (a, r, d);
# Line 529  Line 537 
537             emit ", ";             emit ", ";
538             emitCell r2;             emitCell r2;
539             emit_nop nop )             emit_nop nop )
        | I.COPY{dst, src, impl, tmp} => emitInstrs (Shuffle.shuffle {tmp=tmp,  
             src=src, dst=dst})  
        | I.FCOPY{dst, src, impl, tmp} => emitInstrs (Shuffle.shufflefp {tmp=tmp,  
             src=src, dst=dst})  
540         | I.SAVE{r, i, d} =>         | I.SAVE{r, i, d} =>
541           ( emit "save\t";           ( emit "save\t";
542             emitCell r;             emitCell r;
# Line 560  Line 564 
564           ( emit "ret";           ( emit "ret";
565             emit_leaf leaf;             emit_leaf leaf;
566             emit_nop nop )             emit_nop nop )
        | I.ANNOTATION{i, a} =>  
          ( comment (Annotations.toString a);  
            nl ();  
            emitInstr i )  
567         | I.SOURCE{} => emit "source"         | I.SOURCE{} => emit "source"
568         | I.SINK{} => emit "sink"         | I.SINK{} => emit "sink"
569         | I.PHI{} => emit "phi"         | I.PHI{} => emit "phi"
570         )         )
571            and emitInstr i = (tab(); emitInstr' i; nl())        in  tab(); emitInstr' instr; nl()
572            and emitInstrIndented i = (indent(); emitInstr' i; nl())        end (* emitter *)
573          and emitInstrIndented i = (indent(); emitInstr i; nl())
574            and emitInstrs instrs =            and emitInstrs instrs =
575             app (if !indent_copies then emitInstrIndented             app (if !indent_copies then emitInstrIndented
576                  else emitInstr) instrs                  else emitInstr) instrs
577        in  emitInstr instr end  
578          and emitInstr(I.ANNOTATION{i,a}) =
579               ( comment(Annotations.toString a);
580                  nl();
581                  emitInstr i )
582            | emitInstr(I.LIVE{regs, spilled})  =
583                comment("live= " ^ CellsBasis.CellSet.toString regs ^
584                        "spilled= " ^ CellsBasis.CellSet.toString spilled)
585            | emitInstr(I.KILL{regs, spilled})  =
586                comment("killed:: " ^ CellsBasis.CellSet.toString regs ^
587                        "spilled:: " ^ CellsBasis.CellSet.toString spilled)
588            | emitInstr(I.INSTR i) = emitter i
589            | emitInstr(I.COPY{k=CellsBasis.GP, sz, src, dst, tmp}) =
590               emitInstrs(Shuffle.shuffle{tmp=tmp, src=src, dst=dst})
591            | emitInstr(I.COPY{k=CellsBasis.FP, sz, src, dst, tmp}) =
592               emitInstrs(Shuffle.shufflefp{tmp=tmp, src=src, dst=dst})
593            | emitInstr _ = error "emitInstr"
594    
595     in  S.STREAM{beginCluster=init,     in  S.STREAM{beginCluster=init,
596                  pseudoOp=pseudoOp,                  pseudoOp=pseudoOp,
597                  emit=emitter,                  emit=emitInstr,
598                  endCluster=fail,                  endCluster=fail,
599                  defineLabel=defineLabel,                  defineLabel=defineLabel,
600                  entryLabel=entryLabel,                  entryLabel=entryLabel,

Legend:
Removed from v.909  
changed lines
  Added in v.1017

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