/// <summary cref="CompilerDeviceFunctions.MakeWarp(InvocationContext, WarpIntrinsicKind)"/>
        protected override Value?MakeWarp(InvocationContext context, WarpIntrinsicKind kind)
        {
            var          builder = context.Builder;
            LLVMValueRef value;

            switch (kind)
            {
            case WarpIntrinsicKind.WarpSize:
                value = MakeWarpSize(builder);
                break;

            case WarpIntrinsicKind.LaneIdx:
                value = BuildCall(builder, GetLaneId.Value);
                break;

            default:
                KeyValuePair <Lazy <LLVMValueRef>, bool> shuffleKey;
                if (!ShuffleLookup.TryGetValue(kind, out shuffleKey))
                {
                    throw context.CompilationContext.GetNotSupportedException(
                              ErrorMessages.NotSupportedWarpIntrinsic, kind);
                }
                // Create final mask
                var args = context.GetLLVMArgs();
                args[2] = BuildWarpShuffleMask(context.Unit, builder, args[2], shuffleKey.Value);
                // Build desired shuffle instruction
                value = BuildCall(builder, shuffleKey.Key.Value, args);
                break;
            }
            return(new Value(typeof(int), value));
        }
 public WarpIntrinsicAttribute(WarpIntrinsicKind intrinsicKind)
 {
     IntrinsicKind = intrinsicKind;
 }
 /// <summary>
 /// Handles general warp operations.
 /// </summary>
 /// <param name="context">The current invocation context.</param>
 /// <param name="kind">The kind of the warp intrinsic.</param>
 /// <returns>The resulting value.</returns>
 protected abstract Value?MakeWarp(InvocationContext context, WarpIntrinsicKind kind);