Home | History | Annotate | Download | only in libiberty
      1 #include <ansidecl.h>
      2 
      3 #ifdef __IEEE_BIG_ENDIAN
      4 
      5 typedef union
      6 {
      7   double value;
      8   struct
      9   {
     10     unsigned int sign : 1;
     11     unsigned int exponent: 11;
     12     unsigned int fraction0:4;
     13     unsigned int fraction1:16;
     14     unsigned int fraction2:16;
     15     unsigned int fraction3:16;
     16 
     17   } number;
     18   struct
     19   {
     20     unsigned int sign : 1;
     21     unsigned int exponent: 11;
     22     unsigned int quiet:1;
     23     unsigned int function0:3;
     24     unsigned int function1:16;
     25     unsigned int function2:16;
     26     unsigned int function3:16;
     27   } nan;
     28   struct
     29   {
     30     unsigned long msw;
     31     unsigned long lsw;
     32   } parts;
     33     long aslong[2];
     34 } __ieee_double_shape_type;
     35 
     36 #endif
     37 
     38 #ifdef __IEEE_LITTLE_ENDIAN
     39 
     40 typedef union
     41 {
     42   double value;
     43   struct
     44   {
     45 #ifdef __SMALL_BITFIELDS
     46     unsigned int fraction3:16;
     47     unsigned int fraction2:16;
     48     unsigned int fraction1:16;
     49     unsigned int fraction0: 4;
     50 #else
     51     unsigned int fraction1:32;
     52     unsigned int fraction0:20;
     53 #endif
     54     unsigned int exponent :11;
     55     unsigned int sign     : 1;
     56   } number;
     57   struct
     58   {
     59 #ifdef __SMALL_BITFIELDS
     60     unsigned int function3:16;
     61     unsigned int function2:16;
     62     unsigned int function1:16;
     63     unsigned int function0:3;
     64 #else
     65     unsigned int function1:32;
     66     unsigned int function0:19;
     67 #endif
     68     unsigned int quiet:1;
     69     unsigned int exponent: 11;
     70     unsigned int sign : 1;
     71   } nan;
     72   struct
     73   {
     74     unsigned long lsw;
     75     unsigned long msw;
     76   } parts;
     77 
     78   long aslong[2];
     79 
     80 } __ieee_double_shape_type;
     81 
     82 #endif
     83 
     84 #ifdef __IEEE_BIG_ENDIAN
     85 typedef union
     86 {
     87   float value;
     88   struct
     89   {
     90     unsigned int sign : 1;
     91     unsigned int exponent: 8;
     92     unsigned int fraction0: 7;
     93     unsigned int fraction1: 16;
     94   } number;
     95   struct
     96   {
     97     unsigned int sign:1;
     98     unsigned int exponent:8;
     99     unsigned int quiet:1;
    100     unsigned int function0:6;
    101     unsigned int function1:16;
    102   } nan;
    103   long p1;
    104 
    105 } __ieee_float_shape_type;
    106 #endif
    107 
    108 #ifdef __IEEE_LITTLE_ENDIAN
    109 typedef union
    110 {
    111   float value;
    112   struct
    113   {
    114     unsigned int fraction0: 7;
    115     unsigned int fraction1: 16;
    116     unsigned int exponent: 8;
    117     unsigned int sign : 1;
    118   } number;
    119   struct
    120   {
    121     unsigned int function1:16;
    122     unsigned int function0:6;
    123     unsigned int quiet:1;
    124     unsigned int exponent:8;
    125     unsigned int sign:1;
    126   } nan;
    127   long p1;
    128 
    129 } __ieee_float_shape_type;
    130 #endif
    131 
    132 #if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN)
    133 
    134 double
    135 copysign (double x, double y)
    136 {
    137   __ieee_double_shape_type a,b;
    138   b.value = y;
    139   a.value = x;
    140   a.number.sign =b.number.sign;
    141   return a.value;
    142 }
    143 
    144 #else
    145 
    146 double
    147 copysign (double x, double y)
    148 {
    149   if ((x < 0 && y > 0) || (x > 0 && y < 0))
    150     return -x;
    151   return x;
    152 }
    153 
    154 #endif
    155