xref: /dflybsd-src/contrib/gcc-4.7/libgcc/floatunsisf.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Public domain.  */
2*e4b17023SJohn Marino typedef int SItype __attribute__ ((mode (SI)));
3*e4b17023SJohn Marino typedef unsigned int USItype __attribute__ ((mode (SI)));
4*e4b17023SJohn Marino typedef float SFtype __attribute__ ((mode (SF)));
5*e4b17023SJohn Marino 
6*e4b17023SJohn Marino SFtype
__floatunsisf(USItype u)7*e4b17023SJohn Marino __floatunsisf (USItype u)
8*e4b17023SJohn Marino {
9*e4b17023SJohn Marino   SItype s = (SItype) u;
10*e4b17023SJohn Marino   if (s < 0)
11*e4b17023SJohn Marino     {
12*e4b17023SJohn Marino       /* As in expand_float, compute (u & 1) | (u >> 1) to ensure
13*e4b17023SJohn Marino 	 correct rounding if a nonzero bit is shifted out.  */
14*e4b17023SJohn Marino       return (SFtype) 2.0 * (SFtype) (SItype) ((u & 1) | (u >> 1));
15*e4b17023SJohn Marino     }
16*e4b17023SJohn Marino   else
17*e4b17023SJohn Marino     return (SFtype) s;
18*e4b17023SJohn Marino }
19