Systemd/klibc/klibc/arch/alpha/divide.c
greg@kroah.com a41a0e28c2 [PATCH] added klibc version 0.82 (cvs tree) to the udev tree.
Not hooked up to the build yet.
2005-04-26 21:05:23 -07:00

58 lines
1 KiB
C

#include <stdint.h>
#include <asm/gentrap.h>
#include <asm/pal.h>
#if BITS == 64
typedef uint64_t uint;
typedef int64_t sint;
#else
typedef uint32_t uint;
typedef int32_t sint;
#endif
#ifdef SIGNED
typedef sint xint;
#else
typedef uint xint;
#endif
xint NAME (uint num, uint den)
{
uint quot = 0, qbit = 1;
int minus = 0;
xint v;
if ( den == 0 ) {
/* This is really $16, but $16 and $24 are exchanged by a script */
register unsigned long cause asm("$24") = GEN_INTDIV;
asm volatile("call_pal %0" :: "i" (PAL_gentrap), "r" (cause));
return 0; /* If trap returns... */
}
#if SIGNED
if ( (sint)(num^den) < 0 )
minus = 1;
if ( (sint)num < 0 ) num = -num;
if ( (sint)den < 0 ) den = -den;
#endif
/* Left-justify denominator and count shift */
while ( (sint)den >= 0 ) {
den <<= 1;
qbit <<= 1;
}
while ( qbit ) {
if ( den <= num ) {
num -= den;
quot += qbit;
}
den >>= 1;
qbit >>= 1;
}
v = (xint)(REM ? num : quot);
if ( minus ) v = -v;
return v;
}