ac: add 16-bit support to ac_build_ddxy()
authorRhys Perry <pendingchaos02@gmail.com>
Mon, 8 Apr 2019 07:24:57 +0000 (09:24 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 10 Apr 2019 07:05:58 +0000 (09:05 +0200)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/common/ac_llvm_build.c

index 54e90288bda5d19b515682616df02698ea0a3ae6..3e3ca5c7fdb36cff6a80cd556946d93f1ea0b395 100644 (file)
@@ -1862,9 +1862,16 @@ ac_build_ddxy(struct ac_llvm_context *ctx,
              LLVMValueRef val)
 {
        unsigned tl_lanes[4], trbl_lanes[4];
+       char name[32], type[8];
        LLVMValueRef tl, trbl;
+       LLVMTypeRef result_type;
        LLVMValueRef result;
 
+       result_type = ac_to_float_type(ctx, LLVMTypeOf(val));
+
+       if (result_type == ctx->f16)
+               val = LLVMBuildZExt(ctx->builder, val, ctx->i32, "");
+
        for (unsigned i = 0; i < 4; ++i) {
                tl_lanes[i] = i & mask;
                trbl_lanes[i] = (i & mask) + idx;
@@ -1877,14 +1884,19 @@ ac_build_ddxy(struct ac_llvm_context *ctx,
                                     trbl_lanes[0], trbl_lanes[1],
                                     trbl_lanes[2], trbl_lanes[3]);
 
-       tl = LLVMBuildBitCast(ctx->builder, tl, ctx->f32, "");
-       trbl = LLVMBuildBitCast(ctx->builder, trbl, ctx->f32, "");
+       if (result_type == ctx->f16) {
+               tl = LLVMBuildTrunc(ctx->builder, tl, ctx->i16, "");
+               trbl = LLVMBuildTrunc(ctx->builder, trbl, ctx->i16, "");
+       }
+
+       tl = LLVMBuildBitCast(ctx->builder, tl, result_type, "");
+       trbl = LLVMBuildBitCast(ctx->builder, trbl, result_type, "");
        result = LLVMBuildFSub(ctx->builder, trbl, tl, "");
 
-       result = ac_build_intrinsic(ctx, "llvm.amdgcn.wqm.f32", ctx->f32,
-                                   &result, 1, 0);
+       ac_build_type_name_for_intr(result_type, type, sizeof(type));
+       snprintf(name, sizeof(name), "llvm.amdgcn.wqm.%s", type);
 
-       return result;
+       return ac_build_intrinsic(ctx, name, result_type, &result, 1, 0);
 }
 
 void