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