]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- muloti4_test.c - Test __muloti4 -----------------------------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is dual licensed under the MIT and the University of Illinois Open | |
6 | // Source Licenses. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // This file tests __muloti3 for the compiler_rt library. | |
11 | // | |
12 | //===----------------------------------------------------------------------===// | |
13 | ||
14 | #include "int_lib.h" | |
15 | #include <stdio.h> | |
16 | ||
17 | #ifdef CRT_HAS_128BIT | |
18 | ||
19 | // Returns: a * b | |
20 | ||
21 | // Effects: sets overflow if a * b overflows | |
22 | ||
92a42be0 | 23 | COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow); |
1a4d82fc JJ |
24 | |
25 | int test__muloti4(ti_int a, ti_int b, ti_int expected, int expected_overflow) | |
26 | { | |
27 | int ov; | |
28 | ti_int x = __muloti4(a, b, &ov); | |
29 | if (ov != expected_overflow) { | |
30 | twords at; | |
31 | at.all = a; | |
32 | twords bt; | |
33 | bt.all = b; | |
34 | twords xt; | |
35 | xt.all = x; | |
36 | twords expectedt; | |
37 | expectedt.all = expected; | |
38 | ||
39 | printf("error in __muloti4: overflow=%d expected=%d\n", | |
40 | ov, expected_overflow); | |
41 | printf("error in __muloti4: 0x%.16llX%.16llX * 0x%.16llX%.16llX = " | |
42 | "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n", | |
43 | at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low, | |
44 | expectedt.s.high, expectedt.s.low); | |
45 | return 1; | |
46 | } | |
47 | else if (!expected_overflow && x != expected) | |
48 | { | |
49 | twords at; | |
50 | at.all = a; | |
51 | twords bt; | |
52 | bt.all = b; | |
53 | twords xt; | |
54 | xt.all = x; | |
55 | twords expectedt; | |
56 | expectedt.all = expected; | |
57 | printf("error in __muloti4: 0x%.16llX%.16llX * 0x%.16llX%.16llX = " | |
58 | "0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n", | |
59 | at.s.high, at.s.low, bt.s.high, bt.s.low, xt.s.high, xt.s.low, | |
60 | expectedt.s.high, expectedt.s.low); | |
61 | return 1; | |
62 | } | |
63 | return 0; | |
64 | } | |
65 | ||
66 | #endif | |
67 | ||
68 | int main() | |
69 | { | |
70 | #ifdef CRT_HAS_128BIT | |
71 | if (test__muloti4(0, 0, 0, 0)) | |
72 | return 1; | |
73 | if (test__muloti4(0, 1, 0, 0)) | |
74 | return 1; | |
75 | if (test__muloti4(1, 0, 0, 0)) | |
76 | return 1; | |
77 | if (test__muloti4(0, 10, 0, 0)) | |
78 | return 1; | |
79 | if (test__muloti4(10, 0, 0, 0)) | |
80 | return 1; | |
81 | if (test__muloti4(0, 81985529216486895LL, 0, 0)) | |
82 | return 1; | |
83 | if (test__muloti4(81985529216486895LL, 0, 0, 0)) | |
84 | return 1; | |
85 | ||
86 | if (test__muloti4(0, -1, 0, 0)) | |
87 | return 1; | |
88 | if (test__muloti4(-1, 0, 0, 0)) | |
89 | return 1; | |
90 | if (test__muloti4(0, -10, 0, 0)) | |
91 | return 1; | |
92 | if (test__muloti4(-10, 0, 0, 0)) | |
93 | return 1; | |
94 | if (test__muloti4(0, -81985529216486895LL, 0, 0)) | |
95 | return 1; | |
96 | if (test__muloti4(-81985529216486895LL, 0, 0, 0)) | |
97 | return 1; | |
98 | ||
99 | if (test__muloti4(1, 1, 1, 0)) | |
100 | return 1; | |
101 | if (test__muloti4(1, 10, 10, 0)) | |
102 | return 1; | |
103 | if (test__muloti4(10, 1, 10, 0)) | |
104 | return 1; | |
105 | if (test__muloti4(1, 81985529216486895LL, 81985529216486895LL, 0)) | |
106 | return 1; | |
107 | if (test__muloti4(81985529216486895LL, 1, 81985529216486895LL, 0)) | |
108 | return 1; | |
109 | ||
110 | if (test__muloti4(1, -1, -1, 0)) | |
111 | return 1; | |
112 | if (test__muloti4(1, -10, -10, 0)) | |
113 | return 1; | |
114 | if (test__muloti4(-10, 1, -10, 0)) | |
115 | return 1; | |
116 | if (test__muloti4(1, -81985529216486895LL, -81985529216486895LL, 0)) | |
117 | return 1; | |
118 | if (test__muloti4(-81985529216486895LL, 1, -81985529216486895LL, 0)) | |
119 | return 1; | |
120 | ||
121 | if (test__muloti4(3037000499LL, 3037000499LL, 9223372030926249001LL, 0)) | |
122 | return 1; | |
123 | if (test__muloti4(-3037000499LL, 3037000499LL, -9223372030926249001LL, 0)) | |
124 | return 1; | |
125 | if (test__muloti4(3037000499LL, -3037000499LL, -9223372030926249001LL, 0)) | |
126 | return 1; | |
127 | if (test__muloti4(-3037000499LL, -3037000499LL, 9223372030926249001LL, 0)) | |
128 | return 1; | |
129 | ||
130 | if (test__muloti4(4398046511103LL, 2097152LL, 9223372036852678656LL, 0)) | |
131 | return 1; | |
132 | if (test__muloti4(-4398046511103LL, 2097152LL, -9223372036852678656LL, 0)) | |
133 | return 1; | |
134 | if (test__muloti4(4398046511103LL, -2097152LL, -9223372036852678656LL, 0)) | |
135 | return 1; | |
136 | if (test__muloti4(-4398046511103LL, -2097152LL, 9223372036852678656LL, 0)) | |
137 | return 1; | |
138 | ||
139 | if (test__muloti4(2097152LL, 4398046511103LL, 9223372036852678656LL, 0)) | |
140 | return 1; | |
141 | if (test__muloti4(-2097152LL, 4398046511103LL, -9223372036852678656LL, 0)) | |
142 | return 1; | |
143 | if (test__muloti4(2097152LL, -4398046511103LL, -9223372036852678656LL, 0)) | |
144 | return 1; | |
145 | if (test__muloti4(-2097152LL, -4398046511103LL, 9223372036852678656LL, 0)) | |
146 | return 1; | |
147 | ||
148 | if (test__muloti4(make_ti(0x00000000000000B5LL, 0x04F333F9DE5BE000LL), | |
149 | make_ti(0x0000000000000000LL, 0x00B504F333F9DE5BLL), | |
150 | make_ti(0x7FFFFFFFFFFFF328LL, 0xDF915DA296E8A000LL), 0)) | |
151 | return 1; | |
152 | ||
153 | if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
154 | -2, | |
155 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1)) | |
156 | return 1; | |
157 | if (test__muloti4(-2, | |
158 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
159 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1)) | |
160 | return 1; | |
161 | if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
162 | -1, | |
163 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0)) | |
164 | return 1; | |
165 | if (test__muloti4(-1, | |
166 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
167 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0)) | |
168 | return 1; | |
169 | if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
170 | 0, | |
171 | 0, 0)) | |
172 | return 1; | |
173 | if (test__muloti4(0, | |
174 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
175 | 0, 0)) | |
176 | return 1; | |
177 | if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
178 | 1, | |
179 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0)) | |
180 | return 1; | |
181 | if (test__muloti4(1, | |
182 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
183 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0)) | |
184 | return 1; | |
185 | if (test__muloti4(make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
186 | 2, | |
187 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1)) | |
188 | return 1; | |
189 | if (test__muloti4(2, | |
190 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), | |
191 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1)) | |
192 | return 1; | |
193 | ||
194 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
195 | -2, | |
196 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
197 | return 1; | |
198 | if (test__muloti4(-2, | |
199 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
200 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
201 | return 1; | |
202 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
203 | -1, | |
204 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
205 | return 1; | |
206 | if (test__muloti4(-1, | |
207 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
208 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
209 | return 1; | |
210 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
211 | 0, | |
212 | 0, 0)) | |
213 | return 1; | |
214 | if (test__muloti4(0, | |
215 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
216 | 0, 0)) | |
217 | return 1; | |
218 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
219 | 1, | |
220 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 0)) | |
221 | return 1; | |
222 | if (test__muloti4(1, | |
223 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
224 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 0)) | |
225 | return 1; | |
226 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
227 | 2, | |
228 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
229 | return 1; | |
230 | if (test__muloti4(2, | |
231 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), | |
232 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
233 | return 1; | |
234 | ||
235 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
236 | -2, | |
237 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1)) | |
238 | return 1; | |
239 | if (test__muloti4(-2, | |
240 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
241 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 1)) | |
242 | return 1; | |
243 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
244 | -1, | |
245 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0)) | |
246 | return 1; | |
247 | if (test__muloti4(-1, | |
248 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
249 | make_ti(0x7FFFFFFFFFFFFFFFLL, 0xFFFFFFFFFFFFFFFFLL), 0)) | |
250 | return 1; | |
251 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
252 | 0, | |
253 | 0, 0)) | |
254 | return 1; | |
255 | if (test__muloti4(0, | |
256 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
257 | 0, 0)) | |
258 | return 1; | |
259 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
260 | 1, | |
261 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0)) | |
262 | return 1; | |
263 | if (test__muloti4(1, | |
264 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
265 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), 0)) | |
266 | return 1; | |
267 | if (test__muloti4(make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
268 | 2, | |
269 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
270 | return 1; | |
271 | if (test__muloti4(2, | |
272 | make_ti(0x8000000000000000LL, 0x0000000000000001LL), | |
273 | make_ti(0x8000000000000000LL, 0x0000000000000000LL), 1)) | |
274 | return 1; | |
275 | ||
276 | #else | |
277 | printf("skipped\n"); | |
278 | #endif | |
279 | return 0; | |
280 | } |