[Mesa-dev] [PATCH] ac/llvm: use amdgcn.tbuffer.store instead of SI.tbuffer.store intrinsic

Marek Olšák maraeo at gmail.com
Thu May 17 00:45:30 UTC 2018


The new intrinsic is supported since LLVM 5.0. With that fixed:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Tue, May 15, 2018 at 8:24 PM, Dave Airlie <airlied at gmail.com> wrote:

> From: Dave Airlie <airlied at redhat.com>
>
> Drop the use of the old intrinsic.
> ---
>  src/amd/common/ac_llvm_build.c | 92 +++++++++++++++++++++++++++---
> ------------
>  1 file changed, 60 insertions(+), 32 deletions(-)
>
> diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_
> build.c
> index c9b2e36b632..18a624a0dae 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -888,11 +888,18 @@ ac_build_buffer_store_dword(struct ac_llvm_context
> *ctx,
>                             bool writeonly_memory,
>                             bool swizzle_enable_hint)
>  {
> +       static unsigned dfmt[] = {
> +               V_008F0C_BUF_DATA_FORMAT_32,
> +               V_008F0C_BUF_DATA_FORMAT_32_32,
> +               V_008F0C_BUF_DATA_FORMAT_32_32_32,
> +               V_008F0C_BUF_DATA_FORMAT_32_32_32_32
> +       };
> +
>         /* SWIZZLE_ENABLE requires that soffset isn't folded into voffset
>          * (voffset is swizzled, but soffset isn't swizzled).
>          * llvm.amdgcn.buffer.store doesn't have a separate soffset
> parameter.
>          */
> -       if (!swizzle_enable_hint) {
> +       if (!swizzle_enable_hint || HAVE_LLVM >= 0x0700) {
>                 /* Split 3 channel stores, becase LLVM doesn't support
> 3-channel
>                  * intrinsics. */
>                 if (num_channels == 3) {
> @@ -915,42 +922,63 @@ ac_build_buffer_store_dword(struct ac_llvm_context
> *ctx,
>                 }
>
>                 unsigned func = CLAMP(num_channels, 1, 3) - 1;
> -               static const char *types[] = {"f32", "v2f32", "v4f32"};
>                 char name[256];
> -               LLVMValueRef offset = soffset;
> -
> -               if (inst_offset)
> -                       offset = LLVMBuildAdd(ctx->builder, offset,
> -                                             LLVMConstInt(ctx->i32,
> inst_offset, 0), "");
> -               if (voffset)
> -                       offset = LLVMBuildAdd(ctx->builder, offset,
> voffset, "");
> -
> -               LLVMValueRef args[] = {
> -                       ac_to_float(ctx, vdata),
> -                       LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32,
> ""),
> -                       LLVMConstInt(ctx->i32, 0, 0),
> -                       offset,
> -                       LLVMConstInt(ctx->i1, glc, 0),
> -                       LLVMConstInt(ctx->i1, slc, 0),
> -               };
> -
> -               snprintf(name, sizeof(name), "llvm.amdgcn.buffer.store.%s",
> -                        types[func]);
> -
> -               ac_build_intrinsic(ctx, name, ctx->voidt,
> -                                  args, ARRAY_SIZE(args),
> -                                  writeonly_memory ?
> +
> +               if (!swizzle_enable_hint) {
> +                       LLVMValueRef offset = soffset;
> +
> +                       static const char *types[] = {"f32", "v2f32",
> "v4f32"};
> +
> +                       if (inst_offset)
> +                               offset = LLVMBuildAdd(ctx->builder, offset,
> +
>  LLVMConstInt(ctx->i32, inst_offset, 0), "");
> +                       if (voffset)
> +                               offset = LLVMBuildAdd(ctx->builder,
> offset, voffset, "");
> +
> +                       LLVMValueRef args[] = {
> +                               ac_to_float(ctx, vdata),
> +                               LLVMBuildBitCast(ctx->builder, rsrc,
> ctx->v4i32, ""),
> +                               LLVMConstInt(ctx->i32, 0, 0),
> +                               offset,
> +                               LLVMConstInt(ctx->i1, glc, 0),
> +                               LLVMConstInt(ctx->i1, slc, 0),
> +                       };
> +
> +                       snprintf(name, sizeof(name),
> "llvm.amdgcn.buffer.store.%s",
> +                                types[func]);
> +
> +                       ac_build_intrinsic(ctx, name, ctx->voidt,
> +                                          args, ARRAY_SIZE(args),
> +                                          writeonly_memory ?
>                                            AC_FUNC_ATTR_INACCESSIBLE_MEM_ONLY
> :
>                                            AC_FUNC_ATTR_WRITEONLY);
> -               return;
> +                       return;
> +               } else {
> +                       static const char *types[] = {"i32", "v2i32",
> "v4i32"};
> +                       LLVMValueRef args[] = {
> +                               vdata,
> +                               LLVMBuildBitCast(ctx->builder, rsrc,
> ctx->v4i32, ""),
> +                               LLVMConstInt(ctx->i32, 0, 0),
> +                               voffset ? voffset : LLVMConstInt(ctx->i32,
> 0, 0),
> +                               soffset,
> +                               LLVMConstInt(ctx->i32, inst_offset, 0),
> +                               LLVMConstInt(ctx->i32, dfmt[num_channels -
> 1], 0),
> +                               LLVMConstInt(ctx->i32,
> V_008F0C_BUF_NUM_FORMAT_UINT, 0),
> +                               LLVMConstInt(ctx->i1, glc, 0),
> +                               LLVMConstInt(ctx->i1, slc, 0),
> +                       };
> +                       snprintf(name, sizeof(name),
> "llvm.amdgcn.tbuffer.store.%s",
> +                                types[func]);
> +
> +                       ac_build_intrinsic(ctx, name, ctx->voidt,
> +                                          args, ARRAY_SIZE(args),
> +                                          writeonly_memory ?
> +                                          AC_FUNC_ATTR_INACCESSIBLE_MEM_ONLY
> :
> +                                          AC_FUNC_ATTR_WRITEONLY);
> +                       return;
> +               }
>         }
>
> -       static unsigned dfmt[] = {
> -               V_008F0C_BUF_DATA_FORMAT_32,
> -               V_008F0C_BUF_DATA_FORMAT_32_32,
> -               V_008F0C_BUF_DATA_FORMAT_32_32_32,
> -               V_008F0C_BUF_DATA_FORMAT_32_32_32_32
> -       };
>         assert(num_channels >= 1 && num_channels <= 4);
>
>         LLVMValueRef args[] = {
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180516/5927b7df/attachment.html>


More information about the mesa-dev mailing list