cleanups/fixes for ASM handling
[libfirm] / ir / be / test / boolopts.c
1 /*$ -fno-inline $*/
2 #include <limits.h>
3 #include <stdio.h>
4 #include <assert.h>
5
6 int f(int a, int b)
7 {
8         return a < 0 & b < 0;
9 }
10
11 int f2(short a, short b)
12 {
13         return a < b && b < a;
14 }
15
16 int f3(short a, short b)
17 {
18         return a < b && b > a;
19 }
20
21 int f4(short a, short b, short c)
22 {
23         return (a <= c) & (b <= c);
24 }
25
26 int g(unsigned a, unsigned b)
27 {
28         return ((a >> 12) | 5) & ((b >> 12) | 5);
29 }
30
31 int g2(unsigned a, unsigned b)
32 {
33         return (a & 5) | (b & 5);
34 }
35
36 int g3(int a, int b, int z)
37 {
38         return (a | z) & (b | z);
39 }
40
41 int imp(int a, int b)
42 {
43         /* logical implication */
44         return (a < b) <= (a <= b);
45 }
46
47 int eq(int a, int b)
48 {
49         return (a < b) == (a <= b);
50 }
51
52 int neq(int a, int b)
53 {
54         return (a < b) != (a <= b);
55 }
56
57 int af(int a)
58 {
59         return (a ? 1 : 0) && !a;
60 }
61
62 int at(int a)
63 {
64         return (a ? 1 : 0) || !a;
65 }
66
67 int c(int a, int b)
68 {
69         return a < b || a == b;
70 }
71
72 int c2(int a, int b)
73 {
74         return a < b && a <= b;
75 }
76
77 int c3(int a, int b)
78 {
79         return a < b || a >= b;
80 }
81
82 int c4(int a, int b)
83 {
84         return a < b ^ a <= b;
85 }
86
87 int main()
88 {
89 #define UOP(func,val,should_be) { printf("%s(%d) -> %d (should be %d)\n", #func, val, func(val), should_be); assert(func(val) == should_be); }
90 #define BOP(func,val1,val2,should_be) { printf("%s(%d,%d) -> %d (should be %d)\n", #func, val1, val2, func(val1,val2), should_be); assert(func(val1,val2) == should_be); }
91 #define TOP(func,val1,val2,val3,should_be) { printf("%s(%d,%d,%d) -> %d (should be %d)\n", #func, val1, val2, val3, func(val1,val2,val3), should_be); assert(func(val1,val2,val3) == should_be); }
92         BOP(f, 0, 0, 0);
93         BOP(f, -1, 0, 0);
94         BOP(f, 0, -42, 0);
95         BOP(f, -1, 1, 0);
96         BOP(f, -42, -23, 1);
97         BOP(f, 13, -1, 0);
98         BOP(f, -1, -1, 1);
99         BOP(f, INT_MIN, INT_MIN, 1);
100         BOP(f, INT_MIN, -1, 1);
101         BOP(f, -1, INT_MIN, 1);
102
103         BOP(f2, 0, 0, 0);
104         BOP(f2, -1, 0, 0);
105         BOP(f2, 0, -42, 0);
106         BOP(f2, -1, 1, 0);
107         BOP(f2, -42, -23, 0);
108         BOP(f2, 13, -1, 0);
109         BOP(f2, -1, -1, 0);
110         BOP(f2, SHRT_MIN, SHRT_MIN, 0);
111         BOP(f2, SHRT_MIN, -1, 0);
112         BOP(f2, -1, SHRT_MIN, 0);
113
114         BOP(f3, 0, 0, 0);
115         BOP(f3, -1, 0, 1);
116         BOP(f3, 0, -42, 0);
117         BOP(f3, -1, 1, 1);
118         BOP(f3, -42, -23, 1);
119         BOP(f3, 13, -1, 0);
120         BOP(f3, -1, -1, 0);
121         BOP(f3, SHRT_MIN, SHRT_MIN, 0);
122         BOP(f3, SHRT_MIN, -1, 1);
123         BOP(f3, -1, SHRT_MIN, 0);
124
125         TOP(f4, 1, 2, 3, 1);
126         TOP(f4, -1, -2, -3, 0);
127         TOP(f4, SHRT_MIN, SHRT_MIN, -1, 1);
128         TOP(f4, SHRT_MIN, SHRT_MIN, SHRT_MIN, 1);
129         TOP(f4, SHRT_MAX, SHRT_MIN, SHRT_MAX, 1);
130         TOP(f4, SHRT_MIN, SHRT_MIN, SHRT_MAX, 1);
131         TOP(f4, 13, 42, SHRT_MAX, 1);
132         TOP(f4, 0, 0, 0, 1);
133         TOP(f4, 1, 1, 1, 1);
134
135         BOP(g, UINT_MAX, UINT_MAX, 1048575);
136         BOP(g, 0, 0, 5);
137         BOP(g, 12345, 54321, 5);
138
139         BOP(g2, UINT_MAX, UINT_MAX, 5);
140         BOP(g2, 0, 0, 0);
141         BOP(g2, 12345, 54321, 1);
142
143         BOP(imp, UINT_MAX, UINT_MAX, 1);
144         BOP(imp, 0, 0, 1);
145         BOP(imp, 12345, 54321, 1);
146         BOP(imp, 42, 23, 1);
147
148         BOP(eq, UINT_MAX, UINT_MAX, 0);
149         BOP(eq, 0, 0, 0);
150         BOP(eq, 12345, 54321, 1);
151         BOP(eq, 42, 23, 1);
152
153         BOP(neq, UINT_MAX, UINT_MAX, 1);
154         BOP(neq, 0, 0, 1);
155         BOP(neq, 12345, 54321, 0);
156         BOP(neq, 42, 23, 0);
157
158         TOP(g3, 1, 2, 3, 3);
159         TOP(g3, -1, -2, -3, -1);
160         TOP(g3, INT_MIN, INT_MIN, -1, -1);
161         TOP(g3, INT_MIN, INT_MIN, INT_MIN, INT_MIN);
162         TOP(g3, INT_MAX, INT_MIN, INT_MAX, INT_MAX);
163         TOP(g3, INT_MIN, INT_MIN, INT_MAX, -1);
164         TOP(g3, 13, 42, INT_MAX, INT_MAX);
165         TOP(g3, 0, 0, 0, 0);
166         TOP(g3, 1, 1, 1, 1);
167
168         UOP(af, 0, 0);
169         UOP(af, 1, 0);
170         UOP(af, 42, 0);
171         UOP(af, -1, 0);
172
173         UOP(at, 0, 1);
174         UOP(at, 1, 1);
175         UOP(at, 42, 1);
176         UOP(at, -1, 1);
177
178         BOP(c, 0, 0, 1);
179         BOP(c, -1, 0, 1);
180         BOP(c, 0, -42, 0);
181         BOP(c, -1, 1, 1);
182         BOP(c, -42, -23, 1);
183         BOP(c, 13, -1, 0);
184         BOP(c, -1, -1, 1);
185         BOP(c, SHRT_MIN, SHRT_MIN, 1);
186         BOP(c, SHRT_MIN, -1, 1);
187         BOP(c, -1, SHRT_MIN, 0);
188
189         BOP(c2, 0, 0, 0);
190         BOP(c2, -1, 0, 1);
191         BOP(c2, 0, -42, 0);
192         BOP(c2, -1, 1, 1);
193         BOP(c2, -42, -23, 1);
194         BOP(c2, 13, -1, 0);
195         BOP(c2, -1, -1, 0);
196         BOP(c2, SHRT_MIN, SHRT_MIN, 0);
197         BOP(c2, SHRT_MIN, -1, 1);
198         BOP(c2, -1, SHRT_MIN, 0);
199
200         BOP(c3, 0, 0, 1);
201         BOP(c3, -1, 0, 1);
202         BOP(c3, 0, -42, 1);
203         BOP(c3, -1, 1, 1);
204         BOP(c3, -42, -23, 1);
205         BOP(c3, 13, -1, 1);
206         BOP(c3, -1, -1, 1);
207         BOP(c3, SHRT_MIN, SHRT_MIN, 1);
208         BOP(c3, SHRT_MIN, -1, 1);
209         BOP(c3, -1, SHRT_MIN, 1);
210
211         BOP(c4, 0, 0, 1);
212         BOP(c4, -1, 0, 0);
213         BOP(c4, 0, -42, 0);
214         BOP(c4, -1, 1, 0);
215         BOP(c4, -42, -23, 0);
216         BOP(c4, 13, -1, 0);
217         BOP(c4, -1, -1, 1);
218         BOP(c4, SHRT_MIN, SHRT_MIN, 1);
219         BOP(c4, SHRT_MIN, -1, 0);
220         BOP(c4, -1, SHRT_MIN, 0);
221
222         return 0;
223 }