a41a0e28c2
Not hooked up to the build yet.
58 lines
1 KiB
C
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;
|
|
}
|