Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/tree-il/getTypes.sml
ViewVC logotype

Diff of /branches/charisee/src/compiler/tree-il/getTypes.sml

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

revision 2662, Fri May 30 16:55:05 2014 UTC revision 2665, Tue Jun 3 02:37:46 2014 UTC
# Line 10  Line 10 
10      structure OprSet=ILF.OprSet      structure OprSet=ILF.OprSet
11    
12    
13      fun vecTy n= SOME(Ty.TensorTy[n])      fun vecTy n= Ty.TensorTy[n]
14      val testing=0      val testing=0
15    
16    
17    (* GetTypes TreeIL operator. *)    (* GetTypes TreeIL operator. *)
18      val default=(NONE,[])      val default=([],[])
19    
20        (*rator-> (types, cfns )*)
21      fun TypeofOp rator = (case rator      fun TypeofOp rator = (case rator
22          of  Op.IndexTensor(a,RTy,b,c)=>(SOME RTy,[])          of  Op.IndexTensor(a,RTy,b,c)=>([RTy],[])
23          (* Op.IndexTensor(a,RTy,b,c)=> (SOME RTy, [ILF.OP(Op.IndexTensor(a,RTy,b,c)))]*)          (* Op.IndexTensor(a,RTy,b,c)=> ([RTy], [ILF.OP(Op.IndexTensor(a,RTy,b,c)))]*)
24          | Op.addVec d               => (vecTy d,[ILF.OP(Op.addVec d)])          | Op.addVec d               => ([vecTy d],[ILF.OP(Op.addVec d)])
25          | Op.subVec d               => (vecTy d,[ILF.OP(Op.subVec d)])          | Op.subVec d               => ([vecTy d],[ILF.OP(Op.subVec d)])
26          | Op.prodVec d              => (vecTy d,[ILF.OP(Op.prodVec d)])          | Op.prodVec d              => ([vecTy d],[ILF.OP(Op.prodVec d)])
27          | Op.prodScaV d             => (vecTy d,[ILF.REALTOVEC d,ILF.OP(Op.prodScaV d)])          | Op.prodScaV d             => ([vecTy d],[ILF.CONS(Ty.TensorTy[d]),ILF.OP(Op.prodScaV d)])
28            | Op.sumVec d               => ([Ty.unionTy d],   [ILF.OP(Op.sumVec d)])
29          | _ => default          | _ => default
30          (* end case *))          (* end case *))
31    
32    
33    
34      fun peel(IL.E_Lit( offset))=offset      (*fun peel(IL.E_Lit( offset))=offset*)
35    
36      fun mkFnC(IL.E_LoadVec(fTy, oTy,_, offset))=[ILF.LD(fTy,oTy)]      fun mkFnC(IL.E_LoadVec(fTy, oTy,_, offset))=[ILF.LD(fTy,oTy)]
37        | mkFnC(IL.E_mkVec(_,oTy,pieces,_))= [ILF.MKVEC(oTy,pieces)]        | mkFnC(IL.E_mkVec(_,oTy,pieces,_))= [ILF.MKVEC(oTy,pieces)]
38        | mkFnC(IL.E_Cons (ty , exps))= [ILF.CONS ty]        | mkFnC(IL.E_Cons (ty , exps))= [ILF.CONS ty]
39       (* | mkFnC(IL.E_FillVec(fTy, oTy,_, offset))= [ILF.FVEC(fTy,oTy)]        | mkFnC(IL.E_LoadVecAligned (fTy, oTy,_, offset))=[ILF.LDAligned (fTy,oTy)]
40        | mkFnC(IL.E_SliceVec(fTy, oTy,_, offset))=[ILF.SVEC(fTy)]*)        | mkFnC(IL.E_mkVecAligned (_,oTy,pieces,_))= [ILF.MKVECAligned (oTy,pieces)]
41    
42    
43      (*Get types of Exp*)      (*Get types of Exp*)
44      fun typeOfExp(t,exp)=let      fun typeOfExp(t,exp)=let
   
         fun add((NONE,[]),rest)=List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest  
           | add((SOME typ,[]),rest)= let  
             val (ty1,opr1)=t  
             val t2=(TySet.add(ty1,typ),opr1)  
             in  
                 List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t2 rest  
             end  
         | add((SOME typ,cfn),rest)= let  
45              val (ty1,opr1)=t              val (ty1,opr1)=t
46             (* val t2=(TySet.add(ty1,typ),OprSet.add(opr1, cfn))*)          fun add(([],[]),rest)= List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest
47              val ty2=TySet.add(ty1,typ)          | add((typ,cfn),rest)= let
48    
49              val opr2=List.foldr (fn(e1,e2) =>OprSet.add(e2,e1)) opr1 cfn              val opr2=List.foldr (fn(e1,e2) =>OprSet.add(e2,e1)) opr1 cfn
50                val ty2=List.foldr (fn(e1,e2) =>TySet.add(e2,e1)) ty1 typ
51              val t2=(ty2,opr2)              val t2=(ty2,opr2)
52    
53              in              in
# Line 62  Line 58 
58              | IL.E_Var(var)             => t              | IL.E_Var(var)             => t
59              | IL.E_Lit _                => t              | IL.E_Lit _                => t
60              | IL.E_Apply (_, exps)      => add(default,exps)              | IL.E_Apply (_, exps)      => add(default,exps)
61              | IL.E_Cons (ty , exps)     => add((SOME ty,mkFnC exp),exps)              | IL.E_Cons (ty , exps)     => add(([ty],mkFnC exp),exps)
62              | IL.E_LoadVec(ty,_,exps,_) => add((vecTy ty,mkFnC exp),[exps])              | IL.E_LoadVec(ty,_,exps,_) => add(([vecTy ty],mkFnC exp),[exps])
63              | IL.E_mkVec(_,ty,_,exps)   => add((vecTy ty,mkFnC exp), exps)              | IL.E_mkVec(_,ty,_,exps)   => add(([vecTy ty,Ty.unionTy ty],mkFnC exp), exps)
64             (* | IL.E_FillVec(ty,_,exps,_) => add((vecTy ty,mkFnC exp),[exps])  
             | IL.E_SliceVec(ty,_,exps,_)=> add((vecTy ty,mkFnC exp),[exps])*)  
65              | IL.E_Op(Op, exps)         => add(TypeofOp Op, exps)              | IL.E_Op(Op, exps)         => add(TypeofOp Op, exps)
66              (*end case*))              (*end case*))
67          end          end

Legend:
Removed from v.2662  
changed lines
  Added in v.2665

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