Beispiel #1
0
 /// <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());
 }
Beispiel #2
0
 /// <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());
 }
Beispiel #3
0
        /// <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;
        }
Beispiel #4
0
        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)));
        }
Beispiel #5
0
        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)));
        }
Beispiel #6
0
 public static string GetAtomicOperationSuffix(AtomicKind kind, ArithmeticBasicValueType type) =>
Beispiel #7
0
 public static string GetAtomicOperation(AtomicKind kind, bool requireResult) =>