1169695Skan#include <ansidecl.h> 2169695Skan 3169695Skan#ifdef __IEEE_BIG_ENDIAN 4169695Skan 5169695Skantypedef union 6169695Skan{ 7169695Skan double value; 8169695Skan struct 9169695Skan { 10169695Skan unsigned int sign : 1; 11169695Skan unsigned int exponent: 11; 12169695Skan unsigned int fraction0:4; 13169695Skan unsigned int fraction1:16; 14169695Skan unsigned int fraction2:16; 15169695Skan unsigned int fraction3:16; 16169695Skan 17169695Skan } number; 18169695Skan struct 19169695Skan { 20169695Skan unsigned int sign : 1; 21169695Skan unsigned int exponent: 11; 22169695Skan unsigned int quiet:1; 23169695Skan unsigned int function0:3; 24169695Skan unsigned int function1:16; 25169695Skan unsigned int function2:16; 26169695Skan unsigned int function3:16; 27169695Skan } nan; 28169695Skan struct 29169695Skan { 30169695Skan unsigned long msw; 31169695Skan unsigned long lsw; 32169695Skan } parts; 33169695Skan long aslong[2]; 34169695Skan} __ieee_double_shape_type; 35169695Skan 36169695Skan#endif 37169695Skan 38169695Skan#ifdef __IEEE_LITTLE_ENDIAN 39169695Skan 40169695Skantypedef union 41169695Skan{ 42169695Skan double value; 43169695Skan struct 44169695Skan { 45169695Skan#ifdef __SMALL_BITFIELDS 46169695Skan unsigned int fraction3:16; 47169695Skan unsigned int fraction2:16; 48169695Skan unsigned int fraction1:16; 49169695Skan unsigned int fraction0: 4; 50169695Skan#else 51169695Skan unsigned int fraction1:32; 52169695Skan unsigned int fraction0:20; 53169695Skan#endif 54169695Skan unsigned int exponent :11; 55169695Skan unsigned int sign : 1; 56169695Skan } number; 57169695Skan struct 58169695Skan { 59169695Skan#ifdef __SMALL_BITFIELDS 60169695Skan unsigned int function3:16; 61169695Skan unsigned int function2:16; 62169695Skan unsigned int function1:16; 63169695Skan unsigned int function0:3; 64169695Skan#else 65169695Skan unsigned int function1:32; 66169695Skan unsigned int function0:19; 67169695Skan#endif 68169695Skan unsigned int quiet:1; 69169695Skan unsigned int exponent: 11; 70169695Skan unsigned int sign : 1; 71169695Skan } nan; 72169695Skan struct 73169695Skan { 74169695Skan unsigned long lsw; 75169695Skan unsigned long msw; 76169695Skan } parts; 77169695Skan 78169695Skan long aslong[2]; 79169695Skan 80169695Skan} __ieee_double_shape_type; 81169695Skan 82169695Skan#endif 83169695Skan 84169695Skan#ifdef __IEEE_BIG_ENDIAN 85169695Skantypedef union 86169695Skan{ 87169695Skan float value; 88169695Skan struct 89169695Skan { 90169695Skan unsigned int sign : 1; 91169695Skan unsigned int exponent: 8; 92169695Skan unsigned int fraction0: 7; 93169695Skan unsigned int fraction1: 16; 94169695Skan } number; 95169695Skan struct 96169695Skan { 97169695Skan unsigned int sign:1; 98169695Skan unsigned int exponent:8; 99169695Skan unsigned int quiet:1; 100169695Skan unsigned int function0:6; 101169695Skan unsigned int function1:16; 102169695Skan } nan; 103169695Skan long p1; 104169695Skan 105169695Skan} __ieee_float_shape_type; 106169695Skan#endif 107169695Skan 108169695Skan#ifdef __IEEE_LITTLE_ENDIAN 109169695Skantypedef union 110169695Skan{ 111169695Skan float value; 112169695Skan struct 113169695Skan { 114169695Skan unsigned int fraction0: 7; 115169695Skan unsigned int fraction1: 16; 116169695Skan unsigned int exponent: 8; 117169695Skan unsigned int sign : 1; 118169695Skan } number; 119169695Skan struct 120169695Skan { 121169695Skan unsigned int function1:16; 122169695Skan unsigned int function0:6; 123169695Skan unsigned int quiet:1; 124169695Skan unsigned int exponent:8; 125169695Skan unsigned int sign:1; 126169695Skan } nan; 127169695Skan long p1; 128169695Skan 129169695Skan} __ieee_float_shape_type; 130169695Skan#endif 131169695Skan 132169695Skan#if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN) 133169695Skan 134169695Skandouble 135169695Skancopysign (double x, double y) 136169695Skan{ 137169695Skan __ieee_double_shape_type a,b; 138169695Skan b.value = y; 139169695Skan a.value = x; 140169695Skan a.number.sign =b.number.sign; 141169695Skan return a.value; 142169695Skan} 143169695Skan 144169695Skan#else 145169695Skan 146169695Skandouble 147169695Skancopysign (double x, double y) 148169695Skan{ 149169695Skan if ((x < 0 && y > 0) || (x > 0 && y < 0)) 150169695Skan return -x; 151169695Skan return x; 152169695Skan} 153169695Skan 154169695Skan#endif 155