Esempio n. 1
0
 public void Visit(GenericAtomic atomic)
 {
     if (Get <GenericAtomic>().Kind != atomic.Kind)
     {
         Fail();
     }
 }
Esempio n. 2
0
        /// <summary cref="IValueVisitor.Visit(GenericAtomic)"/>
        public void Visit(GenericAtomic atomic)
        {
            var target = LoadPrimitive(atomic.Target);
            var value  = LoadPrimitive(atomic.Value);

            var requiresResult  = atomic.Uses.HasAny || atomic.Kind == AtomicKind.Exchange;
            var atomicOperation = PTXInstructions.GetAtomicOperation(
                atomic.Kind,
                requiresResult);
            var suffix = PTXInstructions.GetAtomicOperationSuffix(
                atomic.Kind,
                atomic.ArithmeticBasicValueType);

            var targetRegister = requiresResult ? AllocatePrimitive(atomic) : default;

            using (var command = BeginCommand(atomicOperation))
            {
                command.AppendNonLocalAddressSpace(
                    (atomic.Target.Type as AddressSpaceType).AddressSpace);
                command.AppendSuffix(suffix);
                if (requiresResult)
                {
                    command.AppendArgument(targetRegister);
                }
                command.AppendArgumentValue(target);
                command.AppendArgument(value);
            }
        }
Esempio n. 3
0
        /// <summary cref="IValueVisitor.Visit(GenericAtomic)"/>
        public void Visit(GenericAtomic atomic)
        {
            var target = LoadIntrinsic(atomic.Target);
            var value  = LoadIntrinsic(atomic.Value);

            var atomicOperation = CLInstructions.GetAtomicOperation(atomic.Kind);

            StatementEmitter statement;

            if (atomic.Kind == AtomicKind.Exchange)
            {
                var result = AllocateIntrinsic(atomic);
                statement = BeginStatement(result, atomicOperation);
            }
            else
            {
                statement = BeginStatement(atomicOperation);
            }

            statement.BeginArguments();
            statement.AppendAtomicCast(atomic.ArithmeticBasicValueType);
            statement.AppendArgument(target);
            statement.AppendArgument(value);
            statement.EndArguments();

            statement.Dispose();
        }
Esempio n. 4
0
        /// <summary cref="IBackendCodeGenerator.GenerateCode(GenericAtomic)"/>
        public void GenerateCode(GenericAtomic atomic)
        {
            var target = Load(atomic.Target);
            var value  = Load(atomic.Value);
            var result = Allocate(atomic);

            var atomicOperation = CLInstructions.GetAtomicOperation(atomic.Kind);

            using var statement = BeginStatement(result, atomicOperation);
            statement.BeginArguments();
            statement.AppendAtomicCast(atomic.ArithmeticBasicValueType);
            statement.AppendArgument(target);
            statement.AppendArgument(value);
            statement.EndArguments();
        }
Esempio n. 5
0
 /// <summary cref="IValueVisitor.Visit(GenericAtomic)"/>
 public void Visit(GenericAtomic atomic) =>
 CodeGenerator.GenerateCode(atomic);