public void Visit(GenericAtomic atomic) { if (Get <GenericAtomic>().Kind != atomic.Kind) { Fail(); } }
/// <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); } }
/// <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(); }
/// <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(); }
/// <summary cref="IValueVisitor.Visit(GenericAtomic)"/> public void Visit(GenericAtomic atomic) => CodeGenerator.GenerateCode(atomic);