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/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 716, Sat Nov 4 05:42:35 2000 UTC revision 717, Sun Nov 5 15:07:51 2000 UTC
# Line 19  Line 19 
19      structure PseudoOp   : SMLNJ_PSEUDO_OP_TYPE      structure PseudoOp   : SMLNJ_PSEUDO_OP_TYPE
20      structure C          : CPSREGS where T.Region = CPSRegions      structure C          : CPSREGS where T.Region = CPSRegions
21                                     and   T.Constant = SMLNJConstant                                     and   T.Constant = SMLNJConstant
22                                       and   T.Extension =  SMLNJMLTreeExt
23      structure InvokeGC   : INVOKE_GC where T = C.T      structure InvokeGC   : INVOKE_GC where T = C.T
24      structure MLTreeComp : MLTREECOMP where T = C.T      structure MLTreeComp : MLTREECOMP where T = C.T
25      structure Flowgen    : FLOWGRAPH_GEN where T = C.T      structure Flowgen    : FLOWGRAPH_GEN where T = C.T
# Line 30  Line 31 
31  struct  struct
32    
33    structure M  = C.T            (* MLTree *)    structure M  = C.T            (* MLTree *)
34      structure E  = SMLNJMLTreeExt (* Extensions *)
35    structure P  = CPS.P          (* CPS primitive operators *)    structure P  = CPS.P          (* CPS primitive operators *)
36    structure LE = M.LabelExp     (* Label Expression *)    structure LE = M.LabelExp     (* Label Expression *)
37    structure R  = CPSRegions     (* Regions *)    structure R  = CPSRegions     (* Regions *)
# Line 1008  Line 1010 
1010                | _    => error "treeifyAlloc"                | _    => error "treeifyAlloc"
1011                )                )
1012    
1013              and computef64(x, e, k, hp) = let
1014                val f = newFreg REAL64
1015              in
1016                addFregBinding(x, M.FREG(fty, f));
1017                emit(M.FMV(fty, f, e));
1018                gen(k, hp)
1019              end
1020            (*            (*
1021             * x <- e where e contains an floating-point value             * x <- e where e contains an floating-point value
1022             *)             *)
# Line 1016  Line 1025 
1025                  of DEAD => gen(k, hp)                  of DEAD => gen(k, hp)
1026                   | TREEIFY => (markAsTreeified x;                   | TREEIFY => (markAsTreeified x;
1027                                 addFregBinding(x,e); gen(k, hp))                                 addFregBinding(x,e); gen(k, hp))
1028                   | COMPUTE =>                   | COMPUTE => computef64(x, e, k, hp)
                    let val f = newFreg REAL64  
                    in  addFregBinding(x, M.FREG(fty, f));  
                        emit(M.FMV(fty, f, e));  
                        gen(k, hp)  
                    end  
1029                   | _    => error "treeifyDefF64"                   | _    => error "treeifyDefF64"
1030                (*esac*))                (*esac*))
1031    
# Line 1314  Line 1318 
1318                end                end
1319    
1320              (*** PURE ***)              (*** PURE ***)
1321                | gen(PURE(P.real{fromkind=P.INT 31, tokind=P.FLOAT 64},
1322                           [v], x, _, e), hp) =
1323                    treeifyDefF64(x,M.CVTI2F(fty,ity,untagSigned(v)), e, hp)
1324                | gen(PURE(P.pure_arith{oper, kind=P.FLOAT 64}, [v], x, _, e), hp) = let
1325                    val r = fregbind v
1326                  in
1327                    case oper
1328                    of P.~ => treeifyDefF64(x, M.FNEG(fty,r), e, hp)
1329                     | P.abs => treeifyDefF64(x, M.FABS(fty,r), e, hp)
1330                     | P.fsqrt => treeifyDefF64(x, M.FSQRT(fty,r), e, hp)
1331                     | P.fsin => computef64(x, M.FEXT(fty, E.FSINE r), e, hp)
1332                     | P.fcos => computef64(x, M.FEXT(fty, E.FCOSINE r), e, hp)
1333                     | P.ftan => computef64(x, M.FEXT(fty, E.FTANGENT r), e, hp)
1334                  end
1335                | gen(PURE(P.pure_arith{oper, kind=P.FLOAT 64}, [v,w], x, _, e), hp) =
1336                  let val v = fregbind v
1337                      val w = fregbind w
1338                      val t =
1339                      case oper
1340                        of P.+ => M.FADD(fty, v, w)
1341                         | P.* => M.FMUL(fty, v, w)
1342                         | P.- => M.FSUB(fty, v, w)
1343                         | P./ => M.FDIV(fty, v, w)
1344                  in  treeifyDefF64(x, t, e, hp)
1345                  end
1346              | 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) =
1347                  defWithKind(kind, x, M.ORB(ity, regbind v, regbind w), e, hp)                  defWithKind(kind, x, M.ORB(ity, regbind v, regbind w), e, hp)
1348              | gen(PURE(P.pure_arith{oper=P.andb, kind}, [v,w], x, _, e), hp) =              | gen(PURE(P.pure_arith{oper=P.andb, kind}, [v,w], x, _, e), hp) =
# Line 1400  Line 1429 
1429                  | (n, m) => if n = m then copyM(m, x, v, e, hp)                  | (n, m) => if n = m then copyM(m, x, v, e, hp)
1430                              else error "gen:PURE:trunc"                              else error "gen:PURE:trunc"
1431                 (*esac*))                 (*esac*))
             | gen(PURE(P.real{fromkind=P.INT 31, tokind=P.FLOAT 64},  
                        [v], x, _, e), hp) =  
                 treeifyDefF64(x,M.CVTI2F(fty,ity,untagSigned(v)), e, hp)  
             | gen(PURE(P.pure_arith{oper, kind=P.FLOAT 64}, [v], x, _, e), hp) =  
               let val r = fregbind v  
               in  case oper  
                     of P.~ => treeifyDefF64(x, M.FNEG(fty,r), e, hp)  
                      | P.abs => treeifyDefF64(x, M.FABS(fty,r), e, hp)  
               end  
1432              | gen(PURE(P.objlength, [v], x, _, e), hp) =              | gen(PURE(P.objlength, [v], x, _, e), hp) =
1433                  defI31(x, orTag(getObjLength(v)), e, hp)                  defI31(x, orTag(getObjLength(v)), e, hp)
1434              | gen(PURE(P.length, [v], x, t, e), hp) = select(1, v, x, t, e, hp)              | gen(PURE(P.length, [v], x, t, e), hp) = select(1, v, x, t, e, hp)

Legend:
Removed from v.716  
changed lines
  Added in v.717

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