/// <summary> /// Resolves an atomic-operation suffix. /// </summary> /// <param name="kind">The arithmetic kind.</param> /// <param name="type">The operation type.</param> /// <returns>The resolved atomic-operation suffix.</returns> public static string GetAtomicOperationSuffix(AtomicKind kind, ArithmeticBasicValueType type) { if (AtomicOperationsTypes.TryGetValue((kind, type), out string operation)) { return(operation); } throw new NotSupportedIntrinsicException(kind.ToString()); }
/// <summary> /// Resolves an atomic operation. /// </summary> /// <param name="kind">The arithmetic kind.</param> /// <param name="requireResult">True, if the return value is required.</param> /// <returns>The resolved atomic operation.</returns> public static string GetAtomicOperation(AtomicKind kind, bool requireResult) { if (AtomicOperations.TryGetValue((kind, requireResult), out string operation)) { return(operation); } throw new NotSupportedIntrinsicException(kind.ToString()); }
/// <summary> /// Constructs a new generic atomic operation. /// </summary> /// <param name="basicBlock">The parent basic block.</param> /// <param name="target">The target.</param> /// <param name="value">The value to store.</param> /// <param name="kind">The operation kind.</param> /// <param name="flags">The operation flags.</param> internal GenericAtomic( BasicBlock basicBlock, ValueReference target, ValueReference value, AtomicKind kind, AtomicFlags flags) : base( basicBlock, target, value, ImmutableArray <ValueReference> .Empty, flags) { Debug.Assert(value.Type == (target.Type as PointerType).ElementType); Kind = kind; }
public MemoryValue CreateAtomic( Location location, Value target, Value value, AtomicKind kind, AtomicFlags flags) { location.Assert( target.Type is PointerType type && type.ElementType == value.Type); return(Append(new GenericAtomic( GetInitializer(location), target, value, kind, flags))); }
public MemoryValue CreateAtomic( Value target, Value value, AtomicKind kind, AtomicFlags flags) { Debug.Assert(target != null, "Invalid target node"); Debug.Assert(value != null, "Invalid value node"); Debug.Assert( target.Type is PointerType type && type.ElementType == value.Type, "Incompatible pointer and element types"); return(Append(new GenericAtomic( BasicBlock, target, value, kind, flags))); }
public static string GetAtomicOperationSuffix(AtomicKind kind, ArithmeticBasicValueType type) =>
public static string GetAtomicOperation(AtomicKind kind, bool requireResult) =>