[Mesa-dev] [PATCH 01/38] ac: add various helpers for float16/int16/int8

Marek Olšák maraeo at gmail.com
Tue Dec 18 02:47:26 UTC 2018


On Fri, Dec 7, 2018 at 12:22 PM Rhys Perry <pendingchaos02 at gmail.com> wrote:

> Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
> ---
>  src/amd/common/ac_llvm_build.c  | 123 ++++++++++++++++++++++++++++++--
>  src/amd/common/ac_llvm_build.h  |  22 +++++-
>  src/amd/common/ac_nir_to_llvm.c |  30 ++++----
>  3 files changed, 154 insertions(+), 21 deletions(-)
>
> diff --git a/src/amd/common/ac_llvm_build.c
> b/src/amd/common/ac_llvm_build.c
> index 154cc696a2..cc7c6da5a4 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -87,12 +87,16 @@ ac_llvm_context_init(struct ac_llvm_context *ctx,
>         ctx->v4f32 = LLVMVectorType(ctx->f32, 4);
>         ctx->v8i32 = LLVMVectorType(ctx->i32, 8);
>
> +       ctx->i8_0 = LLVMConstInt(ctx->i8, 0, false);
> +       ctx->i8_1 = LLVMConstInt(ctx->i8, 1, false);
>         ctx->i16_0 = LLVMConstInt(ctx->i16, 0, false);
>         ctx->i16_1 = LLVMConstInt(ctx->i16, 1, false);
>         ctx->i32_0 = LLVMConstInt(ctx->i32, 0, false);
>         ctx->i32_1 = LLVMConstInt(ctx->i32, 1, false);
>         ctx->i64_0 = LLVMConstInt(ctx->i64, 0, false);
>         ctx->i64_1 = LLVMConstInt(ctx->i64, 1, false);
> +       ctx->f16_0 = LLVMConstReal(ctx->f16, 0.0);
> +       ctx->f16_1 = LLVMConstReal(ctx->f16, 1.0);
>         ctx->f32_0 = LLVMConstReal(ctx->f32, 0.0);
>         ctx->f32_1 = LLVMConstReal(ctx->f32, 1.0);
>         ctx->f64_0 = LLVMConstReal(ctx->f64, 0.0);
> @@ -201,7 +205,9 @@ ac_get_type_size(LLVMTypeRef type)
>
>  static LLVMTypeRef to_integer_type_scalar(struct ac_llvm_context *ctx,
> LLVMTypeRef t)
>  {
> -       if (t == ctx->f16 || t == ctx->i16)
> +       if (t == ctx->i8)
> +               return ctx->i8;
> +       else if (t == ctx->f16 || t == ctx->i16)
>                 return ctx->i16;
>         else if (t == ctx->f32 || t == ctx->i32)
>                 return ctx->i32;
> @@ -268,6 +274,110 @@ ac_to_float(struct ac_llvm_context *ctx,
> LLVMValueRef v)
>         return LLVMBuildBitCast(ctx->builder, v, ac_to_float_type(ctx,
> type), "");
>  }
>
> +LLVMValueRef ac_get_zerof(struct ac_llvm_context *ctx, LLVMTypeRef t)
> +{
> +       if (t == ctx->f16)
> +               return ctx->f16_0;
> +       else if (t == ctx->f32)
> +               return ctx->f32_0;
> +       else if (t == ctx->f64)
> +               return ctx->f64_0;
> +       else
> +               unreachable("Unhandled float size");
> +}
> +
> +LLVMValueRef ac_get_onef(struct ac_llvm_context *ctx, LLVMTypeRef t)
> +{
> +       if (t == ctx->f16)
> +               return ctx->f16_1;
> +       else if (t == ctx->f32)
> +               return ctx->f32_1;
> +       else if (t == ctx->f64)
> +               return ctx->f64_1;
> +       else
> +               unreachable("Unhandled float size");
> +}
> +
> +LLVMValueRef ac_get_zero(struct ac_llvm_context *ctx, LLVMTypeRef t)
> +{
> +       if (t == ctx->i8)
> +               return ctx->i8_0;
> +       else if (t == ctx->i16)
> +               return ctx->i16_0;
> +       else if (t == ctx->i32)
> +               return ctx->i32_0;
> +       else if (t == ctx->i64)
> +               return ctx->i64_0;
> +       else
> +               unreachable("Unhandled bit size");
> +}
> +
> +LLVMValueRef ac_get_one(struct ac_llvm_context *ctx, LLVMTypeRef t)
> +{
> +       if (t == ctx->i8)
> +               return ctx->i8_1;
> +       else if (t == ctx->i16)
> +               return ctx->i16_1;
> +       else if (t == ctx->i32)
> +               return ctx->i32_1;
> +       else if (t == ctx->i64)
> +               return ctx->i64_1;
> +       else
> +               unreachable("Unhandled bit size");
> +}
>

You don't need these helpers. You can just use LLVMConstInt and
LLVMConstReal.


> +
> +LLVMTypeRef ac_float_of_size(struct ac_llvm_context *ctx, unsigned
> bit_size)
> +{
> +       switch (bit_size) {
> +       case 16:
> +               return ctx->f16;
> +       case 32:
> +               return ctx->f32;
> +       case 64:
> +               return ctx->f64;
> +       default:
> +               unreachable("Unhandled bit size");
> +       }
> +}
> +
> +LLVMTypeRef ac_int_of_size(struct ac_llvm_context *ctx, unsigned bit_size)
> +{
> +       switch (bit_size) {
> +       case 8:
> +               return ctx->i8;
> +       case 16:
> +               return ctx->i16;
> +       case 32:
> +               return ctx->i32;
> +       case 64:
> +               return ctx->i64;
> +       default:
> +               unreachable("Unhandled bit size");
> +       }
> +}
>

This is the same as LLVMIntTypeInContext.

Marek
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181217/a028f006/attachment-0001.html>


More information about the mesa-dev mailing list