add Abs(-x) = Abs(x)
[libfirm] / ir / be / test / localopts.c
1 /*$ -fno-inline $*/
2 #include <stdio.h>
3 #include <math.h>
4
5 #define CONST 42
6
7 int mul0(int x)
8 {
9         return -x * CONST;
10 }
11
12 int mul1(int x, int y)
13 {
14         return -x * -y;
15 }
16
17 int mul2(int x, int y, int z)
18 {
19         return -x * (y - z);
20 }
21
22 int mul3(int x, int y, int z)
23 {
24         return (x - y) * z;
25 }
26
27 int sub0(int x, int y, int z)
28 {
29         return x - (y - z);
30 }
31
32 int sub1(int x, int y)
33 {
34         return x - (y * CONST);
35 }
36
37 int sub2(int x, int y)
38 {
39         return x - -y;
40 }
41
42 int sub3(int x, int y)
43 {
44         return -x - y;
45 }
46
47 int sub4(int x) {
48         return 6 - ~x;
49 }
50
51 int cmp1(int x, int y) {
52         return -x == -y;
53 }
54
55 int cmp2(int x, int y) {
56         return -x != -y;
57 }
58
59 int cmp3(int x, int y) {
60         return ~x == ~y;
61 }
62
63 int cmp4(int x, int y) {
64         return ~x != ~y;
65 }
66
67 int cmp5(int x, int y, int z) {
68         return x + z == z + y;
69 }
70
71 int cmp6(int x, int y, int z) {
72         return x + z != y + z;
73 }
74
75 int cmp7(int x, int y, int z) {
76         return x - z == y - z;
77 }
78
79 int cmp8(int x, int y, int z) {
80         return z -x != z - y;
81 }
82
83 int cmp9(int x) {
84         return -x == 3;
85 }
86
87 int cmp10(int x) {
88         return -x != 3;
89 }
90
91 int cmp11(int x, int y) {
92         return x - y != x;
93 }
94
95 int cmp12(int x, int y) {
96         return x + y == x && y + x == y;
97 }
98
99 int and1(int a, int b) {
100         return (a|b)&a;
101 }
102
103 int and2(int a, int b) {
104         return (a|b) & ~(a&b);
105 }
106
107 int and3(int a) {
108         return (a & 2) == 2;
109 }
110
111 int and4(int a) {
112         return (a & 2) == 4;
113 }
114
115 int and5(int a) {
116         return (a & 2) != 4;
117 }
118
119 int or1(int a) {
120         return (a | 2) != 0;
121 }
122
123 int or2(int a) {
124         return (a | 7) == 0;
125 }
126
127 int add1(int x) {
128         return x + ~x;
129 }
130
131 int shr1(int x) {
132         return -(x >> 31);
133 }
134
135 int shrs1(unsigned x) {
136         return -(x >> 31);
137 }
138
139 int demorgan1(int a, int b) {
140         return (~a) & (~b);
141 }
142
143 int demorgan2(int a, int b) {
144         return (~a) | (~b);
145 }
146
147 int eor1(int a, int b) {
148         return a & (a ^ b);
149 }
150
151 int shl1(int a) {
152         return (a << 3) == (5<<3);
153 }
154
155 int shl2(int a) {
156         return (a << 3) == 41;
157 }
158
159 int shr2(unsigned int a) {
160         return (a >> 3) == 5;
161 }
162
163 int shr3(unsigned int a) {
164         return (a >> 3) == (1 << 29);
165 }
166
167 int shrs2(int a) {
168         return (a >> 3) == 5;
169 }
170
171 int shrs3(int a) {
172         return (a >> 3) == -5;
173 }
174
175 int shrs4(int a) {
176         return (a >> 3) == (1 << 29);
177 }
178
179 int conv1(signed char a) {
180         return (int)a < 0;
181 }
182
183 int conv2(unsigned char a) {
184         return (int)a > 0;
185 }
186
187 int conv3(signed char a) {
188         return (unsigned)a != 0;
189 }
190
191 int phi1(int x) {
192         int a = x ? 23 : 42;
193         int b = x ? 42 : 23;
194         return a + b;
195 }
196
197 int phi2(int x) {
198         int a = x ? 16 : 8;
199         int b = x ? 4  : 2;
200         return a / b;
201 }
202
203 int phi3(int x) {
204         int a = x ? 5 : 9;
205         int b = x ? 2 : 4;
206         return a % b;
207 }
208
209 int phi4(int x) {
210         int a = x ? 5 : 9;
211         int b = x ? 2 : 4;
212         return (a / b) + (a % b);
213 }
214
215 int abs1(int x) {
216         return abs(-x);
217 }
218
219 int main(void)
220 {
221 #define TU(func,x,expect) \
222         printf("%s(%d) = %d (should be %d)\n", #func, x, func(x), expect);
223 #define TB(func,x,y,expect) \
224         printf("%s(%d,%d) = %d (should be %d)\n", #func, x, y, func(x,y), expect);
225 #define TT(func,x,y,z,expect) \
226         printf("%s(%d,%d,%d) = %d (should be %d)\n", #func, x, y, z, func(x,y,z), expect);
227
228         TU(mul0, 3, -126);
229         TB(mul1, 20, 3, 60);
230         TT(mul2, 9, 2, 5, 27);
231         TT(mul3, 5, 2, 9, 27);
232         TT(sub0, 42, 17, 59, 84);
233         TB(sub1, 23, 17, -691);
234         TB(sub2, 42, 17, 59);
235         TB(sub3, 42, 17, -59);
236         TU(sub4, 42, 49);
237         TB(cmp1, 42, 17, 0);
238         TB(cmp2, 42, 17, 1);
239         TB(cmp3, 42, 17, 0);
240         TB(cmp4, 42, 17, 1);
241         TT(cmp5, 42, 17, -4, 0);
242         TT(cmp6, 42, 17, -4, 1);
243         TT(cmp7, 42, 17, -4, 0);
244         TT(cmp8, 42, 17, -4, 1);
245         TU(cmp9, -3, 1);
246         TU(cmp10, -3, 0);
247         TB(cmp11, 5, 5, 1);
248         TB(cmp11, 42, 0, 0);
249         TB(cmp12, 0, 0, 1);
250         TB(cmp12, 42, 5, 0);
251         TB(cmp12, 5, 5, 0);
252         TB(and1, 42, 17, 42);
253         TB(and2, 42, 17, 42^17);
254         TU(and3, 34, 1);
255         TU(add1, -3, -1);
256         TU(shr1, -3, 1);
257         TU(shrs1, -3, -1);
258         TB(demorgan1, 42, 17, ~(42|17));
259         TB(demorgan2, 42, 17, ~(42&17));
260         TB(eor1, 42, 44, 42&~44);
261         TU(shl1, 5, 1);
262         TU(shl1, 6, 0);
263         TU(shl2, 5, 0);
264         TU(shr2, 5<<3, 1);
265         TU(shr2, 6<<3, 0);
266         TU(shr3, 5, 0);
267         TU(shrs2, 5<<3, 1);
268         TU(shrs2, 6<<3, 0);
269         TU(shrs3, -5<<3, 1);
270         TU(shrs3, -6<<3, 0);
271         TU(shrs4, 5, 0);
272         TU(conv1, 3, 0);
273         TU(conv2, 3, 1);
274         TU(conv3, 3, 1);
275         TU(and4, 7, 0);
276         TU(and5, 7, 1);
277         TU(or1, 7, 1);
278         TU(or2, 7, 0);
279         TU(phi1, 1, 65);
280         TU(phi2, 1, 4);
281         TU(phi3, 1, 1);
282         TU(phi4, 1, 3);
283         TU(abs1, 1, 1);
284 }