Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6515 serge 1
/* This is a software floating point library which can be used
2
   for targets without hardware floating point.
3
   Copyright (C) 1994-2015 Free Software Foundation, Inc.
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify it under
8
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 3, or (at your option) any later
10
version.
11
 
12
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13
WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
for more details.
16
 
17
Under Section 7 of GPL version 3, you are granted additional
18
permissions described in the GCC Runtime Library Exception, version
19
3.1, as published by the Free Software Foundation.
20
 
21
You should have received a copy of the GNU General Public License and
22
a copy of the GCC Runtime Library Exception along with this program;
23
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
.  */
25
 
26
/* This implements IEEE 754 format arithmetic, but does not provide a
27
   mechanism for setting the rounding mode, or for generating or handling
28
   exceptions.
29
 
30
   The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
31
   Wilson, all of Cygnus Support.  */
32
 
33
/* The intended way to use this file is to make two copies, add `#define FLOAT'
34
   to one copy, then compile both copies and add them to libgcc.a.  */
35
 
36
#include "tconfig.h"
37
#include "coretypes.h"
38
#include "tm.h"
39
#include "libgcc_tm.h"
40
#include "fp-bit.h"
41
 
42
/* The following macros can be defined to change the behavior of this file:
43
   FLOAT: Implement a `float', aka SFmode, fp library.  If this is not
44
     defined, then this file implements a `double', aka DFmode, fp library.
45
   FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
46
     don't include float->double conversion which requires the double library.
47
     This is useful only for machines which can't support doubles, e.g. some
48
     8-bit processors.
49
   CMPtype: Specify the type that floating point compares should return.
50
     This defaults to SItype, aka int.
51
   _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
52
     two integers to the FLO_union_type.
53
   NO_DENORMALS: Disable handling of denormals.
54
   NO_NANS: Disable nan and infinity handling
55
   SMALL_MACHINE: Useful when operations on QIs and HIs are faster
56
     than on an SI */
57
 
58
/* We don't currently support extended floats (long doubles) on machines
59
   without hardware to deal with them.
60
 
61
   These stubs are just to keep the linker from complaining about unresolved
62
   references which can be pulled in from libio & libstdc++, even if the
63
   user isn't using long doubles.  However, they may generate an unresolved
64
   external to abort if abort is not used by the function, and the stubs
65
   are referenced from within libc, since libgcc goes before and after the
66
   system library.  */
67
 
68
#ifdef DECLARE_LIBRARY_RENAMES
69
  DECLARE_LIBRARY_RENAMES
70
#endif
71
 
72
#ifdef EXTENDED_FLOAT_STUBS
73
extern void abort (void);
74
void __extendsfxf2 (void) { abort(); }
75
void __extenddfxf2 (void) { abort(); }
76
void __truncxfdf2 (void) { abort(); }
77
void __truncxfsf2 (void) { abort(); }
78
void __fixxfsi (void) { abort(); }
79
void __floatsixf (void) { abort(); }
80
void __addxf3 (void) { abort(); }
81
void __subxf3 (void) { abort(); }
82
void __mulxf3 (void) { abort(); }
83
void __divxf3 (void) { abort(); }
84
void __negxf2 (void) { abort(); }
85
void __eqxf2 (void) { abort(); }
86
void __nexf2 (void) { abort(); }
87
void __gtxf2 (void) { abort(); }
88
void __gexf2 (void) { abort(); }
89
void __lexf2 (void) { abort(); }
90
void __ltxf2 (void) { abort(); }
91
 
92
void __extendsftf2 (void) { abort(); }
93
void __extenddftf2 (void) { abort(); }
94
void __trunctfdf2 (void) { abort(); }
95
void __trunctfsf2 (void) { abort(); }
96
void __fixtfsi (void) { abort(); }
97
void __floatsitf (void) { abort(); }
98
void __addtf3 (void) { abort(); }
99
void __subtf3 (void) { abort(); }
100
void __multf3 (void) { abort(); }
101
void __divtf3 (void) { abort(); }
102
void __negtf2 (void) { abort(); }
103
void __eqtf2 (void) { abort(); }
104
void __netf2 (void) { abort(); }
105
void __gttf2 (void) { abort(); }
106
void __getf2 (void) { abort(); }
107
void __letf2 (void) { abort(); }
108
void __lttf2 (void) { abort(); }
109
#else	/* !EXTENDED_FLOAT_STUBS, rest of file */
110
 
111
/* IEEE "special" number predicates */
112
 
113
#ifdef NO_NANS
114
 
115
#define nan() 0
116
#define isnan(x) 0
117
#define isinf(x) 0
118
#else
119
 
120
#if   defined L_thenan_sf
121
const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
122
#elif defined L_thenan_df
123
const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
124
#elif defined L_thenan_tf
125
const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
126
#elif defined TFLOAT
127
extern const fp_number_type __thenan_tf;
128
#elif defined FLOAT
129
extern const fp_number_type __thenan_sf;
130
#else
131
extern const fp_number_type __thenan_df;
132
#endif
133
 
134
INLINE
135
static const fp_number_type *
136
makenan (void)
137
{
138
#ifdef TFLOAT
139
  return & __thenan_tf;
140
#elif defined FLOAT
141
  return & __thenan_sf;
142
#else
143
  return & __thenan_df;
144
#endif
145
}
146
 
147
INLINE
148
static int
149
isnan (const fp_number_type *x)
150
{
151
  return __builtin_expect (x->class == CLASS_SNAN || x->class == CLASS_QNAN,
152
			   0);
153
}
154
 
155
INLINE
156
static int
157
isinf (const fp_number_type *  x)
158
{
159
  return __builtin_expect (x->class == CLASS_INFINITY, 0);
160
}
161
 
162
#endif /* NO_NANS */
163
 
164
INLINE
165
static int
166
iszero (const fp_number_type *  x)
167
{
168
  return x->class == CLASS_ZERO;
169
}
170
 
171
INLINE
172
static void
173
flip_sign ( fp_number_type *  x)
174
{
175
  x->sign = !x->sign;
176
}
177
 
178
/* Count leading zeroes in N.  */
179
INLINE
180
static int
181
clzusi (USItype n)
182
{
183
  extern int __clzsi2 (USItype);
184
  if (sizeof (USItype) == sizeof (unsigned int))
185
    return __builtin_clz (n);
186
  else if (sizeof (USItype) == sizeof (unsigned long))
187
    return __builtin_clzl (n);
188
  else if (sizeof (USItype) == sizeof (unsigned long long))
189
    return __builtin_clzll (n);
190
  else
191
    return __clzsi2 (n);
192
}
193
 
194
extern FLO_type pack_d (const fp_number_type * );
195
 
196
#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
197
FLO_type
198
pack_d (const fp_number_type *src)
199
{
200
  FLO_union_type dst;
201
  fractype fraction = src->fraction.ll;	/* wasn't unsigned before? */
202
  int sign = src->sign;
203
  int exp = 0;
204
 
205
  if (isnan (src))
206
    {
207
      exp = EXPMAX;
208
      /* Restore the NaN's payload.  */
209
      fraction >>= NGARDS;
210
      fraction &= QUIET_NAN - 1;
211
      if (src->class == CLASS_QNAN || 1)
212
	{
213
#ifdef QUIET_NAN_NEGATED
214
	  /* The quiet/signaling bit remains unset.  */
215
	  /* Make sure the fraction has a non-zero value.  */
216
	  if (fraction == 0)
217
	    fraction |= QUIET_NAN - 1;
218
#else
219
	  /* Set the quiet/signaling bit.  */
220
	  fraction |= QUIET_NAN;
221
#endif
222
	}
223
    }
224
  else if (isinf (src))
225
    {
226
      exp = EXPMAX;
227
      fraction = 0;
228
    }
229
  else if (iszero (src))
230
    {
231
      exp = 0;
232
      fraction = 0;
233
    }
234
  else if (fraction == 0)
235
    {
236
      exp = 0;
237
    }
238
  else
239
    {
240
      if (__builtin_expect (src->normal_exp < NORMAL_EXPMIN, 0))
241
	{
242
#ifdef NO_DENORMALS
243
	  /* Go straight to a zero representation if denormals are not
244
 	     supported.  The denormal handling would be harmless but
245
 	     isn't unnecessary.  */
246
	  exp = 0;
247
	  fraction = 0;
248
#else /* NO_DENORMALS */
249
	  /* This number's exponent is too low to fit into the bits
250
	     available in the number, so we'll store 0 in the exponent and
251
	     shift the fraction to the right to make up for it.  */
252
 
253
	  int shift = NORMAL_EXPMIN - src->normal_exp;
254
 
255
	  exp = 0;
256
 
257
	  if (shift > FRAC_NBITS - NGARDS)
258
	    {
259
	      /* No point shifting, since it's more that 64 out.  */
260
	      fraction = 0;
261
	    }
262
	  else
263
	    {
264
	      int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
265
	      fraction = (fraction >> shift) | lowbit;
266
	    }
267
	  if ((fraction & GARDMASK) == GARDMSB)
268
	    {
269
	      if ((fraction & (1 << NGARDS)))
270
		fraction += GARDROUND + 1;
271
	    }
272
	  else
273
	    {
274
	      /* Add to the guards to round up.  */
275
	      fraction += GARDROUND;
276
	    }
277
	  /* Perhaps the rounding means we now need to change the
278
             exponent, because the fraction is no longer denormal.  */
279
	  if (fraction >= IMPLICIT_1)
280
	    {
281
	      exp += 1;
282
	    }
283
	  fraction >>= NGARDS;
284
#endif /* NO_DENORMALS */
285
	}
286
      else if (__builtin_expect (src->normal_exp > EXPBIAS, 0))
287
	{
288
	  exp = EXPMAX;
289
	  fraction = 0;
290
	}
291
      else
292
	{
293
	  exp = src->normal_exp + EXPBIAS;
294
	  /* IF the gard bits are the all zero, but the first, then we're
295
	     half way between two numbers, choose the one which makes the
296
	     lsb of the answer 0.  */
297
	  if ((fraction & GARDMASK) == GARDMSB)
298
	    {
299
	      if (fraction & (1 << NGARDS))
300
		fraction += GARDROUND + 1;
301
	    }
302
	  else
303
	    {
304
	      /* Add a one to the guards to round up */
305
	      fraction += GARDROUND;
306
	    }
307
	  if (fraction >= IMPLICIT_2)
308
	    {
309
	      fraction >>= 1;
310
	      exp += 1;
311
	    }
312
	  fraction >>= NGARDS;
313
	}
314
    }
315
 
316
  /* We previously used bitfields to store the number, but this doesn't
317
     handle little/big endian systems conveniently, so use shifts and
318
     masks */
319
#ifdef FLOAT_BIT_ORDER_MISMATCH
320
  dst.bits.fraction = fraction;
321
  dst.bits.exp = exp;
322
  dst.bits.sign = sign;
323
#else
324
# if defined TFLOAT && defined HALFFRACBITS
325
 {
326
   halffractype high, low, unity;
327
   int lowsign, lowexp;
328
 
329
   unity = (halffractype) 1 << HALFFRACBITS;
330
 
331
   /* Set HIGH to the high double's significand, masking out the implicit 1.
332
      Set LOW to the low double's full significand.  */
333
   high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
334
   low = fraction & (unity * 2 - 1);
335
 
336
   /* Get the initial sign and exponent of the low double.  */
337
   lowexp = exp - HALFFRACBITS - 1;
338
   lowsign = sign;
339
 
340
   /* HIGH should be rounded like a normal double, making |LOW| <=
341
      0.5 ULP of HIGH.  Assume round-to-nearest.  */
342
   if (exp < EXPMAX)
343
     if (low > unity || (low == unity && (high & 1) == 1))
344
       {
345
	 /* Round HIGH up and adjust LOW to match.  */
346
	 high++;
347
	 if (high == unity)
348
	   {
349
	     /* May make it infinite, but that's OK.  */
350
	     high = 0;
351
	     exp++;
352
	   }
353
	 low = unity * 2 - low;
354
	 lowsign ^= 1;
355
       }
356
 
357
   high |= (halffractype) exp << HALFFRACBITS;
358
   high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
359
 
360
   if (exp == EXPMAX || exp == 0 || low == 0)
361
     low = 0;
362
   else
363
     {
364
       while (lowexp > 0 && low < unity)
365
	 {
366
	   low <<= 1;
367
	   lowexp--;
368
	 }
369
 
370
       if (lowexp <= 0)
371
	 {
372
	   halffractype roundmsb, round;
373
	   int shift;
374
 
375
	   shift = 1 - lowexp;
376
	   roundmsb = (1 << (shift - 1));
377
	   round = low & ((roundmsb << 1) - 1);
378
 
379
	   low >>= shift;
380
	   lowexp = 0;
381
 
382
	   if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
383
	     {
384
	       low++;
385
	       if (low == unity)
386
		 /* LOW rounds up to the smallest normal number.  */
387
		 lowexp++;
388
	     }
389
	 }
390
 
391
       low &= unity - 1;
392
       low |= (halffractype) lowexp << HALFFRACBITS;
393
       low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
394
     }
395
   dst.value_raw = ((fractype) high << HALFSHIFT) | low;
396
 }
397
# else
398
  dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
399
  dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
400
  dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
401
# endif
402
#endif
403
 
404
#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
405
#ifdef TFLOAT
406
  {
407
    qrtrfractype tmp1 = dst.words[0];
408
    qrtrfractype tmp2 = dst.words[1];
409
    dst.words[0] = dst.words[3];
410
    dst.words[1] = dst.words[2];
411
    dst.words[2] = tmp2;
412
    dst.words[3] = tmp1;
413
  }
414
#else
415
  {
416
    halffractype tmp = dst.words[0];
417
    dst.words[0] = dst.words[1];
418
    dst.words[1] = tmp;
419
  }
420
#endif
421
#endif
422
 
423
  return dst.value;
424
}
425
#endif
426
 
427
#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
428
void
429
unpack_d (FLO_union_type * src, fp_number_type * dst)
430
{
431
  /* We previously used bitfields to store the number, but this doesn't
432
     handle little/big endian systems conveniently, so use shifts and
433
     masks */
434
  fractype fraction;
435
  int exp;
436
  int sign;
437
 
438
#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
439
  FLO_union_type swapped;
440
 
441
#ifdef TFLOAT
442
  swapped.words[0] = src->words[3];
443
  swapped.words[1] = src->words[2];
444
  swapped.words[2] = src->words[1];
445
  swapped.words[3] = src->words[0];
446
#else
447
  swapped.words[0] = src->words[1];
448
  swapped.words[1] = src->words[0];
449
#endif
450
  src = &swapped;
451
#endif
452
 
453
#ifdef FLOAT_BIT_ORDER_MISMATCH
454
  fraction = src->bits.fraction;
455
  exp = src->bits.exp;
456
  sign = src->bits.sign;
457
#else
458
# if defined TFLOAT && defined HALFFRACBITS
459
 {
460
   halffractype high, low;
461
 
462
   high = src->value_raw >> HALFSHIFT;
463
   low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
464
 
465
   fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
466
   fraction <<= FRACBITS - HALFFRACBITS;
467
   exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
468
   sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
469
 
470
   if (exp != EXPMAX && exp != 0 && low != 0)
471
     {
472
       int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
473
       int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
474
       int shift;
475
       fractype xlow;
476
 
477
       xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
478
       if (lowexp)
479
	 xlow |= (((halffractype)1) << HALFFRACBITS);
480
       else
481
	 lowexp = 1;
482
       shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
483
       if (shift > 0)
484
	 xlow <<= shift;
485
       else if (shift < 0)
486
	 xlow >>= -shift;
487
       if (sign == lowsign)
488
	 fraction += xlow;
489
       else if (fraction >= xlow)
490
	 fraction -= xlow;
491
       else
492
	 {
493
	   /* The high part is a power of two but the full number is lower.
494
	      This code will leave the implicit 1 in FRACTION, but we'd
495
	      have added that below anyway.  */
496
	   fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
497
	   exp--;
498
	 }
499
     }
500
 }
501
# else
502
  fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
503
  exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
504
  sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
505
# endif
506
#endif
507
 
508
  dst->sign = sign;
509
  if (exp == 0)
510
    {
511
      /* Hmm.  Looks like 0 */
512
      if (fraction == 0
513
#ifdef NO_DENORMALS
514
	  || 1
515
#endif
516
	  )
517
	{
518
	  /* tastes like zero */
519
	  dst->class = CLASS_ZERO;
520
	}
521
      else
522
	{
523
	  /* Zero exponent with nonzero fraction - it's denormalized,
524
	     so there isn't a leading implicit one - we'll shift it so
525
	     it gets one.  */
526
	  dst->normal_exp = exp - EXPBIAS + 1;
527
	  fraction <<= NGARDS;
528
 
529
	  dst->class = CLASS_NUMBER;
530
#if 1
531
	  while (fraction < IMPLICIT_1)
532
	    {
533
	      fraction <<= 1;
534
	      dst->normal_exp--;
535
	    }
536
#endif
537
	  dst->fraction.ll = fraction;
538
	}
539
    }
540
  else if (__builtin_expect (exp == EXPMAX, 0))
541
    {
542
      /* Huge exponent*/
543
      if (fraction == 0)
544
	{
545
	  /* Attached to a zero fraction - means infinity */
546
	  dst->class = CLASS_INFINITY;
547
	}
548
      else
549
	{
550
	  /* Nonzero fraction, means nan */
551
#ifdef QUIET_NAN_NEGATED
552
	  if ((fraction & QUIET_NAN) == 0)
553
#else
554
	  if (fraction & QUIET_NAN)
555
#endif
556
	    {
557
	      dst->class = CLASS_QNAN;
558
	    }
559
	  else
560
	    {
561
	      dst->class = CLASS_SNAN;
562
	    }
563
	  /* Now that we know which kind of NaN we got, discard the
564
	     quiet/signaling bit, but do preserve the NaN payload.  */
565
	  fraction &= ~QUIET_NAN;
566
	  dst->fraction.ll = fraction << NGARDS;
567
	}
568
    }
569
  else
570
    {
571
      /* Nothing strange about this number */
572
      dst->normal_exp = exp - EXPBIAS;
573
      dst->class = CLASS_NUMBER;
574
      dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
575
    }
576
}
577
#endif /* L_unpack_df || L_unpack_sf */
578
 
579
#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
580
static const fp_number_type *
581
_fpadd_parts (fp_number_type * a,
582
	      fp_number_type * b,
583
	      fp_number_type * tmp)
584
{
585
  intfrac tfraction;
586
 
587
  /* Put commonly used fields in local variables.  */
588
  int a_normal_exp;
589
  int b_normal_exp;
590
  fractype a_fraction;
591
  fractype b_fraction;
592
 
593
  if (isnan (a))
594
    {
595
      return a;
596
    }
597
  if (isnan (b))
598
    {
599
      return b;
600
    }
601
  if (isinf (a))
602
    {
603
      /* Adding infinities with opposite signs yields a NaN.  */
604
      if (isinf (b) && a->sign != b->sign)
605
	return makenan ();
606
      return a;
607
    }
608
  if (isinf (b))
609
    {
610
      return b;
611
    }
612
  if (iszero (b))
613
    {
614
      if (iszero (a))
615
	{
616
	  *tmp = *a;
617
	  tmp->sign = a->sign & b->sign;
618
	  return tmp;
619
	}
620
      return a;
621
    }
622
  if (iszero (a))
623
    {
624
      return b;
625
    }
626
 
627
  /* Got two numbers. shift the smaller and increment the exponent till
628
     they're the same */
629
  {
630
    int diff;
631
    int sdiff;
632
 
633
    a_normal_exp = a->normal_exp;
634
    b_normal_exp = b->normal_exp;
635
    a_fraction = a->fraction.ll;
636
    b_fraction = b->fraction.ll;
637
 
638
    diff = a_normal_exp - b_normal_exp;
639
    sdiff = diff;
640
 
641
    if (diff < 0)
642
      diff = -diff;
643
    if (diff < FRAC_NBITS)
644
      {
645
	if (sdiff > 0)
646
	  {
647
	    b_normal_exp += diff;
648
	    LSHIFT (b_fraction, diff);
649
	  }
650
	else if (sdiff < 0)
651
	  {
652
	    a_normal_exp += diff;
653
	    LSHIFT (a_fraction, diff);
654
	  }
655
      }
656
    else
657
      {
658
	/* Somethings's up.. choose the biggest */
659
	if (a_normal_exp > b_normal_exp)
660
	  {
661
	    b_normal_exp = a_normal_exp;
662
	    b_fraction = 0;
663
	  }
664
	else
665
	  {
666
	    a_normal_exp = b_normal_exp;
667
	    a_fraction = 0;
668
	  }
669
      }
670
  }
671
 
672
  if (a->sign != b->sign)
673
    {
674
      if (a->sign)
675
	{
676
	  tfraction = -a_fraction + b_fraction;
677
	}
678
      else
679
	{
680
	  tfraction = a_fraction - b_fraction;
681
	}
682
      if (tfraction >= 0)
683
	{
684
	  tmp->sign = 0;
685
	  tmp->normal_exp = a_normal_exp;
686
	  tmp->fraction.ll = tfraction;
687
	}
688
      else
689
	{
690
	  tmp->sign = 1;
691
	  tmp->normal_exp = a_normal_exp;
692
	  tmp->fraction.ll = -tfraction;
693
	}
694
      /* and renormalize it */
695
 
696
      while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
697
	{
698
	  tmp->fraction.ll <<= 1;
699
	  tmp->normal_exp--;
700
	}
701
    }
702
  else
703
    {
704
      tmp->sign = a->sign;
705
      tmp->normal_exp = a_normal_exp;
706
      tmp->fraction.ll = a_fraction + b_fraction;
707
    }
708
  tmp->class = CLASS_NUMBER;
709
  /* Now the fraction is added, we have to shift down to renormalize the
710
     number */
711
 
712
  if (tmp->fraction.ll >= IMPLICIT_2)
713
    {
714
      LSHIFT (tmp->fraction.ll, 1);
715
      tmp->normal_exp++;
716
    }
717
  return tmp;
718
}
719
 
720
FLO_type
721
add (FLO_type arg_a, FLO_type arg_b)
722
{
723
  fp_number_type a;
724
  fp_number_type b;
725
  fp_number_type tmp;
726
  const fp_number_type *res;
727
  FLO_union_type au, bu;
728
 
729
  au.value = arg_a;
730
  bu.value = arg_b;
731
 
732
  unpack_d (&au, &a);
733
  unpack_d (&bu, &b);
734
 
735
  res = _fpadd_parts (&a, &b, &tmp);
736
 
737
  return pack_d (res);
738
}
739
 
740
FLO_type
741
sub (FLO_type arg_a, FLO_type arg_b)
742
{
743
  fp_number_type a;
744
  fp_number_type b;
745
  fp_number_type tmp;
746
  const fp_number_type *res;
747
  FLO_union_type au, bu;
748
 
749
  au.value = arg_a;
750
  bu.value = arg_b;
751
 
752
  unpack_d (&au, &a);
753
  unpack_d (&bu, &b);
754
 
755
  b.sign ^= 1;
756
 
757
  res = _fpadd_parts (&a, &b, &tmp);
758
 
759
  return pack_d (res);
760
}
761
#endif /* L_addsub_sf || L_addsub_df */
762
 
763
#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
764
static inline __attribute__ ((__always_inline__)) const fp_number_type *
765
_fpmul_parts ( fp_number_type *  a,
766
	       fp_number_type *  b,
767
	       fp_number_type * tmp)
768
{
769
  fractype low = 0;
770
  fractype high = 0;
771
 
772
  if (isnan (a))
773
    {
774
      a->sign = a->sign != b->sign;
775
      return a;
776
    }
777
  if (isnan (b))
778
    {
779
      b->sign = a->sign != b->sign;
780
      return b;
781
    }
782
  if (isinf (a))
783
    {
784
      if (iszero (b))
785
	return makenan ();
786
      a->sign = a->sign != b->sign;
787
      return a;
788
    }
789
  if (isinf (b))
790
    {
791
      if (iszero (a))
792
	{
793
	  return makenan ();
794
	}
795
      b->sign = a->sign != b->sign;
796
      return b;
797
    }
798
  if (iszero (a))
799
    {
800
      a->sign = a->sign != b->sign;
801
      return a;
802
    }
803
  if (iszero (b))
804
    {
805
      b->sign = a->sign != b->sign;
806
      return b;
807
    }
808
 
809
  /* Calculate the mantissa by multiplying both numbers to get a
810
     twice-as-wide number.  */
811
  {
812
#if defined(NO_DI_MODE) || defined(TFLOAT)
813
    {
814
      fractype x = a->fraction.ll;
815
      fractype ylow = b->fraction.ll;
816
      fractype yhigh = 0;
817
      int bit;
818
 
819
      /* ??? This does multiplies one bit at a time.  Optimize.  */
820
      for (bit = 0; bit < FRAC_NBITS; bit++)
821
	{
822
	  int carry;
823
 
824
	  if (x & 1)
825
	    {
826
	      carry = (low += ylow) < ylow;
827
	      high += yhigh + carry;
828
	    }
829
	  yhigh <<= 1;
830
	  if (ylow & FRACHIGH)
831
	    {
832
	      yhigh |= 1;
833
	    }
834
	  ylow <<= 1;
835
	  x >>= 1;
836
	}
837
    }
838
#elif defined(FLOAT)
839
    /* Multiplying two USIs to get a UDI, we're safe.  */
840
    {
841
      UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
842
 
843
      high = answer >> BITS_PER_SI;
844
      low = answer;
845
    }
846
#else
847
    /* fractype is DImode, but we need the result to be twice as wide.
848
       Assuming a widening multiply from DImode to TImode is not
849
       available, build one by hand.  */
850
    {
851
      USItype nl = a->fraction.ll;
852
      USItype nh = a->fraction.ll >> BITS_PER_SI;
853
      USItype ml = b->fraction.ll;
854
      USItype mh = b->fraction.ll >> BITS_PER_SI;
855
      UDItype pp_ll = (UDItype) ml * nl;
856
      UDItype pp_hl = (UDItype) mh * nl;
857
      UDItype pp_lh = (UDItype) ml * nh;
858
      UDItype pp_hh = (UDItype) mh * nh;
859
      UDItype res2 = 0;
860
      UDItype res0 = 0;
861
      UDItype ps_hh__ = pp_hl + pp_lh;
862
      if (ps_hh__ < pp_hl)
863
	res2 += (UDItype)1 << BITS_PER_SI;
864
      pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
865
      res0 = pp_ll + pp_hl;
866
      if (res0 < pp_ll)
867
	res2++;
868
      res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
869
      high = res2;
870
      low = res0;
871
    }
872
#endif
873
  }
874
 
875
  tmp->normal_exp = a->normal_exp + b->normal_exp
876
    + FRAC_NBITS - (FRACBITS + NGARDS);
877
  tmp->sign = a->sign != b->sign;
878
  while (high >= IMPLICIT_2)
879
    {
880
      tmp->normal_exp++;
881
      if (high & 1)
882
	{
883
	  low >>= 1;
884
	  low |= FRACHIGH;
885
	}
886
      high >>= 1;
887
    }
888
  while (high < IMPLICIT_1)
889
    {
890
      tmp->normal_exp--;
891
 
892
      high <<= 1;
893
      if (low & FRACHIGH)
894
	high |= 1;
895
      low <<= 1;
896
    }
897
 
898
  if ((high & GARDMASK) == GARDMSB)
899
    {
900
      if (high & (1 << NGARDS))
901
	{
902
	  /* Because we're half way, we would round to even by adding
903
	     GARDROUND + 1, except that's also done in the packing
904
	     function, and rounding twice will lose precision and cause
905
	     the result to be too far off.  Example: 32-bit floats with
906
	     bit patterns 0xfff * 0x3f800400 ~= 0xfff (less than 0.5ulp
907
	     off), not 0x1000 (more than 0.5ulp off).  */
908
	}
909
      else if (low)
910
	{
911
	  /* We're a further than half way by a small amount corresponding
912
	     to the bits set in "low".  Knowing that, we round here and
913
	     not in pack_d, because there we don't have "low" available
914
	     anymore.  */
915
	  high += GARDROUND + 1;
916
 
917
	  /* Avoid further rounding in pack_d.  */
918
	  high &= ~(fractype) GARDMASK;
919
	}
920
    }
921
  tmp->fraction.ll = high;
922
  tmp->class = CLASS_NUMBER;
923
  return tmp;
924
}
925
 
926
FLO_type
927
multiply (FLO_type arg_a, FLO_type arg_b)
928
{
929
  fp_number_type a;
930
  fp_number_type b;
931
  fp_number_type tmp;
932
  const fp_number_type *res;
933
  FLO_union_type au, bu;
934
 
935
  au.value = arg_a;
936
  bu.value = arg_b;
937
 
938
  unpack_d (&au, &a);
939
  unpack_d (&bu, &b);
940
 
941
  res = _fpmul_parts (&a, &b, &tmp);
942
 
943
  return pack_d (res);
944
}
945
#endif /* L_mul_sf || L_mul_df || L_mul_tf */
946
 
947
#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
948
static inline __attribute__ ((__always_inline__)) const fp_number_type *
949
_fpdiv_parts (fp_number_type * a,
950
	      fp_number_type * b)
951
{
952
  fractype bit;
953
  fractype numerator;
954
  fractype denominator;
955
  fractype quotient;
956
 
957
  if (isnan (a))
958
    {
959
      return a;
960
    }
961
  if (isnan (b))
962
    {
963
      return b;
964
    }
965
 
966
  a->sign = a->sign ^ b->sign;
967
 
968
  if (isinf (a) || iszero (a))
969
    {
970
      if (a->class == b->class)
971
	return makenan ();
972
      return a;
973
    }
974
 
975
  if (isinf (b))
976
    {
977
      a->fraction.ll = 0;
978
      a->normal_exp = 0;
979
      return a;
980
    }
981
  if (iszero (b))
982
    {
983
      a->class = CLASS_INFINITY;
984
      return a;
985
    }
986
 
987
  /* Calculate the mantissa by multiplying both 64bit numbers to get a
988
     128 bit number */
989
  {
990
    /* quotient =
991
       ( numerator / denominator) * 2^(numerator exponent -  denominator exponent)
992
     */
993
 
994
    a->normal_exp = a->normal_exp - b->normal_exp;
995
    numerator = a->fraction.ll;
996
    denominator = b->fraction.ll;
997
 
998
    if (numerator < denominator)
999
      {
1000
	/* Fraction will be less than 1.0 */
1001
	numerator *= 2;
1002
	a->normal_exp--;
1003
      }
1004
    bit = IMPLICIT_1;
1005
    quotient = 0;
1006
    /* ??? Does divide one bit at a time.  Optimize.  */
1007
    while (bit)
1008
      {
1009
	if (numerator >= denominator)
1010
	  {
1011
	    quotient |= bit;
1012
	    numerator -= denominator;
1013
	  }
1014
	bit >>= 1;
1015
	numerator *= 2;
1016
      }
1017
 
1018
    if ((quotient & GARDMASK) == GARDMSB)
1019
      {
1020
	if (quotient & (1 << NGARDS))
1021
	  {
1022
	    /* Because we're half way, we would round to even by adding
1023
	       GARDROUND + 1, except that's also done in the packing
1024
	       function, and rounding twice will lose precision and cause
1025
	       the result to be too far off.  */
1026
	  }
1027
	else if (numerator)
1028
	  {
1029
	    /* We're a further than half way by the small amount
1030
	       corresponding to the bits set in "numerator".  Knowing
1031
	       that, we round here and not in pack_d, because there we
1032
	       don't have "numerator" available anymore.  */
1033
	    quotient += GARDROUND + 1;
1034
 
1035
	    /* Avoid further rounding in pack_d.  */
1036
	    quotient &= ~(fractype) GARDMASK;
1037
	  }
1038
      }
1039
 
1040
    a->fraction.ll = quotient;
1041
    return (a);
1042
  }
1043
}
1044
 
1045
FLO_type
1046
divide (FLO_type arg_a, FLO_type arg_b)
1047
{
1048
  fp_number_type a;
1049
  fp_number_type b;
1050
  const fp_number_type *res;
1051
  FLO_union_type au, bu;
1052
 
1053
  au.value = arg_a;
1054
  bu.value = arg_b;
1055
 
1056
  unpack_d (&au, &a);
1057
  unpack_d (&bu, &b);
1058
 
1059
  res = _fpdiv_parts (&a, &b);
1060
 
1061
  return pack_d (res);
1062
}
1063
#endif /* L_div_sf || L_div_df */
1064
 
1065
#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
1066
    || defined(L_fpcmp_parts_tf)
1067
/* according to the demo, fpcmp returns a comparison with 0... thus
1068
   a -1
1069
   a==b -> 0
1070
   a>b -> +1
1071
 */
1072
 
1073
int
1074
__fpcmp_parts (fp_number_type * a, fp_number_type * b)
1075
{
1076
#if 0
1077
  /* either nan -> unordered. Must be checked outside of this routine.  */
1078
  if (isnan (a) && isnan (b))
1079
    {
1080
      return 1;			/* still unordered! */
1081
    }
1082
#endif
1083
 
1084
  if (isnan (a) || isnan (b))
1085
    {
1086
      return 1;			/* how to indicate unordered compare? */
1087
    }
1088
  if (isinf (a) && isinf (b))
1089
    {
1090
      /* +inf > -inf, but +inf != +inf */
1091
      /* b    \a| +inf(0)| -inf(1)
1092
       ______\+--------+--------
1093
       +inf(0)| a==b(0)| a
1094
       -------+--------+--------
1095
       -inf(1)| a>b(1) | a==b(0)
1096
       -------+--------+--------
1097
       So since unordered must be nonzero, just line up the columns...
1098
       */
1099
      return b->sign - a->sign;
1100
    }
1101
  /* but not both...  */
1102
  if (isinf (a))
1103
    {
1104
      return a->sign ? -1 : 1;
1105
    }
1106
  if (isinf (b))
1107
    {
1108
      return b->sign ? 1 : -1;
1109
    }
1110
  if (iszero (a) && iszero (b))
1111
    {
1112
      return 0;
1113
    }
1114
  if (iszero (a))
1115
    {
1116
      return b->sign ? 1 : -1;
1117
    }
1118
  if (iszero (b))
1119
    {
1120
      return a->sign ? -1 : 1;
1121
    }
1122
  /* now both are "normal".  */
1123
  if (a->sign != b->sign)
1124
    {
1125
      /* opposite signs */
1126
      return a->sign ? -1 : 1;
1127
    }
1128
  /* same sign; exponents? */
1129
  if (a->normal_exp > b->normal_exp)
1130
    {
1131
      return a->sign ? -1 : 1;
1132
    }
1133
  if (a->normal_exp < b->normal_exp)
1134
    {
1135
      return a->sign ? 1 : -1;
1136
    }
1137
  /* same exponents; check size.  */
1138
  if (a->fraction.ll > b->fraction.ll)
1139
    {
1140
      return a->sign ? -1 : 1;
1141
    }
1142
  if (a->fraction.ll < b->fraction.ll)
1143
    {
1144
      return a->sign ? 1 : -1;
1145
    }
1146
  /* after all that, they're equal.  */
1147
  return 0;
1148
}
1149
#endif
1150
 
1151
#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
1152
CMPtype
1153
compare (FLO_type arg_a, FLO_type arg_b)
1154
{
1155
  fp_number_type a;
1156
  fp_number_type b;
1157
  FLO_union_type au, bu;
1158
 
1159
  au.value = arg_a;
1160
  bu.value = arg_b;
1161
 
1162
  unpack_d (&au, &a);
1163
  unpack_d (&bu, &b);
1164
 
1165
  return __fpcmp_parts (&a, &b);
1166
}
1167
#endif /* L_compare_sf || L_compare_df */
1168
 
1169
/* These should be optimized for their specific tasks someday.  */
1170
 
1171
#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
1172
CMPtype
1173
_eq_f2 (FLO_type arg_a, FLO_type arg_b)
1174
{
1175
  fp_number_type a;
1176
  fp_number_type b;
1177
  FLO_union_type au, bu;
1178
 
1179
  au.value = arg_a;
1180
  bu.value = arg_b;
1181
 
1182
  unpack_d (&au, &a);
1183
  unpack_d (&bu, &b);
1184
 
1185
  if (isnan (&a) || isnan (&b))
1186
    return 1;			/* false, truth == 0 */
1187
 
1188
  return __fpcmp_parts (&a, &b) ;
1189
}
1190
#endif /* L_eq_sf || L_eq_df */
1191
 
1192
#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
1193
CMPtype
1194
_ne_f2 (FLO_type arg_a, FLO_type arg_b)
1195
{
1196
  fp_number_type a;
1197
  fp_number_type b;
1198
  FLO_union_type au, bu;
1199
 
1200
  au.value = arg_a;
1201
  bu.value = arg_b;
1202
 
1203
  unpack_d (&au, &a);
1204
  unpack_d (&bu, &b);
1205
 
1206
  if (isnan (&a) || isnan (&b))
1207
    return 1;			/* true, truth != 0 */
1208
 
1209
  return  __fpcmp_parts (&a, &b) ;
1210
}
1211
#endif /* L_ne_sf || L_ne_df */
1212
 
1213
#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
1214
CMPtype
1215
_gt_f2 (FLO_type arg_a, FLO_type arg_b)
1216
{
1217
  fp_number_type a;
1218
  fp_number_type b;
1219
  FLO_union_type au, bu;
1220
 
1221
  au.value = arg_a;
1222
  bu.value = arg_b;
1223
 
1224
  unpack_d (&au, &a);
1225
  unpack_d (&bu, &b);
1226
 
1227
  if (isnan (&a) || isnan (&b))
1228
    return -1;			/* false, truth > 0 */
1229
 
1230
  return __fpcmp_parts (&a, &b);
1231
}
1232
#endif /* L_gt_sf || L_gt_df */
1233
 
1234
#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
1235
CMPtype
1236
_ge_f2 (FLO_type arg_a, FLO_type arg_b)
1237
{
1238
  fp_number_type a;
1239
  fp_number_type b;
1240
  FLO_union_type au, bu;
1241
 
1242
  au.value = arg_a;
1243
  bu.value = arg_b;
1244
 
1245
  unpack_d (&au, &a);
1246
  unpack_d (&bu, &b);
1247
 
1248
  if (isnan (&a) || isnan (&b))
1249
    return -1;			/* false, truth >= 0 */
1250
  return __fpcmp_parts (&a, &b) ;
1251
}
1252
#endif /* L_ge_sf || L_ge_df */
1253
 
1254
#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
1255
CMPtype
1256
_lt_f2 (FLO_type arg_a, FLO_type arg_b)
1257
{
1258
  fp_number_type a;
1259
  fp_number_type b;
1260
  FLO_union_type au, bu;
1261
 
1262
  au.value = arg_a;
1263
  bu.value = arg_b;
1264
 
1265
  unpack_d (&au, &a);
1266
  unpack_d (&bu, &b);
1267
 
1268
  if (isnan (&a) || isnan (&b))
1269
    return 1;			/* false, truth < 0 */
1270
 
1271
  return __fpcmp_parts (&a, &b);
1272
}
1273
#endif /* L_lt_sf || L_lt_df */
1274
 
1275
#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
1276
CMPtype
1277
_le_f2 (FLO_type arg_a, FLO_type arg_b)
1278
{
1279
  fp_number_type a;
1280
  fp_number_type b;
1281
  FLO_union_type au, bu;
1282
 
1283
  au.value = arg_a;
1284
  bu.value = arg_b;
1285
 
1286
  unpack_d (&au, &a);
1287
  unpack_d (&bu, &b);
1288
 
1289
  if (isnan (&a) || isnan (&b))
1290
    return 1;			/* false, truth <= 0 */
1291
 
1292
  return __fpcmp_parts (&a, &b) ;
1293
}
1294
#endif /* L_le_sf || L_le_df */
1295
 
1296
#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
1297
CMPtype
1298
_unord_f2 (FLO_type arg_a, FLO_type arg_b)
1299
{
1300
  fp_number_type a;
1301
  fp_number_type b;
1302
  FLO_union_type au, bu;
1303
 
1304
  au.value = arg_a;
1305
  bu.value = arg_b;
1306
 
1307
  unpack_d (&au, &a);
1308
  unpack_d (&bu, &b);
1309
 
1310
  return (isnan (&a) || isnan (&b));
1311
}
1312
#endif /* L_unord_sf || L_unord_df */
1313
 
1314
#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
1315
FLO_type
1316
si_to_float (SItype arg_a)
1317
{
1318
  fp_number_type in;
1319
 
1320
  in.class = CLASS_NUMBER;
1321
  in.sign = arg_a < 0;
1322
  if (!arg_a)
1323
    {
1324
      in.class = CLASS_ZERO;
1325
    }
1326
  else
1327
    {
1328
      USItype uarg;
1329
      int shift;
1330
      in.normal_exp = FRACBITS + NGARDS;
1331
      if (in.sign)
1332
	{
1333
	  /* Special case for minint, since there is no +ve integer
1334
	     representation for it */
1335
	  if (arg_a == (- MAX_SI_INT - 1))
1336
	    {
1337
	      return (FLO_type)(- MAX_SI_INT - 1);
1338
	    }
1339
	  uarg = (-arg_a);
1340
	}
1341
      else
1342
	uarg = arg_a;
1343
 
1344
      in.fraction.ll = uarg;
1345
      shift = clzusi (uarg) - (BITS_PER_SI - 1 - FRACBITS - NGARDS);
1346
      if (shift > 0)
1347
	{
1348
	  in.fraction.ll <<= shift;
1349
	  in.normal_exp -= shift;
1350
	}
1351
    }
1352
  return pack_d (&in);
1353
}
1354
#endif /* L_si_to_sf || L_si_to_df */
1355
 
1356
#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
1357
FLO_type
1358
usi_to_float (USItype arg_a)
1359
{
1360
  fp_number_type in;
1361
 
1362
  in.sign = 0;
1363
  if (!arg_a)
1364
    {
1365
      in.class = CLASS_ZERO;
1366
    }
1367
  else
1368
    {
1369
      int shift;
1370
      in.class = CLASS_NUMBER;
1371
      in.normal_exp = FRACBITS + NGARDS;
1372
      in.fraction.ll = arg_a;
1373
 
1374
      shift = clzusi (arg_a) - (BITS_PER_SI - 1 - FRACBITS - NGARDS);
1375
      if (shift < 0)
1376
	{
1377
	  fractype guard = in.fraction.ll & (((fractype)1 << -shift) - 1);
1378
	  in.fraction.ll >>= -shift;
1379
	  in.fraction.ll |= (guard != 0);
1380
	  in.normal_exp -= shift;
1381
	}
1382
      else if (shift > 0)
1383
	{
1384
	  in.fraction.ll <<= shift;
1385
	  in.normal_exp -= shift;
1386
	}
1387
    }
1388
  return pack_d (&in);
1389
}
1390
#endif
1391
 
1392
#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
1393
SItype
1394
float_to_si (FLO_type arg_a)
1395
{
1396
  fp_number_type a;
1397
  SItype tmp;
1398
  FLO_union_type au;
1399
 
1400
  au.value = arg_a;
1401
  unpack_d (&au, &a);
1402
 
1403
  if (iszero (&a))
1404
    return 0;
1405
  if (isnan (&a))
1406
    return 0;
1407
  /* get reasonable MAX_SI_INT...  */
1408
  if (isinf (&a))
1409
    return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1410
  /* it is a number, but a small one */
1411
  if (a.normal_exp < 0)
1412
    return 0;
1413
  if (a.normal_exp > BITS_PER_SI - 2)
1414
    return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1415
  tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1416
  return a.sign ? (-tmp) : (tmp);
1417
}
1418
#endif /* L_sf_to_si || L_df_to_si */
1419
 
1420
#if defined(L_tf_to_usi)
1421
USItype
1422
float_to_usi (FLO_type arg_a)
1423
{
1424
  fp_number_type a;
1425
  FLO_union_type au;
1426
 
1427
  au.value = arg_a;
1428
  unpack_d (&au, &a);
1429
 
1430
  if (iszero (&a))
1431
    return 0;
1432
  if (isnan (&a))
1433
    return 0;
1434
  /* it is a negative number */
1435
  if (a.sign)
1436
    return 0;
1437
  /* get reasonable MAX_USI_INT...  */
1438
  if (isinf (&a))
1439
    return MAX_USI_INT;
1440
  /* it is a number, but a small one */
1441
  if (a.normal_exp < 0)
1442
    return 0;
1443
  if (a.normal_exp > BITS_PER_SI - 1)
1444
    return MAX_USI_INT;
1445
  else if (a.normal_exp > (FRACBITS + NGARDS))
1446
    return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
1447
  else
1448
    return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1449
}
1450
#endif /* L_tf_to_usi */
1451
 
1452
#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
1453
FLO_type
1454
negate (FLO_type arg_a)
1455
{
1456
  fp_number_type a;
1457
  FLO_union_type au;
1458
 
1459
  au.value = arg_a;
1460
  unpack_d (&au, &a);
1461
 
1462
  flip_sign (&a);
1463
  return pack_d (&a);
1464
}
1465
#endif /* L_negate_sf || L_negate_df */
1466
 
1467
#ifdef FLOAT
1468
 
1469
#if defined(L_make_sf)
1470
SFtype
1471
__make_fp(fp_class_type class,
1472
	     unsigned int sign,
1473
	     int exp,
1474
	     USItype frac)
1475
{
1476
  fp_number_type in;
1477
 
1478
  in.class = class;
1479
  in.sign = sign;
1480
  in.normal_exp = exp;
1481
  in.fraction.ll = frac;
1482
  return pack_d (&in);
1483
}
1484
#endif /* L_make_sf */
1485
 
1486
#ifndef FLOAT_ONLY
1487
 
1488
/* This enables one to build an fp library that supports float but not double.
1489
   Otherwise, we would get an undefined reference to __make_dp.
1490
   This is needed for some 8-bit ports that can't handle well values that
1491
   are 8-bytes in size, so we just don't support double for them at all.  */
1492
 
1493
#if defined(L_sf_to_df)
1494
DFtype
1495
sf_to_df (SFtype arg_a)
1496
{
1497
  fp_number_type in;
1498
  FLO_union_type au;
1499
 
1500
  au.value = arg_a;
1501
  unpack_d (&au, &in);
1502
 
1503
  return __make_dp (in.class, in.sign, in.normal_exp,
1504
		    ((UDItype) in.fraction.ll) << F_D_BITOFF);
1505
}
1506
#endif /* L_sf_to_df */
1507
 
1508
#if defined(L_sf_to_tf) && defined(TMODES)
1509
TFtype
1510
sf_to_tf (SFtype arg_a)
1511
{
1512
  fp_number_type in;
1513
  FLO_union_type au;
1514
 
1515
  au.value = arg_a;
1516
  unpack_d (&au, &in);
1517
 
1518
  return __make_tp (in.class, in.sign, in.normal_exp,
1519
		    ((UTItype) in.fraction.ll) << F_T_BITOFF);
1520
}
1521
#endif /* L_sf_to_df */
1522
 
1523
#endif /* ! FLOAT_ONLY */
1524
#endif /* FLOAT */
1525
 
1526
#ifndef FLOAT
1527
 
1528
extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1529
 
1530
#if defined(L_make_df)
1531
DFtype
1532
__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1533
{
1534
  fp_number_type in;
1535
 
1536
  in.class = class;
1537
  in.sign = sign;
1538
  in.normal_exp = exp;
1539
  in.fraction.ll = frac;
1540
  return pack_d (&in);
1541
}
1542
#endif /* L_make_df */
1543
 
1544
#if defined(L_df_to_sf)
1545
SFtype
1546
df_to_sf (DFtype arg_a)
1547
{
1548
  fp_number_type in;
1549
  USItype sffrac;
1550
  FLO_union_type au;
1551
 
1552
  au.value = arg_a;
1553
  unpack_d (&au, &in);
1554
 
1555
  sffrac = in.fraction.ll >> F_D_BITOFF;
1556
 
1557
  /* We set the lowest guard bit in SFFRAC if we discarded any non
1558
     zero bits.  */
1559
  if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
1560
    sffrac |= 1;
1561
 
1562
  return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1563
}
1564
#endif /* L_df_to_sf */
1565
 
1566
#if defined(L_df_to_tf) && defined(TMODES) \
1567
    && !defined(FLOAT) && !defined(TFLOAT)
1568
TFtype
1569
df_to_tf (DFtype arg_a)
1570
{
1571
  fp_number_type in;
1572
  FLO_union_type au;
1573
 
1574
  au.value = arg_a;
1575
  unpack_d (&au, &in);
1576
 
1577
  return __make_tp (in.class, in.sign, in.normal_exp,
1578
		    ((UTItype) in.fraction.ll) << D_T_BITOFF);
1579
}
1580
#endif /* L_sf_to_df */
1581
 
1582
#ifdef TFLOAT
1583
#if defined(L_make_tf)
1584
TFtype
1585
__make_tp(fp_class_type class,
1586
	     unsigned int sign,
1587
	     int exp,
1588
	     UTItype frac)
1589
{
1590
  fp_number_type in;
1591
 
1592
  in.class = class;
1593
  in.sign = sign;
1594
  in.normal_exp = exp;
1595
  in.fraction.ll = frac;
1596
  return pack_d (&in);
1597
}
1598
#endif /* L_make_tf */
1599
 
1600
#if defined(L_tf_to_df)
1601
DFtype
1602
tf_to_df (TFtype arg_a)
1603
{
1604
  fp_number_type in;
1605
  UDItype sffrac;
1606
  FLO_union_type au;
1607
 
1608
  au.value = arg_a;
1609
  unpack_d (&au, &in);
1610
 
1611
  sffrac = in.fraction.ll >> D_T_BITOFF;
1612
 
1613
  /* We set the lowest guard bit in SFFRAC if we discarded any non
1614
     zero bits.  */
1615
  if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
1616
    sffrac |= 1;
1617
 
1618
  return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
1619
}
1620
#endif /* L_tf_to_df */
1621
 
1622
#if defined(L_tf_to_sf)
1623
SFtype
1624
tf_to_sf (TFtype arg_a)
1625
{
1626
  fp_number_type in;
1627
  USItype sffrac;
1628
  FLO_union_type au;
1629
 
1630
  au.value = arg_a;
1631
  unpack_d (&au, &in);
1632
 
1633
  sffrac = in.fraction.ll >> F_T_BITOFF;
1634
 
1635
  /* We set the lowest guard bit in SFFRAC if we discarded any non
1636
     zero bits.  */
1637
  if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
1638
    sffrac |= 1;
1639
 
1640
  return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1641
}
1642
#endif /* L_tf_to_sf */
1643
#endif /* TFLOAT */
1644
 
1645
#endif /* ! FLOAT */
1646
#endif /* !EXTENDED_FLOAT_STUBS */