From fd1fc255d9d89b1fe9e7d66c1668cde27aff4623 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Mon, 8 Apr 2019 09:24:57 +0200 Subject: [PATCH] ac: add 16-bit support to ac_build_ddxy() Signed-off-by: Rhys Perry Reviewed-by: Bas Nieuwenhuizen --- src/amd/common/ac_llvm_build.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index 54e90288bda..3e3ca5c7fdb 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -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 -- 2.30.2