mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			155 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <ansidecl.h>
 | |
| 
 | |
| #ifdef __IEEE_BIG_ENDIAN
 | |
| 
 | |
| typedef union 
 | |
| {
 | |
|   double value;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned int sign : 1;
 | |
|     unsigned int exponent: 11;
 | |
|     unsigned int fraction0:4;
 | |
|     unsigned int fraction1:16;
 | |
|     unsigned int fraction2:16;
 | |
|     unsigned int fraction3:16;
 | |
|     
 | |
|   } number;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned int sign : 1;
 | |
|     unsigned int exponent: 11;
 | |
|     unsigned int quiet:1;
 | |
|     unsigned int function0:3;
 | |
|     unsigned int function1:16;
 | |
|     unsigned int function2:16;
 | |
|     unsigned int function3:16;
 | |
|   } nan;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned long msw;
 | |
|     unsigned long lsw;
 | |
|   } parts;
 | |
|     long aslong[2];
 | |
| } __ieee_double_shape_type;
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #ifdef __IEEE_LITTLE_ENDIAN
 | |
| 
 | |
| typedef union 
 | |
| {
 | |
|   double value;
 | |
|   struct 
 | |
|   {
 | |
| #ifdef __SMALL_BITFIELDS
 | |
|     unsigned int fraction3:16;
 | |
|     unsigned int fraction2:16;
 | |
|     unsigned int fraction1:16;
 | |
|     unsigned int fraction0: 4;
 | |
| #else
 | |
|     unsigned int fraction1:32;
 | |
|     unsigned int fraction0:20;
 | |
| #endif
 | |
|     unsigned int exponent :11;
 | |
|     unsigned int sign     : 1;
 | |
|   } number;
 | |
|   struct 
 | |
|   {
 | |
| #ifdef __SMALL_BITFIELDS
 | |
|     unsigned int function3:16;
 | |
|     unsigned int function2:16;
 | |
|     unsigned int function1:16;
 | |
|     unsigned int function0:3;
 | |
| #else
 | |
|     unsigned int function1:32;
 | |
|     unsigned int function0:19;
 | |
| #endif
 | |
|     unsigned int quiet:1;
 | |
|     unsigned int exponent: 11;
 | |
|     unsigned int sign : 1;
 | |
|   } nan;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned long lsw;
 | |
|     unsigned long msw;
 | |
|   } parts;
 | |
| 
 | |
|   long aslong[2];
 | |
| 
 | |
| } __ieee_double_shape_type;
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #ifdef __IEEE_BIG_ENDIAN
 | |
| typedef union
 | |
| {
 | |
|   float value;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned int sign : 1;
 | |
|     unsigned int exponent: 8;
 | |
|     unsigned int fraction0: 7;
 | |
|     unsigned int fraction1: 16;
 | |
|   } number;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned int sign:1;
 | |
|     unsigned int exponent:8;
 | |
|     unsigned int quiet:1;
 | |
|     unsigned int function0:6;
 | |
|     unsigned int function1:16;
 | |
|   } nan;
 | |
|   long p1;
 | |
|   
 | |
| } __ieee_float_shape_type;
 | |
| #endif
 | |
| 
 | |
| #ifdef __IEEE_LITTLE_ENDIAN
 | |
| typedef union
 | |
| {
 | |
|   float value;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned int fraction0: 7;
 | |
|     unsigned int fraction1: 16;
 | |
|     unsigned int exponent: 8;
 | |
|     unsigned int sign : 1;
 | |
|   } number;
 | |
|   struct 
 | |
|   {
 | |
|     unsigned int function1:16;
 | |
|     unsigned int function0:6;
 | |
|     unsigned int quiet:1;
 | |
|     unsigned int exponent:8;
 | |
|     unsigned int sign:1;
 | |
|   } nan;
 | |
|   long p1;
 | |
|   
 | |
| } __ieee_float_shape_type;
 | |
| #endif
 | |
| 
 | |
| #if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN)
 | |
| 
 | |
| double
 | |
| copysign (double x, double y)
 | |
| {
 | |
|   __ieee_double_shape_type a,b;
 | |
|   b.value = y;  
 | |
|   a.value = x;
 | |
|   a.number.sign =b.number.sign;
 | |
|   return a.value;
 | |
| }
 | |
| 
 | |
| #else
 | |
| 
 | |
| double
 | |
| copysign (double x, double y)
 | |
| {
 | |
|   if ((x < 0 && y > 0) || (x > 0 && y < 0))
 | |
|     return -x;
 | |
|   return x;
 | |
| }
 | |
| 
 | |
| #endif
 |