#include "longlong.h" #define HIGH_WORD_COEFF (((long long) 1) << BITS_PER_WORD) long long __fixunsdfdi (a) double a; { double b; unsigned long long v; if (a < 0) return 0; /* Compute high word of result, as a flonum. */ b = (a / HIGH_WORD_COEFF); /* Convert that to fixed (but not to long long!), and shift it into the high word. */ v = (unsigned long int) b; v <<= BITS_PER_WORD; /* Remove high part from the double, leaving the low part as flonum. */ a -= (double)v; /* Convert that to fixed (but not to long long!) and add it in. Sometimes A comes out negative. This is significant, since A has more bits than a long int does. */ if (a < 0) v -= (unsigned long int) (- a); else v += (unsigned long int) a; return v; }