diff options
Diffstat (limited to 'lib/libc/quad/quad.h')
-rw-r--r-- | lib/libc/quad/quad.h | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/lib/libc/quad/quad.h b/lib/libc/quad/quad.h index 59a1829fde1..49d20cf4889 100644 --- a/lib/libc/quad/quad.h +++ b/lib/libc/quad/quad.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $OpenBSD: quad.h,v 1.4 2003/06/02 20:18:36 millert Exp $ + * $OpenBSD: quad.h,v 1.5 2004/04/27 17:46:46 otto Exp $ */ /* @@ -40,17 +40,21 @@ * * - The type long long (aka quad_t) exists. * - * - A quad variable is exactly twice as long as `long'. + * - A quad variable is exactly twice as long as `int'. * * - The machine's arithmetic is two's complement. * * This library can provide 128-bit arithmetic on a machine with 128-bit - * quads and 64-bit longs, for instance, or 96-bit arithmetic on machines - * with 48-bit longs. + * quads and 64-bit ints, for instance, or 96-bit arithmetic on machines + * with 48-bit ints. */ #include <sys/types.h> +#if !defined(_KERNEL) && !defined(_STANDALONE) #include <limits.h> +#else +#include <machine/limits.h> +#endif /* * Depending on the desired operation, we view a `long long' (aka quad_t) in @@ -59,12 +63,12 @@ union uu { quad_t q; /* as a (signed) quad */ u_quad_t uq; /* as an unsigned quad */ - long sl[2]; /* as two signed longs */ - u_long ul[2]; /* as two unsigned longs */ + int sl[2]; /* as two signed ints */ + u_int ul[2]; /* as two unsigned ints */ }; /* - * Define high and low longwords. + * Define high and low parts of a quad_t. */ #define H _QUAD_HIGHWORD #define L _QUAD_LOWWORD @@ -75,23 +79,21 @@ union uu { * and assembly. */ #define QUAD_BITS (sizeof(quad_t) * CHAR_BIT) -#define LONG_BITS (sizeof(long) * CHAR_BIT) -#define HALF_BITS (sizeof(long) * CHAR_BIT / 2) +#define INT_BITS (sizeof(int) * CHAR_BIT) +#define HALF_BITS (sizeof(int) * CHAR_BIT / 2) /* * Extract high and low shortwords from longword, and move low shortword of * longword to upper half of long, i.e., produce the upper longword of - * ((quad_t)(x) << (number_of_bits_in_long/2)). (`x' must actually be u_long.) + * ((quad_t)(x) << (number_of_bits_in_int/2)). (`x' must actually be u_int.) * * These are used in the multiply code, to split a longword into upper * and lower halves, and to reassemble a product as a quad_t, shifted left - * (sizeof(long)*CHAR_BIT/2). + * (sizeof(int)*CHAR_BIT/2). */ -#define HHALF(x) ((u_long)(x) >> HALF_BITS) -#define LHALF(x) ((u_long)(x) & (((long)1 << HALF_BITS) - 1)) -#define LHUP(x) ((u_long)(x) << HALF_BITS) - -extern u_quad_t __qdivrem(u_quad_t u, u_quad_t v, u_quad_t *rem); +#define HHALF(x) ((u_int)(x) >> HALF_BITS) +#define LHALF(x) ((u_int)(x) & (((int)1 << HALF_BITS) - 1)) +#define LHUP(x) ((u_int)(x) << HALF_BITS) /* * XXX @@ -99,8 +101,35 @@ extern u_quad_t __qdivrem(u_quad_t u, u_quad_t v, u_quad_t *rem); * as u_quad_t, while gcc 2 correctly uses int. Unfortunately, we still use * both compilers. */ -#if __GNUC__ >= 2 +#if __GNUC_PREREQ__(2, 0) || defined(lint) typedef unsigned int qshift_t; #else typedef u_quad_t qshift_t; #endif + +quad_t __adddi3(quad_t, quad_t); +quad_t __anddi3(quad_t, quad_t); +quad_t __ashldi3(quad_t, qshift_t); +quad_t __ashrdi3(quad_t, qshift_t); +int __cmpdi2(quad_t, quad_t); +quad_t __divdi3(quad_t, quad_t); +quad_t __fixdfdi(double); +quad_t __fixsfdi(float); +u_quad_t __fixunsdfdi(double); +u_quad_t __fixunssfdi(float); +double __floatdidf(quad_t); +float __floatdisf(quad_t); +double __floatunsdidf(u_quad_t); +quad_t __iordi3(quad_t, quad_t); +quad_t __lshldi3(quad_t, qshift_t); +quad_t __lshrdi3(quad_t, qshift_t); +quad_t __moddi3(quad_t, quad_t); +quad_t __muldi3(quad_t, quad_t); +quad_t __negdi2(quad_t); +quad_t __one_cmpldi2(quad_t); +u_quad_t __qdivrem(u_quad_t, u_quad_t, u_quad_t *); +quad_t __subdi3(quad_t, quad_t); +int __ucmpdi2(u_quad_t, u_quad_t); +u_quad_t __udivdi3(u_quad_t, u_quad_t ); +u_quad_t __umoddi3(u_quad_t, u_quad_t ); +quad_t __xordi3(quad_t, quad_t); |