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/x86/mltree/x86.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/x86/mltree/x86.sml

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

revision 554, Thu Mar 2 21:29:44 2000 UTC revision 555, Fri Mar 3 16:10:30 2000 UTC
# Line 31  Line 31 
31  functor X86  functor X86
32    (structure X86Instr : X86INSTR    (structure X86Instr : X86INSTR
33     structure X86MLTree : MLTREE     structure X86MLTree : MLTREE
34    (* structure PseudoInstrs : X86_PSEUDO_INSTR *)     structure ExtensionComp : MLTREE_EXTENSION_COMP
35         where I = X86Instr and T = X86MLTree
36       sharing X86MLTree.Region = X86Instr.Region       sharing X86MLTree.Region = X86Instr.Region
37       sharing X86MLTree.LabelExp = X86Instr.LabelExp       sharing X86MLTree.LabelExp = X86Instr.LabelExp
      (* sharing PseudoInstrs.I = X86Instr  
      sharing PseudoInstrs.T = X86MLTree *)  
38      datatype arch = Pentium | PentiumPro | PentiumII | PentiumIII      datatype arch = Pentium | PentiumPro | PentiumII | PentiumIII
39      val arch : arch ref      val arch : arch ref
40      val tempMem : X86Instr.operand (* temporary for CVTI2F *)      val tempMem : X86Instr.operand (* temporary for CVTI2F *)
     (* val memRegsUsed : word ref *)    (* bit mask of memRegs used *)  
41    ) : sig include MLTREECOMP    ) : sig include MLTREECOMP
42            val rewriteMemReg : bool            val rewriteMemReg : bool
43        end =        end =
# Line 54  Line 52 
52    structure A = MLRiscAnnotations    structure A = MLRiscAnnotations
53    
54    type instrStream = (I.instruction,C.regmap,C.cellset) T.stream    type instrStream = (I.instruction,C.regmap,C.cellset) T.stream
55    type ('s,'r,'f,'c) mltreeStream =    type mltreeStream = (T.stm,C.regmap,T.mlrisc list) T.stream
      (('s,'r,'f,'c) T.stm,C.regmap,('s,'r,'f,'c) T.mlrisc list) T.stream  
   type ('s,'r,'f,'c) reducer =  
      (I.instruction,C.regmap,C.cellset,I.operand,I.addressing_mode,'s,'r,'f,'c)  
        T.reducer  
   type ('s,'r,'f,'c) extender =  
      (I.instruction,C.regmap,C.cellset,I.operand,I.addressing_mode,'s,'r,'f,'c)  
        T.extender  
56    
57    structure Gen = MLTreeGen    structure Gen = MLTreeGen
58       (structure T = T       (structure T = T
# Line 79  Line 70 
70    val rewriteMemReg = rewriteMemReg    val rewriteMemReg = rewriteMemReg
71    fun isMemReg r = rewriteMemReg andalso r >= 8 andalso r < 32    fun isMemReg r = rewriteMemReg andalso r >= 8 andalso r < 32
72    
73      val ST0 = C.ST 0
74      val ST7 = C.ST 7
75    
76    (*    (*
77     * The code generator     * The code generator
78     *)     *)
79    fun selectInstructions    fun selectInstructions
        (T.EXTENDER{compileStm,compileRexp,compileFexp,compileCCexp,...})  
80         (instrStream as         (instrStream as
81          S.STREAM{emit,defineLabel,entryLabel,pseudoOp,annotation,          S.STREAM{emit,defineLabel,entryLabel,pseudoOp,annotation,
82                   beginCluster,endCluster,exitBlock,alias,phi,comment,...}) =                   beginCluster,endCluster,exitBlock,alias,phi,comment,...}) =
# Line 368  Line 361 
361            | I.Indexed _  => true            | I.Indexed _  => true
362            | I.MemReg _   => true            | I.MemReg _   => true
363            | I.LabelEA _  => true            | I.LabelEA _  => true
364              | I.FDirect f  => true
365            | _            => false            | _            => false
366            )            )
367    
# Line 741  Line 735 
735               | T.MARK(e, A.MARKREG f) => (f rd; doExpr(e, rd, an))               | T.MARK(e, A.MARKREG f) => (f rd; doExpr(e, rd, an))
736               | T.MARK(e, a) => doExpr(e, rd, a::an)               | T.MARK(e, a) => doExpr(e, rd, a::an)
737               | T.PRED(e,c) => doExpr(e, rd, A.CTRLUSE c::an)               | T.PRED(e,c) => doExpr(e, rd, A.CTRLUSE c::an)
738               | T.REXT e => compileRexp (reducer()) {e=e, rd=rd, an=an}               | T.REXT e =>
739                     ExtensionComp.compileRext (reducer()) {e=e, rd=rd, an=an}
740                 (* simplify and try again *)                 (* simplify and try again *)
741               | exp => unknownExp exp               | exp => unknownExp exp
742            end (* doExpr *)            end (* doExpr *)
# Line 802  Line 797 
797          | doCCexpr(T.CCMARK(e,A.MARKREG f),rd,an) = (f rd; doCCexpr(e,rd,an))          | doCCexpr(T.CCMARK(e,A.MARKREG f),rd,an) = (f rd; doCCexpr(e,rd,an))
798          | doCCexpr(T.CCMARK(e,a), rd, an) = doCCexpr(e,rd,a::an)          | doCCexpr(T.CCMARK(e,a), rd, an) = doCCexpr(e,rd,a::an)
799          | doCCexpr(T.CCEXT e, cd, an) =          | doCCexpr(T.CCEXT e, cd, an) =
800             compileCCexp (reducer()) {e=e, cd=cd, an=an}             ExtensionComp.compileCCext (reducer()) {e=e, ccd=cd, an=an}
801          | doCCexpr _ = error "doCCexpr"          | doCCexpr _ = error "doCCexpr"
802    
803       and ccExpr e = error "ccExpr"       and ccExpr e = error "ccExpr"
# Line 943  Line 938 
938    
939        and fld(32, opnd) = I.FLDS opnd        and fld(32, opnd) = I.FLDS opnd
940          | fld(64, opnd) = I.FLDL opnd          | fld(64, opnd) = I.FLDL opnd
941            | fld(80, opnd) = I.FLDT opnd
942          | fld _         = error "fld"          | fld _         = error "fld"
943    
944        and fstp(32, opnd) = I.FSTPS opnd        and fstp(32, opnd) = I.FSTPS opnd
945          | fstp(64, opnd) = I.FSTPL opnd          | fstp(64, opnd) = I.FSTPL opnd
946            | fstp(80, opnd) = I.FSTPT opnd
947          | fstp _         = error "fstp"          | fstp _         = error "fstp"
948    
949            (* generate code for floating point stores *)            (* generate code for floating point stores *)
# Line 980  Line 977 
977             * and put result in %ST(0).             * and put result in %ST(0).
978             *)             *)
979        and reduceFexp(fty, fexp, an)  =        and reduceFexp(fty, fexp, an)  =
980            let val ST = I.FDirect(C.ST 0)            let val ST = I.ST(C.ST 0)
981                val ST1 = I.FDirect(C.ST 1)                val ST1 = I.ST(C.ST 1)
982    
983                datatype su_numbers =                datatype su_numbers =
984                  LEAF of int                  LEAF of int
# Line 1019  Line 1016 
1016                  | suNumbering(T.FABS(_,t), _) = suUnary(t)                  | suNumbering(T.FABS(_,t), _) = suUnary(t)
1017                  | suNumbering(T.FNEG(_,t), _) = suUnary(t)                  | suNumbering(T.FNEG(_,t), _) = suUnary(t)
1018                  | suNumbering(T.CVTI2F _, _) = UNARY(1, LEAF 0)                  | suNumbering(T.CVTI2F _, _) = UNARY(1, LEAF 0)
1019                    | suNumbering(T.CVTF2F(_,_,T.FLOAD _), _) = UNARY(1, LEAF 0)
1020                  | suNumbering(T.CVTF2F(_,_,t), _) = suUnary t                  | suNumbering(T.CVTF2F(_,_,t), _) = suUnary t
1021                  | suNumbering(T.FMARK(e,a),x) = suNumbering(e,x)                  | suNumbering(T.FMARK(e,a),x) = suNumbering(e,x)
1022                  | suNumbering _ = error "suNumbering"                  | suNumbering _ = error "suNumbering"
1023    
1024                fun leafEA(T.FREG(fty, f)) = (fty, I.FDirect f)                fun leafEA(T.FREG(fty, f)) = (fty, I.FDirect f)
1025                  | leafEA(T.FLOAD(fty, ea, mem)) = (fty, address(ea, mem))                  | leafEA(T.FLOAD(fty, ea, mem)) = (fty, address(ea, mem))
1026                    | leafEA(T.CVTF2F(_, _, T.FLOAD(fty, ea, mem))) =
1027                          (fty, address(ea, mem))
1028                  | leafEA _ = error "leafEA"                  | leafEA _ = error "leafEA"
1029    
1030                fun cvti2d(t,an) =                fun cvti2d(t,an) =
# Line 1048  Line 1048 
1048                        fun sameEA(T.FREG(t1, f1), T.FREG(t2, f2)) =                        fun sameEA(T.FREG(t1, f1), T.FREG(t2, f2)) =
1049                              t1 = t2 andalso f1 = f2                              t1 = t2 andalso f1 = f2
1050                          | sameEA _ = false                          | sameEA _ = false
1051                        fun doit(oper, t1, t2) =  
1052                           (gencode(t1, su1, []);                        fun doit(oper32, oper64, t1, t2) =
1053                            mark(I.FBINARY{binOp=oper,                        let val _ = gencode(t1, su1, [])
1054                                           src=if sameEA(t1, t2) then ST                            val (fty, src) = leafEA t2
1055                                               else #2(leafEA t2),                        in  if sameEA(t1, t2) then
1056                                           dst=ST}, an)                               mark(I.FBINARY{binOp=oper64, src=ST, dst=ST}, an)
1057                           )                            else
1058                                 let val oper =
1059                                         if isMemOpnd src then
1060                                             case fty of
1061                                               32 => oper32
1062                                             | 64 => oper64
1063                                             | _  => error "gencode: binary"
1064                                         else oper64
1065                                 in mark(I.FBINARY{binOp=oper, src=src, dst=ST}, an)
1066                                 end
1067                          end
1068                    in                    in
1069                      case t of                      case t of
1070                         T.FADD(_, t1, t2) => doit(I.FADD, t1, t2)                         T.FADD(_, t1, t2) => doit(I.FADDS,I.FADDL,t1,t2)
1071                       | T.FMUL(_, t1, t2) => doit(I.FMUL, t1, t2)                       | T.FMUL(_, t1, t2) => doit(I.FMULS,I.FMULL,t1,t2)
1072                       | T.FSUB(_, t1, t2) => doit(I.FSUB, t1, t2)                       | T.FSUB(_, t1, t2) => doit(I.FSUBS,I.FSUBL,t1,t2)
1073                       | T.FDIV(_, t1, t2) => doit(I.FDIV, t1, t2)                       | T.FDIV(_, t1, t2) => doit(I.FDIVS,I.FDIVL,t1,t2)
1074                       | _ => error "gencode.BINARY"                       | _ => error "gencode.BINARY"
1075                    end                    end
1076                  | gencode(fexp, BINARY(fty, su1, su2), an) =                  | gencode(fexp, BINARY(fty, su1, su2), an) =
# Line 1090  Line 1100 
1100                      end                      end
1101                    in                    in
1102                      case fexp                      case fexp
1103                      of T.FADD(_, t1, t2) => doit(t1, t2,I.FADD,I.FADDP,I.FADDP)                      of T.FADD(_, t1, t2) => doit(t1,t2,I.FADDL,I.FADDP,I.FADDP)
1104                       | T.FMUL(_, t1, t2) => doit(t1, t2,I.FMUL,I.FMULP,I.FMULP)                       | T.FMUL(_, t1, t2) => doit(t1,t2,I.FMULL,I.FMULP,I.FMULP)
1105                       | T.FSUB(_, t1, t2) => doit(t1, t2,I.FSUB,I.FSUBP,I.FSUBRP)                       | T.FSUB(_, t1, t2) => doit(t1,t2,I.FSUBL,I.FSUBP,I.FSUBRP)
1106                       | T.FDIV(_, t1, t2) => doit(t1, t2,I.FDIV,I.FDIVP,I.FDIVRP)                       | T.FDIV(_, t1, t2) => doit(t1,t2,I.FDIVL,I.FDIVP,I.FDIVRP)
1107                       | _ => error "gencode.BINARY"                       | _ => error "gencode.BINARY"
1108                    end                    end
1109                  | gencode(fexp, UNARY(_, LEAF 0), an) =                  | gencode(fexp, UNARY(_, LEAF 0), an) =
# Line 1138  Line 1148 
1148          | stmt(T.BCC(ctrl, cc, lab), an) = branch(cc, lab, an)          | stmt(T.BCC(ctrl, cc, lab), an) = branch(cc, lab, an)
1149          | stmt(T.DEFINE l, _) = defineLabel l          | stmt(T.DEFINE l, _) = defineLabel l
1150          | stmt(T.ANNOTATION(s, a), an) = stmt(s, a::an)          | stmt(T.ANNOTATION(s, a), an) = stmt(s, a::an)
1151            | stmt(T.EXT s, an) =
1152                 ExtensionComp.compileSext (reducer()) {stm=s, an=an}
1153          | stmt(s, _) = doStmts(Gen.compileStm s)          | stmt(s, _) = doStmts(Gen.compileStm s)
1154    
1155        and doStmt s = stmt(s, [])        and doStmt s = stmt(s, [])

Legend:
Removed from v.554  
changed lines
  Added in v.555

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