From 791c1ce7549eeccaffca7d89abbf064629d27606 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Mon, 12 May 2025 12:38:17 -0400 Subject: [PATCH] gallivm: Use `llvm.roundeven` in lp_build_round() `lp_build_round` intends to implement round with ties-to-even behavior, as can be seen by its test's use of `nearbyint` to generate reference values and by it use in implementing `nir_op_fround_even`. Fixes: 0d3b2853600 ("gallivm: use llvm intrinsics for 16-bit round/trunc/roundeven") Part-of: (cherry picked from commit eea3ed6a3704dbd90913906c22b585eefb22a1cc) --- .pick_status.json | 2 +- src/gallium/auxiliary/gallivm/lp_bld_arit.c | 2 +- src/gallium/auxiliary/gallivm/lp_bld_nir.c | 9 +-------- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 52563857dc4..c5c4e4dceb0 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3454,7 +3454,7 @@ "description": "gallivm: Use `llvm.roundeven` in lp_build_round()", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "0d3b2853600cf6934a3a09deaf435944d18d833a", "notes": null diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c index 991d4163f72..2ae86415f0e 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c @@ -2100,7 +2100,7 @@ lp_build_round(struct lp_build_context *bld, if (type.width == 16) { char intrinsic[64]; - lp_format_intrinsic(intrinsic, 64, "llvm.round", bld->vec_type); + lp_format_intrinsic(intrinsic, 64, "llvm.roundeven", bld->vec_type); return lp_build_intrinsic_unary(builder, intrinsic, bld->vec_type, a); } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_nir.c b/src/gallium/auxiliary/gallivm/lp_bld_nir.c index 950970e9d9d..a805e98930d 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_nir.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_nir.c @@ -776,14 +776,7 @@ do_alu_action(struct lp_build_nir_context *bld_base, result = lp_build_rcp(get_flt_bld(bld_base, src_bit_size[0]), src[0]); break; case nir_op_fround_even: - if (src_bit_size[0] == 16) { - struct lp_build_context *bld = get_flt_bld(bld_base, 16); - char intrinsic[64]; - lp_format_intrinsic(intrinsic, 64, "llvm.roundeven", bld->vec_type); - result = lp_build_intrinsic_unary(builder, intrinsic, bld->vec_type, src[0]); - } else { - result = lp_build_round(get_flt_bld(bld_base, src_bit_size[0]), src[0]); - } + result = lp_build_round(get_flt_bld(bld_base, src_bit_size[0]), src[0]); break; case nir_op_frsq: result = lp_build_rsqrt(get_flt_bld(bld_base, src_bit_size[0]), src[0]);