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 2663, Fri May 30 18:02:41 2014 UTC revision 2671, Fri Jul 18 18:57:06 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.CONSV d,ILF.OP(Op.prodScaV d)]) (*need different cons here*)
28            | Op.sumVec d               => ([Ty.unionTy d],   [ILF.OP(Op.sumVec d)])
29          | _ => default          | _ => default
30          (* end case *))          (* end case *))
31    
# Line 31  Line 33 
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(A,fTy, oTy,_, offset))=[ILF.LD(A,fTy,oTy)]
37        | mkFnC(IL.E_mkVec(_,oTy,pieces,_))= [ILF.MKVEC(oTy,pieces)]        | mkFnC(IL.E_mkVec(A,rTy,oTy,_,_,_))= [ILF.MKVEC(A,rTy,oTy)]
38          | mkFnC(IL.E_mkVec2(A,rTy,oTy,_,Ty.vectorLength pieces,_))=
39                List.map (fn p => ILF.MKVEC(A,p,oTy)) pieces
40        | mkFnC(IL.E_Cons (ty , exps))= [ILF.CONS ty]        | mkFnC(IL.E_Cons (ty , exps))= [ILF.CONS ty]
41        | mkFnC(IL.E_LoadVecAligned (fTy, oTy,_, offset))=[ILF.LDAligned (fTy,oTy)]        | mkFnC e= []
42        | mkFnC(IL.E_mkVecAligned (_,oTy,pieces,_))= [ILF.MKVECAligned (oTy,pieces)]  
43    
44    
45      (*Get types of Exp*)      (*Get types of Exp*)
46      fun typeOfExp(t,exp)=let      fun typeOfExp(t,exp)=let
47          val (ty1,opr1)=t          val (ty1,opr1)=t
48          fun add((NONE,[]),rest)=List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest          fun add(([],[]),rest)= List.foldr (fn(e1,e2) => typeOfExp(e2,e1)) t rest
49            | add((SOME typ,[]),rest)= let          | add((typ,cfn),rest)= let
50              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  
             val ty2=TySet.add(ty1,typ)  
51              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
52                val ty2=List.foldr (fn(e1,e2) =>TySet.add(e2,e1)) ty1 typ
53              val t2=(ty2,opr2)              val t2=(ty2,opr2)
54    
55              in              in
# Line 60  Line 60 
60              | IL.E_Var(var)             => t              | IL.E_Var(var)             => t
61              | IL.E_Lit _                => t              | IL.E_Lit _                => t
62              | IL.E_Apply (_, exps)      => add(default,exps)              | IL.E_Apply (_, exps)      => add(default,exps)
63              | IL.E_Cons (ty , exps)     => add((SOME ty,mkFnC exp),exps)              | IL.E_Cons (ty , exps)     => add(([ty],mkFnC exp),exps)
64              | IL.E_LoadVec(ty,_,exps,_) => add((vecTy ty,mkFnC exp),[exps])              | IL.E_LoadVec(_,ty,_,exps,_) => add(([vecTy ty],mkFnC exp),[exps])
65              | 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])
66                | IL.E_mkVec2(_,_,ty,_,_,exps)   => add(([vecTy ty,Ty.unionTy ty],mkFnC exp), exps)
67              | IL.E_Op(Op, exps)         => add(TypeofOp Op, exps)              | IL.E_Op(Op, exps)         => add(TypeofOp Op, exps)
68              (*end case*))              (*end case*))
69          end          end
# Line 99  Line 99 
99    
100          in t2          in t2
101          end          end
102    
103    
104        | getTypesFiltered(t, _)= t        | getTypesFiltered(t, _)= t
105    
106    

Legend:
Removed from v.2663  
changed lines
  Added in v.2671

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