/* { dg-do run } */ /* { dg-require-effective-target arm_eabi } */ /* { dg-options "" } */ /* Check that long long divmod functions pass the right argument to __aeabi_ldiv0 on divide by zero. */ #ifdef DEBUGME #include #else extern void abort (void); #endif /* Override div zero handler and simply return the provided value. */ long long __aeabi_ldiv0 (long long r) { return r; } long long lldiv (long long a, long long b) { return a / b; } unsigned long long ulldiv (unsigned long long a, unsigned long long b) { return a / b; } void check (long long num, long long expected) { long long res = lldiv (num, 0LL); if (res != expected) #ifdef DEBUGME { printf ("num=%08X:%08X\n", (unsigned)(num >> 32), (unsigned)num); printf ("res=%08X:%08X\n", (unsigned)(res >> 32), (unsigned)res); } #else abort (); #endif } void ucheck (unsigned long long num, unsigned long long expected) { unsigned long long res = ulldiv (num, 0ULL); if (res != expected) #ifdef DEBUGME { printf ("num=%08X:%08X\n", (unsigned)(num >> 32), (unsigned)num); printf ("res=%08X:%08X\n", (unsigned)(res >> 32), (unsigned)res); } #else abort (); #endif } #define POS_BIG 0x7fffffffffffffffLL #define NEG_BIG 0x8000000000000000LL #define UNS_BIG 0xffffffffffffffffULL int main () { check (0LL, 0LL); check (1LL, POS_BIG); check (0x000000007fffffffLL, POS_BIG); check (0x00000000ffffffffLL, POS_BIG); check (0x0000000100000000LL, POS_BIG); check (POS_BIG, POS_BIG); check (-1LL, NEG_BIG); check (-0x000000007fffffffLL, NEG_BIG); check (-0x00000000ffffffffLL, NEG_BIG); check (-0x0000000100000000LL, NEG_BIG); check (NEG_BIG, NEG_BIG); ucheck (0ULL, 0ULL); ucheck (1ULL, UNS_BIG); ucheck (0x000000007fffffffULL, UNS_BIG); ucheck (0x00000000ffffffffULL, UNS_BIG); ucheck (0x0000000100000000ULL, UNS_BIG); ucheck ((unsigned long long)POS_BIG, UNS_BIG); ucheck (UNS_BIG, UNS_BIG); return 0; }