1#include <limits.h>
2
3extern void abort ();
4
5int test1(int x)
6{
7  return x ^ INT_MIN;
8}
9
10unsigned int test1u(unsigned int x)
11{
12  return x ^ (unsigned int)INT_MIN;
13}
14
15int test2(int x)
16{
17  return x + INT_MIN;
18}
19
20unsigned int test2u(unsigned int x)
21{
22  return x + (unsigned int)INT_MIN;
23}
24
25int test3(int x)
26{
27  return x - INT_MIN;
28}
29
30unsigned int test3u(unsigned int x)
31{
32  return x - (unsigned int)INT_MIN;
33}
34
35int test4(int x)
36{
37  int y = INT_MIN;
38  return x ^ y;
39}
40
41unsigned int test4u(unsigned int x)
42{
43  unsigned int y = (unsigned int)INT_MIN;
44  return x ^ y;
45}
46
47int test5(int x)
48{
49  int y = INT_MIN;
50  return x + y;
51}
52
53unsigned int test5u(unsigned int x)
54{
55  unsigned int y = (unsigned int)INT_MIN;
56  return x + y;
57}
58
59int test6(int x)
60{
61  int y = INT_MIN;
62  return x - y;
63}
64
65unsigned int test6u(unsigned int x)
66{
67  unsigned int y = (unsigned int)INT_MIN;
68  return x - y;
69}
70
71
72
73void test(int a, int b)
74{
75  if (test1(a) != b)
76    abort();
77  if (test2(a) != b)
78    abort();
79  if (test3(a) != b)
80    abort();
81  if (test4(a) != b)
82    abort();
83  if (test5(a) != b)
84    abort();
85  if (test6(a) != b)
86    abort();
87}
88
89void testu(unsigned int a, unsigned int b)
90{
91  if (test1u(a) != b)
92    abort();
93  if (test2u(a) != b)
94    abort();
95  if (test3u(a) != b)
96    abort();
97  if (test4u(a) != b)
98    abort();
99  if (test5u(a) != b)
100    abort();
101  if (test6u(a) != b)
102    abort();
103}
104
105
106int main()
107{
108#if INT_MAX == 2147483647
109  test(0x00000000,0x80000000);
110  test(0x80000000,0x00000000);
111  test(0x12345678,0x92345678);
112  test(0x92345678,0x12345678);
113  test(0x7fffffff,0xffffffff);
114  test(0xffffffff,0x7fffffff);
115
116  testu(0x00000000,0x80000000);
117  testu(0x80000000,0x00000000);
118  testu(0x12345678,0x92345678);
119  testu(0x92345678,0x12345678);
120  testu(0x7fffffff,0xffffffff);
121  testu(0xffffffff,0x7fffffff);
122#endif
123
124#if INT_MAX == 32767
125  test(0x0000,0x8000);
126  test(0x8000,0x0000);
127  test(0x1234,0x9234);
128  test(0x9234,0x1234);
129  test(0x7fff,0xffff);
130  test(0xffff,0x7fff);
131
132  testu(0x0000,0x8000);
133  testu(0x8000,0x0000);
134  testu(0x1234,0x9234);
135  testu(0x9234,0x1234);
136  testu(0x7fff,0xffff);
137  testu(0xffff,0x7fff);
138#endif
139
140  return 0;
141}
142
143