On Fri, Aug 1, 2025 at 10:38 AM <pan2...@intel.com> wrote: > > From: Pan Li <pan2...@intel.com> > > This patch would like to try to match the the unsigned > SAT_MUL form 2, aka below: > > #define DEF_SAT_U_MUL_FMT_2(T) \ > T __attribute__((noinline)) \ > sat_u_mul_##T##_fmt_2 (T a, T b) \ > { \ > T result; \ > if (__builtin_mul_overflow(a, b, &result)) \ > return -1; \ > else \ > return result; \ > } > > While T is uint8_t, uint16_t, uint32_t and uint64_t.
OK. Thanks, Richard. > gcc/ChangeLog: > > * match.pd: Add form 2 for unsigned SAT_MUL. > > Signed-off-by: Pan Li <pan2...@intel.com> > --- > gcc/match.pd | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/gcc/match.pd b/gcc/match.pd > index 82e6e291ae1..a94730680ad 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -3623,6 +3623,18 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > bool c2_is_max_p = wi::eq_p (c2, max); > } > (if (widen_prec > prec && c2_is_max_p))))) > + (match (unsigned_integer_sat_mul @0 @1) > + /* SAT_U_MUL (X, Y) = { > + T result; > + if (__builtin_mul_overflow (X, Y, &result)) > + return -1; > + else > + return -(T)overflow_p | result; > + } > + while T can be uint8_t, uint16_t, uint32_t and uint64_t. */ > + (cond^ (ne (imagpart (IFN_MUL_OVERFLOW:c@2 @0 @1)) integer_zerop) > + integer_minus_onep (realpart @2)) > + (if (types_match (type, @0, @1)))) > ) > > /* The boundary condition for case 10: IMM = 1: > -- > 2.43.0 >