/// <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);