Esempio n. 1
0
        public static Statement Convert(ConversionState state, ConversionResult expressionResult, Identifier receiverIdentifier, ComputeType receiverComputeType, INDEXER indexer)
        {
            bool        complexIndexer;
            ComputeType computeType = receiverComputeType;

            Expression[] indices = ConversionHelper.GetExpressionsFromIndexer(indexer, ref receiverComputeType, out complexIndexer);
            // create empty indices if there is a complex indexer
            if (indices == null && complexIndexer)
            {
                receiverComputeType = computeType;
                indices             = new Expression[computeType.Rank];
            }
            if (indices == null || (receiverComputeType != expressionResult.Type && !complexIndexer))
            {
                return(null);
            }

            // if the right expression has a complex indexer, we need it too
            complexIndexer |= expressionResult.HasComplexIndexer;

            List <ConversionHelper.Argument> sortedArguments = ConversionHelper.ExtractArguments(state, false);
            List <ConversionHelper.Argument> scalarArguments = ConversionHelper.ExtractArguments(state, true);

            ExpressionArgument receiverArgument;

            ConversionHelper.ProcessReceiver(state, expressionResult, receiverIdentifier, receiverComputeType, indices, indexer, ref sortedArguments, complexIndexer, out receiverArgument);

            ConversionResult finalConversionResult = ConversionHelper.GenerateKernelExecution(state, expressionResult, Identifier.For("buffer" + receiverArgument.Index.ToString()), complexIndexer);

            // generate delegates
            DelegateNode getOpenCLTimeDelegateType;
            DelegateNode startOpenCLDelegateType;

            ConversionHelper.GenerateOpenCLDelegates(state, out getOpenCLTimeDelegateType, out startOpenCLDelegateType);

            // generate get time method
            ConversionHelper.GenerateTimeMethod(state);

            // generate the codelets
            Identifier codeletsIdentifier;

            ConversionHelper.GenerateCodelets(state, getOpenCLTimeDelegateType, startOpenCLDelegateType, out codeletsIdentifier);

            // process arguments
            Identifier     dataUsesIdentifier;
            ExpressionList constructArguments = new ExpressionList();

            ConversionHelper.ProcessArguments(state, sortedArguments, scalarArguments, complexIndexer, startOpenCLDelegateType, out dataUsesIdentifier, ref state.Constructor.Parameters, ref constructArguments);

            ConversionHelper.GenerateSubmitCodelet(state, codeletsIdentifier, dataUsesIdentifier);

            ConversionHelper.FinishOperation(state, finalConversionResult);

            String completeExpression   = string.Format("{0} = {1}", ConversionHelper.FormatIdentifierExpression(receiverComputeType, indices, receiverArgument.Index, complexIndexer), finalConversionResult.CompleteExpression);
            Class  actualOperationClass = CONTEXT._operationRegistry.RegisterOperation(completeExpression, state.Class);

            return(new ExpressionStatement {
                Expression = new Construct {
                    Constructor = new MemberBinding {
                        BoundMember = actualOperationClass.GetConstructors()[0],
                    },
                    Operands = constructArguments,
                }
            });
        }
Esempio n. 2
0
 protected override void Visit_INDEXER(INDEXER node)
 {
     /* MOVE CODE HERE */
 }
Esempio n. 3
0
 protected virtual void Visit_INDEXER(INDEXER node)
 {
 }