From c406ba78c8d0dab3171e6cd1018dd6e4f97ff7ee Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 6 Sep 2020 03:46:59 -0400 Subject: [PATCH] ac/llvm: fix b2f for v2f16 Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/llvm/ac_llvm_build.c | 2 +- src/amd/llvm/ac_llvm_build.h | 1 + src/amd/llvm/ac_nir_to_llvm.c | 11 +++++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/amd/llvm/ac_llvm_build.c b/src/amd/llvm/ac_llvm_build.c index 861db0d889a..79a5f8fbb2b 100644 --- a/src/amd/llvm/ac_llvm_build.c +++ b/src/amd/llvm/ac_llvm_build.c @@ -2751,7 +2751,7 @@ LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0, AC_FUNC_ATTR_READNONE); } -static LLVMValueRef ac_const_uint_vec(struct ac_llvm_context *ctx, LLVMTypeRef type, uint64_t value) +LLVMValueRef ac_const_uint_vec(struct ac_llvm_context *ctx, LLVMTypeRef type, uint64_t value) { if (LLVMGetTypeKind(type) == LLVMVectorTypeKind) { diff --git a/src/amd/llvm/ac_llvm_build.h b/src/amd/llvm/ac_llvm_build.h index 6491843cd78..a009560841d 100644 --- a/src/amd/llvm/ac_llvm_build.h +++ b/src/amd/llvm/ac_llvm_build.h @@ -597,6 +597,7 @@ void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned wait_flags); LLVMValueRef ac_build_fract(struct ac_llvm_context *ctx, LLVMValueRef src0, unsigned bitsize); +LLVMValueRef ac_const_uint_vec(struct ac_llvm_context *ctx, LLVMTypeRef type, uint64_t value); LLVMValueRef ac_build_isign(struct ac_llvm_context *ctx, LLVMValueRef src0); LLVMValueRef ac_build_fsign(struct ac_llvm_context *ctx, LLVMValueRef src); LLVMValueRef ac_build_bit_count(struct ac_llvm_context *ctx, LLVMValueRef src0); diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 4b696f28f12..9ea32c70b66 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -330,14 +330,17 @@ static LLVMValueRef emit_b2f(struct ac_llvm_context *ctx, LLVMValueRef src0, unsigned bitsize) { + assert(ac_get_elem_bits(ctx, LLVMTypeOf(src0)) == 32); LLVMValueRef result = LLVMBuildAnd(ctx->builder, src0, - LLVMBuildBitCast(ctx->builder, LLVMConstReal(ctx->f32, 1.0), ctx->i32, ""), + ac_const_uint_vec(ctx, LLVMTypeOf(src0), 0x3f800000), ""); - result = LLVMBuildBitCast(ctx->builder, result, ctx->f32, ""); + result = ac_to_float(ctx, result); switch (bitsize) { - case 16: - return LLVMBuildFPTrunc(ctx->builder, result, ctx->f16, ""); + case 16: { + bool vec2 = LLVMGetTypeKind(LLVMTypeOf(result)) == LLVMVectorTypeKind; + return LLVMBuildFPTrunc(ctx->builder, result, vec2 ? ctx->v2f16 : ctx->f16, ""); + } case 32: return result; case 64: -- 2.30.2