1 /* the following deal with IEEE single-precision numbers */
3 #define SIGNBIT ((unsigned long)0x80000000)
4 #define HIDDEN (unsigned long)(1 << 23)
5 #define SIGN(fp) ((fp >> (8*sizeof(fp)-1)) & 1)
6 #define EXP(fp) (((fp) >> 23) & (unsigned int)0x00FF)
7 #define MANT(fp) (((fp) & (unsigned long)0x007FFFFF) | HIDDEN)
8 #define PACK(s,e,m) ((s) | ((e) << 23) | (m))
17 __fsadd (float a1, float a2)
19 volatile long mant1, mant2;
20 volatile union float_long fl1, fl2;
21 volatile int exp1, exp2;
22 volatile long sign = 0;
27 /* check for zero args */
41 /* do everything in excess precision so's we can round later */
42 mant1 = MANT (fl1.l) << 6;
43 mant2 = MANT (fl2.l) << 6;
52 mant2 >>= exp1 - exp2;
56 mant1 >>= exp2 - exp1;
70 while (!(mant1 & (unsigned long) 0xE0000000))
77 if (mant1 & (unsigned long)(1 << 30))
84 mant1 += (mant1 & (unsigned long)0x40) ? (unsigned long) 0x20 : (unsigned long) 0x1F;
87 if (mant1 & (unsigned long)(1 << 30))
93 /* lose extra precision */
96 /* turn off hidden bit */
99 /* pack up and go home */
100 fl1.l = PACK (sign, (unsigned long) exp1, mant1);