1 /* Copyright (C) 2007-2018 Free Software Foundation, Inc.
2 
3 This file is part of GCC.
4 
5 GCC is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 3, or (at your option) any later
8 version.
9 
10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13 for more details.
14 
15 Under Section 7 of GPL version 3, you are granted additional
16 permissions described in the GCC Runtime Library Exception, version
17 3.1, as published by the Free Software Foundation.
18 
19 You should have received a copy of the GNU General Public License and
20 a copy of the GCC Runtime Library Exception along with this program;
21 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
22 <http://www.gnu.org/licenses/>.  */
23 
24 #include "bid_internal.h"
25 
26 static const UINT64 mult_factor[16] = {
27   1ull, 10ull, 100ull, 1000ull,
28   10000ull, 100000ull, 1000000ull, 10000000ull,
29   100000000ull, 1000000000ull, 10000000000ull, 100000000000ull,
30   1000000000000ull, 10000000000000ull,
31   100000000000000ull, 1000000000000000ull
32 };
33 
34 #if DECIMAL_CALL_BY_REFERENCE
35 void
bid64_quiet_equal(int * pres,UINT64 * px,UINT64 * py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)36 bid64_quiet_equal (int *pres, UINT64 * px,
37 		   UINT64 *
38 		   py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
39 		   _EXC_INFO_PARAM) {
40   UINT64 x = *px;
41   UINT64 y = *py;
42 #else
43 int
44 bid64_quiet_equal (UINT64 x,
45 		   UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
46 		   _EXC_INFO_PARAM) {
47 #endif
48   int res;
49   int exp_x, exp_y, exp_t;
50   UINT64 sig_x, sig_y, sig_t;
51   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y, lcv;
52 
53   // NaN (CASE1)
54   // if either number is NAN, the comparison is unordered,
55   // rather than equal : return 0
56   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
57     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
58       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
59     }
60     res = 0;
61     BID_RETURN (res);
62   }
63   // SIMPLE (CASE2)
64   // if all the bits are the same, these numbers are equivalent.
65   if (x == y) {
66     res = 1;
67     BID_RETURN (res);
68   }
69   // INFINITY (CASE3)
70   if (((x & MASK_INF) == MASK_INF) && ((y & MASK_INF) == MASK_INF)) {
71     res = (((x ^ y) & MASK_SIGN) != MASK_SIGN);
72     BID_RETURN (res);
73   }
74   // ONE INFINITY (CASE3')
75   if (((x & MASK_INF) == MASK_INF) || ((y & MASK_INF) == MASK_INF)) {
76     res = 0;
77     BID_RETURN (res);
78   }
79   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
80   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
81     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
82     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
83     if (sig_x > 9999999999999999ull) {
84       non_canon_x = 1;
85     } else {
86       non_canon_x = 0;
87     }
88   } else {
89     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
90     sig_x = (x & MASK_BINARY_SIG1);
91     non_canon_x = 0;
92   }
93   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
94   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
95     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
96     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
97     if (sig_y > 9999999999999999ull) {
98       non_canon_y = 1;
99     } else {
100       non_canon_y = 0;
101     }
102   } else {
103     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
104     sig_y = (y & MASK_BINARY_SIG1);
105     non_canon_y = 0;
106   }
107   // ZERO (CASE4)
108   // some properties:
109   // (+ZERO==-ZERO) => therefore ignore the sign
110   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
111   //    therefore ignore the exponent field
112   //    (Any non-canonical # is considered 0)
113   if (non_canon_x || sig_x == 0) {
114     x_is_zero = 1;
115   }
116   if (non_canon_y || sig_y == 0) {
117     y_is_zero = 1;
118   }
119   if (x_is_zero && y_is_zero) {
120     res = 1;
121     BID_RETURN (res);
122   } else if ((x_is_zero && !y_is_zero) || (!x_is_zero && y_is_zero)) {
123     res = 0;
124     BID_RETURN (res);
125   }
126   // OPPOSITE SIGN (CASE5)
127   // now, if the sign bits differ => not equal : return 0
128   if ((x ^ y) & MASK_SIGN) {
129     res = 0;
130     BID_RETURN (res);
131   }
132   // REDUNDANT REPRESENTATIONS (CASE6)
133   if (exp_x > exp_y) {	// to simplify the loop below,
134     SWAP (exp_x, exp_y, exp_t);	// put the larger exp in y,
135     SWAP (sig_x, sig_y, sig_t);	// and the smaller exp in x
136   }
137   if (exp_y - exp_x > 15) {
138     res = 0;	// difference cannot be greater than 10^15
139     BID_RETURN (res);
140   }
141   for (lcv = 0; lcv < (exp_y - exp_x); lcv++) {
142     // recalculate y's significand upwards
143     sig_y = sig_y * 10;
144     if (sig_y > 9999999999999999ull) {
145       res = 0;
146       BID_RETURN (res);
147     }
148   }
149   res = (sig_y == sig_x);
150   BID_RETURN (res);
151 }
152 
153 #if DECIMAL_CALL_BY_REFERENCE
154 void
155 bid64_quiet_greater (int *pres, UINT64 * px,
156 		     UINT64 *
157 		     py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
158 		     _EXC_INFO_PARAM) {
159   UINT64 x = *px;
160   UINT64 y = *py;
161 #else
162 int
163 bid64_quiet_greater (UINT64 x,
164 		     UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
165 		     _EXC_INFO_PARAM) {
166 #endif
167   int res;
168   int exp_x, exp_y;
169   UINT64 sig_x, sig_y;
170   UINT128 sig_n_prime;
171   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
172 
173   // NaN (CASE1)
174   // if either number is NAN, the comparison is unordered, rather than equal :
175   // return 0
176   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
177     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
178       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
179     }
180     res = 0;
181     BID_RETURN (res);
182   }
183   // SIMPLE (CASE2)
184   // if all the bits are the same, these numbers are equal (not Greater).
185   if (x == y) {
186     res = 0;
187     BID_RETURN (res);
188   }
189   // INFINITY (CASE3)
190   if ((x & MASK_INF) == MASK_INF) {
191     // if x is neg infinity, there is no way it is greater than y, return 0
192     if (((x & MASK_SIGN) == MASK_SIGN)) {
193       res = 0;
194       BID_RETURN (res);
195     } else {
196       // x is pos infinity, it is greater, unless y is positive
197       // infinity => return y!=pos_infinity
198       res = (((y & MASK_INF) != MASK_INF)
199 	     || ((y & MASK_SIGN) == MASK_SIGN));
200       BID_RETURN (res);
201     }
202   } else if ((y & MASK_INF) == MASK_INF) {
203     // x is finite, so if y is positive infinity, then x is less, return 0
204     //                 if y is negative infinity, then x is greater, return 1
205     res = ((y & MASK_SIGN) == MASK_SIGN);
206     BID_RETURN (res);
207   }
208   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
209   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
210     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
211     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
212     if (sig_x > 9999999999999999ull) {
213       non_canon_x = 1;
214     } else {
215       non_canon_x = 0;
216     }
217   } else {
218     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
219     sig_x = (x & MASK_BINARY_SIG1);
220     non_canon_x = 0;
221   }
222   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
223   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
224     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
225     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
226     if (sig_y > 9999999999999999ull) {
227       non_canon_y = 1;
228     } else {
229       non_canon_y = 0;
230     }
231   } else {
232     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
233     sig_y = (y & MASK_BINARY_SIG1);
234     non_canon_y = 0;
235   }
236   // ZERO (CASE4)
237   // some properties:
238   //(+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
239   //(ZERO x 10^A == ZERO x 10^B) for any valid A, B => therefore ignore the
240   // exponent field
241   // (Any non-canonical # is considered 0)
242   if (non_canon_x || sig_x == 0) {
243     x_is_zero = 1;
244   }
245   if (non_canon_y || sig_y == 0) {
246     y_is_zero = 1;
247   }
248   // if both numbers are zero, neither is greater => return NOTGREATERTHAN
249   if (x_is_zero && y_is_zero) {
250     res = 0;
251     BID_RETURN (res);
252   } else if (x_is_zero) {
253     // is x is zero, it is greater if Y is negative
254     res = ((y & MASK_SIGN) == MASK_SIGN);
255     BID_RETURN (res);
256   } else if (y_is_zero) {
257     // is y is zero, X is greater if it is positive
258     res = ((x & MASK_SIGN) != MASK_SIGN);
259     BID_RETURN (res);
260   }
261   // OPPOSITE SIGN (CASE5)
262   // now, if the sign bits differ, x is greater if y is negative
263   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
264     res = ((y & MASK_SIGN) == MASK_SIGN);
265     BID_RETURN (res);
266   }
267   // REDUNDANT REPRESENTATIONS (CASE6)
268   // if both components are either bigger or smaller,
269   // it is clear what needs to be done
270   if (sig_x > sig_y && exp_x > exp_y) {
271     res = ((x & MASK_SIGN) != MASK_SIGN);
272     BID_RETURN (res);
273   }
274   if (sig_x < sig_y && exp_x < exp_y) {
275     res = ((x & MASK_SIGN) == MASK_SIGN);
276     BID_RETURN (res);
277   }
278   // if exp_x is 15 greater than exp_y, no need for compensation
279   if (exp_x - exp_y > 15) {	// difference cannot be greater than 10^15
280     if (x & MASK_SIGN)	// if both are negative
281       res = 0;
282     else	// if both are positive
283       res = 1;
284     BID_RETURN (res);
285   }
286   // if exp_x is 15 less than exp_y, no need for compensation
287   if (exp_y - exp_x > 15) {
288     if (x & MASK_SIGN)	// if both are negative
289       res = 1;
290     else	// if both are positive
291       res = 0;
292     BID_RETURN (res);
293   }
294   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
295   if (exp_x > exp_y) {	// to simplify the loop below,
296     // otherwise adjust the x significand upwards
297     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
298 			    mult_factor[exp_x - exp_y]);
299     // if postitive, return whichever significand is larger (converse if neg.)
300     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
301       res = 0;
302       BID_RETURN (res);
303     }
304     res = (((sig_n_prime.w[1] > 0)
305 	    || sig_n_prime.w[0] > sig_y) ^ ((x & MASK_SIGN) ==
306 					    MASK_SIGN));
307     BID_RETURN (res);
308   }
309   // adjust the y significand upwards
310   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
311 			  mult_factor[exp_y - exp_x]);
312   // if postitive, return whichever significand is larger
313   //     (converse if negative)
314   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
315     res = 0;
316     BID_RETURN (res);
317   }
318   res = (((sig_n_prime.w[1] == 0)
319 	  && (sig_x > sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
320 					    MASK_SIGN));
321   BID_RETURN (res);
322 }
323 
324 #if DECIMAL_CALL_BY_REFERENCE
325 void
326 bid64_quiet_greater_equal (int *pres, UINT64 * px,
327 			   UINT64 *
328 			   py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
329 			   _EXC_INFO_PARAM) {
330   UINT64 x = *px;
331   UINT64 y = *py;
332 #else
333 int
334 bid64_quiet_greater_equal (UINT64 x,
335 			   UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
336 			   _EXC_INFO_PARAM) {
337 #endif
338   int res;
339   int exp_x, exp_y;
340   UINT64 sig_x, sig_y;
341   UINT128 sig_n_prime;
342   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
343 
344   // NaN (CASE1)
345   // if either number is NAN, the comparison is unordered : return 1
346   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
347     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
348       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
349     }
350     res = 0;
351     BID_RETURN (res);
352   }
353   // SIMPLE (CASE2)
354   // if all the bits are the same, these numbers are equal.
355   if (x == y) {
356     res = 1;
357     BID_RETURN (res);
358   }
359   // INFINITY (CASE3)
360   if ((x & MASK_INF) == MASK_INF) {
361     // if x==neg_inf, { res = (y == neg_inf)?1:0; BID_RETURN (res) }
362     if ((x & MASK_SIGN) == MASK_SIGN) {
363       // x is -inf, so it is less than y unless y is -inf
364       res = (((y & MASK_INF) == MASK_INF)
365 	     && (y & MASK_SIGN) == MASK_SIGN);
366       BID_RETURN (res);
367     } else {	// x is pos_inf, no way for it to be less than y
368       res = 1;
369       BID_RETURN (res);
370     }
371   } else if ((y & MASK_INF) == MASK_INF) {
372     // x is finite, so:
373     //    if y is +inf, x<y
374     //    if y is -inf, x>y
375     res = ((y & MASK_SIGN) == MASK_SIGN);
376     BID_RETURN (res);
377   }
378   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
379   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
380     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
381     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
382     if (sig_x > 9999999999999999ull) {
383       non_canon_x = 1;
384     } else {
385       non_canon_x = 0;
386     }
387   } else {
388     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
389     sig_x = (x & MASK_BINARY_SIG1);
390     non_canon_x = 0;
391   }
392   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
393   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
394     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
395     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
396     if (sig_y > 9999999999999999ull) {
397       non_canon_y = 1;
398     } else {
399       non_canon_y = 0;
400     }
401   } else {
402     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
403     sig_y = (y & MASK_BINARY_SIG1);
404     non_canon_y = 0;
405   }
406   // ZERO (CASE4)
407   // some properties:
408   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
409   // (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
410   //   therefore ignore the exponent field
411   //  (Any non-canonical # is considered 0)
412   if (non_canon_x || sig_x == 0) {
413     x_is_zero = 1;
414   }
415   if (non_canon_y || sig_y == 0) {
416     y_is_zero = 1;
417   }
418   if (x_is_zero && y_is_zero) {
419     // if both numbers are zero, they are equal
420     res = 1;
421     BID_RETURN (res);
422   } else if (x_is_zero) {
423     // if x is zero, it is lessthan if Y is positive
424     res = ((y & MASK_SIGN) == MASK_SIGN);
425     BID_RETURN (res);
426   } else if (y_is_zero) {
427     // if y is zero, X is less if it is negative
428     res = ((x & MASK_SIGN) != MASK_SIGN);
429     BID_RETURN (res);
430   }
431   // OPPOSITE SIGN (CASE5)
432   // now, if the sign bits differ, x is less than if y is positive
433   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
434     res = ((y & MASK_SIGN) == MASK_SIGN);
435     BID_RETURN (res);
436   }
437   // REDUNDANT REPRESENTATIONS (CASE6)
438   // if both components are either bigger or smaller
439   if (sig_x > sig_y && exp_x >= exp_y) {
440     res = ((x & MASK_SIGN) != MASK_SIGN);
441     BID_RETURN (res);
442   }
443   if (sig_x < sig_y && exp_x <= exp_y) {
444     res = ((x & MASK_SIGN) == MASK_SIGN);
445     BID_RETURN (res);
446   }
447   // if exp_x is 15 greater than exp_y, no need for compensation
448   if (exp_x - exp_y > 15) {
449     res = ((x & MASK_SIGN) != MASK_SIGN);
450     // difference cannot be greater than 10^15
451     BID_RETURN (res);
452   }
453   // if exp_x is 15 less than exp_y, no need for compensation
454   if (exp_y - exp_x > 15) {
455     res = ((x & MASK_SIGN) == MASK_SIGN);
456     BID_RETURN (res);
457   }
458   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
459   if (exp_x > exp_y) {	// to simplify the loop below,
460     // otherwise adjust the x significand upwards
461     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
462 			    mult_factor[exp_x - exp_y]);
463     // return 1 if values are equal
464     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
465       res = 1;
466       BID_RETURN (res);
467     }
468     // if postitive, return whichever significand abs is smaller
469     // (converse if negative)
470     res = (((sig_n_prime.w[1] == 0)
471 	    && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) !=
472 					    MASK_SIGN));
473     BID_RETURN (res);
474   }
475   // adjust the y significand upwards
476   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
477 			  mult_factor[exp_y - exp_x]);
478   // return 0 if values are equal
479   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
480     res = 1;
481     BID_RETURN (res);
482   }
483   // if positive, return whichever significand abs is smaller
484   // (converse if negative)
485   res = (((sig_n_prime.w[1] > 0)
486 	  || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) !=
487 					    MASK_SIGN));
488   BID_RETURN (res);
489 }
490 
491 #if DECIMAL_CALL_BY_REFERENCE
492 void
493 bid64_quiet_greater_unordered (int *pres, UINT64 * px,
494 			       UINT64 *
495 			       py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
496 			       _EXC_INFO_PARAM) {
497   UINT64 x = *px;
498   UINT64 y = *py;
499 #else
500 int
501 bid64_quiet_greater_unordered (UINT64 x,
502 			       UINT64 y _EXC_FLAGS_PARAM
503 			       _EXC_MASKS_PARAM _EXC_INFO_PARAM) {
504 #endif
505   int res;
506   int exp_x, exp_y;
507   UINT64 sig_x, sig_y;
508   UINT128 sig_n_prime;
509   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
510 
511   // NaN (CASE1)
512   // if either number is NAN, the comparison is unordered, rather than equal :
513   // return 0
514   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
515     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
516       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
517     }
518     res = 1;
519     BID_RETURN (res);
520   }
521   // SIMPLE (CASE2)
522   // if all the bits are the same, these numbers are equal (not Greater).
523   if (x == y) {
524     res = 0;
525     BID_RETURN (res);
526   }
527   // INFINITY (CASE3)
528   if ((x & MASK_INF) == MASK_INF) {
529     // if x is neg infinity, there is no way it is greater than y, return 0
530     if (((x & MASK_SIGN) == MASK_SIGN)) {
531       res = 0;
532       BID_RETURN (res);
533     } else {
534       // x is pos infinity, it is greater, unless y is positive infinity =>
535       // return y!=pos_infinity
536       res = (((y & MASK_INF) != MASK_INF)
537 	     || ((y & MASK_SIGN) == MASK_SIGN));
538       BID_RETURN (res);
539     }
540   } else if ((y & MASK_INF) == MASK_INF) {
541     // x is finite, so if y is positive infinity, then x is less, return 0
542     //                 if y is negative infinity, then x is greater, return 1
543     res = ((y & MASK_SIGN) == MASK_SIGN);
544     BID_RETURN (res);
545   }
546   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
547   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
548     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
549     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
550     if (sig_x > 9999999999999999ull) {
551       non_canon_x = 1;
552     } else {
553       non_canon_x = 0;
554     }
555   } else {
556     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
557     sig_x = (x & MASK_BINARY_SIG1);
558     non_canon_x = 0;
559   }
560   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
561   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
562     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
563     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
564     if (sig_y > 9999999999999999ull) {
565       non_canon_y = 1;
566     } else {
567       non_canon_y = 0;
568     }
569   } else {
570     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
571     sig_y = (y & MASK_BINARY_SIG1);
572     non_canon_y = 0;
573   }
574   // ZERO (CASE4)
575   // some properties:
576   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
577   // (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
578   // therefore ignore the exponent field
579   //    (Any non-canonical # is considered 0)
580   if (non_canon_x || sig_x == 0) {
581     x_is_zero = 1;
582   }
583   if (non_canon_y || sig_y == 0) {
584     y_is_zero = 1;
585   }
586   // if both numbers are zero, neither is greater => return NOTGREATERTHAN
587   if (x_is_zero && y_is_zero) {
588     res = 0;
589     BID_RETURN (res);
590   } else if (x_is_zero) {
591     // is x is zero, it is greater if Y is negative
592     res = ((y & MASK_SIGN) == MASK_SIGN);
593     BID_RETURN (res);
594   } else if (y_is_zero) {
595     // is y is zero, X is greater if it is positive
596     res = ((x & MASK_SIGN) != MASK_SIGN);
597     BID_RETURN (res);
598   }
599   // OPPOSITE SIGN (CASE5)
600   // now, if the sign bits differ, x is greater if y is negative
601   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
602     res = ((y & MASK_SIGN) == MASK_SIGN);
603     BID_RETURN (res);
604   }
605   // REDUNDANT REPRESENTATIONS (CASE6)
606   // if both components are either bigger or smaller
607   if (sig_x > sig_y && exp_x >= exp_y) {
608     res = ((x & MASK_SIGN) != MASK_SIGN);
609     BID_RETURN (res);
610   }
611   if (sig_x < sig_y && exp_x <= exp_y) {
612     res = ((x & MASK_SIGN) == MASK_SIGN);
613     BID_RETURN (res);
614   }
615   // if exp_x is 15 greater than exp_y, no need for compensation
616   if (exp_x - exp_y > 15) {
617     // difference cannot be greater than 10^15
618     res = ((x & MASK_SIGN) != MASK_SIGN);
619     BID_RETURN (res);
620   }
621   // if exp_x is 15 less than exp_y, no need for compensation
622   if (exp_y - exp_x > 15) {
623     res = ((x & MASK_SIGN) == MASK_SIGN);
624     BID_RETURN (res);
625   }
626   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
627   if (exp_x > exp_y) {	// to simplify the loop below,
628     // otherwise adjust the x significand upwards
629     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
630 			    mult_factor[exp_x - exp_y]);
631     // if postitive, return whichever significand is larger
632     // (converse if negative)
633     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
634       res = 0;
635       BID_RETURN (res);
636     }
637     res = (((sig_n_prime.w[1] > 0)
638 	    || sig_n_prime.w[0] > sig_y) ^ ((x & MASK_SIGN) ==
639 					    MASK_SIGN));
640     BID_RETURN (res);
641   }
642   // adjust the y significand upwards
643   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
644 			  mult_factor[exp_y - exp_x]);
645   // if postitive, return whichever significand is larger (converse if negative)
646   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
647     res = 0;
648     BID_RETURN (res);
649   }
650   res = (((sig_n_prime.w[1] == 0)
651 	  && (sig_x > sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
652 					    MASK_SIGN));
653   BID_RETURN (res);
654 }
655 
656 #if DECIMAL_CALL_BY_REFERENCE
657 void
658 bid64_quiet_less (int *pres, UINT64 * px,
659 		  UINT64 *
660 		  py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)
661 {
662   UINT64 x = *px;
663   UINT64 y = *py;
664 #else
665 int
666 bid64_quiet_less (UINT64 x,
667 		  UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
668 		  _EXC_INFO_PARAM) {
669 #endif
670   int res;
671   int exp_x, exp_y;
672   UINT64 sig_x, sig_y;
673   UINT128 sig_n_prime;
674   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
675 
676   // NaN (CASE1)
677   // if either number is NAN, the comparison is unordered : return 0
678   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
679     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
680       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
681     }
682     res = 0;
683     BID_RETURN (res);
684   }
685   // SIMPLE (CASE2)
686   // if all the bits are the same, these numbers are equal.
687   if (x == y) {
688     res = 0;
689     BID_RETURN (res);
690   }
691   // INFINITY (CASE3)
692   if ((x & MASK_INF) == MASK_INF) {
693     // if x==neg_inf, { res = (y == neg_inf)?0:1; BID_RETURN (res) }
694     if ((x & MASK_SIGN) == MASK_SIGN) {
695       // x is -inf, so it is less than y unless y is -inf
696       res = (((y & MASK_INF) != MASK_INF)
697 	     || (y & MASK_SIGN) != MASK_SIGN);
698       BID_RETURN (res);
699     } else {
700       // x is pos_inf, no way for it to be less than y
701       res = 0;
702       BID_RETURN (res);
703     }
704   } else if ((y & MASK_INF) == MASK_INF) {
705     // x is finite, so:
706     //    if y is +inf, x<y
707     //    if y is -inf, x>y
708     res = ((y & MASK_SIGN) != MASK_SIGN);
709     BID_RETURN (res);
710   }
711   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
712   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
713     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
714     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
715     if (sig_x > 9999999999999999ull) {
716       non_canon_x = 1;
717     } else {
718       non_canon_x = 0;
719     }
720   } else {
721     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
722     sig_x = (x & MASK_BINARY_SIG1);
723     non_canon_x = 0;
724   }
725   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
726   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
727     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
728     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
729     if (sig_y > 9999999999999999ull) {
730       non_canon_y = 1;
731     } else {
732       non_canon_y = 0;
733     }
734   } else {
735     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
736     sig_y = (y & MASK_BINARY_SIG1);
737     non_canon_y = 0;
738   }
739   // ZERO (CASE4)
740   // some properties:
741   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
742   // (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
743   //  therefore ignore the exponent field
744   //    (Any non-canonical # is considered 0)
745   if (non_canon_x || sig_x == 0) {
746     x_is_zero = 1;
747   }
748   if (non_canon_y || sig_y == 0) {
749     y_is_zero = 1;
750   }
751   if (x_is_zero && y_is_zero) {
752     // if both numbers are zero, they are equal
753     res = 0;
754     BID_RETURN (res);
755   } else if (x_is_zero) {
756     // if x is zero, it is lessthan if Y is positive
757     res = ((y & MASK_SIGN) != MASK_SIGN);
758     BID_RETURN (res);
759   } else if (y_is_zero) {
760     // if y is zero, X is less if it is negative
761     res = ((x & MASK_SIGN) == MASK_SIGN);
762     BID_RETURN (res);
763   }
764   // OPPOSITE SIGN (CASE5)
765   // now, if the sign bits differ, x is less than if y is positive
766   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
767     res = ((y & MASK_SIGN) != MASK_SIGN);
768     BID_RETURN (res);
769   }
770   // REDUNDANT REPRESENTATIONS (CASE6)
771   // if both components are either bigger or smaller,
772   // it is clear what needs to be done
773   if (sig_x > sig_y && exp_x >= exp_y) {
774     res = ((x & MASK_SIGN) == MASK_SIGN);
775     BID_RETURN (res);
776   }
777   if (sig_x < sig_y && exp_x <= exp_y) {
778     res = ((x & MASK_SIGN) != MASK_SIGN);
779     BID_RETURN (res);
780   }
781   // if exp_x is 15 greater than exp_y, no need for compensation
782   if (exp_x - exp_y > 15) {
783     res = ((x & MASK_SIGN) == MASK_SIGN);
784     // difference cannot be greater than 10^15
785     BID_RETURN (res);
786   }
787   // if exp_x is 15 less than exp_y, no need for compensation
788   if (exp_y - exp_x > 15) {
789     res = ((x & MASK_SIGN) != MASK_SIGN);
790     BID_RETURN (res);
791   }
792   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
793   if (exp_x > exp_y) {	// to simplify the loop below,
794     // otherwise adjust the x significand upwards
795     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
796 			    mult_factor[exp_x - exp_y]);
797     // return 0 if values are equal
798     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
799       res = 0;
800       BID_RETURN (res);
801     }
802     // if postitive, return whichever significand abs is smaller
803     // (converse if negative)
804     res = (((sig_n_prime.w[1] == 0)
805 	    && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
806 					    MASK_SIGN));
807     BID_RETURN (res);
808   }
809   // adjust the y significand upwards
810   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
811 			  mult_factor[exp_y - exp_x]);
812   // return 0 if values are equal
813   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
814     res = 0;
815     BID_RETURN (res);
816   }
817   // if positive, return whichever significand abs is smaller
818   // (converse if negative)
819   res = (((sig_n_prime.w[1] > 0)
820 	  || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
821 					    MASK_SIGN));
822   BID_RETURN (res);
823 }
824 
825 #if DECIMAL_CALL_BY_REFERENCE
826 void
827 bid64_quiet_less_equal (int *pres, UINT64 * px,
828 			UINT64 *
829 			py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
830 			_EXC_INFO_PARAM) {
831   UINT64 x = *px;
832   UINT64 y = *py;
833 #else
834 int
835 bid64_quiet_less_equal (UINT64 x,
836 			UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
837 			_EXC_INFO_PARAM) {
838 #endif
839   int res;
840   int exp_x, exp_y;
841   UINT64 sig_x, sig_y;
842   UINT128 sig_n_prime;
843   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
844 
845   // NaN (CASE1)
846   // if either number is NAN, the comparison is unordered, rather than equal :
847   //     return 0
848   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
849     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
850       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
851     }
852     res = 0;
853     BID_RETURN (res);
854   }
855   // SIMPLE (CASE2)
856   // if all the bits are the same, these numbers are equal (LESSEQUAL).
857   if (x == y) {
858     res = 1;
859     BID_RETURN (res);
860   }
861   // INFINITY (CASE3)
862   if ((x & MASK_INF) == MASK_INF) {
863     if (((x & MASK_SIGN) == MASK_SIGN)) {
864       // if x is neg infinity, it must be lessthan or equal to y return 1
865       res = 1;
866       BID_RETURN (res);
867     } else {
868       // x is pos infinity, it is greater, unless y is positive infinity =>
869       // return y==pos_infinity
870       res = !(((y & MASK_INF) != MASK_INF)
871 	      || ((y & MASK_SIGN) == MASK_SIGN));
872       BID_RETURN (res);
873     }
874   } else if ((y & MASK_INF) == MASK_INF) {
875     // x is finite, so if y is positive infinity, then x is less, return 1
876     //                 if y is negative infinity, then x is greater, return 0
877     res = ((y & MASK_SIGN) != MASK_SIGN);
878     BID_RETURN (res);
879   }
880   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
881   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
882     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
883     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
884     if (sig_x > 9999999999999999ull) {
885       non_canon_x = 1;
886     } else {
887       non_canon_x = 0;
888     }
889   } else {
890     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
891     sig_x = (x & MASK_BINARY_SIG1);
892     non_canon_x = 0;
893   }
894   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
895   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
896     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
897     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
898     if (sig_y > 9999999999999999ull) {
899       non_canon_y = 1;
900     } else {
901       non_canon_y = 0;
902     }
903   } else {
904     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
905     sig_y = (y & MASK_BINARY_SIG1);
906     non_canon_y = 0;
907   }
908   // ZERO (CASE4)
909   // some properties:
910   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
911   // (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
912   //     therefore ignore the exponent field
913   //    (Any non-canonical # is considered 0)
914   if (non_canon_x || sig_x == 0) {
915     x_is_zero = 1;
916   }
917   if (non_canon_y || sig_y == 0) {
918     y_is_zero = 1;
919   }
920   if (x_is_zero && y_is_zero) {
921     // if both numbers are zero, they are equal -> return 1
922     res = 1;
923     BID_RETURN (res);
924   } else if (x_is_zero) {
925     // if x is zero, it is lessthan if Y is positive
926     res = ((y & MASK_SIGN) != MASK_SIGN);
927     BID_RETURN (res);
928   } else if (y_is_zero) {
929     // if y is zero, X is less if it is negative
930     res = ((x & MASK_SIGN) == MASK_SIGN);
931     BID_RETURN (res);
932   }
933   // OPPOSITE SIGN (CASE5)
934   // now, if the sign bits differ, x is less than if y is positive
935   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
936     res = ((y & MASK_SIGN) != MASK_SIGN);
937     BID_RETURN (res);
938   }
939   // REDUNDANT REPRESENTATIONS (CASE6)
940   // if both components are either bigger or smaller
941   if (sig_x > sig_y && exp_x >= exp_y) {
942     res = ((x & MASK_SIGN) == MASK_SIGN);
943     BID_RETURN (res);
944   }
945   if (sig_x < sig_y && exp_x <= exp_y) {
946     res = ((x & MASK_SIGN) != MASK_SIGN);
947     BID_RETURN (res);
948   }
949   // if exp_x is 15 greater than exp_y, no need for compensation
950   if (exp_x - exp_y > 15) {
951     res = ((x & MASK_SIGN) == MASK_SIGN);
952     // difference cannot be greater than 10^15
953     BID_RETURN (res);
954   }
955   // if exp_x is 15 less than exp_y, no need for compensation
956   if (exp_y - exp_x > 15) {
957     res = ((x & MASK_SIGN) != MASK_SIGN);
958     BID_RETURN (res);
959   }
960   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
961   if (exp_x > exp_y) {	// to simplify the loop below,
962     // otherwise adjust the x significand upwards
963     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
964 			    mult_factor[exp_x - exp_y]);
965     // return 1 if values are equal
966     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
967       res = 1;
968       BID_RETURN (res);
969     }
970     // if postitive, return whichever significand abs is smaller
971     //     (converse if negative)
972     res = (((sig_n_prime.w[1] == 0)
973 	    && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
974 					    MASK_SIGN));
975     BID_RETURN (res);
976   }
977   // adjust the y significand upwards
978   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
979 			  mult_factor[exp_y - exp_x]);
980   // return 1 if values are equal
981   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
982     res = 1;
983     BID_RETURN (res);
984   }
985   // if positive, return whichever significand abs is smaller
986   //     (converse if negative)
987   res = (((sig_n_prime.w[1] > 0)
988 	  || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
989 					    MASK_SIGN));
990   BID_RETURN (res);
991 }
992 
993 #if DECIMAL_CALL_BY_REFERENCE
994 void
995 bid64_quiet_less_unordered (int *pres, UINT64 * px,
996 			    UINT64 *
997 			    py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
998 			    _EXC_INFO_PARAM) {
999   UINT64 x = *px;
1000   UINT64 y = *py;
1001 #else
1002 int
1003 bid64_quiet_less_unordered (UINT64 x,
1004 			    UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1005 			    _EXC_INFO_PARAM) {
1006 #endif
1007   int res;
1008   int exp_x, exp_y;
1009   UINT64 sig_x, sig_y;
1010   UINT128 sig_n_prime;
1011   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
1012 
1013   // NaN (CASE1)
1014   // if either number is NAN, the comparison is unordered : return 0
1015   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1016     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
1017       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
1018     }
1019     res = 1;
1020     BID_RETURN (res);
1021   }
1022   // SIMPLE (CASE2)
1023   // if all the bits are the same, these numbers are equal.
1024   if (x == y) {
1025     res = 0;
1026     BID_RETURN (res);
1027   }
1028   // INFINITY (CASE3)
1029   if ((x & MASK_INF) == MASK_INF) {
1030     // if x==neg_inf, { res = (y == neg_inf)?0:1; BID_RETURN (res) }
1031     if ((x & MASK_SIGN) == MASK_SIGN) {
1032       // x is -inf, so it is less than y unless y is -inf
1033       res = (((y & MASK_INF) != MASK_INF)
1034 	     || (y & MASK_SIGN) != MASK_SIGN);
1035       BID_RETURN (res);
1036     } else {
1037       // x is pos_inf, no way for it to be less than y
1038       res = 0;
1039       BID_RETURN (res);
1040     }
1041   } else if ((y & MASK_INF) == MASK_INF) {
1042     // x is finite, so:
1043     //    if y is +inf, x<y
1044     //    if y is -inf, x>y
1045     res = ((y & MASK_SIGN) != MASK_SIGN);
1046     BID_RETURN (res);
1047   }
1048   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1049   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1050     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
1051     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1052     if (sig_x > 9999999999999999ull) {
1053       non_canon_x = 1;
1054     } else {
1055       non_canon_x = 0;
1056     }
1057   } else {
1058     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
1059     sig_x = (x & MASK_BINARY_SIG1);
1060     non_canon_x = 0;
1061   }
1062   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1063   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1064     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
1065     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1066     if (sig_y > 9999999999999999ull) {
1067       non_canon_y = 1;
1068     } else {
1069       non_canon_y = 0;
1070     }
1071   } else {
1072     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
1073     sig_y = (y & MASK_BINARY_SIG1);
1074     non_canon_y = 0;
1075   }
1076   // ZERO (CASE4)
1077   // some properties:
1078   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
1079   // (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
1080   //     therefore ignore the exponent field
1081   //    (Any non-canonical # is considered 0)
1082   if (non_canon_x || sig_x == 0) {
1083     x_is_zero = 1;
1084   }
1085   if (non_canon_y || sig_y == 0) {
1086     y_is_zero = 1;
1087   }
1088   if (x_is_zero && y_is_zero) {
1089     // if both numbers are zero, they are equal
1090     res = 0;
1091     BID_RETURN (res);
1092   } else if (x_is_zero) {
1093     // if x is zero, it is lessthan if Y is positive
1094     res = ((y & MASK_SIGN) != MASK_SIGN);
1095     BID_RETURN (res);
1096   } else if (y_is_zero) {
1097     // if y is zero, X is less if it is negative
1098     res = ((x & MASK_SIGN) == MASK_SIGN);
1099     BID_RETURN (res);
1100   }
1101   // OPPOSITE SIGN (CASE5)
1102   // now, if the sign bits differ, x is less than if y is positive
1103   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
1104     res = ((y & MASK_SIGN) != MASK_SIGN);
1105     BID_RETURN (res);
1106   }
1107   // REDUNDANT REPRESENTATIONS (CASE6)
1108   // if both components are either bigger or smaller
1109   if (sig_x > sig_y && exp_x >= exp_y) {
1110     res = ((x & MASK_SIGN) == MASK_SIGN);
1111     BID_RETURN (res);
1112   }
1113   if (sig_x < sig_y && exp_x <= exp_y) {
1114     res = ((x & MASK_SIGN) != MASK_SIGN);
1115     BID_RETURN (res);
1116   }
1117   // if exp_x is 15 greater than exp_y, no need for compensation
1118   if (exp_x - exp_y > 15) {
1119     res = ((x & MASK_SIGN) == MASK_SIGN);
1120     // difference cannot be greater than 10^15
1121     BID_RETURN (res);
1122   }
1123   // if exp_x is 15 less than exp_y, no need for compensation
1124   if (exp_y - exp_x > 15) {
1125     res = ((x & MASK_SIGN) != MASK_SIGN);
1126     BID_RETURN (res);
1127   }
1128   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
1129   if (exp_x > exp_y) {	// to simplify the loop below,
1130     // otherwise adjust the x significand upwards
1131     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
1132 			    mult_factor[exp_x - exp_y]);
1133     // return 0 if values are equal
1134     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
1135       res = 0;
1136       BID_RETURN (res);
1137     }
1138     // if postitive, return whichever significand abs is smaller
1139     //     (converse if negative)
1140     res = (((sig_n_prime.w[1] == 0)
1141 	    && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
1142 					    MASK_SIGN));
1143     BID_RETURN (res);
1144   }
1145   // adjust the y significand upwards
1146   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
1147 			  mult_factor[exp_y - exp_x]);
1148   // return 0 if values are equal
1149   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
1150     res = 0;
1151     BID_RETURN (res);
1152   }
1153   // if positive, return whichever significand abs is smaller
1154   //     (converse if negative)
1155   res = (((sig_n_prime.w[1] > 0)
1156 	  || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
1157 					    MASK_SIGN));
1158   BID_RETURN (res);
1159 }
1160 
1161 #if DECIMAL_CALL_BY_REFERENCE
1162 void
1163 bid64_quiet_not_equal (int *pres, UINT64 * px,
1164 		       UINT64 *
1165 		       py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1166 		       _EXC_INFO_PARAM) {
1167   UINT64 x = *px;
1168   UINT64 y = *py;
1169 #else
1170 int
1171 bid64_quiet_not_equal (UINT64 x,
1172 		       UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1173 		       _EXC_INFO_PARAM) {
1174 #endif
1175   int res;
1176   int exp_x, exp_y, exp_t;
1177   UINT64 sig_x, sig_y, sig_t;
1178   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y, lcv;
1179 
1180   // NaN (CASE1)
1181   // if either number is NAN, the comparison is unordered,
1182   // rather than equal : return 1
1183   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1184     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
1185       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
1186     }
1187     res = 1;
1188     BID_RETURN (res);
1189   }
1190   // SIMPLE (CASE2)
1191   // if all the bits are the same, these numbers are equivalent.
1192   if (x == y) {
1193     res = 0;
1194     BID_RETURN (res);
1195   }
1196   // INFINITY (CASE3)
1197   if (((x & MASK_INF) == MASK_INF) && ((y & MASK_INF) == MASK_INF)) {
1198     res = (((x ^ y) & MASK_SIGN) == MASK_SIGN);
1199     BID_RETURN (res);
1200   }
1201   // ONE INFINITY (CASE3')
1202   if (((x & MASK_INF) == MASK_INF) || ((y & MASK_INF) == MASK_INF)) {
1203     res = 1;
1204     BID_RETURN (res);
1205   }
1206   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1207   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1208     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
1209     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1210     if (sig_x > 9999999999999999ull) {
1211       non_canon_x = 1;
1212     } else {
1213       non_canon_x = 0;
1214     }
1215   } else {
1216     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
1217     sig_x = (x & MASK_BINARY_SIG1);
1218     non_canon_x = 0;
1219   }
1220 
1221   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1222   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1223     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
1224     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1225     if (sig_y > 9999999999999999ull) {
1226       non_canon_y = 1;
1227     } else {
1228       non_canon_y = 0;
1229     }
1230   } else {
1231     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
1232     sig_y = (y & MASK_BINARY_SIG1);
1233     non_canon_y = 0;
1234   }
1235 
1236   // ZERO (CASE4)
1237   // some properties:
1238   // (+ZERO==-ZERO) => therefore ignore the sign
1239   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
1240   //        therefore ignore the exponent field
1241   //    (Any non-canonical # is considered 0)
1242   if (non_canon_x || sig_x == 0) {
1243     x_is_zero = 1;
1244   }
1245   if (non_canon_y || sig_y == 0) {
1246     y_is_zero = 1;
1247   }
1248 
1249   if (x_is_zero && y_is_zero) {
1250     res = 0;
1251     BID_RETURN (res);
1252   } else if ((x_is_zero && !y_is_zero) || (!x_is_zero && y_is_zero)) {
1253     res = 1;
1254     BID_RETURN (res);
1255   }
1256   // OPPOSITE SIGN (CASE5)
1257   // now, if the sign bits differ => not equal : return 1
1258   if ((x ^ y) & MASK_SIGN) {
1259     res = 1;
1260     BID_RETURN (res);
1261   }
1262   // REDUNDANT REPRESENTATIONS (CASE6)
1263   if (exp_x > exp_y) {	// to simplify the loop below,
1264     SWAP (exp_x, exp_y, exp_t);	// put the larger exp in y,
1265     SWAP (sig_x, sig_y, sig_t);	// and the smaller exp in x
1266   }
1267 
1268   if (exp_y - exp_x > 15) {
1269     res = 1;
1270     BID_RETURN (res);
1271   }
1272   // difference cannot be greater than 10^16
1273 
1274   for (lcv = 0; lcv < (exp_y - exp_x); lcv++) {
1275 
1276     // recalculate y's significand upwards
1277     sig_y = sig_y * 10;
1278     if (sig_y > 9999999999999999ull) {
1279       res = 1;
1280       BID_RETURN (res);
1281     }
1282   }
1283 
1284   {
1285     res = sig_y != sig_x;
1286     BID_RETURN (res);
1287   }
1288 
1289 }
1290 
1291 #if DECIMAL_CALL_BY_REFERENCE
1292 void
1293 bid64_quiet_not_greater (int *pres, UINT64 * px,
1294 			 UINT64 *
1295 			 py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1296 			 _EXC_INFO_PARAM) {
1297   UINT64 x = *px;
1298   UINT64 y = *py;
1299 #else
1300 int
1301 bid64_quiet_not_greater (UINT64 x,
1302 			 UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1303 			 _EXC_INFO_PARAM) {
1304 #endif
1305   int res;
1306   int exp_x, exp_y;
1307   UINT64 sig_x, sig_y;
1308   UINT128 sig_n_prime;
1309   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
1310 
1311   // NaN (CASE1)
1312   // if either number is NAN, the comparison is unordered,
1313   //   rather than equal : return 0
1314   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1315     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
1316       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
1317     }
1318     res = 1;
1319     BID_RETURN (res);
1320   }
1321   // SIMPLE (CASE2)
1322   // if all the bits are the same, these numbers are equal (LESSEQUAL).
1323   if (x == y) {
1324     res = 1;
1325     BID_RETURN (res);
1326   }
1327   // INFINITY (CASE3)
1328   if ((x & MASK_INF) == MASK_INF) {
1329     // if x is neg infinity, it must be lessthan or equal to y return 1
1330     if (((x & MASK_SIGN) == MASK_SIGN)) {
1331       res = 1;
1332       BID_RETURN (res);
1333     }
1334     // x is pos infinity, it is greater, unless y is positive
1335     // infinity => return y==pos_infinity
1336     else {
1337       res = !(((y & MASK_INF) != MASK_INF)
1338 	      || ((y & MASK_SIGN) == MASK_SIGN));
1339       BID_RETURN (res);
1340     }
1341   } else if ((y & MASK_INF) == MASK_INF) {
1342     // x is finite, so if y is positive infinity, then x is less, return 1
1343     //                 if y is negative infinity, then x is greater, return 0
1344     {
1345       res = ((y & MASK_SIGN) != MASK_SIGN);
1346       BID_RETURN (res);
1347     }
1348   }
1349   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1350   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1351     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
1352     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1353     if (sig_x > 9999999999999999ull) {
1354       non_canon_x = 1;
1355     } else {
1356       non_canon_x = 0;
1357     }
1358   } else {
1359     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
1360     sig_x = (x & MASK_BINARY_SIG1);
1361     non_canon_x = 0;
1362   }
1363 
1364   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1365   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1366     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
1367     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1368     if (sig_y > 9999999999999999ull) {
1369       non_canon_y = 1;
1370     } else {
1371       non_canon_y = 0;
1372     }
1373   } else {
1374     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
1375     sig_y = (y & MASK_BINARY_SIG1);
1376     non_canon_y = 0;
1377   }
1378 
1379   // ZERO (CASE4)
1380   // some properties:
1381   // (+ZERO==-ZERO) => therefore ignore the sign, and neither
1382   //         number is greater
1383   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
1384   //         therefore ignore the exponent field
1385   //    (Any non-canonical # is considered 0)
1386   if (non_canon_x || sig_x == 0) {
1387     x_is_zero = 1;
1388   }
1389   if (non_canon_y || sig_y == 0) {
1390     y_is_zero = 1;
1391   }
1392   // if both numbers are zero, they are equal -> return 1
1393   if (x_is_zero && y_is_zero) {
1394     res = 1;
1395     BID_RETURN (res);
1396   }
1397   // if x is zero, it is lessthan if Y is positive
1398   else if (x_is_zero) {
1399     res = ((y & MASK_SIGN) != MASK_SIGN);
1400     BID_RETURN (res);
1401   }
1402   // if y is zero, X is less if it is negative
1403   else if (y_is_zero) {
1404     res = ((x & MASK_SIGN) == MASK_SIGN);
1405     BID_RETURN (res);
1406   }
1407   // OPPOSITE SIGN (CASE5)
1408   // now, if the sign bits differ, x is less than if y is positive
1409   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
1410     res = ((y & MASK_SIGN) != MASK_SIGN);
1411     BID_RETURN (res);
1412   }
1413   // REDUNDANT REPRESENTATIONS (CASE6)
1414   // if both components are either bigger or smaller
1415   if (sig_x > sig_y && exp_x >= exp_y) {
1416     res = ((x & MASK_SIGN) == MASK_SIGN);
1417     BID_RETURN (res);
1418   }
1419   if (sig_x < sig_y && exp_x <= exp_y) {
1420     res = ((x & MASK_SIGN) != MASK_SIGN);
1421     BID_RETURN (res);
1422   }
1423   // if exp_x is 15 greater than exp_y, no need for compensation
1424   if (exp_x - exp_y > 15) {
1425     res = ((x & MASK_SIGN) == MASK_SIGN);
1426     BID_RETURN (res);
1427   }
1428   // difference cannot be greater than 10^15
1429 
1430   // if exp_x is 15 less than exp_y, no need for compensation
1431   if (exp_y - exp_x > 15) {
1432     res = ((x & MASK_SIGN) != MASK_SIGN);
1433     BID_RETURN (res);
1434   }
1435   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
1436   if (exp_x > exp_y) {	// to simplify the loop below,
1437 
1438     // otherwise adjust the x significand upwards
1439     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
1440 			    mult_factor[exp_x - exp_y]);
1441 
1442     // return 1 if values are equal
1443     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
1444       res = 1;
1445       BID_RETURN (res);
1446     }
1447     // if postitive, return whichever significand abs is smaller
1448     //     (converse if negative)
1449     {
1450       res = (((sig_n_prime.w[1] == 0)
1451 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
1452 					      MASK_SIGN));
1453       BID_RETURN (res);
1454     }
1455   }
1456   // adjust the y significand upwards
1457   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
1458 			  mult_factor[exp_y - exp_x]);
1459 
1460   // return 1 if values are equal
1461   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
1462     res = 1;
1463     BID_RETURN (res);
1464   }
1465   // if positive, return whichever significand abs is smaller
1466   //     (converse if negative)
1467   {
1468     res = (((sig_n_prime.w[1] > 0)
1469 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
1470 					      MASK_SIGN));
1471     BID_RETURN (res);
1472   }
1473 }
1474 
1475 #if DECIMAL_CALL_BY_REFERENCE
1476 void
1477 bid64_quiet_not_less (int *pres, UINT64 * px,
1478 		      UINT64 *
1479 		      py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1480 		      _EXC_INFO_PARAM) {
1481   UINT64 x = *px;
1482   UINT64 y = *py;
1483 #else
1484 int
1485 bid64_quiet_not_less (UINT64 x,
1486 		      UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1487 		      _EXC_INFO_PARAM) {
1488 #endif
1489   int res;
1490   int exp_x, exp_y;
1491   UINT64 sig_x, sig_y;
1492   UINT128 sig_n_prime;
1493   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
1494 
1495   // NaN (CASE1)
1496   // if either number is NAN, the comparison is unordered : return 1
1497   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1498     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
1499       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
1500     }
1501     res = 1;
1502     BID_RETURN (res);
1503   }
1504   // SIMPLE (CASE2)
1505   // if all the bits are the same, these numbers are equal.
1506   if (x == y) {
1507     res = 1;
1508     BID_RETURN (res);
1509   }
1510   // INFINITY (CASE3)
1511   if ((x & MASK_INF) == MASK_INF) {
1512     // if x==neg_inf, { res = (y == neg_inf)?1:0; BID_RETURN (res) }
1513     if ((x & MASK_SIGN) == MASK_SIGN)
1514       // x is -inf, so it is less than y unless y is -inf
1515     {
1516       res = (((y & MASK_INF) == MASK_INF)
1517 	     && (y & MASK_SIGN) == MASK_SIGN);
1518       BID_RETURN (res);
1519     } else
1520       // x is pos_inf, no way for it to be less than y
1521     {
1522       res = 1;
1523       BID_RETURN (res);
1524     }
1525   } else if ((y & MASK_INF) == MASK_INF) {
1526     // x is finite, so:
1527     //    if y is +inf, x<y
1528     //    if y is -inf, x>y
1529     {
1530       res = ((y & MASK_SIGN) == MASK_SIGN);
1531       BID_RETURN (res);
1532     }
1533   }
1534   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1535   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1536     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
1537     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1538     if (sig_x > 9999999999999999ull) {
1539       non_canon_x = 1;
1540     } else {
1541       non_canon_x = 0;
1542     }
1543   } else {
1544     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
1545     sig_x = (x & MASK_BINARY_SIG1);
1546     non_canon_x = 0;
1547   }
1548 
1549   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1550   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1551     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
1552     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1553     if (sig_y > 9999999999999999ull) {
1554       non_canon_y = 1;
1555     } else {
1556       non_canon_y = 0;
1557     }
1558   } else {
1559     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
1560     sig_y = (y & MASK_BINARY_SIG1);
1561     non_canon_y = 0;
1562   }
1563 
1564   // ZERO (CASE4)
1565   // some properties:
1566   // (+ZERO==-ZERO) => therefore ignore the sign, and neither
1567   //        number is greater
1568   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
1569   //        therefore ignore the exponent field
1570   //    (Any non-canonical # is considered 0)
1571   if (non_canon_x || sig_x == 0) {
1572     x_is_zero = 1;
1573   }
1574   if (non_canon_y || sig_y == 0) {
1575     y_is_zero = 1;
1576   }
1577   // if both numbers are zero, they are equal
1578   if (x_is_zero && y_is_zero) {
1579     res = 1;
1580     BID_RETURN (res);
1581   }
1582   // if x is zero, it is lessthan if Y is positive
1583   else if (x_is_zero) {
1584     res = ((y & MASK_SIGN) == MASK_SIGN);
1585     BID_RETURN (res);
1586   }
1587   // if y is zero, X is less if it is negative
1588   else if (y_is_zero) {
1589     res = ((x & MASK_SIGN) != MASK_SIGN);
1590     BID_RETURN (res);
1591   }
1592   // OPPOSITE SIGN (CASE5)
1593   // now, if the sign bits differ, x is less than if y is positive
1594   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
1595     res = ((y & MASK_SIGN) == MASK_SIGN);
1596     BID_RETURN (res);
1597   }
1598   // REDUNDANT REPRESENTATIONS (CASE6)
1599   // if both components are either bigger or smaller
1600   if (sig_x > sig_y && exp_x >= exp_y) {
1601     res = ((x & MASK_SIGN) != MASK_SIGN);
1602     BID_RETURN (res);
1603   }
1604   if (sig_x < sig_y && exp_x <= exp_y) {
1605     res = ((x & MASK_SIGN) == MASK_SIGN);
1606     BID_RETURN (res);
1607   }
1608   // if exp_x is 15 greater than exp_y, no need for compensation
1609   if (exp_x - exp_y > 15) {
1610     res = ((x & MASK_SIGN) != MASK_SIGN);
1611     BID_RETURN (res);
1612   }
1613   // difference cannot be greater than 10^15
1614 
1615   // if exp_x is 15 less than exp_y, no need for compensation
1616   if (exp_y - exp_x > 15) {
1617     res = ((x & MASK_SIGN) == MASK_SIGN);
1618     BID_RETURN (res);
1619   }
1620   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
1621   if (exp_x > exp_y) {	// to simplify the loop below,
1622 
1623     // otherwise adjust the x significand upwards
1624     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
1625 			    mult_factor[exp_x - exp_y]);
1626 
1627     // return 0 if values are equal
1628     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
1629       res = 1;
1630       BID_RETURN (res);
1631     }
1632     // if postitive, return whichever significand abs is smaller
1633     //     (converse if negative)
1634     {
1635       res = (((sig_n_prime.w[1] == 0)
1636 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) !=
1637 					      MASK_SIGN));
1638       BID_RETURN (res);
1639     }
1640   }
1641   // adjust the y significand upwards
1642   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
1643 			  mult_factor[exp_y - exp_x]);
1644 
1645   // return 0 if values are equal
1646   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
1647     res = 1;
1648     BID_RETURN (res);
1649   }
1650   // if positive, return whichever significand abs is smaller
1651   //     (converse if negative)
1652   {
1653     res = (((sig_n_prime.w[1] > 0)
1654 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) !=
1655 					      MASK_SIGN));
1656     BID_RETURN (res);
1657   }
1658 }
1659 
1660 #if DECIMAL_CALL_BY_REFERENCE
1661 void
1662 bid64_quiet_ordered (int *pres, UINT64 * px,
1663 		     UINT64 *
1664 		     py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1665 		     _EXC_INFO_PARAM) {
1666   UINT64 x = *px;
1667   UINT64 y = *py;
1668 #else
1669 int
1670 bid64_quiet_ordered (UINT64 x,
1671 		     UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1672 		     _EXC_INFO_PARAM) {
1673 #endif
1674   int res;
1675 
1676   // NaN (CASE1)
1677   // if either number is NAN, the comparison is ordered, rather than equal : return 0
1678   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1679     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
1680       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
1681     }
1682     res = 0;
1683     BID_RETURN (res);
1684   } else {
1685     res = 1;
1686     BID_RETURN (res);
1687   }
1688 }
1689 
1690 #if DECIMAL_CALL_BY_REFERENCE
1691 void
1692 bid64_quiet_unordered (int *pres, UINT64 * px,
1693 		       UINT64 *
1694 		       py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1695 		       _EXC_INFO_PARAM) {
1696   UINT64 x = *px;
1697   UINT64 y = *py;
1698 #else
1699 int
1700 bid64_quiet_unordered (UINT64 x,
1701 		       UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1702 		       _EXC_INFO_PARAM) {
1703 #endif
1704   int res;
1705 
1706   // NaN (CASE1)
1707   // if either number is NAN, the comparison is unordered,
1708   //     rather than equal : return 0
1709   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1710     if ((x & MASK_SNAN) == MASK_SNAN || (y & MASK_SNAN) == MASK_SNAN) {
1711       *pfpsf |= INVALID_EXCEPTION;	// set exception if sNaN
1712     }
1713     res = 1;
1714     BID_RETURN (res);
1715   } else {
1716     res = 0;
1717     BID_RETURN (res);
1718   }
1719 }
1720 
1721 #if DECIMAL_CALL_BY_REFERENCE
1722 void
1723 bid64_signaling_greater (int *pres, UINT64 * px,
1724 			 UINT64 *
1725 			 py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1726 			 _EXC_INFO_PARAM) {
1727   UINT64 x = *px;
1728   UINT64 y = *py;
1729 #else
1730 int
1731 bid64_signaling_greater (UINT64 x,
1732 			 UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1733 			 _EXC_INFO_PARAM) {
1734 #endif
1735   int res;
1736   int exp_x, exp_y;
1737   UINT64 sig_x, sig_y;
1738   UINT128 sig_n_prime;
1739   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
1740 
1741   // NaN (CASE1)
1742   // if either number is NAN, the comparison is unordered,
1743   //     rather than equal : return 0
1744   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1745     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
1746     res = 0;
1747     BID_RETURN (res);
1748   }
1749   // SIMPLE (CASE2)
1750   // if all the bits are the same, these numbers are equal (not Greater).
1751   if (x == y) {
1752     res = 0;
1753     BID_RETURN (res);
1754   }
1755   // INFINITY (CASE3)
1756   if ((x & MASK_INF) == MASK_INF) {
1757     // if x is neg infinity, there is no way it is greater than y, return 0
1758     if (((x & MASK_SIGN) == MASK_SIGN)) {
1759       res = 0;
1760       BID_RETURN (res);
1761     }
1762     // x is pos infinity, it is greater,
1763     // unless y is positive infinity => return y!=pos_infinity
1764     else {
1765       res = (((y & MASK_INF) != MASK_INF)
1766 	     || ((y & MASK_SIGN) == MASK_SIGN));
1767       BID_RETURN (res);
1768     }
1769   } else if ((y & MASK_INF) == MASK_INF) {
1770     // x is finite, so if y is positive infinity, then x is less, return 0
1771     //                 if y is negative infinity, then x is greater, return 1
1772     {
1773       res = ((y & MASK_SIGN) == MASK_SIGN);
1774       BID_RETURN (res);
1775     }
1776   }
1777   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1778   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1779     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
1780     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1781     if (sig_x > 9999999999999999ull) {
1782       non_canon_x = 1;
1783     } else {
1784       non_canon_x = 0;
1785     }
1786   } else {
1787     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
1788     sig_x = (x & MASK_BINARY_SIG1);
1789     non_canon_x = 0;
1790   }
1791 
1792   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1793   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1794     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
1795     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1796     if (sig_y > 9999999999999999ull) {
1797       non_canon_y = 1;
1798     } else {
1799       non_canon_y = 0;
1800     }
1801   } else {
1802     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
1803     sig_y = (y & MASK_BINARY_SIG1);
1804     non_canon_y = 0;
1805   }
1806 
1807   // ZERO (CASE4)
1808   // some properties:
1809   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
1810   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
1811   //      therefore ignore the exponent field
1812   //    (Any non-canonical # is considered 0)
1813   if (non_canon_x || sig_x == 0) {
1814     x_is_zero = 1;
1815   }
1816   if (non_canon_y || sig_y == 0) {
1817     y_is_zero = 1;
1818   }
1819   // if both numbers are zero, neither is greater => return NOTGREATERTHAN
1820   if (x_is_zero && y_is_zero) {
1821     res = 0;
1822     BID_RETURN (res);
1823   }
1824   // is x is zero, it is greater if Y is negative
1825   else if (x_is_zero) {
1826     res = ((y & MASK_SIGN) == MASK_SIGN);
1827     BID_RETURN (res);
1828   }
1829   // is y is zero, X is greater if it is positive
1830   else if (y_is_zero) {
1831     res = ((x & MASK_SIGN) != MASK_SIGN);
1832     BID_RETURN (res);
1833   }
1834   // OPPOSITE SIGN (CASE5)
1835   // now, if the sign bits differ, x is greater if y is negative
1836   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
1837     res = ((y & MASK_SIGN) == MASK_SIGN);
1838     BID_RETURN (res);
1839   }
1840   // REDUNDANT REPRESENTATIONS (CASE6)
1841 
1842   // if both components are either bigger or smaller
1843   if (sig_x > sig_y && exp_x >= exp_y) {
1844     res = ((x & MASK_SIGN) != MASK_SIGN);
1845     BID_RETURN (res);
1846   }
1847   if (sig_x < sig_y && exp_x <= exp_y) {
1848     res = ((x & MASK_SIGN) == MASK_SIGN);
1849     BID_RETURN (res);
1850   }
1851   // if exp_x is 15 greater than exp_y, no need for compensation
1852   if (exp_x - exp_y > 15) {
1853     res = ((x & MASK_SIGN) != MASK_SIGN);
1854     BID_RETURN (res);
1855   }
1856   // difference cannot be greater than 10^15
1857 
1858   // if exp_x is 15 less than exp_y, no need for compensation
1859   if (exp_y - exp_x > 15) {
1860     res = ((x & MASK_SIGN) == MASK_SIGN);
1861     BID_RETURN (res);
1862   }
1863   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
1864   if (exp_x > exp_y) {	// to simplify the loop below,
1865 
1866     // otherwise adjust the x significand upwards
1867     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
1868 			    mult_factor[exp_x - exp_y]);
1869 
1870 
1871     // if postitive, return whichever significand is larger
1872     //     (converse if negative)
1873     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
1874       res = 0;
1875       BID_RETURN (res);
1876     }
1877 
1878     {
1879       res = (((sig_n_prime.w[1] > 0)
1880 	      || sig_n_prime.w[0] > sig_y) ^ ((x & MASK_SIGN) ==
1881 					      MASK_SIGN));
1882       BID_RETURN (res);
1883     }
1884   }
1885   // adjust the y significand upwards
1886   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
1887 			  mult_factor[exp_y - exp_x]);
1888 
1889   // if postitive, return whichever significand is larger
1890   //     (converse if negative)
1891   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
1892     res = 0;
1893     BID_RETURN (res);
1894   }
1895   {
1896     res = (((sig_n_prime.w[1] == 0)
1897 	    && (sig_x > sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
1898 					      MASK_SIGN));
1899     BID_RETURN (res);
1900   }
1901 }
1902 
1903 #if DECIMAL_CALL_BY_REFERENCE
1904 void
1905 bid64_signaling_greater_equal (int *pres, UINT64 * px,
1906 			       UINT64 *
1907 			       py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1908 			       _EXC_INFO_PARAM) {
1909   UINT64 x = *px;
1910   UINT64 y = *py;
1911 #else
1912 int
1913 bid64_signaling_greater_equal (UINT64 x,
1914 			       UINT64 y _EXC_FLAGS_PARAM
1915 			       _EXC_MASKS_PARAM _EXC_INFO_PARAM) {
1916 #endif
1917   int res;
1918   int exp_x, exp_y;
1919   UINT64 sig_x, sig_y;
1920   UINT128 sig_n_prime;
1921   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
1922 
1923   // NaN (CASE1)
1924   // if either number is NAN, the comparison is unordered : return 1
1925   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
1926     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
1927     res = 0;
1928     BID_RETURN (res);
1929   }
1930   // SIMPLE (CASE2)
1931   // if all the bits are the same, these numbers are equal.
1932   if (x == y) {
1933     res = 1;
1934     BID_RETURN (res);
1935   }
1936   // INFINITY (CASE3)
1937   if ((x & MASK_INF) == MASK_INF) {
1938     // if x==neg_inf, { res = (y == neg_inf)?1:0; BID_RETURN (res) }
1939     if ((x & MASK_SIGN) == MASK_SIGN)
1940       // x is -inf, so it is less than y unless y is -inf
1941     {
1942       res = (((y & MASK_INF) == MASK_INF)
1943 	     && (y & MASK_SIGN) == MASK_SIGN);
1944       BID_RETURN (res);
1945     } else
1946       // x is pos_inf, no way for it to be less than y
1947     {
1948       res = 1;
1949       BID_RETURN (res);
1950     }
1951   } else if ((y & MASK_INF) == MASK_INF) {
1952     // x is finite, so:
1953     //    if y is +inf, x<y
1954     //    if y is -inf, x>y
1955     {
1956       res = ((y & MASK_SIGN) == MASK_SIGN);
1957       BID_RETURN (res);
1958     }
1959   }
1960   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1961   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1962     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
1963     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1964     if (sig_x > 9999999999999999ull) {
1965       non_canon_x = 1;
1966     } else {
1967       non_canon_x = 0;
1968     }
1969   } else {
1970     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
1971     sig_x = (x & MASK_BINARY_SIG1);
1972     non_canon_x = 0;
1973   }
1974 
1975   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1976   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1977     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
1978     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1979     if (sig_y > 9999999999999999ull) {
1980       non_canon_y = 1;
1981     } else {
1982       non_canon_y = 0;
1983     }
1984   } else {
1985     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
1986     sig_y = (y & MASK_BINARY_SIG1);
1987     non_canon_y = 0;
1988   }
1989 
1990   // ZERO (CASE4)
1991   // some properties:
1992   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
1993   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
1994   //      therefore ignore the exponent field
1995   //    (Any non-canonical # is considered 0)
1996   if (non_canon_x || sig_x == 0) {
1997     x_is_zero = 1;
1998   }
1999   if (non_canon_y || sig_y == 0) {
2000     y_is_zero = 1;
2001   }
2002   // if both numbers are zero, they are equal
2003   if (x_is_zero && y_is_zero) {
2004     res = 1;
2005     BID_RETURN (res);
2006   }
2007   // if x is zero, it is lessthan if Y is positive
2008   else if (x_is_zero) {
2009     res = ((y & MASK_SIGN) == MASK_SIGN);
2010     BID_RETURN (res);
2011   }
2012   // if y is zero, X is less if it is negative
2013   else if (y_is_zero) {
2014     res = ((x & MASK_SIGN) != MASK_SIGN);
2015     BID_RETURN (res);
2016   }
2017   // OPPOSITE SIGN (CASE5)
2018   // now, if the sign bits differ, x is less than if y is positive
2019   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
2020     res = ((y & MASK_SIGN) == MASK_SIGN);
2021     BID_RETURN (res);
2022   }
2023   // REDUNDANT REPRESENTATIONS (CASE6)
2024   // if both components are either bigger or smaller
2025   if (sig_x > sig_y && exp_x >= exp_y) {
2026     res = ((x & MASK_SIGN) != MASK_SIGN);
2027     BID_RETURN (res);
2028   }
2029   if (sig_x < sig_y && exp_x <= exp_y) {
2030     res = ((x & MASK_SIGN) == MASK_SIGN);
2031     BID_RETURN (res);
2032   }
2033   // if exp_x is 15 greater than exp_y, no need for compensation
2034   if (exp_x - exp_y > 15) {
2035     res = ((x & MASK_SIGN) != MASK_SIGN);
2036     BID_RETURN (res);
2037   }
2038   // difference cannot be greater than 10^15
2039 
2040   // if exp_x is 15 less than exp_y, no need for compensation
2041   if (exp_y - exp_x > 15) {
2042     res = ((x & MASK_SIGN) == MASK_SIGN);
2043     BID_RETURN (res);
2044   }
2045   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
2046   if (exp_x > exp_y) {	// to simplify the loop below,
2047 
2048     // otherwise adjust the x significand upwards
2049     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
2050 			    mult_factor[exp_x - exp_y]);
2051 
2052     // return 1 if values are equal
2053     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
2054       res = 1;
2055       BID_RETURN (res);
2056     }
2057     // if postitive, return whichever significand abs is smaller
2058     //     (converse if negative)
2059     {
2060       res = (((sig_n_prime.w[1] == 0)
2061 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) !=
2062 					      MASK_SIGN));
2063       BID_RETURN (res);
2064     }
2065   }
2066   // adjust the y significand upwards
2067   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
2068 			  mult_factor[exp_y - exp_x]);
2069 
2070   // return 0 if values are equal
2071   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
2072     res = 1;
2073     BID_RETURN (res);
2074   }
2075   // if positive, return whichever significand abs is smaller
2076   //     (converse if negative)
2077   {
2078     res = (((sig_n_prime.w[1] > 0)
2079 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) !=
2080 					      MASK_SIGN));
2081     BID_RETURN (res);
2082   }
2083 }
2084 
2085 #if DECIMAL_CALL_BY_REFERENCE
2086 void
2087 bid64_signaling_greater_unordered (int *pres, UINT64 * px,
2088 				   UINT64 *
2089 				   py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2090 				   _EXC_INFO_PARAM) {
2091   UINT64 x = *px;
2092   UINT64 y = *py;
2093 #else
2094 int
2095 bid64_signaling_greater_unordered (UINT64 x,
2096 				   UINT64 y _EXC_FLAGS_PARAM
2097 				   _EXC_MASKS_PARAM _EXC_INFO_PARAM) {
2098 #endif
2099   int res;
2100   int exp_x, exp_y;
2101   UINT64 sig_x, sig_y;
2102   UINT128 sig_n_prime;
2103   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
2104 
2105   // NaN (CASE1)
2106   // if either number is NAN, the comparison is unordered,
2107   // rather than equal : return 0
2108   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
2109     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
2110     res = 1;
2111     BID_RETURN (res);
2112   }
2113   // SIMPLE (CASE2)
2114   // if all the bits are the same, these numbers are equal (not Greater).
2115   if (x == y) {
2116     res = 0;
2117     BID_RETURN (res);
2118   }
2119   // INFINITY (CASE3)
2120   if ((x & MASK_INF) == MASK_INF) {
2121     // if x is neg infinity, there is no way it is greater than y, return 0
2122     if (((x & MASK_SIGN) == MASK_SIGN)) {
2123       res = 0;
2124       BID_RETURN (res);
2125     }
2126     // x is pos infinity, it is greater,
2127     // unless y is positive infinity => return y!=pos_infinity
2128     else {
2129       res = (((y & MASK_INF) != MASK_INF)
2130 	     || ((y & MASK_SIGN) == MASK_SIGN));
2131       BID_RETURN (res);
2132     }
2133   } else if ((y & MASK_INF) == MASK_INF) {
2134     // x is finite, so if y is positive infinity, then x is less, return 0
2135     //                 if y is negative infinity, then x is greater, return 1
2136     {
2137       res = ((y & MASK_SIGN) == MASK_SIGN);
2138       BID_RETURN (res);
2139     }
2140   }
2141   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2142   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2143     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
2144     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2145     if (sig_x > 9999999999999999ull) {
2146       non_canon_x = 1;
2147     } else {
2148       non_canon_x = 0;
2149     }
2150   } else {
2151     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
2152     sig_x = (x & MASK_BINARY_SIG1);
2153     non_canon_x = 0;
2154   }
2155 
2156   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2157   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2158     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
2159     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2160     if (sig_y > 9999999999999999ull) {
2161       non_canon_y = 1;
2162     } else {
2163       non_canon_y = 0;
2164     }
2165   } else {
2166     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
2167     sig_y = (y & MASK_BINARY_SIG1);
2168     non_canon_y = 0;
2169   }
2170 
2171   // ZERO (CASE4)
2172   // some properties:
2173   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
2174   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
2175   //      therefore ignore the exponent field
2176   //    (Any non-canonical # is considered 0)
2177   if (non_canon_x || sig_x == 0) {
2178     x_is_zero = 1;
2179   }
2180   if (non_canon_y || sig_y == 0) {
2181     y_is_zero = 1;
2182   }
2183   // if both numbers are zero, neither is greater => return NOTGREATERTHAN
2184   if (x_is_zero && y_is_zero) {
2185     res = 0;
2186     BID_RETURN (res);
2187   }
2188   // is x is zero, it is greater if Y is negative
2189   else if (x_is_zero) {
2190     res = ((y & MASK_SIGN) == MASK_SIGN);
2191     BID_RETURN (res);
2192   }
2193   // is y is zero, X is greater if it is positive
2194   else if (y_is_zero) {
2195     res = ((x & MASK_SIGN) != MASK_SIGN);
2196     BID_RETURN (res);
2197   }
2198   // OPPOSITE SIGN (CASE5)
2199   // now, if the sign bits differ, x is greater if y is negative
2200   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
2201     res = ((y & MASK_SIGN) == MASK_SIGN);
2202     BID_RETURN (res);
2203   }
2204   // REDUNDANT REPRESENTATIONS (CASE6)
2205 
2206   // if both components are either bigger or smaller
2207   if (sig_x > sig_y && exp_x >= exp_y) {
2208     res = ((x & MASK_SIGN) != MASK_SIGN);
2209     BID_RETURN (res);
2210   }
2211   if (sig_x < sig_y && exp_x <= exp_y) {
2212     res = ((x & MASK_SIGN) == MASK_SIGN);
2213     BID_RETURN (res);
2214   }
2215   // if exp_x is 15 greater than exp_y, no need for compensation
2216   if (exp_x - exp_y > 15) {
2217     res = ((x & MASK_SIGN) != MASK_SIGN);
2218     BID_RETURN (res);
2219   }
2220   // difference cannot be greater than 10^15
2221 
2222   // if exp_x is 15 less than exp_y, no need for compensation
2223   if (exp_y - exp_x > 15) {
2224     res = ((x & MASK_SIGN) == MASK_SIGN);
2225     BID_RETURN (res);
2226   }
2227   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
2228   if (exp_x > exp_y) {	// to simplify the loop below,
2229 
2230     // otherwise adjust the x significand upwards
2231     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
2232 			    mult_factor[exp_x - exp_y]);
2233 
2234     // if postitive, return whichever significand is larger
2235     //     (converse if negative)
2236     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
2237       res = 0;
2238       BID_RETURN (res);
2239     }
2240 
2241     {
2242       res = (((sig_n_prime.w[1] > 0)
2243 	      || sig_n_prime.w[0] > sig_y) ^ ((x & MASK_SIGN) ==
2244 					      MASK_SIGN));
2245       BID_RETURN (res);
2246     }
2247   }
2248   // adjust the y significand upwards
2249   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
2250 			  mult_factor[exp_y - exp_x]);
2251 
2252   // if postitive, return whichever significand is larger
2253   //     (converse if negative)
2254   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
2255     res = 0;
2256     BID_RETURN (res);
2257   }
2258   {
2259     res = (((sig_n_prime.w[1] == 0)
2260 	    && (sig_x > sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
2261 					      MASK_SIGN));
2262     BID_RETURN (res);
2263   }
2264 }
2265 
2266 #if DECIMAL_CALL_BY_REFERENCE
2267 void
2268 bid64_signaling_less (int *pres, UINT64 * px,
2269 		      UINT64 *
2270 		      py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2271 		      _EXC_INFO_PARAM) {
2272   UINT64 x = *px;
2273   UINT64 y = *py;
2274 #else
2275 int
2276 bid64_signaling_less (UINT64 x,
2277 		      UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2278 		      _EXC_INFO_PARAM) {
2279 #endif
2280   int res;
2281   int exp_x, exp_y;
2282   UINT64 sig_x, sig_y;
2283   UINT128 sig_n_prime;
2284   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
2285 
2286   // NaN (CASE1)
2287   // if either number is NAN, the comparison is unordered : return 0
2288   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
2289     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
2290     res = 0;
2291     BID_RETURN (res);
2292   }
2293   // SIMPLE (CASE2)
2294   // if all the bits are the same, these numbers are equal.
2295   if (x == y) {
2296     res = 0;
2297     BID_RETURN (res);
2298   }
2299   // INFINITY (CASE3)
2300   if ((x & MASK_INF) == MASK_INF) {
2301     // if x==neg_inf, { res = (y == neg_inf)?0:1; BID_RETURN (res) }
2302     if ((x & MASK_SIGN) == MASK_SIGN)
2303       // x is -inf, so it is less than y unless y is -inf
2304     {
2305       res = (((y & MASK_INF) != MASK_INF)
2306 	     || (y & MASK_SIGN) != MASK_SIGN);
2307       BID_RETURN (res);
2308     } else
2309       // x is pos_inf, no way for it to be less than y
2310     {
2311       res = 0;
2312       BID_RETURN (res);
2313     }
2314   } else if ((y & MASK_INF) == MASK_INF) {
2315     // x is finite, so:
2316     //    if y is +inf, x<y
2317     //    if y is -inf, x>y
2318     {
2319       res = ((y & MASK_SIGN) != MASK_SIGN);
2320       BID_RETURN (res);
2321     }
2322   }
2323   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2324   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2325     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
2326     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2327     if (sig_x > 9999999999999999ull) {
2328       non_canon_x = 1;
2329     } else {
2330       non_canon_x = 0;
2331     }
2332   } else {
2333     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
2334     sig_x = (x & MASK_BINARY_SIG1);
2335     non_canon_x = 0;
2336   }
2337 
2338   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2339   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2340     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
2341     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2342     if (sig_y > 9999999999999999ull) {
2343       non_canon_y = 1;
2344     } else {
2345       non_canon_y = 0;
2346     }
2347   } else {
2348     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
2349     sig_y = (y & MASK_BINARY_SIG1);
2350     non_canon_y = 0;
2351   }
2352 
2353   // ZERO (CASE4)
2354   // some properties:
2355   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
2356   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
2357   //      therefore ignore the exponent field
2358   //    (Any non-canonical # is considered 0)
2359   if (non_canon_x || sig_x == 0) {
2360     x_is_zero = 1;
2361   }
2362   if (non_canon_y || sig_y == 0) {
2363     y_is_zero = 1;
2364   }
2365   // if both numbers are zero, they are equal
2366   if (x_is_zero && y_is_zero) {
2367     res = 0;
2368     BID_RETURN (res);
2369   }
2370   // if x is zero, it is lessthan if Y is positive
2371   else if (x_is_zero) {
2372     res = ((y & MASK_SIGN) != MASK_SIGN);
2373     BID_RETURN (res);
2374   }
2375   // if y is zero, X is less if it is negative
2376   else if (y_is_zero) {
2377     res = ((x & MASK_SIGN) == MASK_SIGN);
2378     BID_RETURN (res);
2379   }
2380   // OPPOSITE SIGN (CASE5)
2381   // now, if the sign bits differ, x is less than if y is positive
2382   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
2383     res = ((y & MASK_SIGN) != MASK_SIGN);
2384     BID_RETURN (res);
2385   }
2386   // REDUNDANT REPRESENTATIONS (CASE6)
2387   // if both components are either bigger or smaller
2388   if (sig_x > sig_y && exp_x >= exp_y) {
2389     res = ((x & MASK_SIGN) == MASK_SIGN);
2390     BID_RETURN (res);
2391   }
2392   if (sig_x < sig_y && exp_x <= exp_y) {
2393     res = ((x & MASK_SIGN) != MASK_SIGN);
2394     BID_RETURN (res);
2395   }
2396   // if exp_x is 15 greater than exp_y, no need for compensation
2397   if (exp_x - exp_y > 15) {
2398     res = ((x & MASK_SIGN) == MASK_SIGN);
2399     BID_RETURN (res);
2400   }
2401   // difference cannot be greater than 10^15
2402 
2403   // if exp_x is 15 less than exp_y, no need for compensation
2404   if (exp_y - exp_x > 15) {
2405     res = ((x & MASK_SIGN) != MASK_SIGN);
2406     BID_RETURN (res);
2407   }
2408   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
2409   if (exp_x > exp_y) {	// to simplify the loop below,
2410 
2411     // otherwise adjust the x significand upwards
2412     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
2413 			    mult_factor[exp_x - exp_y]);
2414 
2415     // return 0 if values are equal
2416     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
2417       res = 0;
2418       BID_RETURN (res);
2419     }
2420     // if postitive, return whichever significand abs is smaller
2421     //     (converse if negative)
2422     {
2423       res = (((sig_n_prime.w[1] == 0)
2424 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
2425 					      MASK_SIGN));
2426       BID_RETURN (res);
2427     }
2428   }
2429   // adjust the y significand upwards
2430   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
2431 			  mult_factor[exp_y - exp_x]);
2432 
2433   // return 0 if values are equal
2434   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
2435     res = 0;
2436     BID_RETURN (res);
2437   }
2438   // if positive, return whichever significand abs is smaller
2439   //     (converse if negative)
2440   {
2441     res = (((sig_n_prime.w[1] > 0)
2442 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
2443 					      MASK_SIGN));
2444     BID_RETURN (res);
2445   }
2446 }
2447 
2448 #if DECIMAL_CALL_BY_REFERENCE
2449 void
2450 bid64_signaling_less_equal (int *pres, UINT64 * px,
2451 			    UINT64 *
2452 			    py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2453 			    _EXC_INFO_PARAM) {
2454   UINT64 x = *px;
2455   UINT64 y = *py;
2456 #else
2457 int
2458 bid64_signaling_less_equal (UINT64 x,
2459 			    UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2460 			    _EXC_INFO_PARAM) {
2461 #endif
2462   int res;
2463   int exp_x, exp_y;
2464   UINT64 sig_x, sig_y;
2465   UINT128 sig_n_prime;
2466   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
2467 
2468   // NaN (CASE1)
2469   // if either number is NAN, the comparison is unordered,
2470   // rather than equal : return 0
2471   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
2472     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
2473     res = 0;
2474     BID_RETURN (res);
2475   }
2476   // SIMPLE (CASE2)
2477   // if all the bits are the same, these numbers are equal (LESSEQUAL).
2478   if (x == y) {
2479     res = 1;
2480     BID_RETURN (res);
2481   }
2482   // INFINITY (CASE3)
2483   if ((x & MASK_INF) == MASK_INF) {
2484     // if x is neg infinity, it must be lessthan or equal to y return 1
2485     if (((x & MASK_SIGN) == MASK_SIGN)) {
2486       res = 1;
2487       BID_RETURN (res);
2488     }
2489     // x is pos infinity, it is greater,
2490     // unless y is positive infinity => return y==pos_infinity
2491     else {
2492       res = !(((y & MASK_INF) != MASK_INF)
2493 	      || ((y & MASK_SIGN) == MASK_SIGN));
2494       BID_RETURN (res);
2495     }
2496   } else if ((y & MASK_INF) == MASK_INF) {
2497     // x is finite, so if y is positive infinity, then x is less, return 1
2498     //                 if y is negative infinity, then x is greater, return 0
2499     {
2500       res = ((y & MASK_SIGN) != MASK_SIGN);
2501       BID_RETURN (res);
2502     }
2503   }
2504   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2505   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2506     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
2507     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2508     if (sig_x > 9999999999999999ull) {
2509       non_canon_x = 1;
2510     } else {
2511       non_canon_x = 0;
2512     }
2513   } else {
2514     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
2515     sig_x = (x & MASK_BINARY_SIG1);
2516     non_canon_x = 0;
2517   }
2518 
2519   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2520   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2521     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
2522     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2523     if (sig_y > 9999999999999999ull) {
2524       non_canon_y = 1;
2525     } else {
2526       non_canon_y = 0;
2527     }
2528   } else {
2529     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
2530     sig_y = (y & MASK_BINARY_SIG1);
2531     non_canon_y = 0;
2532   }
2533 
2534   // ZERO (CASE4)
2535   // some properties:
2536   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
2537   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
2538   //      therefore ignore the exponent field
2539   //    (Any non-canonical # is considered 0)
2540   if (non_canon_x || sig_x == 0) {
2541     x_is_zero = 1;
2542   }
2543   if (non_canon_y || sig_y == 0) {
2544     y_is_zero = 1;
2545   }
2546   // if both numbers are zero, they are equal -> return 1
2547   if (x_is_zero && y_is_zero) {
2548     res = 1;
2549     BID_RETURN (res);
2550   }
2551   // if x is zero, it is lessthan if Y is positive
2552   else if (x_is_zero) {
2553     res = ((y & MASK_SIGN) != MASK_SIGN);
2554     BID_RETURN (res);
2555   }
2556   // if y is zero, X is less if it is negative
2557   else if (y_is_zero) {
2558     res = ((x & MASK_SIGN) == MASK_SIGN);
2559     BID_RETURN (res);
2560   }
2561   // OPPOSITE SIGN (CASE5)
2562   // now, if the sign bits differ, x is less than if y is positive
2563   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
2564     res = ((y & MASK_SIGN) != MASK_SIGN);
2565     BID_RETURN (res);
2566   }
2567   // REDUNDANT REPRESENTATIONS (CASE6)
2568   // if both components are either bigger or smaller
2569   if (sig_x > sig_y && exp_x >= exp_y) {
2570     res = ((x & MASK_SIGN) == MASK_SIGN);
2571     BID_RETURN (res);
2572   }
2573   if (sig_x < sig_y && exp_x <= exp_y) {
2574     res = ((x & MASK_SIGN) != MASK_SIGN);
2575     BID_RETURN (res);
2576   }
2577   // if exp_x is 15 greater than exp_y, no need for compensation
2578   if (exp_x - exp_y > 15) {
2579     res = ((x & MASK_SIGN) == MASK_SIGN);
2580     BID_RETURN (res);
2581   }
2582   // difference cannot be greater than 10^15
2583 
2584   // if exp_x is 15 less than exp_y, no need for compensation
2585   if (exp_y - exp_x > 15) {
2586     res = ((x & MASK_SIGN) != MASK_SIGN);
2587     BID_RETURN (res);
2588   }
2589   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
2590   if (exp_x > exp_y) {	// to simplify the loop below,
2591 
2592     // otherwise adjust the x significand upwards
2593     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
2594 			    mult_factor[exp_x - exp_y]);
2595 
2596     // return 1 if values are equal
2597     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
2598       res = 1;
2599       BID_RETURN (res);
2600     }
2601     // if postitive, return whichever significand abs is smaller
2602     //     (converse if negative)
2603     {
2604       res = (((sig_n_prime.w[1] == 0)
2605 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
2606 					      MASK_SIGN));
2607       BID_RETURN (res);
2608     }
2609   }
2610   // adjust the y significand upwards
2611   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
2612 			  mult_factor[exp_y - exp_x]);
2613 
2614   // return 1 if values are equal
2615   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
2616     res = 1;
2617     BID_RETURN (res);
2618   }
2619   // if positive, return whichever significand abs is smaller
2620   //     (converse if negative)
2621   {
2622     res = (((sig_n_prime.w[1] > 0)
2623 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
2624 					      MASK_SIGN));
2625     BID_RETURN (res);
2626   }
2627 }
2628 
2629 #if DECIMAL_CALL_BY_REFERENCE
2630 void
2631 bid64_signaling_less_unordered (int *pres, UINT64 * px,
2632 				UINT64 *
2633 				py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2634 				_EXC_INFO_PARAM) {
2635   UINT64 x = *px;
2636   UINT64 y = *py;
2637 #else
2638 int
2639 bid64_signaling_less_unordered (UINT64 x,
2640 				UINT64 y _EXC_FLAGS_PARAM
2641 				_EXC_MASKS_PARAM _EXC_INFO_PARAM) {
2642 #endif
2643   int res;
2644   int exp_x, exp_y;
2645   UINT64 sig_x, sig_y;
2646   UINT128 sig_n_prime;
2647   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
2648 
2649   // NaN (CASE1)
2650   // if either number is NAN, the comparison is unordered : return 0
2651   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
2652     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
2653     res = 1;
2654     BID_RETURN (res);
2655   }
2656   // SIMPLE (CASE2)
2657   // if all the bits are the same, these numbers are equal.
2658   if (x == y) {
2659     res = 0;
2660     BID_RETURN (res);
2661   }
2662   // INFINITY (CASE3)
2663   if ((x & MASK_INF) == MASK_INF) {
2664     // if x==neg_inf, { res = (y == neg_inf)?0:1; BID_RETURN (res) }
2665     if ((x & MASK_SIGN) == MASK_SIGN)
2666       // x is -inf, so it is less than y unless y is -inf
2667     {
2668       res = (((y & MASK_INF) != MASK_INF)
2669 	     || (y & MASK_SIGN) != MASK_SIGN);
2670       BID_RETURN (res);
2671     } else
2672       // x is pos_inf, no way for it to be less than y
2673     {
2674       res = 0;
2675       BID_RETURN (res);
2676     }
2677   } else if ((y & MASK_INF) == MASK_INF) {
2678     // x is finite, so:
2679     //    if y is +inf, x<y
2680     //    if y is -inf, x>y
2681     {
2682       res = ((y & MASK_SIGN) != MASK_SIGN);
2683       BID_RETURN (res);
2684     }
2685   }
2686   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2687   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2688     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
2689     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2690     if (sig_x > 9999999999999999ull) {
2691       non_canon_x = 1;
2692     } else {
2693       non_canon_x = 0;
2694     }
2695   } else {
2696     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
2697     sig_x = (x & MASK_BINARY_SIG1);
2698     non_canon_x = 0;
2699   }
2700 
2701   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2702   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2703     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
2704     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2705     if (sig_y > 9999999999999999ull) {
2706       non_canon_y = 1;
2707     } else {
2708       non_canon_y = 0;
2709     }
2710   } else {
2711     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
2712     sig_y = (y & MASK_BINARY_SIG1);
2713     non_canon_y = 0;
2714   }
2715 
2716   // ZERO (CASE4)
2717   // some properties:
2718   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
2719   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
2720   //      therefore ignore the exponent field
2721   //    (Any non-canonical # is considered 0)
2722   if (non_canon_x || sig_x == 0) {
2723     x_is_zero = 1;
2724   }
2725   if (non_canon_y || sig_y == 0) {
2726     y_is_zero = 1;
2727   }
2728   // if both numbers are zero, they are equal
2729   if (x_is_zero && y_is_zero) {
2730     res = 0;
2731     BID_RETURN (res);
2732   }
2733   // if x is zero, it is lessthan if Y is positive
2734   else if (x_is_zero) {
2735     res = ((y & MASK_SIGN) != MASK_SIGN);
2736     BID_RETURN (res);
2737   }
2738   // if y is zero, X is less if it is negative
2739   else if (y_is_zero) {
2740     res = ((x & MASK_SIGN) == MASK_SIGN);
2741     BID_RETURN (res);
2742   }
2743   // OPPOSITE SIGN (CASE5)
2744   // now, if the sign bits differ, x is less than if y is positive
2745   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
2746     res = ((y & MASK_SIGN) != MASK_SIGN);
2747     BID_RETURN (res);
2748   }
2749   // REDUNDANT REPRESENTATIONS (CASE6)
2750   // if both components are either bigger or smaller
2751   if (sig_x > sig_y && exp_x >= exp_y) {
2752     res = ((x & MASK_SIGN) == MASK_SIGN);
2753     BID_RETURN (res);
2754   }
2755   if (sig_x < sig_y && exp_x <= exp_y) {
2756     res = ((x & MASK_SIGN) != MASK_SIGN);
2757     BID_RETURN (res);
2758   }
2759   // if exp_x is 15 greater than exp_y, no need for compensation
2760   if (exp_x - exp_y > 15) {
2761     res = ((x & MASK_SIGN) == MASK_SIGN);
2762     BID_RETURN (res);
2763   }
2764   // difference cannot be greater than 10^15
2765 
2766   // if exp_x is 15 less than exp_y, no need for compensation
2767   if (exp_y - exp_x > 15) {
2768     res = ((x & MASK_SIGN) != MASK_SIGN);
2769     BID_RETURN (res);
2770   }
2771   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
2772   if (exp_x > exp_y) {	// to simplify the loop below,
2773 
2774     // otherwise adjust the x significand upwards
2775     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
2776 			    mult_factor[exp_x - exp_y]);
2777 
2778     // return 0 if values are equal
2779     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
2780       res = 0;
2781       BID_RETURN (res);
2782     }
2783     // if postitive, return whichever significand abs is smaller
2784     //     (converse if negative)
2785     {
2786       res = (((sig_n_prime.w[1] == 0)
2787 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
2788 					      MASK_SIGN));
2789       BID_RETURN (res);
2790     }
2791   }
2792   // adjust the y significand upwards
2793   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
2794 			  mult_factor[exp_y - exp_x]);
2795 
2796   // return 0 if values are equal
2797   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
2798     res = 0;
2799     BID_RETURN (res);
2800   }
2801   // if positive, return whichever significand abs is smaller
2802   //     (converse if negative)
2803   {
2804     res = (((sig_n_prime.w[1] > 0)
2805 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
2806 					      MASK_SIGN));
2807     BID_RETURN (res);
2808   }
2809 }
2810 
2811 #if DECIMAL_CALL_BY_REFERENCE
2812 void
2813 bid64_signaling_not_greater (int *pres, UINT64 * px,
2814 			     UINT64 *
2815 			     py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2816 			     _EXC_INFO_PARAM) {
2817   UINT64 x = *px;
2818   UINT64 y = *py;
2819 #else
2820 int
2821 bid64_signaling_not_greater (UINT64 x,
2822 			     UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2823 			     _EXC_INFO_PARAM) {
2824 #endif
2825   int res;
2826   int exp_x, exp_y;
2827   UINT64 sig_x, sig_y;
2828   UINT128 sig_n_prime;
2829   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
2830 
2831   // NaN (CASE1)
2832   // if either number is NAN, the comparison is unordered,
2833   // rather than equal : return 0
2834   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
2835     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
2836     res = 1;
2837     BID_RETURN (res);
2838   }
2839   // SIMPLE (CASE2)
2840   // if all the bits are the same, these numbers are equal (LESSEQUAL).
2841   if (x == y) {
2842     res = 1;
2843     BID_RETURN (res);
2844   }
2845   // INFINITY (CASE3)
2846   if ((x & MASK_INF) == MASK_INF) {
2847     // if x is neg infinity, it must be lessthan or equal to y return 1
2848     if (((x & MASK_SIGN) == MASK_SIGN)) {
2849       res = 1;
2850       BID_RETURN (res);
2851     }
2852     // x is pos infinity, it is greater,
2853     // unless y is positive infinity => return y==pos_infinity
2854     else {
2855       res = !(((y & MASK_INF) != MASK_INF)
2856 	      || ((y & MASK_SIGN) == MASK_SIGN));
2857       BID_RETURN (res);
2858     }
2859   } else if ((y & MASK_INF) == MASK_INF) {
2860     // x is finite, so if y is positive infinity, then x is less, return 1
2861     //                 if y is negative infinity, then x is greater, return 0
2862     {
2863       res = ((y & MASK_SIGN) != MASK_SIGN);
2864       BID_RETURN (res);
2865     }
2866   }
2867   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2868   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2869     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
2870     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2871     if (sig_x > 9999999999999999ull) {
2872       non_canon_x = 1;
2873     } else {
2874       non_canon_x = 0;
2875     }
2876   } else {
2877     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
2878     sig_x = (x & MASK_BINARY_SIG1);
2879     non_canon_x = 0;
2880   }
2881 
2882   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2883   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2884     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
2885     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2886     if (sig_y > 9999999999999999ull) {
2887       non_canon_y = 1;
2888     } else {
2889       non_canon_y = 0;
2890     }
2891   } else {
2892     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
2893     sig_y = (y & MASK_BINARY_SIG1);
2894     non_canon_y = 0;
2895   }
2896 
2897   // ZERO (CASE4)
2898   // some properties:
2899   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
2900   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
2901   //      therefore ignore the exponent field
2902   //    (Any non-canonical # is considered 0)
2903   if (non_canon_x || sig_x == 0) {
2904     x_is_zero = 1;
2905   }
2906   if (non_canon_y || sig_y == 0) {
2907     y_is_zero = 1;
2908   }
2909   // if both numbers are zero, they are equal -> return 1
2910   if (x_is_zero && y_is_zero) {
2911     res = 1;
2912     BID_RETURN (res);
2913   }
2914   // if x is zero, it is lessthan if Y is positive
2915   else if (x_is_zero) {
2916     res = ((y & MASK_SIGN) != MASK_SIGN);
2917     BID_RETURN (res);
2918   }
2919   // if y is zero, X is less if it is negative
2920   else if (y_is_zero) {
2921     res = ((x & MASK_SIGN) == MASK_SIGN);
2922     BID_RETURN (res);
2923   }
2924   // OPPOSITE SIGN (CASE5)
2925   // now, if the sign bits differ, x is less than if y is positive
2926   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
2927     res = ((y & MASK_SIGN) != MASK_SIGN);
2928     BID_RETURN (res);
2929   }
2930   // REDUNDANT REPRESENTATIONS (CASE6)
2931   // if both components are either bigger or smaller
2932   if (sig_x > sig_y && exp_x >= exp_y) {
2933     res = ((x & MASK_SIGN) == MASK_SIGN);
2934     BID_RETURN (res);
2935   }
2936   if (sig_x < sig_y && exp_x <= exp_y) {
2937     res = ((x & MASK_SIGN) != MASK_SIGN);
2938     BID_RETURN (res);
2939   }
2940   // if exp_x is 15 greater than exp_y, no need for compensation
2941   if (exp_x - exp_y > 15) {
2942     res = ((x & MASK_SIGN) == MASK_SIGN);
2943     BID_RETURN (res);
2944   }
2945   // difference cannot be greater than 10^15
2946 
2947   // if exp_x is 15 less than exp_y, no need for compensation
2948   if (exp_y - exp_x > 15) {
2949     res = ((x & MASK_SIGN) != MASK_SIGN);
2950     BID_RETURN (res);
2951   }
2952   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
2953   if (exp_x > exp_y) {	// to simplify the loop below,
2954 
2955     // otherwise adjust the x significand upwards
2956     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
2957 			    mult_factor[exp_x - exp_y]);
2958 
2959     // return 1 if values are equal
2960     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
2961       res = 1;
2962       BID_RETURN (res);
2963     }
2964     // if postitive, return whichever significand abs is smaller
2965     //     (converse if negative)
2966     {
2967       res = (((sig_n_prime.w[1] == 0)
2968 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) ==
2969 					      MASK_SIGN));
2970       BID_RETURN (res);
2971     }
2972   }
2973   // adjust the y significand upwards
2974   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
2975 			  mult_factor[exp_y - exp_x]);
2976 
2977   // return 1 if values are equal
2978   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
2979     res = 1;
2980     BID_RETURN (res);
2981   }
2982   // if positive, return whichever significand abs is smaller
2983   //     (converse if negative)
2984   {
2985     res = (((sig_n_prime.w[1] > 0)
2986 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) ==
2987 					      MASK_SIGN));
2988     BID_RETURN (res);
2989   }
2990 }
2991 
2992 #if DECIMAL_CALL_BY_REFERENCE
2993 void
2994 bid64_signaling_not_less (int *pres, UINT64 * px,
2995 			  UINT64 *
2996 			  py _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2997 			  _EXC_INFO_PARAM) {
2998   UINT64 x = *px;
2999   UINT64 y = *py;
3000 #else
3001 int
3002 bid64_signaling_not_less (UINT64 x,
3003 			  UINT64 y _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
3004 			  _EXC_INFO_PARAM) {
3005 #endif
3006   int res;
3007   int exp_x, exp_y;
3008   UINT64 sig_x, sig_y;
3009   UINT128 sig_n_prime;
3010   char x_is_zero = 0, y_is_zero = 0, non_canon_x, non_canon_y;
3011 
3012   // NaN (CASE1)
3013   // if either number is NAN, the comparison is unordered : return 1
3014   if (((x & MASK_NAN) == MASK_NAN) || ((y & MASK_NAN) == MASK_NAN)) {
3015     *pfpsf |= INVALID_EXCEPTION;	// set invalid exception if NaN
3016     res = 1;
3017     BID_RETURN (res);
3018   }
3019   // SIMPLE (CASE2)
3020   // if all the bits are the same, these numbers are equal.
3021   if (x == y) {
3022     res = 1;
3023     BID_RETURN (res);
3024   }
3025   // INFINITY (CASE3)
3026   if ((x & MASK_INF) == MASK_INF) {
3027     // if x==neg_inf, { res = (y == neg_inf)?1:0; BID_RETURN (res) }
3028     if ((x & MASK_SIGN) == MASK_SIGN)
3029       // x is -inf, so it is less than y unless y is -inf
3030     {
3031       res = (((y & MASK_INF) == MASK_INF)
3032 	     && (y & MASK_SIGN) == MASK_SIGN);
3033       BID_RETURN (res);
3034     } else
3035       // x is pos_inf, no way for it to be less than y
3036     {
3037       res = 1;
3038       BID_RETURN (res);
3039     }
3040   } else if ((y & MASK_INF) == MASK_INF) {
3041     // x is finite, so:
3042     //    if y is +inf, x<y
3043     //    if y is -inf, x>y
3044     {
3045       res = ((y & MASK_SIGN) == MASK_SIGN);
3046       BID_RETURN (res);
3047     }
3048   }
3049   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
3050   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
3051     exp_x = (x & MASK_BINARY_EXPONENT2) >> 51;
3052     sig_x = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
3053     if (sig_x > 9999999999999999ull) {
3054       non_canon_x = 1;
3055     } else {
3056       non_canon_x = 0;
3057     }
3058   } else {
3059     exp_x = (x & MASK_BINARY_EXPONENT1) >> 53;
3060     sig_x = (x & MASK_BINARY_SIG1);
3061     non_canon_x = 0;
3062   }
3063 
3064   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
3065   if ((y & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
3066     exp_y = (y & MASK_BINARY_EXPONENT2) >> 51;
3067     sig_y = (y & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
3068     if (sig_y > 9999999999999999ull) {
3069       non_canon_y = 1;
3070     } else {
3071       non_canon_y = 0;
3072     }
3073   } else {
3074     exp_y = (y & MASK_BINARY_EXPONENT1) >> 53;
3075     sig_y = (y & MASK_BINARY_SIG1);
3076     non_canon_y = 0;
3077   }
3078 
3079   // ZERO (CASE4)
3080   // some properties:
3081   // (+ZERO==-ZERO) => therefore ignore the sign, and neither number is greater
3082   //    (ZERO x 10^A == ZERO x 10^B) for any valid A, B =>
3083   //      therefore ignore the exponent field
3084   //    (Any non-canonical # is considered 0)
3085   if (non_canon_x || sig_x == 0) {
3086     x_is_zero = 1;
3087   }
3088   if (non_canon_y || sig_y == 0) {
3089     y_is_zero = 1;
3090   }
3091   // if both numbers are zero, they are equal
3092   if (x_is_zero && y_is_zero) {
3093     res = 1;
3094     BID_RETURN (res);
3095   }
3096   // if x is zero, it is lessthan if Y is positive
3097   else if (x_is_zero) {
3098     res = ((y & MASK_SIGN) == MASK_SIGN);
3099     BID_RETURN (res);
3100   }
3101   // if y is zero, X is less if it is negative
3102   else if (y_is_zero) {
3103     res = ((x & MASK_SIGN) != MASK_SIGN);
3104     BID_RETURN (res);
3105   }
3106   // OPPOSITE SIGN (CASE5)
3107   // now, if the sign bits differ, x is less than if y is positive
3108   if (((x ^ y) & MASK_SIGN) == MASK_SIGN) {
3109     res = ((y & MASK_SIGN) == MASK_SIGN);
3110     BID_RETURN (res);
3111   }
3112   // REDUNDANT REPRESENTATIONS (CASE6)
3113   // if both components are either bigger or smaller
3114   if (sig_x > sig_y && exp_x >= exp_y) {
3115     res = ((x & MASK_SIGN) != MASK_SIGN);
3116     BID_RETURN (res);
3117   }
3118   if (sig_x < sig_y && exp_x <= exp_y) {
3119     res = ((x & MASK_SIGN) == MASK_SIGN);
3120     BID_RETURN (res);
3121   }
3122   // if exp_x is 15 greater than exp_y, no need for compensation
3123   if (exp_x - exp_y > 15) {
3124     res = ((x & MASK_SIGN) != MASK_SIGN);
3125     BID_RETURN (res);
3126   }
3127   // difference cannot be greater than 10^15
3128 
3129   // if exp_x is 15 less than exp_y, no need for compensation
3130   if (exp_y - exp_x > 15) {
3131     res = ((x & MASK_SIGN) == MASK_SIGN);
3132     BID_RETURN (res);
3133   }
3134   // if |exp_x - exp_y| < 15, it comes down to the compensated significand
3135   if (exp_x > exp_y) {	// to simplify the loop below,
3136 
3137     // otherwise adjust the x significand upwards
3138     __mul_64x64_to_128MACH (sig_n_prime, sig_x,
3139 			    mult_factor[exp_x - exp_y]);
3140 
3141     // return 0 if values are equal
3142     if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_y)) {
3143       res = 1;
3144       BID_RETURN (res);
3145     }
3146     // if postitive, return whichever significand abs is smaller
3147     //     (converse if negative)
3148     {
3149       res = (((sig_n_prime.w[1] == 0)
3150 	      && sig_n_prime.w[0] < sig_y) ^ ((x & MASK_SIGN) !=
3151 					      MASK_SIGN));
3152       BID_RETURN (res);
3153     }
3154   }
3155   // adjust the y significand upwards
3156   __mul_64x64_to_128MACH (sig_n_prime, sig_y,
3157 			  mult_factor[exp_y - exp_x]);
3158 
3159   // return 0 if values are equal
3160   if (sig_n_prime.w[1] == 0 && (sig_n_prime.w[0] == sig_x)) {
3161     res = 1;
3162     BID_RETURN (res);
3163   }
3164   // if positive, return whichever significand abs is smaller
3165   //     (converse if negative)
3166   {
3167     res = (((sig_n_prime.w[1] > 0)
3168 	    || (sig_x < sig_n_prime.w[0])) ^ ((x & MASK_SIGN) !=
3169 					      MASK_SIGN));
3170     BID_RETURN (res);
3171   }
3172 }
3173