1// RUN: %clang_builtins %s %librt -o %t && %run %t
2// REQUIRES: librt_has_mulodi4
3
4#include "int_lib.h"
5#include <stdio.h>
6
7extern COMPILER_RT_ABI di_int __mulodi4(di_int a, di_int b, int* overflow);
8
9int test__mulodi4(di_int a, di_int b, di_int expected, int expected_overflow)
10{
11 int ov;
12 di_int x = __mulodi4(a, b, &ov);
13 if (ov != expected_overflow)
14 printf("error in __mulodi4: overflow=%d expected=%d\n",
15 ov, expected_overflow);
16 else if (!expected_overflow && x != expected) {
17 printf("error in __mulodi4: 0x%llX * 0x%llX = 0x%llX (overflow=%d), "
18 "expected 0x%llX (overflow=%d)\n",
19 a, b, x, ov, expected, expected_overflow);
20 return 1;
21 }
22 return 0;
23}
24
25int main()
26{
27 if (test__mulodi4(0, 0, 0, 0))
28 return 1;
29 if (test__mulodi4(0, 1, 0, 0))
30 return 1;
31 if (test__mulodi4(1, 0, 0, 0))
32 return 1;
33 if (test__mulodi4(0, 10, 0, 0))
34 return 1;
35 if (test__mulodi4(10, 0, 0, 0))
36 return 1;
37 if (test__mulodi4(0, 81985529216486895LL, 0, 0))
38 return 1;
39 if (test__mulodi4(81985529216486895LL, 0, 0, 0))
40 return 1;
41
42 if (test__mulodi4(0, -1, 0, 0))
43 return 1;
44 if (test__mulodi4(-1, 0, 0, 0))
45 return 1;
46 if (test__mulodi4(0, -10, 0, 0))
47 return 1;
48 if (test__mulodi4(-10, 0, 0, 0))
49 return 1;
50 if (test__mulodi4(0, -81985529216486895LL, 0, 0))
51 return 1;
52 if (test__mulodi4(-81985529216486895LL, 0, 0, 0))
53 return 1;
54
55 if (test__mulodi4(1, 1, 1, 0))
56 return 1;
57 if (test__mulodi4(1, 10, 10, 0))
58 return 1;
59 if (test__mulodi4(10, 1, 10, 0))
60 return 1;
61 if (test__mulodi4(1, 81985529216486895LL, 81985529216486895LL, 0))
62 return 1;
63 if (test__mulodi4(81985529216486895LL, 1, 81985529216486895LL, 0))
64 return 1;
65
66 if (test__mulodi4(1, -1, -1, 0))
67 return 1;
68 if (test__mulodi4(1, -10, -10, 0))
69 return 1;
70 if (test__mulodi4(-10, 1, -10, 0))
71 return 1;
72 if (test__mulodi4(1, -81985529216486895LL, -81985529216486895LL, 0))
73 return 1;
74 if (test__mulodi4(-81985529216486895LL, 1, -81985529216486895LL, 0))
75 return 1;
76
77 if (test__mulodi4(3037000499LL, 3037000499LL, 9223372030926249001LL, 0))
78 return 1;
79 if (test__mulodi4(-3037000499LL, 3037000499LL, -9223372030926249001LL, 0))
80 return 1;
81 if (test__mulodi4(3037000499LL, -3037000499LL, -9223372030926249001LL, 0))
82 return 1;
83 if (test__mulodi4(-3037000499LL, -3037000499LL, 9223372030926249001LL, 0))
84 return 1;
85
86 if (test__mulodi4(4398046511103LL, 2097152LL, 9223372036852678656LL, 0))
87 return 1;
88 if (test__mulodi4(-4398046511103LL, 2097152LL, -9223372036852678656LL, 0))
89 return 1;
90 if (test__mulodi4(4398046511103LL, -2097152LL, -9223372036852678656LL, 0))
91 return 1;
92 if (test__mulodi4(-4398046511103LL, -2097152LL, 9223372036852678656LL, 0))
93 return 1;
94
95 if (test__mulodi4(2097152LL, 4398046511103LL, 9223372036852678656LL, 0))
96 return 1;
97 if (test__mulodi4(-2097152LL, 4398046511103LL, -9223372036852678656LL, 0))
98 return 1;
99 if (test__mulodi4(2097152LL, -4398046511103LL, -9223372036852678656LL, 0))
100 return 1;
101 if (test__mulodi4(-2097152LL, -4398046511103LL, 9223372036852678656LL, 0))
102 return 1;
103
104 if (test__mulodi4(0x7FFFFFFFFFFFFFFFLL, -2, 2, 1))
105 return 1;
106 if (test__mulodi4(-2, 0x7FFFFFFFFFFFFFFFLL, 2, 1))
107 return 1;
108 if (test__mulodi4(0x7FFFFFFFFFFFFFFFLL, -1, 0x8000000000000001LL, 0))
109 return 1;
110 if (test__mulodi4(-1, 0x7FFFFFFFFFFFFFFFLL, 0x8000000000000001LL, 0))
111 return 1;
112 if (test__mulodi4(0x7FFFFFFFFFFFFFFFLL, 0, 0, 0))
113 return 1;
114 if (test__mulodi4(0, 0x7FFFFFFFFFFFFFFFLL, 0, 0))
115 return 1;
116 if (test__mulodi4(0x7FFFFFFFFFFFFFFFLL, 1, 0x7FFFFFFFFFFFFFFFLL, 0))
117 return 1;
118 if (test__mulodi4(1, 0x7FFFFFFFFFFFFFFFLL, 0x7FFFFFFFFFFFFFFFLL, 0))
119 return 1;
120 if (test__mulodi4(0x7FFFFFFFFFFFFFFFLL, 2, 0x8000000000000001LL, 1))
121 return 1;
122 if (test__mulodi4(2, 0x7FFFFFFFFFFFFFFFLL, 0x8000000000000001LL, 1))
123 return 1;
124
125 if (test__mulodi4(0x8000000000000000LL, -2, 0x8000000000000000LL, 1))
126 return 1;
127 if (test__mulodi4(-2, 0x8000000000000000LL, 0x8000000000000000LL, 1))
128 return 1;
129 if (test__mulodi4(0x8000000000000000LL, -1, 0x8000000000000000LL, 1))
130 return 1;
131 if (test__mulodi4(-1, 0x8000000000000000LL, 0x8000000000000000LL, 1))
132 return 1;
133 if (test__mulodi4(0x8000000000000000LL, 0, 0, 0))
134 return 1;
135 if (test__mulodi4(0, 0x8000000000000000LL, 0, 0))
136 return 1;
137 if (test__mulodi4(0x8000000000000000LL, 1, 0x8000000000000000LL, 0))
138 return 1;
139 if (test__mulodi4(1, 0x8000000000000000LL, 0x8000000000000000LL, 0))
140 return 1;
141 if (test__mulodi4(0x8000000000000000LL, 2, 0x8000000000000000LL, 1))
142 return 1;
143 if (test__mulodi4(2, 0x8000000000000000LL, 0x8000000000000000LL, 1))
144 return 1;
145
146 if (test__mulodi4(0x8000000000000001LL, -2, 0x8000000000000001LL, 1))
147 return 1;
148 if (test__mulodi4(-2, 0x8000000000000001LL, 0x8000000000000001LL, 1))
149 return 1;
150 if (test__mulodi4(0x8000000000000001LL, -1, 0x7FFFFFFFFFFFFFFFLL, 0))
151 return 1;
152 if (test__mulodi4(-1, 0x8000000000000001LL, 0x7FFFFFFFFFFFFFFFLL, 0))
153 return 1;
154 if (test__mulodi4(0x8000000000000001LL, 0, 0, 0))
155 return 1;
156 if (test__mulodi4(0, 0x8000000000000001LL, 0, 0))
157 return 1;
158 if (test__mulodi4(0x8000000000000001LL, 1, 0x8000000000000001LL, 0))
159 return 1;
160 if (test__mulodi4(1, 0x8000000000000001LL, 0x8000000000000001LL, 0))
161 return 1;
162 if (test__mulodi4(0x8000000000000001LL, 2, 0x8000000000000000LL, 1))
163 return 1;
164 if (test__mulodi4(2, 0x8000000000000001LL, 0x8000000000000000LL, 1))
165 return 1;
166
167 return 0;
168}
169