(*This function transitions low-il operators to tree-il operators *) structure ExpOp = struct local structure SrcOp = LowOps structure DstOp = TreeOps structure SrcTy = LowILTypes structure DstTy = TreeILTypes structure T = TreeIL structure TS=tString in val testing=0 fun getLd(pieces, 0, rator, argsS, args, origTy)= let fun createOps ([], _, code) = code | createOps (vn::es, offset, code)=let val args' = List.map (fn a => T.E_LoadVec(vn, origTy, a, T.E_Lit(Literal.Int offset))) args val exp = T.E_Op(rator vn, argsS@args') in createOps (es, offset + IntInf.fromInt vn, code@[exp]) end in createOps (pieces, 0, []) end (*addSca function used for sumVec function *) fun addSca [e1]=e1 | addSca(e1::e2::es)= addSca([T.E_Op(DstOp.addSca,[e1,e2])]@es) fun creatLd(lhs,rator,n,origTy,pieces,argsS,args)= let val splitTy=DstTy.vectorLength pieces val code=getLd(pieces, 0,rator,[],args,origTy) val exp=(case (rator n) of DstOp.sumVec _ => addSca code | _ =>T.E_mkVec(n,origTy,splitTy,code) (*end case*)) val _=(case testing of 1=>(print((TS.toStringEx exp)^"\n\n");1) |_ =>1) in [T.S_Assign([lhs],exp)] end (*Low-IL operators to Tree-IL operators*) fun expandOp rator=(case rator of SrcOp.IAdd => DstOp.IAdd | SrcOp.ISub => DstOp.ISub | SrcOp.IMul => DstOp.IMul | SrcOp.IDiv => DstOp.IDiv | SrcOp.INeg => DstOp.INeg | SrcOp.Abs ty => DstOp.Abs ty | SrcOp.LT ty => DstOp.LT ty | SrcOp.LTE ty => DstOp.LTE ty | SrcOp.EQ ty => DstOp.EQ ty | SrcOp.NEQ ty => DstOp.NEQ ty | SrcOp.GT ty => DstOp.GT ty | SrcOp.GTE ty => DstOp.GTE ty | SrcOp.Not => DstOp.Not | SrcOp.Max => DstOp.Max | SrcOp.Min => DstOp.Min | SrcOp.Clamp ty => DstOp.Clamp ty | SrcOp.Lerp ty => DstOp.Lerp ty | SrcOp.Norm ty => DstOp.Norm ty | SrcOp.Normalize d => DstOp.Normalize d | SrcOp.Zero ty => DstOp.Zero ty | SrcOp.PrincipleEvec ty => DstOp.PrincipleEvec ty | SrcOp.EigenVals2x2 => DstOp.EigenVals2x2 | SrcOp.EigenVals3x3 => DstOp.EigenVals3x3 | SrcOp.Select(ty as SrcTy.TupleTy tys, i) => DstOp.Select( ty, i) | SrcOp.Index (ty, i ) => DstOp.Index ( ty, i) | SrcOp.Subscript ty => DstOp.Subscript ty | SrcOp.Ceiling d => DstOp.Ceiling d | SrcOp.Floor d => DstOp.Floor d | SrcOp.Round d => DstOp.Round d | SrcOp.Trunc d => DstOp.Trunc d | SrcOp.IntToReal => DstOp.IntToReal | SrcOp.RealToInt d => DstOp.RealToInt d (*| SrcOp.VoxelAddress( info, offset) => expandVoxelAddress (y, info, offset, args') | SrcOp.LoadVoxels (rty, d ) => DstOp.LoadVoxels( rty, d)*) | SrcOp.Kernel h => DstOp.Kernel h | SrcOp.LoadImage info => DstOp.LoadImage info | SrcOp.Inside info => DstOp.Inside info | SrcOp.Transform V=> DstOp.Transform V | SrcOp.Translate V=> DstOp.Translate V | SrcOp.addSca =>DstOp.addSca | SrcOp.subSca=>DstOp.subSca | SrcOp.prodSca=>DstOp.prodSca | SrcOp.divSca=>DstOp.divSca (*Still need to sort *) | SrcOp.IndexTensor e=> DstOp.IndexTensor e | SrcOp.imgAddr(v,indexAt, dim)=>DstOp.imgAddr(v, indexAt, dim) | SrcOp.imgLoad(v,dim,n)=>DstOp.imgLoad(v,dim,n) (*EigenVecs,mkDynamic, Append,Prepend, Concat,Length,ImageAddress,LoadVoxel,Inputs, and Pritns*) | rator => raise Fail ("bogus operator " ^ SrcOp.toString rator) (* end case *)) end; end
Click to toggle
does not end with </html> tag
does not end with </body> tag
The output has ended thus: | rator => raise Fail ("bogus operator " ^ SrcOp.toString rator) (* end case *)) end; end