1extern void abort(); 2 3#define HOST_WIDE_INT long 4#define HOST_BITS_PER_WIDE_INT (sizeof(long)*8) 5 6struct tree_type 7{ 8 unsigned int precision : 9; 9}; 10 11int 12sign_bit_p (struct tree_type *t, HOST_WIDE_INT val_hi, unsigned HOST_WIDE_INT val_lo) 13{ 14 unsigned HOST_WIDE_INT mask_lo, lo; 15 HOST_WIDE_INT mask_hi, hi; 16 int width = t->precision; 17 18 if (width > HOST_BITS_PER_WIDE_INT) 19 { 20 hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1); 21 lo = 0; 22 23 mask_hi = ((unsigned HOST_WIDE_INT) -1 24 >> (2 * HOST_BITS_PER_WIDE_INT - width)); 25 mask_lo = -1; 26 } 27 else 28 { 29 hi = 0; 30 lo = (unsigned HOST_WIDE_INT) 1 << (width - 1); 31 32 mask_hi = 0; 33 mask_lo = ((unsigned HOST_WIDE_INT) -1 34 >> (HOST_BITS_PER_WIDE_INT - width)); 35 } 36 37 if ((val_hi & mask_hi) == hi 38 && (val_lo & mask_lo) == lo) 39 return 1; 40 41 return 0; 42} 43 44int main() 45{ 46 struct tree_type t; 47 t.precision = 1; 48 if (!sign_bit_p (&t, 0, -1)) 49 abort (); 50 return 0; 51} 52