1// RUN: %clang_builtins %s %librt -o %t && %run %t
2// REQUIRES: librt_has_mulosi4
3
4#include "int_lib.h"
5#include <stdio.h>
6
7// Returns: a * b
8
9// Effects: aborts if a * b overflows
10
11COMPILER_RT_ABI si_int __mulosi4(si_int a, si_int b, int *overflow);
12
13int test__mulosi4(si_int a, si_int b, si_int expected, int expected_overflow)
14{
15 int ov;
16 si_int x = __mulosi4(a, b, &ov);
17 if (ov != expected_overflow)
18 printf("error in __mulosi4: overflow=%d expected=%d\n",
19 ov, expected_overflow);
20 else if (!expected_overflow && x != expected) {
21 printf("error in __mulosi4: 0x%X * 0x%X = 0x%X (overflow=%d), "
22 "expected 0x%X (overflow=%d)\n",
23 a, b, x, ov, expected, expected_overflow);
24 return 1;
25 }
26 return 0;
27}
28
29
30int main()
31{
32 if (test__mulosi4(0, 0, 0, 0))
33 return 1;
34 if (test__mulosi4(0, 1, 0, 0))
35 return 1;
36 if (test__mulosi4(1, 0, 0, 0))
37 return 1;
38 if (test__mulosi4(0, 10, 0, 0))
39 return 1;
40 if (test__mulosi4(10, 0, 0, 0))
41 return 1;
42 if (test__mulosi4(0, 0x1234567, 0, 0))
43 return 1;
44 if (test__mulosi4(0x1234567, 0, 0, 0))
45 return 1;
46
47 if (test__mulosi4(0, -1, 0, 0))
48 return 1;
49 if (test__mulosi4(-1, 0, 0, 0))
50 return 1;
51 if (test__mulosi4(0, -10, 0, 0))
52 return 1;
53 if (test__mulosi4(-10, 0, 0, 0))
54 return 1;
55 if (test__mulosi4(0, -0x1234567, 0, 0))
56 return 1;
57 if (test__mulosi4(-0x1234567, 0, 0, 0))
58 return 1;
59
60 if (test__mulosi4(1, 1, 1, 0))
61 return 1;
62 if (test__mulosi4(1, 10, 10, 0))
63 return 1;
64 if (test__mulosi4(10, 1, 10, 0))
65 return 1;
66 if (test__mulosi4(1, 0x1234567, 0x1234567, 0))
67 return 1;
68 if (test__mulosi4(0x1234567, 1, 0x1234567, 0))
69 return 1;
70
71 if (test__mulosi4(1, -1, -1, 0))
72 return 1;
73 if (test__mulosi4(1, -10, -10, 0))
74 return 1;
75 if (test__mulosi4(-10, 1, -10, 0))
76 return 1;
77 if (test__mulosi4(1, -0x1234567, -0x1234567, 0))
78 return 1;
79 if (test__mulosi4(-0x1234567, 1, -0x1234567, 0))
80 return 1;
81
82 if (test__mulosi4(0x7FFFFFFF, -2, 0x80000001, 1))
83 return 1;
84 if (test__mulosi4(-2, 0x7FFFFFFF, 0x80000001, 1))
85 return 1;
86 if (test__mulosi4(0x7FFFFFFF, -1, 0x80000001, 0))
87 return 1;
88 if (test__mulosi4(-1, 0x7FFFFFFF, 0x80000001, 0))
89 return 1;
90 if (test__mulosi4(0x7FFFFFFF, 0, 0, 0))
91 return 1;
92 if (test__mulosi4(0, 0x7FFFFFFF, 0, 0))
93 return 1;
94 if (test__mulosi4(0x7FFFFFFF, 1, 0x7FFFFFFF, 0))
95 return 1;
96 if (test__mulosi4(1, 0x7FFFFFFF, 0x7FFFFFFF, 0))
97 return 1;
98 if (test__mulosi4(0x7FFFFFFF, 2, 0x80000001, 1))
99 return 1;
100 if (test__mulosi4(2, 0x7FFFFFFF, 0x80000001, 1))
101 return 1;
102
103 if (test__mulosi4(0x80000000, -2, 0x80000000, 1))
104 return 1;
105 if (test__mulosi4(-2, 0x80000000, 0x80000000, 1))
106 return 1;
107 if (test__mulosi4(0x80000000, -1, 0x80000000, 1))
108 return 1;
109 if (test__mulosi4(-1, 0x80000000, 0x80000000, 1))
110 return 1;
111 if (test__mulosi4(0x80000000, 0, 0, 0))
112 return 1;
113 if (test__mulosi4(0, 0x80000000, 0, 0))
114 return 1;
115 if (test__mulosi4(0x80000000, 1, 0x80000000, 0))
116 return 1;
117 if (test__mulosi4(1, 0x80000000, 0x80000000, 0))
118 return 1;
119 if (test__mulosi4(0x80000000, 2, 0x80000000, 1))
120 return 1;
121 if (test__mulosi4(2, 0x80000000, 0x80000000, 1))
122 return 1;
123
124 if (test__mulosi4(0x80000001, -2, 0x80000001, 1))
125 return 1;
126 if (test__mulosi4(-2, 0x80000001, 0x80000001, 1))
127 return 1;
128 if (test__mulosi4(0x80000001, -1, 0x7FFFFFFF, 0))
129 return 1;
130 if (test__mulosi4(-1, 0x80000001, 0x7FFFFFFF, 0))
131 return 1;
132 if (test__mulosi4(0x80000001, 0, 0, 0))
133 return 1;
134 if (test__mulosi4(0, 0x80000001, 0, 0))
135 return 1;
136 if (test__mulosi4(0x80000001, 1, 0x80000001, 0))
137 return 1;
138 if (test__mulosi4(1, 0x80000001, 0x80000001, 0))
139 return 1;
140 if (test__mulosi4(0x80000001, 2, 0x80000000, 1))
141 return 1;
142 if (test__mulosi4(2, 0x80000001, 0x80000000, 1))
143 return 1;
144
145 return 0;
146}
147