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
23COMPILER_RT_ABI ti_int __muloti4(ti_int a, ti_int b, int *overflow);
24
25int 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
68int 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}
281