Exemplo n.º 1
0
        protected override void TraverseOperator(Operator op)
        {
            var lhs = op.Args.FirstOrDefault();
            var rhs = op.Args.SecondOrDefault();
            var targ = op.Args.FirstOrDefault();

            var opt = op.OperatorType;
            if (opt.IsAssign())
            {
                // todo. implement this with the use of SafeExpandOpAssign
                var equiv = op.UnsafeExpandOpAssign();
                Traverse(equiv);
            }
            else if (opt == OperatorType.AndAlso)
            {
                var equiv = new Conditional(lhs, rhs, new Const(false));
                Traverse(equiv);
            }
            else if (opt == OperatorType.OrElse)
            {
                var equiv = new Conditional(lhs, new Const(true), rhs);
                Traverse(equiv);
            }
            else
            {
                op.Args.ForEach(Traverse);

                switch (opt)
                {
                    case OperatorType.Add:
                        il.add();
                        break;
                    case OperatorType.And:
                        il.and();
                        break;
                    case OperatorType.Divide:
                        il.div();
                        break;
                    case OperatorType.Equal:
                        il.ceq();
                        break;
                    case OperatorType.GreaterThan:
                        il.cgt();
                        break;
                    case OperatorType.GreaterThanOrEqual:
                        il.cge();
                        break;
                    case OperatorType.LeftShift:
                        il.shl();
                        break;
                    case OperatorType.LessThan:
                        il.clt();
                        break;
                    case OperatorType.LessThanOrEqual:
                        il.cle();
                        break;
                    case OperatorType.Modulo:
                        il.rem();
                        break;
                    case OperatorType.Multiply:
                        il.mul();
                        break;
                    case OperatorType.Negate:
                        il.neg();
                        break;
                    case OperatorType.Not:
                        var is_bool = targ.Type() == typeof(bool);
                        if (is_bool) il.ldc_i4(0).ceq();
                        else il.not();
                        break;
                    case OperatorType.NotEqual:
                        il.cne();
                        break;
                    case OperatorType.Or:
                        il.or();
                        break;
                    case OperatorType.RightShift:
                        il.shr();
                        break;
                    case OperatorType.Subtract:
                        il.sub();
                        break;
                    case OperatorType.Xor:
                        il.xor();
                        break;
                    default:
                        throw AssertionHelper.Fail();
                }
            }
        }
Exemplo n.º 2
0
        protected override void TraverseOperator(Operator op)
        {
            var lhs = op.Args.FirstOrDefault();
            var rhs = op.Args.SecondOrDefault();
            var targ = op.Args.FirstOrDefault();

            var opt = op.OperatorType;
            if (opt.IsAssign())
            {
                var equiv = op.UnsafeExpandOpAssign();
                _ptx.ld(equiv);
            }
            else if (opt == OperatorType.AndAlso)
            {
                var equiv = new Conditional(lhs, rhs, new Const(false));
                _ptx.ld(equiv);
            }
            else if (opt == OperatorType.OrElse)
            {
                var equiv = new Conditional(lhs, new Const(true), rhs);
                _ptx.ld(equiv);
            }
            else
            {
                op.Args.ForEach(arg => _ptx.ld(arg));

                switch (opt)
                {
                    case OperatorType.Add:
                        _ptx.op("add");
                        break;
                    case OperatorType.And:
                        _ptx.op("and");
                        break;
                    case OperatorType.Divide:
                        _ptx.op("div");
                        break;
                    case OperatorType.Equal:
                        _ptx.op("setp.eq");
                        break;
                    case OperatorType.GreaterThan:
                        _ptx.op("setp.gt");
                        break;
                    case OperatorType.GreaterThanOrEqual:
                        _ptx.op("setp.ge");
                        break;
                    case OperatorType.LeftShift:
                        _ptx.op("shl");
                        break;
                    case OperatorType.LessThan:
                        _ptx.op("setp.lt");
                        break;
                    case OperatorType.LessThanOrEqual:
                        _ptx.op("setp.le");
                        break;
                    case OperatorType.Modulo:
                        _ptx.op("rem");
                        break;
                    case OperatorType.Multiply:
                        var t = _ptx.peek_expr().Type;
                        _ptx.op(t.is_int() ? "mul.lo" : "mul");
                        break;
                    case OperatorType.Negate:
                        _ptx.op("neg");
                        break;
                    case OperatorType.Not:
                        _ptx.ld("not");
                        break;
                    case OperatorType.NotEqual:
                        _ptx.op("setp.ne");
                        break;
                    case OperatorType.Or:
                        _ptx.op("or");
                        break;
                    case OperatorType.RightShift:
                        _ptx.op("shr");
                        break;
                    case OperatorType.Subtract:
                        _ptx.op("sub");
                        break;
                    case OperatorType.Xor:
                        _ptx.op("xor");
                        break;
                    default:
                        throw AssertionHelper.Fail();
                }
            }
        }