Statistics
| Branch: | Revision:

root / fpu / softfloat-macros.h @ 2ac8bd03

History | View | Annotate | Download (24.9 kB)

1 8d725fac Andreas Färber
/*
2 8d725fac Andreas Färber
 * QEMU float support macros
3 8d725fac Andreas Färber
 *
4 8d725fac Andreas Färber
 * Derived from SoftFloat.
5 8d725fac Andreas Färber
 */
6 158142c2 bellard
7 158142c2 bellard
/*============================================================================
8 158142c2 bellard

9 158142c2 bellard
This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
10 158142c2 bellard
Arithmetic Package, Release 2b.
11 158142c2 bellard

12 158142c2 bellard
Written by John R. Hauser.  This work was made possible in part by the
13 158142c2 bellard
International Computer Science Institute, located at Suite 600, 1947 Center
14 158142c2 bellard
Street, Berkeley, California 94704.  Funding was partially provided by the
15 158142c2 bellard
National Science Foundation under grant MIP-9311980.  The original version
16 158142c2 bellard
of this code was written as part of a project to build a fixed-point vector
17 158142c2 bellard
processor in collaboration with the University of California at Berkeley,
18 158142c2 bellard
overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
19 158142c2 bellard
is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
20 158142c2 bellard
arithmetic/SoftFloat.html'.
21 158142c2 bellard

22 158142c2 bellard
THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort has
23 158142c2 bellard
been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
24 158142c2 bellard
RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
25 158142c2 bellard
AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
26 158142c2 bellard
COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
27 158142c2 bellard
EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
28 158142c2 bellard
INSTITUTE (possibly via similar legal notice) AGAINST ALL LOSSES, COSTS, OR
29 158142c2 bellard
OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
30 158142c2 bellard

31 158142c2 bellard
Derivative works are acceptable, even for commercial purposes, so long as
32 158142c2 bellard
(1) the source code for the derivative work includes prominent notice that
33 158142c2 bellard
the work is derivative, and (2) the source code includes prominent notice with
34 158142c2 bellard
these four paragraphs for those parts of this code that are retained.
35 158142c2 bellard

36 158142c2 bellard
=============================================================================*/
37 158142c2 bellard
38 158142c2 bellard
/*----------------------------------------------------------------------------
39 b3b4c7f3 Aurelien Jarno
| This macro tests for minimum version of the GNU C compiler.
40 b3b4c7f3 Aurelien Jarno
*----------------------------------------------------------------------------*/
41 b3b4c7f3 Aurelien Jarno
#if defined(__GNUC__) && defined(__GNUC_MINOR__)
42 b3b4c7f3 Aurelien Jarno
# define SOFTFLOAT_GNUC_PREREQ(maj, min) \
43 b3b4c7f3 Aurelien Jarno
         ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
44 b3b4c7f3 Aurelien Jarno
#else
45 b3b4c7f3 Aurelien Jarno
# define SOFTFLOAT_GNUC_PREREQ(maj, min) 0
46 b3b4c7f3 Aurelien Jarno
#endif
47 b3b4c7f3 Aurelien Jarno
48 b3b4c7f3 Aurelien Jarno
49 b3b4c7f3 Aurelien Jarno
/*----------------------------------------------------------------------------
50 158142c2 bellard
| Shifts `a' right by the number of bits given in `count'.  If any nonzero
51 158142c2 bellard
| bits are shifted off, they are ``jammed'' into the least significant bit of
52 158142c2 bellard
| the result by setting the least significant bit to 1.  The value of `count'
53 158142c2 bellard
| can be arbitrarily large; in particular, if `count' is greater than 32, the
54 158142c2 bellard
| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
55 158142c2 bellard
| The result is stored in the location pointed to by `zPtr'.
56 158142c2 bellard
*----------------------------------------------------------------------------*/
57 158142c2 bellard
58 bb98fe42 Andreas Färber
INLINE void shift32RightJamming( uint32_t a, int16 count, uint32_t *zPtr )
59 158142c2 bellard
{
60 bb98fe42 Andreas Färber
    uint32_t z;
61 158142c2 bellard
62 158142c2 bellard
    if ( count == 0 ) {
63 158142c2 bellard
        z = a;
64 158142c2 bellard
    }
65 158142c2 bellard
    else if ( count < 32 ) {
66 158142c2 bellard
        z = ( a>>count ) | ( ( a<<( ( - count ) & 31 ) ) != 0 );
67 158142c2 bellard
    }
68 158142c2 bellard
    else {
69 158142c2 bellard
        z = ( a != 0 );
70 158142c2 bellard
    }
71 158142c2 bellard
    *zPtr = z;
72 158142c2 bellard
73 158142c2 bellard
}
74 158142c2 bellard
75 158142c2 bellard
/*----------------------------------------------------------------------------
76 158142c2 bellard
| Shifts `a' right by the number of bits given in `count'.  If any nonzero
77 158142c2 bellard
| bits are shifted off, they are ``jammed'' into the least significant bit of
78 158142c2 bellard
| the result by setting the least significant bit to 1.  The value of `count'
79 158142c2 bellard
| can be arbitrarily large; in particular, if `count' is greater than 64, the
80 158142c2 bellard
| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
81 158142c2 bellard
| The result is stored in the location pointed to by `zPtr'.
82 158142c2 bellard
*----------------------------------------------------------------------------*/
83 158142c2 bellard
84 bb98fe42 Andreas Färber
INLINE void shift64RightJamming( uint64_t a, int16 count, uint64_t *zPtr )
85 158142c2 bellard
{
86 bb98fe42 Andreas Färber
    uint64_t z;
87 158142c2 bellard
88 158142c2 bellard
    if ( count == 0 ) {
89 158142c2 bellard
        z = a;
90 158142c2 bellard
    }
91 158142c2 bellard
    else if ( count < 64 ) {
92 158142c2 bellard
        z = ( a>>count ) | ( ( a<<( ( - count ) & 63 ) ) != 0 );
93 158142c2 bellard
    }
94 158142c2 bellard
    else {
95 158142c2 bellard
        z = ( a != 0 );
96 158142c2 bellard
    }
97 158142c2 bellard
    *zPtr = z;
98 158142c2 bellard
99 158142c2 bellard
}
100 158142c2 bellard
101 158142c2 bellard
/*----------------------------------------------------------------------------
102 158142c2 bellard
| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by 64
103 158142c2 bellard
| _plus_ the number of bits given in `count'.  The shifted result is at most
104 158142c2 bellard
| 64 nonzero bits; this is stored at the location pointed to by `z0Ptr'.  The
105 158142c2 bellard
| bits shifted off form a second 64-bit result as follows:  The _last_ bit
106 158142c2 bellard
| shifted off is the most-significant bit of the extra result, and the other
107 158142c2 bellard
| 63 bits of the extra result are all zero if and only if _all_but_the_last_
108 158142c2 bellard
| bits shifted off were all zero.  This extra result is stored in the location
109 158142c2 bellard
| pointed to by `z1Ptr'.  The value of `count' can be arbitrarily large.
110 158142c2 bellard
|     (This routine makes more sense if `a0' and `a1' are considered to form
111 158142c2 bellard
| a fixed-point value with binary point between `a0' and `a1'.  This fixed-
112 158142c2 bellard
| point value is shifted right by the number of bits given in `count', and
113 158142c2 bellard
| the integer part of the result is returned at the location pointed to by
114 158142c2 bellard
| `z0Ptr'.  The fractional part of the result may be slightly corrupted as
115 158142c2 bellard
| described above, and is returned at the location pointed to by `z1Ptr'.)
116 158142c2 bellard
*----------------------------------------------------------------------------*/
117 158142c2 bellard
118 158142c2 bellard
INLINE void
119 158142c2 bellard
 shift64ExtraRightJamming(
120 bb98fe42 Andreas Färber
     uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
121 158142c2 bellard
{
122 bb98fe42 Andreas Färber
    uint64_t z0, z1;
123 158142c2 bellard
    int8 negCount = ( - count ) & 63;
124 158142c2 bellard
125 158142c2 bellard
    if ( count == 0 ) {
126 158142c2 bellard
        z1 = a1;
127 158142c2 bellard
        z0 = a0;
128 158142c2 bellard
    }
129 158142c2 bellard
    else if ( count < 64 ) {
130 158142c2 bellard
        z1 = ( a0<<negCount ) | ( a1 != 0 );
131 158142c2 bellard
        z0 = a0>>count;
132 158142c2 bellard
    }
133 158142c2 bellard
    else {
134 158142c2 bellard
        if ( count == 64 ) {
135 158142c2 bellard
            z1 = a0 | ( a1 != 0 );
136 158142c2 bellard
        }
137 158142c2 bellard
        else {
138 158142c2 bellard
            z1 = ( ( a0 | a1 ) != 0 );
139 158142c2 bellard
        }
140 158142c2 bellard
        z0 = 0;
141 158142c2 bellard
    }
142 158142c2 bellard
    *z1Ptr = z1;
143 158142c2 bellard
    *z0Ptr = z0;
144 158142c2 bellard
145 158142c2 bellard
}
146 158142c2 bellard
147 158142c2 bellard
/*----------------------------------------------------------------------------
148 158142c2 bellard
| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
149 158142c2 bellard
| number of bits given in `count'.  Any bits shifted off are lost.  The value
150 158142c2 bellard
| of `count' can be arbitrarily large; in particular, if `count' is greater
151 158142c2 bellard
| than 128, the result will be 0.  The result is broken into two 64-bit pieces
152 158142c2 bellard
| which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
153 158142c2 bellard
*----------------------------------------------------------------------------*/
154 158142c2 bellard
155 158142c2 bellard
INLINE void
156 158142c2 bellard
 shift128Right(
157 bb98fe42 Andreas Färber
     uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
158 158142c2 bellard
{
159 bb98fe42 Andreas Färber
    uint64_t z0, z1;
160 158142c2 bellard
    int8 negCount = ( - count ) & 63;
161 158142c2 bellard
162 158142c2 bellard
    if ( count == 0 ) {
163 158142c2 bellard
        z1 = a1;
164 158142c2 bellard
        z0 = a0;
165 158142c2 bellard
    }
166 158142c2 bellard
    else if ( count < 64 ) {
167 158142c2 bellard
        z1 = ( a0<<negCount ) | ( a1>>count );
168 158142c2 bellard
        z0 = a0>>count;
169 158142c2 bellard
    }
170 158142c2 bellard
    else {
171 158142c2 bellard
        z1 = ( count < 64 ) ? ( a0>>( count & 63 ) ) : 0;
172 158142c2 bellard
        z0 = 0;
173 158142c2 bellard
    }
174 158142c2 bellard
    *z1Ptr = z1;
175 158142c2 bellard
    *z0Ptr = z0;
176 158142c2 bellard
177 158142c2 bellard
}
178 158142c2 bellard
179 158142c2 bellard
/*----------------------------------------------------------------------------
180 158142c2 bellard
| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
181 158142c2 bellard
| number of bits given in `count'.  If any nonzero bits are shifted off, they
182 158142c2 bellard
| are ``jammed'' into the least significant bit of the result by setting the
183 158142c2 bellard
| least significant bit to 1.  The value of `count' can be arbitrarily large;
184 158142c2 bellard
| in particular, if `count' is greater than 128, the result will be either
185 158142c2 bellard
| 0 or 1, depending on whether the concatenation of `a0' and `a1' is zero or
186 158142c2 bellard
| nonzero.  The result is broken into two 64-bit pieces which are stored at
187 158142c2 bellard
| the locations pointed to by `z0Ptr' and `z1Ptr'.
188 158142c2 bellard
*----------------------------------------------------------------------------*/
189 158142c2 bellard
190 158142c2 bellard
INLINE void
191 158142c2 bellard
 shift128RightJamming(
192 bb98fe42 Andreas Färber
     uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
193 158142c2 bellard
{
194 bb98fe42 Andreas Färber
    uint64_t z0, z1;
195 158142c2 bellard
    int8 negCount = ( - count ) & 63;
196 158142c2 bellard
197 158142c2 bellard
    if ( count == 0 ) {
198 158142c2 bellard
        z1 = a1;
199 158142c2 bellard
        z0 = a0;
200 158142c2 bellard
    }
201 158142c2 bellard
    else if ( count < 64 ) {
202 158142c2 bellard
        z1 = ( a0<<negCount ) | ( a1>>count ) | ( ( a1<<negCount ) != 0 );
203 158142c2 bellard
        z0 = a0>>count;
204 158142c2 bellard
    }
205 158142c2 bellard
    else {
206 158142c2 bellard
        if ( count == 64 ) {
207 158142c2 bellard
            z1 = a0 | ( a1 != 0 );
208 158142c2 bellard
        }
209 158142c2 bellard
        else if ( count < 128 ) {
210 158142c2 bellard
            z1 = ( a0>>( count & 63 ) ) | ( ( ( a0<<negCount ) | a1 ) != 0 );
211 158142c2 bellard
        }
212 158142c2 bellard
        else {
213 158142c2 bellard
            z1 = ( ( a0 | a1 ) != 0 );
214 158142c2 bellard
        }
215 158142c2 bellard
        z0 = 0;
216 158142c2 bellard
    }
217 158142c2 bellard
    *z1Ptr = z1;
218 158142c2 bellard
    *z0Ptr = z0;
219 158142c2 bellard
220 158142c2 bellard
}
221 158142c2 bellard
222 158142c2 bellard
/*----------------------------------------------------------------------------
223 158142c2 bellard
| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' right
224 158142c2 bellard
| by 64 _plus_ the number of bits given in `count'.  The shifted result is
225 158142c2 bellard
| at most 128 nonzero bits; these are broken into two 64-bit pieces which are
226 158142c2 bellard
| stored at the locations pointed to by `z0Ptr' and `z1Ptr'.  The bits shifted
227 158142c2 bellard
| off form a third 64-bit result as follows:  The _last_ bit shifted off is
228 158142c2 bellard
| the most-significant bit of the extra result, and the other 63 bits of the
229 158142c2 bellard
| extra result are all zero if and only if _all_but_the_last_ bits shifted off
230 158142c2 bellard
| were all zero.  This extra result is stored in the location pointed to by
231 158142c2 bellard
| `z2Ptr'.  The value of `count' can be arbitrarily large.
232 158142c2 bellard
|     (This routine makes more sense if `a0', `a1', and `a2' are considered
233 158142c2 bellard
| to form a fixed-point value with binary point between `a1' and `a2'.  This
234 158142c2 bellard
| fixed-point value is shifted right by the number of bits given in `count',
235 158142c2 bellard
| and the integer part of the result is returned at the locations pointed to
236 158142c2 bellard
| by `z0Ptr' and `z1Ptr'.  The fractional part of the result may be slightly
237 158142c2 bellard
| corrupted as described above, and is returned at the location pointed to by
238 158142c2 bellard
| `z2Ptr'.)
239 158142c2 bellard
*----------------------------------------------------------------------------*/
240 158142c2 bellard
241 158142c2 bellard
INLINE void
242 158142c2 bellard
 shift128ExtraRightJamming(
243 bb98fe42 Andreas Färber
     uint64_t a0,
244 bb98fe42 Andreas Färber
     uint64_t a1,
245 bb98fe42 Andreas Färber
     uint64_t a2,
246 158142c2 bellard
     int16 count,
247 bb98fe42 Andreas Färber
     uint64_t *z0Ptr,
248 bb98fe42 Andreas Färber
     uint64_t *z1Ptr,
249 bb98fe42 Andreas Färber
     uint64_t *z2Ptr
250 158142c2 bellard
 )
251 158142c2 bellard
{
252 bb98fe42 Andreas Färber
    uint64_t z0, z1, z2;
253 158142c2 bellard
    int8 negCount = ( - count ) & 63;
254 158142c2 bellard
255 158142c2 bellard
    if ( count == 0 ) {
256 158142c2 bellard
        z2 = a2;
257 158142c2 bellard
        z1 = a1;
258 158142c2 bellard
        z0 = a0;
259 158142c2 bellard
    }
260 158142c2 bellard
    else {
261 158142c2 bellard
        if ( count < 64 ) {
262 158142c2 bellard
            z2 = a1<<negCount;
263 158142c2 bellard
            z1 = ( a0<<negCount ) | ( a1>>count );
264 158142c2 bellard
            z0 = a0>>count;
265 158142c2 bellard
        }
266 158142c2 bellard
        else {
267 158142c2 bellard
            if ( count == 64 ) {
268 158142c2 bellard
                z2 = a1;
269 158142c2 bellard
                z1 = a0;
270 158142c2 bellard
            }
271 158142c2 bellard
            else {
272 158142c2 bellard
                a2 |= a1;
273 158142c2 bellard
                if ( count < 128 ) {
274 158142c2 bellard
                    z2 = a0<<negCount;
275 158142c2 bellard
                    z1 = a0>>( count & 63 );
276 158142c2 bellard
                }
277 158142c2 bellard
                else {
278 158142c2 bellard
                    z2 = ( count == 128 ) ? a0 : ( a0 != 0 );
279 158142c2 bellard
                    z1 = 0;
280 158142c2 bellard
                }
281 158142c2 bellard
            }
282 158142c2 bellard
            z0 = 0;
283 158142c2 bellard
        }
284 158142c2 bellard
        z2 |= ( a2 != 0 );
285 158142c2 bellard
    }
286 158142c2 bellard
    *z2Ptr = z2;
287 158142c2 bellard
    *z1Ptr = z1;
288 158142c2 bellard
    *z0Ptr = z0;
289 158142c2 bellard
290 158142c2 bellard
}
291 158142c2 bellard
292 158142c2 bellard
/*----------------------------------------------------------------------------
293 158142c2 bellard
| Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the
294 158142c2 bellard
| number of bits given in `count'.  Any bits shifted off are lost.  The value
295 158142c2 bellard
| of `count' must be less than 64.  The result is broken into two 64-bit
296 158142c2 bellard
| pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
297 158142c2 bellard
*----------------------------------------------------------------------------*/
298 158142c2 bellard
299 158142c2 bellard
INLINE void
300 158142c2 bellard
 shortShift128Left(
301 bb98fe42 Andreas Färber
     uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
302 158142c2 bellard
{
303 158142c2 bellard
304 158142c2 bellard
    *z1Ptr = a1<<count;
305 158142c2 bellard
    *z0Ptr =
306 158142c2 bellard
        ( count == 0 ) ? a0 : ( a0<<count ) | ( a1>>( ( - count ) & 63 ) );
307 158142c2 bellard
308 158142c2 bellard
}
309 158142c2 bellard
310 158142c2 bellard
/*----------------------------------------------------------------------------
311 158142c2 bellard
| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' left
312 158142c2 bellard
| by the number of bits given in `count'.  Any bits shifted off are lost.
313 158142c2 bellard
| The value of `count' must be less than 64.  The result is broken into three
314 158142c2 bellard
| 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
315 158142c2 bellard
| `z1Ptr', and `z2Ptr'.
316 158142c2 bellard
*----------------------------------------------------------------------------*/
317 158142c2 bellard
318 158142c2 bellard
INLINE void
319 158142c2 bellard
 shortShift192Left(
320 bb98fe42 Andreas Färber
     uint64_t a0,
321 bb98fe42 Andreas Färber
     uint64_t a1,
322 bb98fe42 Andreas Färber
     uint64_t a2,
323 158142c2 bellard
     int16 count,
324 bb98fe42 Andreas Färber
     uint64_t *z0Ptr,
325 bb98fe42 Andreas Färber
     uint64_t *z1Ptr,
326 bb98fe42 Andreas Färber
     uint64_t *z2Ptr
327 158142c2 bellard
 )
328 158142c2 bellard
{
329 bb98fe42 Andreas Färber
    uint64_t z0, z1, z2;
330 158142c2 bellard
    int8 negCount;
331 158142c2 bellard
332 158142c2 bellard
    z2 = a2<<count;
333 158142c2 bellard
    z1 = a1<<count;
334 158142c2 bellard
    z0 = a0<<count;
335 158142c2 bellard
    if ( 0 < count ) {
336 158142c2 bellard
        negCount = ( ( - count ) & 63 );
337 158142c2 bellard
        z1 |= a2>>negCount;
338 158142c2 bellard
        z0 |= a1>>negCount;
339 158142c2 bellard
    }
340 158142c2 bellard
    *z2Ptr = z2;
341 158142c2 bellard
    *z1Ptr = z1;
342 158142c2 bellard
    *z0Ptr = z0;
343 158142c2 bellard
344 158142c2 bellard
}
345 158142c2 bellard
346 158142c2 bellard
/*----------------------------------------------------------------------------
347 158142c2 bellard
| Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit
348 158142c2 bellard
| value formed by concatenating `b0' and `b1'.  Addition is modulo 2^128, so
349 158142c2 bellard
| any carry out is lost.  The result is broken into two 64-bit pieces which
350 158142c2 bellard
| are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
351 158142c2 bellard
*----------------------------------------------------------------------------*/
352 158142c2 bellard
353 158142c2 bellard
INLINE void
354 158142c2 bellard
 add128(
355 bb98fe42 Andreas Färber
     uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, uint64_t *z0Ptr, uint64_t *z1Ptr )
356 158142c2 bellard
{
357 bb98fe42 Andreas Färber
    uint64_t z1;
358 158142c2 bellard
359 158142c2 bellard
    z1 = a1 + b1;
360 158142c2 bellard
    *z1Ptr = z1;
361 158142c2 bellard
    *z0Ptr = a0 + b0 + ( z1 < a1 );
362 158142c2 bellard
363 158142c2 bellard
}
364 158142c2 bellard
365 158142c2 bellard
/*----------------------------------------------------------------------------
366 158142c2 bellard
| Adds the 192-bit value formed by concatenating `a0', `a1', and `a2' to the
367 158142c2 bellard
| 192-bit value formed by concatenating `b0', `b1', and `b2'.  Addition is
368 158142c2 bellard
| modulo 2^192, so any carry out is lost.  The result is broken into three
369 158142c2 bellard
| 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
370 158142c2 bellard
| `z1Ptr', and `z2Ptr'.
371 158142c2 bellard
*----------------------------------------------------------------------------*/
372 158142c2 bellard
373 158142c2 bellard
INLINE void
374 158142c2 bellard
 add192(
375 bb98fe42 Andreas Färber
     uint64_t a0,
376 bb98fe42 Andreas Färber
     uint64_t a1,
377 bb98fe42 Andreas Färber
     uint64_t a2,
378 bb98fe42 Andreas Färber
     uint64_t b0,
379 bb98fe42 Andreas Färber
     uint64_t b1,
380 bb98fe42 Andreas Färber
     uint64_t b2,
381 bb98fe42 Andreas Färber
     uint64_t *z0Ptr,
382 bb98fe42 Andreas Färber
     uint64_t *z1Ptr,
383 bb98fe42 Andreas Färber
     uint64_t *z2Ptr
384 158142c2 bellard
 )
385 158142c2 bellard
{
386 bb98fe42 Andreas Färber
    uint64_t z0, z1, z2;
387 158142c2 bellard
    int8 carry0, carry1;
388 158142c2 bellard
389 158142c2 bellard
    z2 = a2 + b2;
390 158142c2 bellard
    carry1 = ( z2 < a2 );
391 158142c2 bellard
    z1 = a1 + b1;
392 158142c2 bellard
    carry0 = ( z1 < a1 );
393 158142c2 bellard
    z0 = a0 + b0;
394 158142c2 bellard
    z1 += carry1;
395 158142c2 bellard
    z0 += ( z1 < carry1 );
396 158142c2 bellard
    z0 += carry0;
397 158142c2 bellard
    *z2Ptr = z2;
398 158142c2 bellard
    *z1Ptr = z1;
399 158142c2 bellard
    *z0Ptr = z0;
400 158142c2 bellard
401 158142c2 bellard
}
402 158142c2 bellard
403 158142c2 bellard
/*----------------------------------------------------------------------------
404 158142c2 bellard
| Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the
405 158142c2 bellard
| 128-bit value formed by concatenating `a0' and `a1'.  Subtraction is modulo
406 158142c2 bellard
| 2^128, so any borrow out (carry out) is lost.  The result is broken into two
407 158142c2 bellard
| 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and
408 158142c2 bellard
| `z1Ptr'.
409 158142c2 bellard
*----------------------------------------------------------------------------*/
410 158142c2 bellard
411 158142c2 bellard
INLINE void
412 158142c2 bellard
 sub128(
413 bb98fe42 Andreas Färber
     uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, uint64_t *z0Ptr, uint64_t *z1Ptr )
414 158142c2 bellard
{
415 158142c2 bellard
416 158142c2 bellard
    *z1Ptr = a1 - b1;
417 158142c2 bellard
    *z0Ptr = a0 - b0 - ( a1 < b1 );
418 158142c2 bellard
419 158142c2 bellard
}
420 158142c2 bellard
421 158142c2 bellard
/*----------------------------------------------------------------------------
422 158142c2 bellard
| Subtracts the 192-bit value formed by concatenating `b0', `b1', and `b2'
423 158142c2 bellard
| from the 192-bit value formed by concatenating `a0', `a1', and `a2'.
424 158142c2 bellard
| Subtraction is modulo 2^192, so any borrow out (carry out) is lost.  The
425 158142c2 bellard
| result is broken into three 64-bit pieces which are stored at the locations
426 158142c2 bellard
| pointed to by `z0Ptr', `z1Ptr', and `z2Ptr'.
427 158142c2 bellard
*----------------------------------------------------------------------------*/
428 158142c2 bellard
429 158142c2 bellard
INLINE void
430 158142c2 bellard
 sub192(
431 bb98fe42 Andreas Färber
     uint64_t a0,
432 bb98fe42 Andreas Färber
     uint64_t a1,
433 bb98fe42 Andreas Färber
     uint64_t a2,
434 bb98fe42 Andreas Färber
     uint64_t b0,
435 bb98fe42 Andreas Färber
     uint64_t b1,
436 bb98fe42 Andreas Färber
     uint64_t b2,
437 bb98fe42 Andreas Färber
     uint64_t *z0Ptr,
438 bb98fe42 Andreas Färber
     uint64_t *z1Ptr,
439 bb98fe42 Andreas Färber
     uint64_t *z2Ptr
440 158142c2 bellard
 )
441 158142c2 bellard
{
442 bb98fe42 Andreas Färber
    uint64_t z0, z1, z2;
443 158142c2 bellard
    int8 borrow0, borrow1;
444 158142c2 bellard
445 158142c2 bellard
    z2 = a2 - b2;
446 158142c2 bellard
    borrow1 = ( a2 < b2 );
447 158142c2 bellard
    z1 = a1 - b1;
448 158142c2 bellard
    borrow0 = ( a1 < b1 );
449 158142c2 bellard
    z0 = a0 - b0;
450 158142c2 bellard
    z0 -= ( z1 < borrow1 );
451 158142c2 bellard
    z1 -= borrow1;
452 158142c2 bellard
    z0 -= borrow0;
453 158142c2 bellard
    *z2Ptr = z2;
454 158142c2 bellard
    *z1Ptr = z1;
455 158142c2 bellard
    *z0Ptr = z0;
456 158142c2 bellard
457 158142c2 bellard
}
458 158142c2 bellard
459 158142c2 bellard
/*----------------------------------------------------------------------------
460 158142c2 bellard
| Multiplies `a' by `b' to obtain a 128-bit product.  The product is broken
461 158142c2 bellard
| into two 64-bit pieces which are stored at the locations pointed to by
462 158142c2 bellard
| `z0Ptr' and `z1Ptr'.
463 158142c2 bellard
*----------------------------------------------------------------------------*/
464 158142c2 bellard
465 bb98fe42 Andreas Färber
INLINE void mul64To128( uint64_t a, uint64_t b, uint64_t *z0Ptr, uint64_t *z1Ptr )
466 158142c2 bellard
{
467 bb98fe42 Andreas Färber
    uint32_t aHigh, aLow, bHigh, bLow;
468 bb98fe42 Andreas Färber
    uint64_t z0, zMiddleA, zMiddleB, z1;
469 158142c2 bellard
470 158142c2 bellard
    aLow = a;
471 158142c2 bellard
    aHigh = a>>32;
472 158142c2 bellard
    bLow = b;
473 158142c2 bellard
    bHigh = b>>32;
474 bb98fe42 Andreas Färber
    z1 = ( (uint64_t) aLow ) * bLow;
475 bb98fe42 Andreas Färber
    zMiddleA = ( (uint64_t) aLow ) * bHigh;
476 bb98fe42 Andreas Färber
    zMiddleB = ( (uint64_t) aHigh ) * bLow;
477 bb98fe42 Andreas Färber
    z0 = ( (uint64_t) aHigh ) * bHigh;
478 158142c2 bellard
    zMiddleA += zMiddleB;
479 bb98fe42 Andreas Färber
    z0 += ( ( (uint64_t) ( zMiddleA < zMiddleB ) )<<32 ) + ( zMiddleA>>32 );
480 158142c2 bellard
    zMiddleA <<= 32;
481 158142c2 bellard
    z1 += zMiddleA;
482 158142c2 bellard
    z0 += ( z1 < zMiddleA );
483 158142c2 bellard
    *z1Ptr = z1;
484 158142c2 bellard
    *z0Ptr = z0;
485 158142c2 bellard
486 158142c2 bellard
}
487 158142c2 bellard
488 158142c2 bellard
/*----------------------------------------------------------------------------
489 158142c2 bellard
| Multiplies the 128-bit value formed by concatenating `a0' and `a1' by
490 158142c2 bellard
| `b' to obtain a 192-bit product.  The product is broken into three 64-bit
491 158142c2 bellard
| pieces which are stored at the locations pointed to by `z0Ptr', `z1Ptr', and
492 158142c2 bellard
| `z2Ptr'.
493 158142c2 bellard
*----------------------------------------------------------------------------*/
494 158142c2 bellard
495 158142c2 bellard
INLINE void
496 158142c2 bellard
 mul128By64To192(
497 bb98fe42 Andreas Färber
     uint64_t a0,
498 bb98fe42 Andreas Färber
     uint64_t a1,
499 bb98fe42 Andreas Färber
     uint64_t b,
500 bb98fe42 Andreas Färber
     uint64_t *z0Ptr,
501 bb98fe42 Andreas Färber
     uint64_t *z1Ptr,
502 bb98fe42 Andreas Färber
     uint64_t *z2Ptr
503 158142c2 bellard
 )
504 158142c2 bellard
{
505 bb98fe42 Andreas Färber
    uint64_t z0, z1, z2, more1;
506 158142c2 bellard
507 158142c2 bellard
    mul64To128( a1, b, &z1, &z2 );
508 158142c2 bellard
    mul64To128( a0, b, &z0, &more1 );
509 158142c2 bellard
    add128( z0, more1, 0, z1, &z0, &z1 );
510 158142c2 bellard
    *z2Ptr = z2;
511 158142c2 bellard
    *z1Ptr = z1;
512 158142c2 bellard
    *z0Ptr = z0;
513 158142c2 bellard
514 158142c2 bellard
}
515 158142c2 bellard
516 158142c2 bellard
/*----------------------------------------------------------------------------
517 158142c2 bellard
| Multiplies the 128-bit value formed by concatenating `a0' and `a1' to the
518 158142c2 bellard
| 128-bit value formed by concatenating `b0' and `b1' to obtain a 256-bit
519 158142c2 bellard
| product.  The product is broken into four 64-bit pieces which are stored at
520 158142c2 bellard
| the locations pointed to by `z0Ptr', `z1Ptr', `z2Ptr', and `z3Ptr'.
521 158142c2 bellard
*----------------------------------------------------------------------------*/
522 158142c2 bellard
523 158142c2 bellard
INLINE void
524 158142c2 bellard
 mul128To256(
525 bb98fe42 Andreas Färber
     uint64_t a0,
526 bb98fe42 Andreas Färber
     uint64_t a1,
527 bb98fe42 Andreas Färber
     uint64_t b0,
528 bb98fe42 Andreas Färber
     uint64_t b1,
529 bb98fe42 Andreas Färber
     uint64_t *z0Ptr,
530 bb98fe42 Andreas Färber
     uint64_t *z1Ptr,
531 bb98fe42 Andreas Färber
     uint64_t *z2Ptr,
532 bb98fe42 Andreas Färber
     uint64_t *z3Ptr
533 158142c2 bellard
 )
534 158142c2 bellard
{
535 bb98fe42 Andreas Färber
    uint64_t z0, z1, z2, z3;
536 bb98fe42 Andreas Färber
    uint64_t more1, more2;
537 158142c2 bellard
538 158142c2 bellard
    mul64To128( a1, b1, &z2, &z3 );
539 158142c2 bellard
    mul64To128( a1, b0, &z1, &more2 );
540 158142c2 bellard
    add128( z1, more2, 0, z2, &z1, &z2 );
541 158142c2 bellard
    mul64To128( a0, b0, &z0, &more1 );
542 158142c2 bellard
    add128( z0, more1, 0, z1, &z0, &z1 );
543 158142c2 bellard
    mul64To128( a0, b1, &more1, &more2 );
544 158142c2 bellard
    add128( more1, more2, 0, z2, &more1, &z2 );
545 158142c2 bellard
    add128( z0, z1, 0, more1, &z0, &z1 );
546 158142c2 bellard
    *z3Ptr = z3;
547 158142c2 bellard
    *z2Ptr = z2;
548 158142c2 bellard
    *z1Ptr = z1;
549 158142c2 bellard
    *z0Ptr = z0;
550 158142c2 bellard
551 158142c2 bellard
}
552 158142c2 bellard
553 158142c2 bellard
/*----------------------------------------------------------------------------
554 158142c2 bellard
| Returns an approximation to the 64-bit integer quotient obtained by dividing
555 158142c2 bellard
| `b' into the 128-bit value formed by concatenating `a0' and `a1'.  The
556 158142c2 bellard
| divisor `b' must be at least 2^63.  If q is the exact quotient truncated
557 158142c2 bellard
| toward zero, the approximation returned lies between q and q + 2 inclusive.
558 158142c2 bellard
| If the exact quotient q is larger than 64 bits, the maximum positive 64-bit
559 158142c2 bellard
| unsigned integer is returned.
560 158142c2 bellard
*----------------------------------------------------------------------------*/
561 158142c2 bellard
562 bb98fe42 Andreas Färber
static uint64_t estimateDiv128To64( uint64_t a0, uint64_t a1, uint64_t b )
563 158142c2 bellard
{
564 bb98fe42 Andreas Färber
    uint64_t b0, b1;
565 bb98fe42 Andreas Färber
    uint64_t rem0, rem1, term0, term1;
566 bb98fe42 Andreas Färber
    uint64_t z;
567 158142c2 bellard
568 158142c2 bellard
    if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF );
569 158142c2 bellard
    b0 = b>>32;
570 158142c2 bellard
    z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32;
571 158142c2 bellard
    mul64To128( b, z, &term0, &term1 );
572 158142c2 bellard
    sub128( a0, a1, term0, term1, &rem0, &rem1 );
573 bb98fe42 Andreas Färber
    while ( ( (int64_t) rem0 ) < 0 ) {
574 158142c2 bellard
        z -= LIT64( 0x100000000 );
575 158142c2 bellard
        b1 = b<<32;
576 158142c2 bellard
        add128( rem0, rem1, b0, b1, &rem0, &rem1 );
577 158142c2 bellard
    }
578 158142c2 bellard
    rem0 = ( rem0<<32 ) | ( rem1>>32 );
579 158142c2 bellard
    z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0;
580 158142c2 bellard
    return z;
581 158142c2 bellard
582 158142c2 bellard
}
583 158142c2 bellard
584 158142c2 bellard
/*----------------------------------------------------------------------------
585 158142c2 bellard
| Returns an approximation to the square root of the 32-bit significand given
586 158142c2 bellard
| by `a'.  Considered as an integer, `a' must be at least 2^31.  If bit 0 of
587 158142c2 bellard
| `aExp' (the least significant bit) is 1, the integer returned approximates
588 158142c2 bellard
| 2^31*sqrt(`a'/2^31), where `a' is considered an integer.  If bit 0 of `aExp'
589 158142c2 bellard
| is 0, the integer returned approximates 2^31*sqrt(`a'/2^30).  In either
590 158142c2 bellard
| case, the approximation returned lies strictly within +/-2 of the exact
591 158142c2 bellard
| value.
592 158142c2 bellard
*----------------------------------------------------------------------------*/
593 158142c2 bellard
594 bb98fe42 Andreas Färber
static uint32_t estimateSqrt32( int16 aExp, uint32_t a )
595 158142c2 bellard
{
596 bb98fe42 Andreas Färber
    static const uint16_t sqrtOddAdjustments[] = {
597 158142c2 bellard
        0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0,
598 158142c2 bellard
        0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67
599 158142c2 bellard
    };
600 bb98fe42 Andreas Färber
    static const uint16_t sqrtEvenAdjustments[] = {
601 158142c2 bellard
        0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E,
602 158142c2 bellard
        0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002
603 158142c2 bellard
    };
604 158142c2 bellard
    int8 index;
605 bb98fe42 Andreas Färber
    uint32_t z;
606 158142c2 bellard
607 158142c2 bellard
    index = ( a>>27 ) & 15;
608 158142c2 bellard
    if ( aExp & 1 ) {
609 3f4cb3d3 blueswir1
        z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ (int)index ];
610 158142c2 bellard
        z = ( ( a / z )<<14 ) + ( z<<15 );
611 158142c2 bellard
        a >>= 1;
612 158142c2 bellard
    }
613 158142c2 bellard
    else {
614 3f4cb3d3 blueswir1
        z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ (int)index ];
615 158142c2 bellard
        z = a / z + z;
616 158142c2 bellard
        z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 );
617 bb98fe42 Andreas Färber
        if ( z <= a ) return (uint32_t) ( ( (int32_t) a )>>1 );
618 158142c2 bellard
    }
619 bb98fe42 Andreas Färber
    return ( (uint32_t) ( ( ( (uint64_t) a )<<31 ) / z ) ) + ( z>>1 );
620 158142c2 bellard
621 158142c2 bellard
}
622 158142c2 bellard
623 158142c2 bellard
/*----------------------------------------------------------------------------
624 158142c2 bellard
| Returns the number of leading 0 bits before the most-significant 1 bit of
625 158142c2 bellard
| `a'.  If `a' is zero, 32 is returned.
626 158142c2 bellard
*----------------------------------------------------------------------------*/
627 158142c2 bellard
628 bb98fe42 Andreas Färber
static int8 countLeadingZeros32( uint32_t a )
629 158142c2 bellard
{
630 b3b4c7f3 Aurelien Jarno
#if SOFTFLOAT_GNUC_PREREQ(3, 4)
631 b3b4c7f3 Aurelien Jarno
    if (a) {
632 b3b4c7f3 Aurelien Jarno
        return __builtin_clz(a);
633 b3b4c7f3 Aurelien Jarno
    } else {
634 b3b4c7f3 Aurelien Jarno
        return 32;
635 b3b4c7f3 Aurelien Jarno
    }
636 b3b4c7f3 Aurelien Jarno
#else
637 158142c2 bellard
    static const int8 countLeadingZerosHigh[] = {
638 158142c2 bellard
        8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
639 158142c2 bellard
        3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
640 158142c2 bellard
        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
641 158142c2 bellard
        2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
642 158142c2 bellard
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
643 158142c2 bellard
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
644 158142c2 bellard
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
645 158142c2 bellard
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
646 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
647 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
648 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
649 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
650 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
651 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
652 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
653 158142c2 bellard
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
654 158142c2 bellard
    };
655 158142c2 bellard
    int8 shiftCount;
656 158142c2 bellard
657 158142c2 bellard
    shiftCount = 0;
658 158142c2 bellard
    if ( a < 0x10000 ) {
659 158142c2 bellard
        shiftCount += 16;
660 158142c2 bellard
        a <<= 16;
661 158142c2 bellard
    }
662 158142c2 bellard
    if ( a < 0x1000000 ) {
663 158142c2 bellard
        shiftCount += 8;
664 158142c2 bellard
        a <<= 8;
665 158142c2 bellard
    }
666 158142c2 bellard
    shiftCount += countLeadingZerosHigh[ a>>24 ];
667 158142c2 bellard
    return shiftCount;
668 b3b4c7f3 Aurelien Jarno
#endif
669 158142c2 bellard
}
670 158142c2 bellard
671 158142c2 bellard
/*----------------------------------------------------------------------------
672 158142c2 bellard
| Returns the number of leading 0 bits before the most-significant 1 bit of
673 158142c2 bellard
| `a'.  If `a' is zero, 64 is returned.
674 158142c2 bellard
*----------------------------------------------------------------------------*/
675 158142c2 bellard
676 bb98fe42 Andreas Färber
static int8 countLeadingZeros64( uint64_t a )
677 158142c2 bellard
{
678 b3b4c7f3 Aurelien Jarno
#if SOFTFLOAT_GNUC_PREREQ(3, 4)
679 b3b4c7f3 Aurelien Jarno
    if (a) {
680 b3b4c7f3 Aurelien Jarno
        return __builtin_clzll(a);
681 b3b4c7f3 Aurelien Jarno
    } else {
682 b3b4c7f3 Aurelien Jarno
        return 64;
683 b3b4c7f3 Aurelien Jarno
    }
684 b3b4c7f3 Aurelien Jarno
#else
685 158142c2 bellard
    int8 shiftCount;
686 158142c2 bellard
687 158142c2 bellard
    shiftCount = 0;
688 bb98fe42 Andreas Färber
    if ( a < ( (uint64_t) 1 )<<32 ) {
689 158142c2 bellard
        shiftCount += 32;
690 158142c2 bellard
    }
691 158142c2 bellard
    else {
692 158142c2 bellard
        a >>= 32;
693 158142c2 bellard
    }
694 158142c2 bellard
    shiftCount += countLeadingZeros32( a );
695 158142c2 bellard
    return shiftCount;
696 b3b4c7f3 Aurelien Jarno
#endif
697 158142c2 bellard
}
698 158142c2 bellard
699 158142c2 bellard
/*----------------------------------------------------------------------------
700 158142c2 bellard
| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1'
701 158142c2 bellard
| is equal to the 128-bit value formed by concatenating `b0' and `b1'.
702 158142c2 bellard
| Otherwise, returns 0.
703 158142c2 bellard
*----------------------------------------------------------------------------*/
704 158142c2 bellard
705 bb98fe42 Andreas Färber
INLINE flag eq128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
706 158142c2 bellard
{
707 158142c2 bellard
708 158142c2 bellard
    return ( a0 == b0 ) && ( a1 == b1 );
709 158142c2 bellard
710 158142c2 bellard
}
711 158142c2 bellard
712 158142c2 bellard
/*----------------------------------------------------------------------------
713 158142c2 bellard
| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
714 158142c2 bellard
| than or equal to the 128-bit value formed by concatenating `b0' and `b1'.
715 158142c2 bellard
| Otherwise, returns 0.
716 158142c2 bellard
*----------------------------------------------------------------------------*/
717 158142c2 bellard
718 bb98fe42 Andreas Färber
INLINE flag le128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
719 158142c2 bellard
{
720 158142c2 bellard
721 158142c2 bellard
    return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 <= b1 ) );
722 158142c2 bellard
723 158142c2 bellard
}
724 158142c2 bellard
725 158142c2 bellard
/*----------------------------------------------------------------------------
726 158142c2 bellard
| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
727 158142c2 bellard
| than the 128-bit value formed by concatenating `b0' and `b1'.  Otherwise,
728 158142c2 bellard
| returns 0.
729 158142c2 bellard
*----------------------------------------------------------------------------*/
730 158142c2 bellard
731 bb98fe42 Andreas Färber
INLINE flag lt128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
732 158142c2 bellard
{
733 158142c2 bellard
734 158142c2 bellard
    return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 < b1 ) );
735 158142c2 bellard
736 158142c2 bellard
}
737 158142c2 bellard
738 158142c2 bellard
/*----------------------------------------------------------------------------
739 158142c2 bellard
| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is
740 158142c2 bellard
| not equal to the 128-bit value formed by concatenating `b0' and `b1'.
741 158142c2 bellard
| Otherwise, returns 0.
742 158142c2 bellard
*----------------------------------------------------------------------------*/
743 158142c2 bellard
744 bb98fe42 Andreas Färber
INLINE flag ne128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
745 158142c2 bellard
{
746 158142c2 bellard
747 158142c2 bellard
    return ( a0 != b0 ) || ( a1 != b1 );
748 158142c2 bellard
749 158142c2 bellard
}