1 extern void abort();
2 
3 #define HOST_WIDE_INT long
4 #define HOST_BITS_PER_WIDE_INT (sizeof(long)*8)
5 
6 struct tree_type
7 {
8   unsigned int precision : 9;
9 };
10 
11 int
sign_bit_p(struct tree_type * t,HOST_WIDE_INT val_hi,unsigned HOST_WIDE_INT val_lo)12 sign_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 
main()44 int 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