Home | History | Annotate | Download | only in libgcc
      1 #include "libgcc.h"
      2 
      3 __libgcc uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p)
      4 {
      5   uint64_t quot = 0, qbit = 1;
      6 
      7   if ( den == 0 ) {
      8     return 1/((unsigned)den); /* Intentional divide by zero, without
      9 				 triggering a compiler warning which
     10 				 would abort the build */
     11   }
     12 
     13   /* Left-justify denominator and count shift */
     14   while ( (int64_t)den >= 0 ) {
     15     den <<= 1;
     16     qbit <<= 1;
     17   }
     18 
     19   while ( qbit ) {
     20     if ( den <= num ) {
     21       num -= den;
     22       quot += qbit;
     23     }
     24     den >>= 1;
     25     qbit >>= 1;
     26   }
     27 
     28   if ( rem_p )
     29     *rem_p = num;
     30 
     31   return quot;
     32 }
     33