Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Tracker SCM

SCM Repository

[smlnj] Diff of /sml/trunk/src/compiler/CodeGen/main/mlriscGen.sml
ViewVC logotype

Diff of /sml/trunk/src/compiler/CodeGen/main/mlriscGen.sml

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

revision 1333, Thu May 22 17:12:13 2003 UTC revision 1334, Thu May 22 22:46:30 2003 UTC
# Line 166  Line 166 
166    (*    (*
167     * The allocation pointer.  This must be a register     * The allocation pointer.  This must be a register
168     *)     *)
169    val M.REG(_,allocptrR) = C.allocptr    val allocptrR =
170          case C.allocptr of
171              M.REG(_,allocptrR) => allocptrR
172            | _ => error "allocptrR"
173    
174    (*    (*
175     * Dedicated registers.     * Dedicated registers.
# Line 560  Line 563 
563                  | eCopy([], [], [], [], xs', rl') = (xs', rl')                  | eCopy([], [], [], [], xs', rl') = (xs', rl')
564                  | eCopy([], [], rds, rss, xs', rl') =                  | eCopy([], [], rds, rss, xs', rl') =
565                     (emit(M.COPY(ity, rds, rss)); (xs', rl'))                     (emit(M.COPY(ity, rds, rss)); (xs', rl'))
566                    | eCopy (([], _::_, _, _, _, _) | (_::_, [], _, _, _, _)) =
567                        error "eCopy"
568    
569                fun eOther(x::xs, M.GPR(r)::rl, xs', rl') =                fun eOther(x::xs, M.GPR(r)::rl, xs', rl') =
570                    let val t = newReg PTR                    let val t = newReg PTR
# Line 569  Line 574 
574                  | eOther(x::xs, (M.FPR(M.FREG(_,f)))::rl, xs', rl') =                  | eOther(x::xs, (M.FPR(M.FREG(_,f)))::rl, xs', rl') =
575                      eOther(xs, rl, x::xs', f::rl')                      eOther(xs, rl, x::xs', f::rl')
576                  | eOther([], [], xs, rl) = (xs, rl)                  | eOther([], [], xs, rl) = (xs, rl)
577                    | eOther (_, M.FPR _ :: _, _, _) =
578                        error "eOther: FPR but not FREG"
579                    | eOther (_, M.CCR _ :: _, _, _) =
580                        error "eOther: CCR"
581                    | eOther (([], _::_, _, _) | (_::_, [], _, _)) =
582                        error "eOther"
583    
584                fun eFcopy([], []) = ()                fun eFcopy([], []) = ()
585                  | eFcopy(xs, rl) =                  | eFcopy(xs, rl) =
# Line 1015  Line 1026 
1026                     )                     )
1027                | _ =>                | _ =>
1028                   (* Standard function *)                   (* Standard function *)
1029                   let val regfmls as (M.GPR linkreg::regfmlsTl) = formals                   let val regfmls = formals
1030                         val (linkreg, regfmlsTl) =
1031                             case formals of
1032                                 (M.GPR linkreg::regfmlsTl) => (linkreg, regfmlsTl)
1033                               | _ => error "no linkreg for standard function"
1034                       val entryLab =                       val entryLab =
1035                           if splitEntry then functionLabel(~f-1) else lab                           if splitEntry then functionLabel(~f-1) else lab
1036                   in                   in
# Line 1164  Line 1179 
1179                genCont(no, hp);                genCont(no, hp);
1180                genlab(trueLab, yes, hp)                genlab(trueLab, yes, hp)
1181            end            end
1182                | branch _ = error "branch"
1183    
1184                (* branch if x is boxed *)                (* branch if x is boxed *)
1185            and branchOnBoxed(cv, x, yes, no, hp) =            and branchOnBoxed(cv, x, yes, no, hp) =
# Line 1350  Line 1366 
1366             *)             *)
1367            and externalApp(f, args, hp) =            and externalApp(f, args, hp) =
1368                let val ctys = map grabty args                let val ctys = map grabty args
1369                    val formals as (M.GPR dest::_) =                    val formals =
1370                      ArgP.standard{fnTy=typmap f, vfp=vfp, argTys=ctys}                      ArgP.standard{fnTy=typmap f, vfp=vfp, argTys=ctys}
1371                      val dest =
1372                          case formals of
1373                              (M.GPR dest::_) => dest
1374                            | _ => error "externalApp: dest"
1375                in  callSetup(formals, args);                in  callSetup(formals, args);
1376                    if gctypes then                    if gctypes then
1377                      annotation(gcAnnotation(#create GCCells.GCLIVEOUT,                      annotation(gcAnnotation(#create GCCells.GCLIVEOUT,
# Line 1484  Line 1504 
1504                   | P.fsin => computef64(x, M.FEXT(fty, E.FSINE r), e, hp)                   | P.fsin => computef64(x, M.FEXT(fty, E.FSINE r), e, hp)
1505                   | P.fcos => computef64(x, M.FEXT(fty, E.FCOSINE r), e, hp)                   | P.fcos => computef64(x, M.FEXT(fty, E.FCOSINE r), e, hp)
1506                   | P.ftan => computef64(x, M.FEXT(fty, E.FTANGENT r), e, hp)                   | P.ftan => computef64(x, M.FEXT(fty, E.FTANGENT r), e, hp)
1507                     | _ => error "unexpected primop in pure unary float64"
1508                end                end
1509              | gen(PURE(P.pure_arith{oper, kind=P.FLOAT 64}, [v,w], x, _, e), hp) =              | gen(PURE(P.pure_arith{oper, kind=P.FLOAT 64}, [v,w], x, _, e), hp) =
1510                let val v = fregbind v                let val v = fregbind v
# Line 1494  Line 1515 
1515                       | P.* => M.FMUL(fty, v, w)                       | P.* => M.FMUL(fty, v, w)
1516                       | P.- => M.FSUB(fty, v, w)                       | P.- => M.FSUB(fty, v, w)
1517                       | P./ => M.FDIV(fty, v, w)                       | P./ => M.FDIV(fty, v, w)
1518                         | _ => error "unexpected primop in pure binary float64"
1519                in  treeifyDefF64(x, t, e, hp)                in  treeifyDefF64(x, t, e, hp)
1520                end                end
1521              | gen(PURE(P.pure_arith{oper=P.orb, kind}, [v,w], x, _, e), hp) =              | gen(PURE(P.pure_arith{oper=P.orb, kind}, [v,w], x, _, e), hp) =
# Line 1553  Line 1575 
1575                        | P.rshiftl=> logical32(M.SRL, v, w, x, e, hp)                        | P.rshiftl=> logical32(M.SRL, v, w, x, e, hp)
1576                        | _ => error "gen:PURE UINT 32"                        | _ => error "gen:PURE UINT 32"
1577                      (*esac*))                      (*esac*))
1578                     | _ => error "unexpected numkind in pure binary arithop"
1579                (*esac*))                (*esac*))
1580              | gen(PURE(P.pure_arith{oper=P.notb, kind}, [v], x, _, e), hp) =              | gen(PURE(P.pure_arith{oper=P.notb, kind}, [v], x, _, e), hp) =
1581                 (case kind                 (case kind
# Line 1562  Line 1585 
1585                                                 LW 0wxFFFFFFFF), e, hp)                                                 LW 0wxFFFFFFFF), e, hp)
1586                   | P.UINT 31 => defI31(x,M.SUB(ity, zero, regbind v), e, hp)                   | P.UINT 31 => defI31(x,M.SUB(ity, zero, regbind v), e, hp)
1587                   | P.INT 31 => defI31(x,M.SUB(ity, zero, regbind v), e, hp)                   | P.INT 31 => defI31(x,M.SUB(ity, zero, regbind v), e, hp)
1588                     | _ => error "unexpected numkind in pure unary arithop"
1589                (*esac*))                (*esac*))
1590              | gen(PURE(P.copy ft, [v], x, _, e), hp) =              | gen(PURE(P.copy ft, [v], x, _, e), hp) =
1591                 (case ft                 (case ft
# Line 1810  Line 1834 
1834                       | P.* => M.FMUL(fty, v, w)                       | P.* => M.FMUL(fty, v, w)
1835                       | P.- => M.FSUB(fty, v, w)                       | P.- => M.FSUB(fty, v, w)
1836                       | P./ => M.FDIV(fty, v, w)                       | P./ => M.FDIV(fty, v, w)
1837                         | _ => error "unexpected primop in binary float64"
1838                in  treeifyDefF64(x, t, e, hp)                in  treeifyDefF64(x, t, e, hp)
1839                end                end
1840              (*** LOOKER ***)              (*** LOOKER ***)
# Line 2049  Line 2074 
2074            fun initFrags (start::rest : CPS.function list) =            fun initFrags (start::rest : CPS.function list) =
2075            let fun init(func as (fk, f, _, _, _)) =            let fun init(func as (fk, f, _, _, _)) =
2076                   addGenTbl (f, Frag.makeFrag(func, functionLabel f))                   addGenTbl (f, Frag.makeFrag(func, functionLabel f))
2077            in  app init rest;                in
2078                      app init rest;
2079                init start                init start
2080            end            end
2081                | initFrags [] = error "initFrags"
2082    
2083            (*            (*
2084             * Create cluster annotations.             * Create cluster annotations.
# Line 2099  Line 2126 
2126        end        end
2127    
2128        fun entrypoint ((_,f,_,_,_)::_) () = Label.addrOf (functionLabel f)        fun entrypoint ((_,f,_,_,_)::_) () = Label.addrOf (functionLabel f)
2129            | entrypoint [] () = error "entrypoint: no functions"
2130    in    in
2131      app mkGlobalTables funcs;      app mkGlobalTables funcs;
2132      app genCluster (Cluster.cluster funcs);      app genCluster (Cluster.cluster funcs);

Legend:
Removed from v.1333  
changed lines
  Added in v.1334

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