(root)/
gcc-13.2.0/
libiberty/
copysign.c
       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