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(); } }
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(); } }
protected MutatingBinaryPrimitive(BinaryPrimitiveOps binaryOp) : base(Signatures.DefineMutatingBinaryFunction("Accumulate" + binaryOp.ToString(), binaryOp.GetExpectedInputType())) { }
protected PureBinaryPrimitive(BinaryPrimitiveOps binaryOp) : base(Signatures.DefinePureBinaryFunction(binaryOp.ToString(), binaryOp.GetExpectedInputType(), binaryOp.GetExpectedInputType())) { }
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(); }