From 2933af75762a05a7ca89a866755d4a7d3f8b7d9f Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 17 Mar 2023 22:57:06 -0400 Subject: [PATCH] nir/builder: Add nir_umod_imm helper Like nir_udiv_imm, we can do a similar power-of-two trick. It's also really convenient. v2: Assert reasonable bounds on the modulus (Faith). Signed-off-by: Alyssa Rosenzweig Reviewed-by: Bas Nieuwenhuizen [v1] Reviewed-by: Lionel Landwerlin [v1] Reviewed-by: Faith Ekstrand Part-of: --- src/compiler/nir/nir_builder.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index 83b2b6efd09..ad367d114ce 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -882,6 +882,18 @@ nir_udiv_imm(nir_builder *build, nir_ssa_def *x, uint64_t y) } } +static inline nir_ssa_def * +nir_umod_imm(nir_builder *build, nir_ssa_def *x, uint64_t y) +{ + assert(y > 0 && y <= u_uintN_max(x->bit_size)); + + if (util_is_power_of_two_nonzero(y)) { + return nir_iand_imm(build, x, y - 1); + } else { + return nir_umod(build, x, nir_imm_intN_t(build, y, x->bit_size)); + } +} + static inline nir_ssa_def * nir_ibfe_imm(nir_builder *build, nir_ssa_def *x, uint32_t offset, uint32_t size) {