extern void abort(); #define HOST_WIDE_INT long #define HOST_BITS_PER_WIDE_INT (sizeof(long)*8) struct tree_type { unsigned int precision : 9; }; int sign_bit_p (struct tree_type *t, HOST_WIDE_INT val_hi, unsigned HOST_WIDE_INT val_lo) { unsigned HOST_WIDE_INT mask_lo, lo; HOST_WIDE_INT mask_hi, hi; int width = t->precision; if (width > HOST_BITS_PER_WIDE_INT) { hi = (unsigned HOST_WIDE_INT) 1 << (width - HOST_BITS_PER_WIDE_INT - 1); lo = 0; mask_hi = ((unsigned HOST_WIDE_INT) -1 >> (2 * HOST_BITS_PER_WIDE_INT - width)); mask_lo = -1; } else { hi = 0; lo = (unsigned HOST_WIDE_INT) 1 << (width - 1); mask_hi = 0; mask_lo = ((unsigned HOST_WIDE_INT) -1 >> (HOST_BITS_PER_WIDE_INT - width)); } if ((val_hi & mask_hi) == hi && (val_lo & mask_lo) == lo) return 1; return 0; } int main() { struct tree_type t; t.precision = 1; if (!sign_bit_p (&t, 0, -1)) abort (); return 0; }