https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104116
--- Comment #6 from Avinash Jayakar <avinashd at gcc dot gnu.org> ---
ROUND_MOD_EXPR and ROUND_DIV_EXPR can be implemented as follows (as done in
expand_divmod)
For unsigned
r = x %[rd] y;
is
r = x % y; if (r > ((y - 1) >> 1)) r -= y;
d = x /[rd] y;
is
r = x % y; d = x / y; if (r > ((y - 1) >> 1)) d++;
For signed
r = x %[rd] y; d = x %[rd] y;
is
r = x % y; d = x / y;
if (r > ((y - 1) >> 1))
{
if (x ^ y < 0) { r += y; d--; }
else { r -= y; d++; }
}