1*82d799bfSmiod /* $OpenBSD: softfloat-macros.h,v 1.3 2007/12/29 17:43:14 miod Exp $ */
2433075b6Spvalchev /* $NetBSD: softfloat-macros.h,v 1.1 2001/04/26 03:10:47 ross Exp $ */
3433075b6Spvalchev
4433075b6Spvalchev /*
5433075b6Spvalchev ===============================================================================
6433075b6Spvalchev
7433075b6Spvalchev This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
8433075b6Spvalchev Arithmetic Package, Release 2a.
9433075b6Spvalchev
10433075b6Spvalchev Written by John R. Hauser. This work was made possible in part by the
11433075b6Spvalchev International Computer Science Institute, located at Suite 600, 1947 Center
12433075b6Spvalchev Street, Berkeley, California 94704. Funding was partially provided by the
13433075b6Spvalchev National Science Foundation under grant MIP-9311980. The original version
14433075b6Spvalchev of this code was written as part of a project to build a fixed-point vector
15433075b6Spvalchev processor in collaboration with the University of California at Berkeley,
16433075b6Spvalchev overseen by Profs. Nelson Morgan and John Wawrzynek. More information
17433075b6Spvalchev is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
18433075b6Spvalchev arithmetic/SoftFloat.html'.
19433075b6Spvalchev
20433075b6Spvalchev THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable
21433075b6Spvalchev effort has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT
22433075b6Spvalchev WILL AT TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS
23433075b6Spvalchev RESTRICTED TO PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL
24433075b6Spvalchev RESPONSIBILITY FOR ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM
25433075b6Spvalchev THEIR OWN USE OF THE SOFTWARE, AND WHO ALSO EFFECTIVELY INDEMNIFY
26433075b6Spvalchev (possibly via similar legal warning) JOHN HAUSER AND THE INTERNATIONAL
27433075b6Spvalchev COMPUTER SCIENCE INSTITUTE AGAINST ALL LOSSES, COSTS, OR OTHER PROBLEMS
28433075b6Spvalchev ARISING FROM THE USE OF THE SOFTWARE BY THEIR CUSTOMERS AND CLIENTS.
29433075b6Spvalchev
30433075b6Spvalchev Derivative works are acceptable, even for commercial purposes, so long as
31433075b6Spvalchev (1) they include prominent notice that the work is derivative, and (2) they
32433075b6Spvalchev include prominent notice akin to these four paragraphs for those parts of
33433075b6Spvalchev this code that are retained.
34433075b6Spvalchev
35433075b6Spvalchev ===============================================================================
36433075b6Spvalchev */
37433075b6Spvalchev
38433075b6Spvalchev /*
39433075b6Spvalchev -------------------------------------------------------------------------------
40433075b6Spvalchev Shifts `a' right by the number of bits given in `count'. If any nonzero
41433075b6Spvalchev bits are shifted off, they are ``jammed'' into the least significant bit of
42433075b6Spvalchev the result by setting the least significant bit to 1. The value of `count'
43433075b6Spvalchev can be arbitrarily large; in particular, if `count' is greater than 32, the
44433075b6Spvalchev result will be either 0 or 1, depending on whether `a' is zero or nonzero.
45433075b6Spvalchev The result is stored in the location pointed to by `zPtr'.
46433075b6Spvalchev -------------------------------------------------------------------------------
47433075b6Spvalchev */
shift32RightJamming(bits32 a,int16 count,bits32 * zPtr)48433075b6Spvalchev INLINE void shift32RightJamming( bits32 a, int16 count, bits32 *zPtr )
49433075b6Spvalchev {
50433075b6Spvalchev bits32 z;
51433075b6Spvalchev
52433075b6Spvalchev if ( count == 0 ) {
53433075b6Spvalchev z = a;
54433075b6Spvalchev }
55433075b6Spvalchev else if ( count < 32 ) {
56433075b6Spvalchev z = ( a>>count ) | ( ( a<<( ( - count ) & 31 ) ) != 0 );
57433075b6Spvalchev }
58433075b6Spvalchev else {
59433075b6Spvalchev z = ( a != 0 );
60433075b6Spvalchev }
61433075b6Spvalchev *zPtr = z;
62433075b6Spvalchev
63433075b6Spvalchev }
64433075b6Spvalchev
65433075b6Spvalchev /*
66433075b6Spvalchev -------------------------------------------------------------------------------
67433075b6Spvalchev Shifts `a' right by the number of bits given in `count'. If any nonzero
68433075b6Spvalchev bits are shifted off, they are ``jammed'' into the least significant bit of
69433075b6Spvalchev the result by setting the least significant bit to 1. The value of `count'
70433075b6Spvalchev can be arbitrarily large; in particular, if `count' is greater than 64, the
71433075b6Spvalchev result will be either 0 or 1, depending on whether `a' is zero or nonzero.
72433075b6Spvalchev The result is stored in the location pointed to by `zPtr'.
73433075b6Spvalchev -------------------------------------------------------------------------------
74433075b6Spvalchev */
shift64RightJamming(bits64 a,int16 count,bits64 * zPtr)75433075b6Spvalchev INLINE void shift64RightJamming( bits64 a, int16 count, bits64 *zPtr )
76433075b6Spvalchev {
77433075b6Spvalchev bits64 z;
78433075b6Spvalchev
79433075b6Spvalchev if ( count == 0 ) {
80433075b6Spvalchev z = a;
81433075b6Spvalchev }
82433075b6Spvalchev else if ( count < 64 ) {
83433075b6Spvalchev z = ( a>>count ) | ( ( a<<( ( - count ) & 63 ) ) != 0 );
84433075b6Spvalchev }
85433075b6Spvalchev else {
86433075b6Spvalchev z = ( a != 0 );
87433075b6Spvalchev }
88433075b6Spvalchev *zPtr = z;
89433075b6Spvalchev
90433075b6Spvalchev }
91433075b6Spvalchev
92433075b6Spvalchev /*
93433075b6Spvalchev -------------------------------------------------------------------------------
94433075b6Spvalchev Shifts the 128-bit value formed by concatenating `a0' and `a1' right by 64
95433075b6Spvalchev _plus_ the number of bits given in `count'. The shifted result is at most
96433075b6Spvalchev 64 nonzero bits; this is stored at the location pointed to by `z0Ptr'. The
97433075b6Spvalchev bits shifted off form a second 64-bit result as follows: The _last_ bit
98433075b6Spvalchev shifted off is the most-significant bit of the extra result, and the other
99433075b6Spvalchev 63 bits of the extra result are all zero if and only if _all_but_the_last_
100433075b6Spvalchev bits shifted off were all zero. This extra result is stored in the location
101433075b6Spvalchev pointed to by `z1Ptr'. The value of `count' can be arbitrarily large.
102433075b6Spvalchev (This routine makes more sense if `a0' and `a1' are considered to form a
103433075b6Spvalchev fixed-point value with binary point between `a0' and `a1'. This fixed-point
104433075b6Spvalchev value is shifted right by the number of bits given in `count', and the
105433075b6Spvalchev integer part of the result is returned at the location pointed to by
106433075b6Spvalchev `z0Ptr'. The fractional part of the result may be slightly corrupted as
107433075b6Spvalchev described above, and is returned at the location pointed to by `z1Ptr'.)
108433075b6Spvalchev -------------------------------------------------------------------------------
109433075b6Spvalchev */
110433075b6Spvalchev INLINE void
shift64ExtraRightJamming(bits64 a0,bits64 a1,int16 count,bits64 * z0Ptr,bits64 * z1Ptr)111433075b6Spvalchev shift64ExtraRightJamming(
112433075b6Spvalchev bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
113433075b6Spvalchev {
114433075b6Spvalchev bits64 z0, z1;
115433075b6Spvalchev int8 negCount = ( - count ) & 63;
116433075b6Spvalchev
117433075b6Spvalchev if ( count == 0 ) {
118433075b6Spvalchev z1 = a1;
119433075b6Spvalchev z0 = a0;
120433075b6Spvalchev }
121433075b6Spvalchev else if ( count < 64 ) {
122433075b6Spvalchev z1 = ( a0<<negCount ) | ( a1 != 0 );
123433075b6Spvalchev z0 = a0>>count;
124433075b6Spvalchev }
125433075b6Spvalchev else {
126433075b6Spvalchev if ( count == 64 ) {
127433075b6Spvalchev z1 = a0 | ( a1 != 0 );
128433075b6Spvalchev }
129433075b6Spvalchev else {
130433075b6Spvalchev z1 = ( ( a0 | a1 ) != 0 );
131433075b6Spvalchev }
132433075b6Spvalchev z0 = 0;
133433075b6Spvalchev }
134433075b6Spvalchev *z1Ptr = z1;
135433075b6Spvalchev *z0Ptr = z0;
136433075b6Spvalchev
137433075b6Spvalchev }
138433075b6Spvalchev
1390a4c5fafSmiod #if defined(FLOATX80) || defined(FLOAT128)
1400a4c5fafSmiod
141433075b6Spvalchev /*
142433075b6Spvalchev -------------------------------------------------------------------------------
143433075b6Spvalchev Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
144433075b6Spvalchev number of bits given in `count'. Any bits shifted off are lost. The value
145433075b6Spvalchev of `count' can be arbitrarily large; in particular, if `count' is greater
146433075b6Spvalchev than 128, the result will be 0. The result is broken into two 64-bit pieces
147433075b6Spvalchev which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
148433075b6Spvalchev -------------------------------------------------------------------------------
149433075b6Spvalchev */
150433075b6Spvalchev INLINE void
shift128Right(bits64 a0,bits64 a1,int16 count,bits64 * z0Ptr,bits64 * z1Ptr)151433075b6Spvalchev shift128Right(
152433075b6Spvalchev bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
153433075b6Spvalchev {
154433075b6Spvalchev bits64 z0, z1;
155433075b6Spvalchev int8 negCount = ( - count ) & 63;
156433075b6Spvalchev
157433075b6Spvalchev if ( count == 0 ) {
158433075b6Spvalchev z1 = a1;
159433075b6Spvalchev z0 = a0;
160433075b6Spvalchev }
161433075b6Spvalchev else if ( count < 64 ) {
162433075b6Spvalchev z1 = ( a0<<negCount ) | ( a1>>count );
163433075b6Spvalchev z0 = a0>>count;
164433075b6Spvalchev }
165433075b6Spvalchev else {
166433075b6Spvalchev z1 = ( count < 64 ) ? ( a0>>( count & 63 ) ) : 0;
167433075b6Spvalchev z0 = 0;
168433075b6Spvalchev }
169433075b6Spvalchev *z1Ptr = z1;
170433075b6Spvalchev *z0Ptr = z0;
171433075b6Spvalchev
172433075b6Spvalchev }
173433075b6Spvalchev
174433075b6Spvalchev /*
175433075b6Spvalchev -------------------------------------------------------------------------------
176433075b6Spvalchev Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
177433075b6Spvalchev number of bits given in `count'. If any nonzero bits are shifted off, they
178433075b6Spvalchev are ``jammed'' into the least significant bit of the result by setting the
179433075b6Spvalchev least significant bit to 1. The value of `count' can be arbitrarily large;
180433075b6Spvalchev in particular, if `count' is greater than 128, the result will be either
181433075b6Spvalchev 0 or 1, depending on whether the concatenation of `a0' and `a1' is zero or
182433075b6Spvalchev nonzero. The result is broken into two 64-bit pieces which are stored at
183433075b6Spvalchev the locations pointed to by `z0Ptr' and `z1Ptr'.
184433075b6Spvalchev -------------------------------------------------------------------------------
185433075b6Spvalchev */
186433075b6Spvalchev INLINE void
shift128RightJamming(bits64 a0,bits64 a1,int16 count,bits64 * z0Ptr,bits64 * z1Ptr)187433075b6Spvalchev shift128RightJamming(
188433075b6Spvalchev bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
189433075b6Spvalchev {
190433075b6Spvalchev bits64 z0, z1;
191433075b6Spvalchev int8 negCount = ( - count ) & 63;
192433075b6Spvalchev
193433075b6Spvalchev if ( count == 0 ) {
194433075b6Spvalchev z1 = a1;
195433075b6Spvalchev z0 = a0;
196433075b6Spvalchev }
197433075b6Spvalchev else if ( count < 64 ) {
198433075b6Spvalchev z1 = ( a0<<negCount ) | ( a1>>count ) | ( ( a1<<negCount ) != 0 );
199433075b6Spvalchev z0 = a0>>count;
200433075b6Spvalchev }
201433075b6Spvalchev else {
202433075b6Spvalchev if ( count == 64 ) {
203433075b6Spvalchev z1 = a0 | ( a1 != 0 );
204433075b6Spvalchev }
205433075b6Spvalchev else if ( count < 128 ) {
206433075b6Spvalchev z1 = ( a0>>( count & 63 ) ) | ( ( ( a0<<negCount ) | a1 ) != 0 );
207433075b6Spvalchev }
208433075b6Spvalchev else {
209433075b6Spvalchev z1 = ( ( a0 | a1 ) != 0 );
210433075b6Spvalchev }
211433075b6Spvalchev z0 = 0;
212433075b6Spvalchev }
213433075b6Spvalchev *z1Ptr = z1;
214433075b6Spvalchev *z0Ptr = z0;
215433075b6Spvalchev
216433075b6Spvalchev }
217433075b6Spvalchev
218433075b6Spvalchev /*
219433075b6Spvalchev -------------------------------------------------------------------------------
220433075b6Spvalchev Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' right
221433075b6Spvalchev by 64 _plus_ the number of bits given in `count'. The shifted result is
222433075b6Spvalchev at most 128 nonzero bits; these are broken into two 64-bit pieces which are
223433075b6Spvalchev stored at the locations pointed to by `z0Ptr' and `z1Ptr'. The bits shifted
224433075b6Spvalchev off form a third 64-bit result as follows: The _last_ bit shifted off is
225433075b6Spvalchev the most-significant bit of the extra result, and the other 63 bits of the
226433075b6Spvalchev extra result are all zero if and only if _all_but_the_last_ bits shifted off
227433075b6Spvalchev were all zero. This extra result is stored in the location pointed to by
228433075b6Spvalchev `z2Ptr'. The value of `count' can be arbitrarily large.
229433075b6Spvalchev (This routine makes more sense if `a0', `a1', and `a2' are considered
230433075b6Spvalchev to form a fixed-point value with binary point between `a1' and `a2'. This
231433075b6Spvalchev fixed-point value is shifted right by the number of bits given in `count',
232433075b6Spvalchev and the integer part of the result is returned at the locations pointed to
233433075b6Spvalchev by `z0Ptr' and `z1Ptr'. The fractional part of the result may be slightly
234433075b6Spvalchev corrupted as described above, and is returned at the location pointed to by
235433075b6Spvalchev `z2Ptr'.)
236433075b6Spvalchev -------------------------------------------------------------------------------
237433075b6Spvalchev */
238433075b6Spvalchev INLINE void
shift128ExtraRightJamming(bits64 a0,bits64 a1,bits64 a2,int16 count,bits64 * z0Ptr,bits64 * z1Ptr,bits64 * z2Ptr)239433075b6Spvalchev shift128ExtraRightJamming(
240433075b6Spvalchev bits64 a0,
241433075b6Spvalchev bits64 a1,
242433075b6Spvalchev bits64 a2,
243433075b6Spvalchev int16 count,
244433075b6Spvalchev bits64 *z0Ptr,
245433075b6Spvalchev bits64 *z1Ptr,
246433075b6Spvalchev bits64 *z2Ptr
247433075b6Spvalchev )
248433075b6Spvalchev {
249433075b6Spvalchev bits64 z0, z1, z2;
250433075b6Spvalchev int8 negCount = ( - count ) & 63;
251433075b6Spvalchev
252433075b6Spvalchev if ( count == 0 ) {
253433075b6Spvalchev z2 = a2;
254433075b6Spvalchev z1 = a1;
255433075b6Spvalchev z0 = a0;
256433075b6Spvalchev }
257433075b6Spvalchev else {
258433075b6Spvalchev if ( count < 64 ) {
259433075b6Spvalchev z2 = a1<<negCount;
260433075b6Spvalchev z1 = ( a0<<negCount ) | ( a1>>count );
261433075b6Spvalchev z0 = a0>>count;
262433075b6Spvalchev }
263433075b6Spvalchev else {
264433075b6Spvalchev if ( count == 64 ) {
265433075b6Spvalchev z2 = a1;
266433075b6Spvalchev z1 = a0;
267433075b6Spvalchev }
268433075b6Spvalchev else {
269433075b6Spvalchev a2 |= a1;
270433075b6Spvalchev if ( count < 128 ) {
271433075b6Spvalchev z2 = a0<<negCount;
272433075b6Spvalchev z1 = a0>>( count & 63 );
273433075b6Spvalchev }
274433075b6Spvalchev else {
275433075b6Spvalchev z2 = ( count == 128 ) ? a0 : ( a0 != 0 );
276433075b6Spvalchev z1 = 0;
277433075b6Spvalchev }
278433075b6Spvalchev }
279433075b6Spvalchev z0 = 0;
280433075b6Spvalchev }
281433075b6Spvalchev z2 |= ( a2 != 0 );
282433075b6Spvalchev }
283433075b6Spvalchev *z2Ptr = z2;
284433075b6Spvalchev *z1Ptr = z1;
285433075b6Spvalchev *z0Ptr = z0;
286433075b6Spvalchev
287433075b6Spvalchev }
288433075b6Spvalchev
289433075b6Spvalchev /*
290433075b6Spvalchev -------------------------------------------------------------------------------
291433075b6Spvalchev Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the
292433075b6Spvalchev number of bits given in `count'. Any bits shifted off are lost. The value
293433075b6Spvalchev of `count' must be less than 64. The result is broken into two 64-bit
294433075b6Spvalchev pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
295433075b6Spvalchev -------------------------------------------------------------------------------
296433075b6Spvalchev */
297433075b6Spvalchev INLINE void
shortShift128Left(bits64 a0,bits64 a1,int16 count,bits64 * z0Ptr,bits64 * z1Ptr)298433075b6Spvalchev shortShift128Left(
299433075b6Spvalchev bits64 a0, bits64 a1, int16 count, bits64 *z0Ptr, bits64 *z1Ptr )
300433075b6Spvalchev {
301433075b6Spvalchev
302433075b6Spvalchev *z1Ptr = a1<<count;
303433075b6Spvalchev *z0Ptr =
304433075b6Spvalchev ( count == 0 ) ? a0 : ( a0<<count ) | ( a1>>( ( - count ) & 63 ) );
305433075b6Spvalchev
306433075b6Spvalchev }
307433075b6Spvalchev
3080a4c5fafSmiod #endif /* FLOATX80 || FLOAT128 */
3090a4c5fafSmiod
3100a4c5fafSmiod #ifdef FLOAT128
3110a4c5fafSmiod
312433075b6Spvalchev /*
313433075b6Spvalchev -------------------------------------------------------------------------------
314433075b6Spvalchev Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' left
315433075b6Spvalchev by the number of bits given in `count'. Any bits shifted off are lost.
316433075b6Spvalchev The value of `count' must be less than 64. The result is broken into three
317433075b6Spvalchev 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
318433075b6Spvalchev `z1Ptr', and `z2Ptr'.
319433075b6Spvalchev -------------------------------------------------------------------------------
320433075b6Spvalchev */
321433075b6Spvalchev INLINE void
shortShift192Left(bits64 a0,bits64 a1,bits64 a2,int16 count,bits64 * z0Ptr,bits64 * z1Ptr,bits64 * z2Ptr)322433075b6Spvalchev shortShift192Left(
323433075b6Spvalchev bits64 a0,
324433075b6Spvalchev bits64 a1,
325433075b6Spvalchev bits64 a2,
326433075b6Spvalchev int16 count,
327433075b6Spvalchev bits64 *z0Ptr,
328433075b6Spvalchev bits64 *z1Ptr,
329433075b6Spvalchev bits64 *z2Ptr
330433075b6Spvalchev )
331433075b6Spvalchev {
332433075b6Spvalchev bits64 z0, z1, z2;
333433075b6Spvalchev int8 negCount;
334433075b6Spvalchev
335433075b6Spvalchev z2 = a2<<count;
336433075b6Spvalchev z1 = a1<<count;
337433075b6Spvalchev z0 = a0<<count;
338433075b6Spvalchev if ( 0 < count ) {
339433075b6Spvalchev negCount = ( ( - count ) & 63 );
340433075b6Spvalchev z1 |= a2>>negCount;
341433075b6Spvalchev z0 |= a1>>negCount;
342433075b6Spvalchev }
343433075b6Spvalchev *z2Ptr = z2;
344433075b6Spvalchev *z1Ptr = z1;
345433075b6Spvalchev *z0Ptr = z0;
346433075b6Spvalchev
347433075b6Spvalchev }
348433075b6Spvalchev
3490a4c5fafSmiod #endif /* FLOAT128 */
3500a4c5fafSmiod
351433075b6Spvalchev /*
352433075b6Spvalchev -------------------------------------------------------------------------------
353433075b6Spvalchev Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit
354433075b6Spvalchev value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so
355433075b6Spvalchev any carry out is lost. The result is broken into two 64-bit pieces which
356433075b6Spvalchev are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
357433075b6Spvalchev -------------------------------------------------------------------------------
358433075b6Spvalchev */
359433075b6Spvalchev INLINE void
add128(bits64 a0,bits64 a1,bits64 b0,bits64 b1,bits64 * z0Ptr,bits64 * z1Ptr)360433075b6Spvalchev add128(
361433075b6Spvalchev bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 *z0Ptr, bits64 *z1Ptr )
362433075b6Spvalchev {
363433075b6Spvalchev bits64 z1;
364433075b6Spvalchev
365433075b6Spvalchev z1 = a1 + b1;
366433075b6Spvalchev *z1Ptr = z1;
367433075b6Spvalchev *z0Ptr = a0 + b0 + ( z1 < a1 );
368433075b6Spvalchev
369433075b6Spvalchev }
370433075b6Spvalchev
3710a4c5fafSmiod #if defined(FLOATX80) || defined(FLOAT128)
3720a4c5fafSmiod
373433075b6Spvalchev /*
374433075b6Spvalchev -------------------------------------------------------------------------------
375433075b6Spvalchev Adds the 192-bit value formed by concatenating `a0', `a1', and `a2' to the
376433075b6Spvalchev 192-bit value formed by concatenating `b0', `b1', and `b2'. Addition is
377433075b6Spvalchev modulo 2^192, so any carry out is lost. The result is broken into three
378433075b6Spvalchev 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
379433075b6Spvalchev `z1Ptr', and `z2Ptr'.
380433075b6Spvalchev -------------------------------------------------------------------------------
381433075b6Spvalchev */
382433075b6Spvalchev INLINE void
add192(bits64 a0,bits64 a1,bits64 a2,bits64 b0,bits64 b1,bits64 b2,bits64 * z0Ptr,bits64 * z1Ptr,bits64 * z2Ptr)383433075b6Spvalchev add192(
384433075b6Spvalchev bits64 a0,
385433075b6Spvalchev bits64 a1,
386433075b6Spvalchev bits64 a2,
387433075b6Spvalchev bits64 b0,
388433075b6Spvalchev bits64 b1,
389433075b6Spvalchev bits64 b2,
390433075b6Spvalchev bits64 *z0Ptr,
391433075b6Spvalchev bits64 *z1Ptr,
392433075b6Spvalchev bits64 *z2Ptr
393433075b6Spvalchev )
394433075b6Spvalchev {
395433075b6Spvalchev bits64 z0, z1, z2;
396433075b6Spvalchev int8 carry0, carry1;
397433075b6Spvalchev
398433075b6Spvalchev z2 = a2 + b2;
399433075b6Spvalchev carry1 = ( z2 < a2 );
400433075b6Spvalchev z1 = a1 + b1;
401433075b6Spvalchev carry0 = ( z1 < a1 );
402433075b6Spvalchev z0 = a0 + b0;
403433075b6Spvalchev z1 += carry1;
404433075b6Spvalchev z0 += ( z1 < carry1 );
405433075b6Spvalchev z0 += carry0;
406433075b6Spvalchev *z2Ptr = z2;
407433075b6Spvalchev *z1Ptr = z1;
408433075b6Spvalchev *z0Ptr = z0;
409433075b6Spvalchev
410433075b6Spvalchev }
411433075b6Spvalchev
4120a4c5fafSmiod #endif /* FLOATX80 || FLOAT128 */
4130a4c5fafSmiod
414433075b6Spvalchev /*
415433075b6Spvalchev -------------------------------------------------------------------------------
416433075b6Spvalchev Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the
417433075b6Spvalchev 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo
418433075b6Spvalchev 2^128, so any borrow out (carry out) is lost. The result is broken into two
419433075b6Spvalchev 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and
420433075b6Spvalchev `z1Ptr'.
421433075b6Spvalchev -------------------------------------------------------------------------------
422433075b6Spvalchev */
423433075b6Spvalchev INLINE void
sub128(bits64 a0,bits64 a1,bits64 b0,bits64 b1,bits64 * z0Ptr,bits64 * z1Ptr)424433075b6Spvalchev sub128(
425433075b6Spvalchev bits64 a0, bits64 a1, bits64 b0, bits64 b1, bits64 *z0Ptr, bits64 *z1Ptr )
426433075b6Spvalchev {
427433075b6Spvalchev
428433075b6Spvalchev *z1Ptr = a1 - b1;
429433075b6Spvalchev *z0Ptr = a0 - b0 - ( a1 < b1 );
430433075b6Spvalchev
431433075b6Spvalchev }
432433075b6Spvalchev
4330a4c5fafSmiod #if defined(FLOATX80) || defined(FLOAT128)
4340a4c5fafSmiod
435433075b6Spvalchev /*
436433075b6Spvalchev -------------------------------------------------------------------------------
437433075b6Spvalchev Subtracts the 192-bit value formed by concatenating `b0', `b1', and `b2'
438433075b6Spvalchev from the 192-bit value formed by concatenating `a0', `a1', and `a2'.
439433075b6Spvalchev Subtraction is modulo 2^192, so any borrow out (carry out) is lost. The
440433075b6Spvalchev result is broken into three 64-bit pieces which are stored at the locations
441433075b6Spvalchev pointed to by `z0Ptr', `z1Ptr', and `z2Ptr'.
442433075b6Spvalchev -------------------------------------------------------------------------------
443433075b6Spvalchev */
444433075b6Spvalchev INLINE void
sub192(bits64 a0,bits64 a1,bits64 a2,bits64 b0,bits64 b1,bits64 b2,bits64 * z0Ptr,bits64 * z1Ptr,bits64 * z2Ptr)445433075b6Spvalchev sub192(
446433075b6Spvalchev bits64 a0,
447433075b6Spvalchev bits64 a1,
448433075b6Spvalchev bits64 a2,
449433075b6Spvalchev bits64 b0,
450433075b6Spvalchev bits64 b1,
451433075b6Spvalchev bits64 b2,
452433075b6Spvalchev bits64 *z0Ptr,
453433075b6Spvalchev bits64 *z1Ptr,
454433075b6Spvalchev bits64 *z2Ptr
455433075b6Spvalchev )
456433075b6Spvalchev {
457433075b6Spvalchev bits64 z0, z1, z2;
458433075b6Spvalchev int8 borrow0, borrow1;
459433075b6Spvalchev
460433075b6Spvalchev z2 = a2 - b2;
461433075b6Spvalchev borrow1 = ( a2 < b2 );
462433075b6Spvalchev z1 = a1 - b1;
463433075b6Spvalchev borrow0 = ( a1 < b1 );
464433075b6Spvalchev z0 = a0 - b0;
465433075b6Spvalchev z0 -= ( z1 < borrow1 );
466433075b6Spvalchev z1 -= borrow1;
467433075b6Spvalchev z0 -= borrow0;
468433075b6Spvalchev *z2Ptr = z2;
469433075b6Spvalchev *z1Ptr = z1;
470433075b6Spvalchev *z0Ptr = z0;
471433075b6Spvalchev
472433075b6Spvalchev }
473433075b6Spvalchev
4740a4c5fafSmiod #endif /* FLOATX80 || FLOAT128 */
4750a4c5fafSmiod
476433075b6Spvalchev /*
477433075b6Spvalchev -------------------------------------------------------------------------------
478433075b6Spvalchev Multiplies `a' by `b' to obtain a 128-bit product. The product is broken
479433075b6Spvalchev into two 64-bit pieces which are stored at the locations pointed to by
480433075b6Spvalchev `z0Ptr' and `z1Ptr'.
481433075b6Spvalchev -------------------------------------------------------------------------------
482433075b6Spvalchev */
mul64To128(bits64 a,bits64 b,bits64 * z0Ptr,bits64 * z1Ptr)483433075b6Spvalchev INLINE void mul64To128( bits64 a, bits64 b, bits64 *z0Ptr, bits64 *z1Ptr )
484433075b6Spvalchev {
485433075b6Spvalchev bits32 aHigh, aLow, bHigh, bLow;
486433075b6Spvalchev bits64 z0, zMiddleA, zMiddleB, z1;
487433075b6Spvalchev
488433075b6Spvalchev aLow = a;
489433075b6Spvalchev aHigh = a>>32;
490433075b6Spvalchev bLow = b;
491433075b6Spvalchev bHigh = b>>32;
492433075b6Spvalchev z1 = ( (bits64) aLow ) * bLow;
493433075b6Spvalchev zMiddleA = ( (bits64) aLow ) * bHigh;
494433075b6Spvalchev zMiddleB = ( (bits64) aHigh ) * bLow;
495433075b6Spvalchev z0 = ( (bits64) aHigh ) * bHigh;
496433075b6Spvalchev zMiddleA += zMiddleB;
497433075b6Spvalchev z0 += ( ( (bits64) ( zMiddleA < zMiddleB ) )<<32 ) + ( zMiddleA>>32 );
498433075b6Spvalchev zMiddleA <<= 32;
499433075b6Spvalchev z1 += zMiddleA;
500433075b6Spvalchev z0 += ( z1 < zMiddleA );
501433075b6Spvalchev *z1Ptr = z1;
502433075b6Spvalchev *z0Ptr = z0;
503433075b6Spvalchev
504433075b6Spvalchev }
505433075b6Spvalchev
5060a4c5fafSmiod #ifdef FLOAT128
5070a4c5fafSmiod
508433075b6Spvalchev /*
509433075b6Spvalchev -------------------------------------------------------------------------------
510433075b6Spvalchev Multiplies the 128-bit value formed by concatenating `a0' and `a1' by
511433075b6Spvalchev `b' to obtain a 192-bit product. The product is broken into three 64-bit
512433075b6Spvalchev pieces which are stored at the locations pointed to by `z0Ptr', `z1Ptr', and
513433075b6Spvalchev `z2Ptr'.
514433075b6Spvalchev -------------------------------------------------------------------------------
515433075b6Spvalchev */
516433075b6Spvalchev INLINE void
mul128By64To192(bits64 a0,bits64 a1,bits64 b,bits64 * z0Ptr,bits64 * z1Ptr,bits64 * z2Ptr)517433075b6Spvalchev mul128By64To192(
518433075b6Spvalchev bits64 a0,
519433075b6Spvalchev bits64 a1,
520433075b6Spvalchev bits64 b,
521433075b6Spvalchev bits64 *z0Ptr,
522433075b6Spvalchev bits64 *z1Ptr,
523433075b6Spvalchev bits64 *z2Ptr
524433075b6Spvalchev )
525433075b6Spvalchev {
526433075b6Spvalchev bits64 z0, z1, z2, more1;
527433075b6Spvalchev
528433075b6Spvalchev mul64To128( a1, b, &z1, &z2 );
529433075b6Spvalchev mul64To128( a0, b, &z0, &more1 );
530433075b6Spvalchev add128( z0, more1, 0, z1, &z0, &z1 );
531433075b6Spvalchev *z2Ptr = z2;
532433075b6Spvalchev *z1Ptr = z1;
533433075b6Spvalchev *z0Ptr = z0;
534433075b6Spvalchev
535433075b6Spvalchev }
536433075b6Spvalchev
537433075b6Spvalchev /*
538433075b6Spvalchev -------------------------------------------------------------------------------
539433075b6Spvalchev Multiplies the 128-bit value formed by concatenating `a0' and `a1' to the
540433075b6Spvalchev 128-bit value formed by concatenating `b0' and `b1' to obtain a 256-bit
541433075b6Spvalchev product. The product is broken into four 64-bit pieces which are stored at
542433075b6Spvalchev the locations pointed to by `z0Ptr', `z1Ptr', `z2Ptr', and `z3Ptr'.
543433075b6Spvalchev -------------------------------------------------------------------------------
544433075b6Spvalchev */
545433075b6Spvalchev INLINE void
mul128To256(bits64 a0,bits64 a1,bits64 b0,bits64 b1,bits64 * z0Ptr,bits64 * z1Ptr,bits64 * z2Ptr,bits64 * z3Ptr)546433075b6Spvalchev mul128To256(
547433075b6Spvalchev bits64 a0,
548433075b6Spvalchev bits64 a1,
549433075b6Spvalchev bits64 b0,
550433075b6Spvalchev bits64 b1,
551433075b6Spvalchev bits64 *z0Ptr,
552433075b6Spvalchev bits64 *z1Ptr,
553433075b6Spvalchev bits64 *z2Ptr,
554433075b6Spvalchev bits64 *z3Ptr
555433075b6Spvalchev )
556433075b6Spvalchev {
557433075b6Spvalchev bits64 z0, z1, z2, z3;
558433075b6Spvalchev bits64 more1, more2;
559433075b6Spvalchev
560433075b6Spvalchev mul64To128( a1, b1, &z2, &z3 );
561433075b6Spvalchev mul64To128( a1, b0, &z1, &more2 );
562433075b6Spvalchev add128( z1, more2, 0, z2, &z1, &z2 );
563433075b6Spvalchev mul64To128( a0, b0, &z0, &more1 );
564433075b6Spvalchev add128( z0, more1, 0, z1, &z0, &z1 );
565433075b6Spvalchev mul64To128( a0, b1, &more1, &more2 );
566433075b6Spvalchev add128( more1, more2, 0, z2, &more1, &z2 );
567433075b6Spvalchev add128( z0, z1, 0, more1, &z0, &z1 );
568433075b6Spvalchev *z3Ptr = z3;
569433075b6Spvalchev *z2Ptr = z2;
570433075b6Spvalchev *z1Ptr = z1;
571433075b6Spvalchev *z0Ptr = z0;
572433075b6Spvalchev
573433075b6Spvalchev }
574433075b6Spvalchev
5750a4c5fafSmiod #endif /* FLOAT128 */
5760a4c5fafSmiod
577433075b6Spvalchev /*
578433075b6Spvalchev -------------------------------------------------------------------------------
579433075b6Spvalchev Returns an approximation to the 64-bit integer quotient obtained by dividing
580433075b6Spvalchev `b' into the 128-bit value formed by concatenating `a0' and `a1'. The
581433075b6Spvalchev divisor `b' must be at least 2^63. If q is the exact quotient truncated
582433075b6Spvalchev toward zero, the approximation returned lies between q and q + 2 inclusive.
583433075b6Spvalchev If the exact quotient q is larger than 64 bits, the maximum positive 64-bit
584433075b6Spvalchev unsigned integer is returned.
585433075b6Spvalchev -------------------------------------------------------------------------------
586433075b6Spvalchev */
estimateDiv128To64(bits64 a0,bits64 a1,bits64 b)587433075b6Spvalchev static bits64 estimateDiv128To64( bits64 a0, bits64 a1, bits64 b )
588433075b6Spvalchev {
589433075b6Spvalchev bits64 b0, b1;
590433075b6Spvalchev bits64 rem0, rem1, term0, term1;
591433075b6Spvalchev bits64 z;
592433075b6Spvalchev
593433075b6Spvalchev if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF );
594433075b6Spvalchev b0 = b>>32;
595433075b6Spvalchev z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32;
596433075b6Spvalchev mul64To128( b, z, &term0, &term1 );
597433075b6Spvalchev sub128( a0, a1, term0, term1, &rem0, &rem1 );
598433075b6Spvalchev while ( ( (sbits64) rem0 ) < 0 ) {
599433075b6Spvalchev z -= LIT64( 0x100000000 );
600433075b6Spvalchev b1 = b<<32;
601433075b6Spvalchev add128( rem0, rem1, b0, b1, &rem0, &rem1 );
602433075b6Spvalchev }
603433075b6Spvalchev rem0 = ( rem0<<32 ) | ( rem1>>32 );
604433075b6Spvalchev z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0;
605433075b6Spvalchev return z;
606433075b6Spvalchev
607433075b6Spvalchev }
608433075b6Spvalchev
609433075b6Spvalchev #ifndef SOFTFLOAT_FOR_GCC /* Not used */
610433075b6Spvalchev /*
611433075b6Spvalchev -------------------------------------------------------------------------------
612433075b6Spvalchev Returns an approximation to the square root of the 32-bit significand given
613433075b6Spvalchev by `a'. Considered as an integer, `a' must be at least 2^31. If bit 0 of
614433075b6Spvalchev `aExp' (the least significant bit) is 1, the integer returned approximates
615433075b6Spvalchev 2^31*sqrt(`a'/2^31), where `a' is considered an integer. If bit 0 of `aExp'
616433075b6Spvalchev is 0, the integer returned approximates 2^31*sqrt(`a'/2^30). In either
617433075b6Spvalchev case, the approximation returned lies strictly within +/-2 of the exact
618433075b6Spvalchev value.
619433075b6Spvalchev -------------------------------------------------------------------------------
620433075b6Spvalchev */
estimateSqrt32(int16 aExp,bits32 a)621433075b6Spvalchev static bits32 estimateSqrt32( int16 aExp, bits32 a )
622433075b6Spvalchev {
623433075b6Spvalchev static const bits16 sqrtOddAdjustments[] = {
624433075b6Spvalchev 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0,
625433075b6Spvalchev 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67
626433075b6Spvalchev };
627433075b6Spvalchev static const bits16 sqrtEvenAdjustments[] = {
628433075b6Spvalchev 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E,
629433075b6Spvalchev 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002
630433075b6Spvalchev };
631433075b6Spvalchev int8 index;
632433075b6Spvalchev bits32 z;
633433075b6Spvalchev
634433075b6Spvalchev index = ( a>>27 ) & 15;
635433075b6Spvalchev if ( aExp & 1 ) {
636433075b6Spvalchev z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ index ];
637433075b6Spvalchev z = ( ( a / z )<<14 ) + ( z<<15 );
638433075b6Spvalchev a >>= 1;
639433075b6Spvalchev }
640433075b6Spvalchev else {
641433075b6Spvalchev z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ index ];
642433075b6Spvalchev z = a / z + z;
643433075b6Spvalchev z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 );
644433075b6Spvalchev if ( z <= a ) return (bits32) ( ( (sbits32) a )>>1 );
645433075b6Spvalchev }
646433075b6Spvalchev return ( (bits32) ( ( ( (bits64) a )<<31 ) / z ) ) + ( z>>1 );
647433075b6Spvalchev
648433075b6Spvalchev }
649433075b6Spvalchev #endif
650433075b6Spvalchev
651433075b6Spvalchev /*
652433075b6Spvalchev -------------------------------------------------------------------------------
653433075b6Spvalchev Returns the number of leading 0 bits before the most-significant 1 bit of
654433075b6Spvalchev `a'. If `a' is zero, 32 is returned.
655433075b6Spvalchev -------------------------------------------------------------------------------
656433075b6Spvalchev */
657*82d799bfSmiod #ifndef SOFTFLOAT_MD_CLZ
countLeadingZeros32(bits32 a)658433075b6Spvalchev static int8 countLeadingZeros32( bits32 a )
659433075b6Spvalchev {
660433075b6Spvalchev static const int8 countLeadingZerosHigh[] = {
661433075b6Spvalchev 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
662433075b6Spvalchev 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
663433075b6Spvalchev 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
664433075b6Spvalchev 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
665433075b6Spvalchev 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
666433075b6Spvalchev 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
667433075b6Spvalchev 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
668433075b6Spvalchev 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
669433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
670433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
671433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
672433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
673433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
674433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
675433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
676433075b6Spvalchev 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
677433075b6Spvalchev };
678433075b6Spvalchev int8 shiftCount;
679433075b6Spvalchev
680433075b6Spvalchev shiftCount = 0;
681433075b6Spvalchev if ( a < 0x10000 ) {
682433075b6Spvalchev shiftCount += 16;
683433075b6Spvalchev a <<= 16;
684433075b6Spvalchev }
685433075b6Spvalchev if ( a < 0x1000000 ) {
686433075b6Spvalchev shiftCount += 8;
687433075b6Spvalchev a <<= 8;
688433075b6Spvalchev }
689433075b6Spvalchev shiftCount += countLeadingZerosHigh[ a>>24 ];
690433075b6Spvalchev return shiftCount;
691433075b6Spvalchev
692433075b6Spvalchev }
693*82d799bfSmiod #endif
694433075b6Spvalchev
695433075b6Spvalchev /*
696433075b6Spvalchev -------------------------------------------------------------------------------
697433075b6Spvalchev Returns the number of leading 0 bits before the most-significant 1 bit of
698433075b6Spvalchev `a'. If `a' is zero, 64 is returned.
699433075b6Spvalchev -------------------------------------------------------------------------------
700433075b6Spvalchev */
countLeadingZeros64(bits64 a)701433075b6Spvalchev static int8 countLeadingZeros64( bits64 a )
702433075b6Spvalchev {
703433075b6Spvalchev int8 shiftCount;
704433075b6Spvalchev
705433075b6Spvalchev shiftCount = 0;
706433075b6Spvalchev if ( a < ( (bits64) 1 )<<32 ) {
707433075b6Spvalchev shiftCount += 32;
708433075b6Spvalchev }
709433075b6Spvalchev else {
710433075b6Spvalchev a >>= 32;
711433075b6Spvalchev }
712433075b6Spvalchev shiftCount += countLeadingZeros32( a );
713433075b6Spvalchev return shiftCount;
714433075b6Spvalchev
715433075b6Spvalchev }
716433075b6Spvalchev
7170a4c5fafSmiod #if defined(FLOATX80) || defined(FLOAT128)
7180a4c5fafSmiod
719433075b6Spvalchev /*
720433075b6Spvalchev -------------------------------------------------------------------------------
721433075b6Spvalchev Returns 1 if the 128-bit value formed by concatenating `a0' and `a1'
722433075b6Spvalchev is equal to the 128-bit value formed by concatenating `b0' and `b1'.
723433075b6Spvalchev Otherwise, returns 0.
724433075b6Spvalchev -------------------------------------------------------------------------------
725433075b6Spvalchev */
eq128(bits64 a0,bits64 a1,bits64 b0,bits64 b1)726433075b6Spvalchev INLINE flag eq128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
727433075b6Spvalchev {
728433075b6Spvalchev
729433075b6Spvalchev return ( a0 == b0 ) && ( a1 == b1 );
730433075b6Spvalchev
731433075b6Spvalchev }
732433075b6Spvalchev
733433075b6Spvalchev /*
734433075b6Spvalchev -------------------------------------------------------------------------------
735433075b6Spvalchev Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
736433075b6Spvalchev than or equal to the 128-bit value formed by concatenating `b0' and `b1'.
737433075b6Spvalchev Otherwise, returns 0.
738433075b6Spvalchev -------------------------------------------------------------------------------
739433075b6Spvalchev */
le128(bits64 a0,bits64 a1,bits64 b0,bits64 b1)740433075b6Spvalchev INLINE flag le128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
741433075b6Spvalchev {
742433075b6Spvalchev
743433075b6Spvalchev return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 <= b1 ) );
744433075b6Spvalchev
745433075b6Spvalchev }
746433075b6Spvalchev
747433075b6Spvalchev /*
748433075b6Spvalchev -------------------------------------------------------------------------------
749433075b6Spvalchev Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
750433075b6Spvalchev than the 128-bit value formed by concatenating `b0' and `b1'. Otherwise,
751433075b6Spvalchev returns 0.
752433075b6Spvalchev -------------------------------------------------------------------------------
753433075b6Spvalchev */
lt128(bits64 a0,bits64 a1,bits64 b0,bits64 b1)754433075b6Spvalchev INLINE flag lt128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
755433075b6Spvalchev {
756433075b6Spvalchev
757433075b6Spvalchev return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 < b1 ) );
758433075b6Spvalchev
759433075b6Spvalchev }
760433075b6Spvalchev
7610a4c5fafSmiod #endif /* FLOATX80 || FLOAT128 */
7620a4c5fafSmiod
7630a4c5fafSmiod #if 0
7640a4c5fafSmiod
765433075b6Spvalchev /*
766433075b6Spvalchev -------------------------------------------------------------------------------
767433075b6Spvalchev Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is
768433075b6Spvalchev not equal to the 128-bit value formed by concatenating `b0' and `b1'.
769433075b6Spvalchev Otherwise, returns 0.
770433075b6Spvalchev -------------------------------------------------------------------------------
771433075b6Spvalchev */
772433075b6Spvalchev INLINE flag ne128( bits64 a0, bits64 a1, bits64 b0, bits64 b1 )
773433075b6Spvalchev {
774433075b6Spvalchev
775433075b6Spvalchev return ( a0 != b0 ) || ( a1 != b1 );
776433075b6Spvalchev
777433075b6Spvalchev }
778433075b6Spvalchev
7790a4c5fafSmiod #endif
780