1 | /*-␊ |
2 | * Copyright (c) 1992, 1993␊ |
3 | *␉The Regents of the University of California. All rights reserved.␊ |
4 | *␊ |
5 | * This software was developed by the Computer Systems Engineering group␊ |
6 | * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and␊ |
7 | * contributed to Berkeley.␊ |
8 | *␊ |
9 | * Redistribution and use in source and binary forms, with or without␊ |
10 | * modification, are permitted provided that the following conditions␊ |
11 | * are met:␊ |
12 | * 1. Redistributions of source code must retain the above copyright␊ |
13 | * notice, this list of conditions and the following disclaimer.␊ |
14 | * 2. Redistributions in binary form must reproduce the above copyright␊ |
15 | * notice, this list of conditions and the following disclaimer in the␊ |
16 | * documentation and/or other materials provided with the distribution.␊ |
17 | * 3. All advertising materials mentioning features or use of this software␊ |
18 | * must display the following acknowledgement:␊ |
19 | *␉This product includes software developed by the University of␊ |
20 | *␉California, Berkeley and its contributors.␊ |
21 | * 4. Neither the name of the University nor the names of its contributors␊ |
22 | * may be used to endorse or promote products derived from this software␊ |
23 | * without specific prior written permission.␊ |
24 | *␊ |
25 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND␊ |
26 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE␊ |
27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE␊ |
28 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE␊ |
29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL␊ |
30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS␊ |
31 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)␊ |
32 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT␊ |
33 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY␊ |
34 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF␊ |
35 | * SUCH DAMAGE.␊ |
36 | *␊ |
37 | *␉@(#)quad.h␉8.1 (Berkeley) 6/4/93␊ |
38 | * $FreeBSD: src/sys/libkern/quad.h,v 1.9 1999/08/28 00:46:36 peter Exp $␊ |
39 | */␊ |
40 | ␊ |
41 | /*␊ |
42 | * Quad arithmetic.␊ |
43 | *␊ |
44 | * This library makes the following assumptions:␊ |
45 | *␊ |
46 | * - The type long long (aka quad_t) exists.␊ |
47 | *␊ |
48 | * - A quad variable is exactly twice as long as `long'.␊ |
49 | *␊ |
50 | * - The machine's arithmetic is two's complement.␊ |
51 | *␊ |
52 | * This library can provide 128-bit arithmetic on a machine with 128-bit␊ |
53 | * quads and 64-bit longs, for instance, or 96-bit arithmetic on machines␊ |
54 | * with 48-bit longs.␊ |
55 | */␊ |
56 | ␊ |
57 | #include <sys/cdefs.h>␊ |
58 | #include <sys/types.h>␊ |
59 | #include <limits.h>␊ |
60 | ␊ |
61 | /*␊ |
62 | * Depending on the desired operation, we view a `long long' (aka quad_t) in␊ |
63 | * one or more of the following formats.␊ |
64 | */␊ |
65 | union uu {␊ |
66 | ␉quad_t␉q;␉␉/* as a (signed) quad */␊ |
67 | ␉quad_t␉uq;␉␉/* as an unsigned quad */␊ |
68 | ␉long␉sl[2];␉␉/* as two signed longs */␊ |
69 | ␉u_long␉ul[2];␉␉/* as two unsigned longs */␊ |
70 | };␊ |
71 | ␊ |
72 | /*␊ |
73 | * Define high and low longwords.␊ |
74 | */␊ |
75 | #define␉Hi␉␉_QUAD_HIGHWORD␊ |
76 | #define␉Lo␉␉_QUAD_LOWWORD␊ |
77 | ␊ |
78 | /*␊ |
79 | * Total number of bits in a quad_t and in the pieces that make it up.␊ |
80 | * These are used for shifting, and also below for halfword extraction␊ |
81 | * and assembly.␊ |
82 | */␊ |
83 | #define␉QUAD_BITS␉(sizeof(quad_t) * CHAR_BIT)␊ |
84 | #define␉LONG_BITS␉(sizeof(long) * CHAR_BIT)␊ |
85 | #define␉HALF_BITS␉(sizeof(long) * CHAR_BIT / 2)␊ |
86 | ␊ |
87 | /*␊ |
88 | * Extract high and low shortwords from longword, and move low shortword of␊ |
89 | * longword to upper half of long, i.e., produce the upper longword of␊ |
90 | * ((quad_t)(x) << (number_of_bits_in_long/2)). (`x' must actually be u_long.)␊ |
91 | *␊ |
92 | * These are used in the multiply code, to split a longword into upper␊ |
93 | * and lower halves, and to reassemble a product as a quad_t, shifted left␊ |
94 | * (sizeof(long)*CHAR_BIT/2).␊ |
95 | */␊ |
96 | #define␉HHALF(x)␉((x) >> HALF_BITS)␊ |
97 | #define␉LHALF(x)␉((x) & ((1 << HALF_BITS) - 1))␊ |
98 | #define␉LHUP(x)␉␉((x) << HALF_BITS)␊ |
99 | ␊ |
100 | quad_t␉␉__divdi3 __P((quad_t a, quad_t b));␊ |
101 | quad_t␉␉__moddi3 __P((quad_t a, quad_t b));␊ |
102 | u_quad_t␉__qdivrem __P((u_quad_t u, u_quad_t v, u_quad_t *rem));␊ |
103 | u_quad_t␉__udivdi3 __P((u_quad_t a, u_quad_t b));␊ |
104 | u_quad_t␉__umoddi3 __P((u_quad_t a, u_quad_t b));␊ |
105 | ␊ |
106 | /*␊ |
107 | * XXX␊ |
108 | * Compensate for gcc 1 vs gcc 2. Gcc 1 defines ?sh?di3's second argument␊ |
109 | * as u_quad_t, while gcc 2 correctly uses int. Unfortunately, we still use␊ |
110 | * both compilers.␊ |
111 | */␊ |
112 | #if __GNUC__ >= 2␊ |
113 | typedef unsigned int␉qshift_t;␊ |
114 | #else␊ |
115 | typedef u_quad_t␉qshift_t;␊ |
116 | #endif␊ |
117 | ␊ |
118 | ␊ |
119 | ␊ |
120 | ␊ |
121 | ␊ |
122 | ␊ |
123 | ␊ |
124 | ␊ |
125 | ␊ |
126 | |