示例#1
0
        private static Ast.Macro IfMacro()
        {
            var def   = Macro.GetMacroDefinition(typeof(Macro <bool, Macro <T>, Macro <T>, T>));
            var cond  = Ast.MPRef(def.Parameters[0]);
            var thenm = (def.Parameters[1] as Ast.MacroDefParam).Definition;
            var elsem = (def.Parameters[2] as Ast.MacroDefParam).Definition;

            return(Ast.Mac(def.Parameters, def.Result, Ast.Blk(
                               Ast.If(cond, Ast.MCall(thenm, def.Result), Ast.MCall(elsem, def.Result)))));
        }
示例#2
0
 private string CompileAndOutput(CLKernel[] kernels)
 {
     foreach (var kernel in kernels)
     {
         var body = Ast.Blk();
         BeginScope(body);
         _function = ClcAst.Kern(kernel.Name,
                                 KernelArguments(kernel._expr.Parameters), body);
         OutputKernel(kernel._expr);
         _program.Functions.Add(Macro.InstantiateAllMacros(_function));
     }
     return(_program.Output(this));
 }
示例#3
0
        private static Ast.Macro ForStepMacro()
        {
            var def  = Macro.GetMacroDefinition(typeof(Macro <int, int, int, T, Macro <int, T, T>, T>));
            var ind  = Macro.GenUniqueVar(typeof(int), "ind");
            var init = Ast.MPRef(def.Parameters[0]);
            var cond = Ast.Op("{0} != {1}", Ast.VRef(ind), Ast.MPRef(def.Parameters[1]));
            var incr = Ast.Op("{0} += {1}", Ast.VRef(ind), Ast.MPRef(def.Parameters[2]));
            var body = (def.Parameters[4] as Ast.MacroDefParam).Definition;

            return(Ast.Mac(def.Parameters, def.Result, Ast.Blk(
                               Ast.Ass(Ast.VRef(def.Result), Ast.MPRef(def.Parameters[3])),
                               Ast.For(ind, init, cond, incr,
                                       Ast.MCall(body, def.Result, Ast.VRef(ind), Ast.VRef(def.Result))))));
        }
示例#4
0
        private static Ast.Macro DoWhileMacro()
        {
            var def   = Macro.GetMacroDefinition(typeof(Macro <int, int, Macro <int, T>, Macro <T, bool>, T>));
            var ind   = Macro.GenUniqueVar(typeof(int), "ind");
            var cont  = Macro.GenUniqueVar(typeof(bool), "cont");
            var start = Ast.MPRef(def.Parameters[0]);
            var cond  = Ast.Op("{0} && {1}",
                               Ast.Op("{0} < {1}", Ast.VRef(ind), Ast.MPRef(def.Parameters[1])), Ast.VRef(cont));
            var incr      = Ast.Op("{0}++", Ast.VRef(ind));
            var body      = (def.Parameters[2] as Ast.MacroDefParam).Definition;
            var whileCond = (def.Parameters[3] as Ast.MacroDefParam).Definition;

            return(Ast.Mac(def.Parameters, def.Result, Ast.Blk(
                               Ast.DeclVar(cont, Ast.Lit("true")),
                               Ast.For(ind, start, cond, incr, Ast.Blk(
                                           Ast.MCall(body, def.Result, Ast.VRef(ind)),
                                           Ast.MCall(whileCond, cont, Ast.VRef(def.Result)))))));
        }
示例#5
0
 private void StartMain()
 {
     _function = Ast.Fun("main", null, Enumerable.Empty <Ast.Argument> (), Ast.Blk());
     BeginScope(_function.Body);
 }