From 836b0ace10146957fa0fdc33fcf3391103a6459b Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 22 Jul 2021 15:36:59 +1000 Subject: [PATCH] gallivm/nir: handle 16-bit exp/lod using intrinsics. This just passes the 16-bit float versions to the llvm intrinsics Reviewed-by: Roland Scheidegger Part-of: --- src/gallium/auxiliary/gallivm/lp_bld_arit.c | 16 ++++++++++++++++ src/gallium/auxiliary/gallivm/lp_bld_nir.c | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c index b6e9ebd4546..3b4430e7ab3 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c @@ -3227,6 +3227,13 @@ lp_build_exp2(struct lp_build_context *bld, LLVMValueRef expfpart = NULL; LLVMValueRef res = NULL; + if (type.floating && type.width == 16) { + char intrinsic[32]; + lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.exp2", vec_type); + LLVMValueRef args[] = { x }; + return lp_build_intrinsic(builder, intrinsic, vec_type, args, 1, 0); + } + assert(lp_check_value(bld->type, x)); /* TODO: optimize the constant case */ @@ -3408,6 +3415,15 @@ lp_build_log2_approx(struct lp_build_context *bld, LLVMValueRef p_z = NULL; LLVMValueRef res = NULL; + if (bld->type.width == 16) { + char intrinsic[32]; + lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.log2", bld->vec_type); + LLVMValueRef args[] = { x }; + if (p_log2) + *p_log2 = lp_build_intrinsic(builder, intrinsic, bld->vec_type, args, 1, 0); + return; + } + assert(lp_check_value(bld->type, x)); if(p_exp || p_floor_log2 || p_log2) { diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c index 28c7eafe54a..04dd86a3115 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c @@ -704,7 +704,7 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base, result = fcmp32(bld_base, PIPE_FUNC_EQUAL, src_bit_size[0], src); break; case nir_op_fexp2: - result = lp_build_exp2(&bld_base->base, src[0]); + result = lp_build_exp2(get_flt_bld(bld_base, src_bit_size[0]), src[0]); break; case nir_op_ffloor: result = lp_build_floor(get_flt_bld(bld_base, src_bit_size[0]), src[0]); @@ -734,7 +734,7 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base, result = lp_build_isfinite(get_flt_bld(bld_base, src_bit_size[0]), src[0]); break; case nir_op_flog2: - result = lp_build_log2_safe(&bld_base->base, src[0]); + result = lp_build_log2_safe(get_flt_bld(bld_base, src_bit_size[0]), src[0]); break; case nir_op_flt: case nir_op_flt32: