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