xref: /openbsd-src/gnu/lib/libiberty/src/copysign.c (revision 150b7e42cfa21e6546d96ae514ca23e80d970ac7)
100bf4279Sespie #include <ansidecl.h>
200bf4279Sespie 
300bf4279Sespie #ifdef __IEEE_BIG_ENDIAN
400bf4279Sespie 
500bf4279Sespie typedef union
600bf4279Sespie {
700bf4279Sespie   double value;
800bf4279Sespie   struct
900bf4279Sespie   {
1000bf4279Sespie     unsigned int sign : 1;
1100bf4279Sespie     unsigned int exponent: 11;
1200bf4279Sespie     unsigned int fraction0:4;
1300bf4279Sespie     unsigned int fraction1:16;
1400bf4279Sespie     unsigned int fraction2:16;
1500bf4279Sespie     unsigned int fraction3:16;
1600bf4279Sespie 
1700bf4279Sespie   } number;
1800bf4279Sespie   struct
1900bf4279Sespie   {
2000bf4279Sespie     unsigned int sign : 1;
2100bf4279Sespie     unsigned int exponent: 11;
2200bf4279Sespie     unsigned int quiet:1;
2300bf4279Sespie     unsigned int function0:3;
2400bf4279Sespie     unsigned int function1:16;
2500bf4279Sespie     unsigned int function2:16;
2600bf4279Sespie     unsigned int function3:16;
2700bf4279Sespie   } nan;
2800bf4279Sespie   struct
2900bf4279Sespie   {
3000bf4279Sespie     unsigned long msw;
3100bf4279Sespie     unsigned long lsw;
3200bf4279Sespie   } parts;
3300bf4279Sespie     long aslong[2];
3400bf4279Sespie } __ieee_double_shape_type;
3500bf4279Sespie 
3600bf4279Sespie #endif
3700bf4279Sespie 
3800bf4279Sespie #ifdef __IEEE_LITTLE_ENDIAN
3900bf4279Sespie 
4000bf4279Sespie typedef union
4100bf4279Sespie {
4200bf4279Sespie   double value;
4300bf4279Sespie   struct
4400bf4279Sespie   {
4500bf4279Sespie #ifdef __SMALL_BITFIELDS
4600bf4279Sespie     unsigned int fraction3:16;
4700bf4279Sespie     unsigned int fraction2:16;
4800bf4279Sespie     unsigned int fraction1:16;
4900bf4279Sespie     unsigned int fraction0: 4;
5000bf4279Sespie #else
5100bf4279Sespie     unsigned int fraction1:32;
5200bf4279Sespie     unsigned int fraction0:20;
5300bf4279Sespie #endif
5400bf4279Sespie     unsigned int exponent :11;
5500bf4279Sespie     unsigned int sign     : 1;
5600bf4279Sespie   } number;
5700bf4279Sespie   struct
5800bf4279Sespie   {
5900bf4279Sespie #ifdef __SMALL_BITFIELDS
6000bf4279Sespie     unsigned int function3:16;
6100bf4279Sespie     unsigned int function2:16;
6200bf4279Sespie     unsigned int function1:16;
6300bf4279Sespie     unsigned int function0:3;
6400bf4279Sespie #else
6500bf4279Sespie     unsigned int function1:32;
6600bf4279Sespie     unsigned int function0:19;
6700bf4279Sespie #endif
6800bf4279Sespie     unsigned int quiet:1;
6900bf4279Sespie     unsigned int exponent: 11;
7000bf4279Sespie     unsigned int sign : 1;
7100bf4279Sespie   } nan;
7200bf4279Sespie   struct
7300bf4279Sespie   {
7400bf4279Sespie     unsigned long lsw;
7500bf4279Sespie     unsigned long msw;
7600bf4279Sespie   } parts;
7700bf4279Sespie 
7800bf4279Sespie   long aslong[2];
7900bf4279Sespie 
8000bf4279Sespie } __ieee_double_shape_type;
8100bf4279Sespie 
8200bf4279Sespie #endif
8300bf4279Sespie 
8400bf4279Sespie #ifdef __IEEE_BIG_ENDIAN
8500bf4279Sespie typedef union
8600bf4279Sespie {
8700bf4279Sespie   float value;
8800bf4279Sespie   struct
8900bf4279Sespie   {
9000bf4279Sespie     unsigned int sign : 1;
9100bf4279Sespie     unsigned int exponent: 8;
9200bf4279Sespie     unsigned int fraction0: 7;
9300bf4279Sespie     unsigned int fraction1: 16;
9400bf4279Sespie   } number;
9500bf4279Sespie   struct
9600bf4279Sespie   {
9700bf4279Sespie     unsigned int sign:1;
9800bf4279Sespie     unsigned int exponent:8;
9900bf4279Sespie     unsigned int quiet:1;
10000bf4279Sespie     unsigned int function0:6;
10100bf4279Sespie     unsigned int function1:16;
10200bf4279Sespie   } nan;
10300bf4279Sespie   long p1;
10400bf4279Sespie 
10500bf4279Sespie } __ieee_float_shape_type;
10600bf4279Sespie #endif
10700bf4279Sespie 
10800bf4279Sespie #ifdef __IEEE_LITTLE_ENDIAN
10900bf4279Sespie typedef union
11000bf4279Sespie {
11100bf4279Sespie   float value;
11200bf4279Sespie   struct
11300bf4279Sespie   {
11400bf4279Sespie     unsigned int fraction0: 7;
11500bf4279Sespie     unsigned int fraction1: 16;
11600bf4279Sespie     unsigned int exponent: 8;
11700bf4279Sespie     unsigned int sign : 1;
11800bf4279Sespie   } number;
11900bf4279Sespie   struct
12000bf4279Sespie   {
12100bf4279Sespie     unsigned int function1:16;
12200bf4279Sespie     unsigned int function0:6;
12300bf4279Sespie     unsigned int quiet:1;
12400bf4279Sespie     unsigned int exponent:8;
12500bf4279Sespie     unsigned int sign:1;
12600bf4279Sespie   } nan;
12700bf4279Sespie   long p1;
12800bf4279Sespie 
12900bf4279Sespie } __ieee_float_shape_type;
13000bf4279Sespie #endif
13100bf4279Sespie 
1329588ddcfSespie #if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN)
13300bf4279Sespie 
13425e200daSespie double
copysign(double x,double y)135*150b7e42Smiod copysign (double x, double y)
13600bf4279Sespie {
13700bf4279Sespie   __ieee_double_shape_type a,b;
13800bf4279Sespie   b.value = y;
13900bf4279Sespie   a.value = x;
14000bf4279Sespie   a.number.sign =b.number.sign;
14100bf4279Sespie   return a.value;
14200bf4279Sespie }
1439588ddcfSespie 
1449588ddcfSespie #else
1459588ddcfSespie 
14625e200daSespie double
copysign(double x,double y)147*150b7e42Smiod copysign (double x, double y)
1489588ddcfSespie {
1499588ddcfSespie   if ((x < 0 && y > 0) || (x > 0 && y < 0))
1509588ddcfSespie     return -x;
1519588ddcfSespie   return x;
1529588ddcfSespie }
1539588ddcfSespie 
1549588ddcfSespie #endif
155