don't rely on undefined behaviour in optest
[libfirm] / ir / be / test / optest.h
1 #ifndef TESTANZ
2 #define TESTANZ 21
3 #define IMM         23
4 #define IMM_SHIFT   4
5 #define test16_1        42
6 #define test16_2        11
7 #define test16_shift 7
8 #define test32_1        0x001200AB
9 #define test32_2        0x00341501
10 #define test32_shift 5
11 #define test32_s    7
12 #endif
13
14 T tname(test_add_) (T a, T b) {
15         return a+b;
16 }
17
18 T tname(test_addi_) (T a) {
19         return a+IMM;
20 }
21
22 T tname(test_sub_) (T a, T b) {
23         return a-b;
24 }
25
26 T tname(test_subi_) (T a) {
27         return a-IMM;
28 }
29
30 T tname(test_subfi_) (T a) {
31         return IMM-a;
32 }
33
34 T tname(test_mul_) (T a, T b) {
35         return a*b;
36 }
37
38 T tname(test_muli_) (T a) {
39         return a*IMM;
40 }
41
42 T tname(test_div_) (T a, T b) {
43         return a/b;
44 }
45
46 T tname(test_divi_) (T a) {
47         return a/IMM;
48 }
49
50 #ifndef TEST_UNSIGNED
51 T tname(test_abs_) (T a) {
52         return a < 0 ? -a : a;
53 }
54
55 T tname(test_neg_) (T a) {
56         return -a;
57 }
58 #endif
59
60 #ifndef TEST_FLOAT
61 T tname(test_shl_) (T a, T b) {
62         return a<<b;
63 }
64
65 T tname(test_shli_) (T a) {
66         return a<<IMM_SHIFT;
67 }
68
69 T tname(test_shr_) (T a, T b) {
70         return a>>b;
71 }
72
73 T tname(test_shri_) (T a) {
74         return a>>IMM_SHIFT;
75 }
76
77 T tname(test_mod_) (T a, T b) {
78         return a%b;
79 }
80 #endif
81
82 T tname(test_cmp_) (T a, T b) {
83         return (a>b) ? 1 : 0;
84 }
85
86 T tname(test_cmpi_) (T a) {
87         return (a>IMM) ? 1 : 0;
88 }
89
90 T tname(res16_) [TESTANZ];
91 T tname(res32_) [TESTANZ];
92
93 void tname(test_) () {
94         int i;
95         T *res16 = tname(res16_);
96         memset(res16, 0, TESTANZ * sizeof(res16[0]));
97         T *res32 = tname(res32_);
98         memset(res32, 0, TESTANZ * sizeof(res32[0]));
99
100         res16[ 0] = tname(test_add_)  (test16_1, test16_2);
101         res16[ 1] = tname(test_sub_)  (test16_1, test16_2);
102         res16[ 2] = tname(test_mul_)  (test16_1, test16_2);
103         res16[ 3] = tname(test_div_)  (test16_1, test16_2);
104 #ifndef TEST_FLOAT
105         res16[ 4] = tname(test_shl_)  (test16_1, test16_shift);
106         res16[ 5] = tname(test_shr_)  (test16_1, test16_shift);
107         res16[ 6] = tname(test_mod_)  (test16_1, test16_2);
108 #endif
109         res16[ 7] = tname(test_div_)  (test16_1, test16_2);
110         res16[ 8] = tname(test_cmp_)  (test16_1, test16_2);
111         res16[ 9] = tname(test_addi_) (test16_1);
112         res16[10] = tname(test_subi_) (test16_1);
113         res16[11] = tname(test_subfi_)(test16_1);
114         res16[12] = tname(test_muli_) (test16_1);
115         res16[13] = tname(test_divi_) (test16_1);
116 #ifndef TEST_FLOAT
117         res16[14] = tname(test_shli_) (test16_1);
118         res16[15] = tname(test_shri_) (test16_1);
119 #endif
120         res16[16] = tname(test_cmpi_) (test16_1);
121 #ifndef TEST_UNSIGNED
122         res16[17] = tname(test_neg_)  (test16_1);
123         res16[18] = tname(test_neg_)  (-test16_1);
124         res16[19] = tname(test_abs_)  (test16_1);
125         res16[20] = tname(test_abs_)  (-test16_1);
126 #endif
127
128         res32[ 0] = tname(test_add_)  (test32_1, test32_2);
129         res32[ 1] = tname(test_sub_)  (test32_1, test32_2);
130         res32[ 2] = tname(test_mul_)  (test32_1, test32_2);
131         res32[ 3] = tname(test_div_)  (test32_1, test32_2);
132 #ifndef TEST_FLOAT
133         res32[ 4] = tname(test_shl_)  (test32_1, test32_shift);
134         res32[ 5] = tname(test_shr_)  (test32_1, test32_shift);
135         res32[ 6] = tname(test_mod_)  (test32_1, test32_2);
136 #endif
137         res32[ 7] = tname(test_div_)  (test32_1, test32_2);
138         res32[ 8] = tname(test_cmp_)  (test32_1, test32_2);
139         res32[ 9] = tname(test_addi_) (test32_1);
140         res32[10] = tname(test_subi_) (test32_1);
141         res32[11] = tname(test_subfi_)(test32_1);
142         res32[12] = tname(test_muli_) (test32_1);
143         res32[13] = tname(test_divi_) (test32_1);
144 #ifndef TEST_FLOAT
145         res32[14] = tname(test_shli_) (test32_1);
146         res32[15] = tname(test_shri_) (test32_1);
147 #endif
148         res32[16] = tname(test_cmpi_) (test32_1);
149 #ifndef TEST_UNSIGNED
150         res32[17] = tname(test_neg_)  (test32_1);
151         res32[18] = tname(test_neg_)  (-test32_1);
152         res32[19] = tname(test_abs_)  (test32_1);
153         res32[20] = tname(test_abs_)  (-test32_1);
154 #endif
155
156         printf("Result for %s\n", __PRETTY_FUNCTION__);
157         for (i=0; i<TESTANZ; i++) {
158 #ifndef TEST_FLOAT
159                 printf("res16[%d] = %d\n", i, res16[i]);
160                 printf("res32[%d] = %d\n", i, res32[i]);
161 #else
162                 printf("res16[%d] = %f\n", i, res16[i]);
163                 printf("res32[%d] = %f\n", i, res32[i]);
164 #endif
165         }
166 }