ac/llvm: fix b2f for v2f16
authorMarek Olšák <marek.olsak@amd.com>
Sun, 6 Sep 2020 07:46:59 +0000 (03:46 -0400)
committerVivek Pandya <vivekvpandya@gmail.com>
Mon, 7 Sep 2020 15:55:16 +0000 (21:25 +0530)
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6284>

src/amd/llvm/ac_llvm_build.c
src/amd/llvm/ac_llvm_build.h
src/amd/llvm/ac_nir_to_llvm.c

index 861db0d889ae73d21fc2923fcaece79af701f6fa..79a5f8fbb2bad3f87b5163455366dee651a78640 100644 (file)
@@ -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) {
index 6491843cd78241cbe1fffaa7e0dabb0fb0c3d0b9..a009560841d450b9df027f1bfeb7381c0d19875f 100644 (file)
@@ -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);
index 4b696f28f124eb774a15483da9c1d4eb84dad17e..9ea32c70b660f031865d18f2a019a26459b3d082 100644 (file)
@@ -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: