예제 #1
0
        public static NIType GetExpectedInputType(this BinaryPrimitiveOps binaryOp)
        {
            switch (binaryOp)
            {
            case BinaryPrimitiveOps.Add:
            case BinaryPrimitiveOps.Subtract:
            case BinaryPrimitiveOps.Multiply:
            case BinaryPrimitiveOps.Divide:
            case BinaryPrimitiveOps.Modulus:
                return(PFTypes.Int32);

            case BinaryPrimitiveOps.And:
            case BinaryPrimitiveOps.Or:
            case BinaryPrimitiveOps.Xor:
                return(PFTypes.Boolean);

            default:
                throw new NotImplementedException();
            }
        }
예제 #2
0
        private void EmitBinaryOperation(BinaryPrimitiveOps operation)
        {
            switch (operation)
            {
            case BinaryPrimitiveOps.Add:
                _builder.EmitAdd();
                break;

            case BinaryPrimitiveOps.Subtract:
                _builder.EmitSubtract();
                break;

            case BinaryPrimitiveOps.Multiply:
                _builder.EmitMultiply();
                break;

            case BinaryPrimitiveOps.Divide:
                _builder.EmitDivide();
                break;

            case BinaryPrimitiveOps.And:
                _builder.EmitAnd();
                break;

            case BinaryPrimitiveOps.Or:
                _builder.EmitOr();
                break;

            case BinaryPrimitiveOps.Xor:
                _builder.EmitXor();
                break;

            default:
                throw new NotImplementedException();
            }
        }
예제 #3
0
 protected MutatingBinaryPrimitive(BinaryPrimitiveOps binaryOp)
     : base(Signatures.DefineMutatingBinaryFunction("Accumulate" + binaryOp.ToString(), binaryOp.GetExpectedInputType()))
 {
 }
예제 #4
0
 protected PureBinaryPrimitive(BinaryPrimitiveOps binaryOp)
     : base(Signatures.DefinePureBinaryFunction(binaryOp.ToString(), binaryOp.GetExpectedInputType(), binaryOp.GetExpectedInputType()))
 {
 }
예제 #5
0
        private static void CompileMutatingBinaryPrimitive(FunctionCompiler compiler, FunctionalNode primitiveNode, BinaryPrimitiveOps operation)
        {
            VariableReference input1 = primitiveNode.InputTerminals.ElementAt(0).GetTrueVariable(),
                              input2 = primitiveNode.InputTerminals.ElementAt(1).GetTrueVariable();

            compiler.LoadValueAsReference(input1);
            compiler._builder.EmitDuplicate();
            compiler._builder.EmitDerefInteger();
            compiler.LoadValueAsReference(input2);
            compiler._builder.EmitDerefInteger();
            compiler.EmitBinaryOperation(operation);
            compiler._builder.EmitStoreInteger();
        }