https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113604
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |jakub at gcc dot gnu.org --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- longlong.h documents that HIGH_NUMERATOR must be less than DENOMINATOR for correct operation. If, in addition, the most significant bit of DENOMINATOR must be 1, then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1. While UDIV_NEEDS_NORMALIZATION is 1 only on sh32 and arches which don't define their udiv_qrnnd and fallback to C, the first requirement is there for all arches. 0xffffffff'ffffffff'ffff8000'03e00001uwb / 0xffffffff'ffffffffuwb is 0x1'00000000'00000000uwb and 0xffffffff'ffffffff'ffff8000'03e00001uwb % 0xffffffff'ffffffffuwb is 0xffff8000'03e00001uwb, so the quotient isn't representable in 64-bit number, which is why SIGFPE is triggered.