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