https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97459
--- Comment #10 from Thomas Koenig <tkoenig at gcc dot gnu.org> --- There are a couple of more constants for this could be tried. Base 7: static unsigned rem_7_v2 (mytype n) { unsigned long a, b, c, d; a = n & MASK_48; b = (n >> 48) & MASK_48; c = n >> 96; return (a+b+c) % 7; } gives the reminder with respect to 7. The reason is that 2^48-1 = 3*3*5*7*13*17*97*241*257*673, so a shift of 48 bits works for any combination of these factors. However, for 15, I would have to check if it would be better to use the 64-bit shift. For 19, it's a shift of 56 that would work. I think I'd better make a table.