1*46dbe239SXin Li #include <gtest/gtest.h>
2*46dbe239SXin Li
3*46dbe239SXin Li #include <fxdiv.h>
4*46dbe239SXin Li
TEST(uint32_t,cases)5*46dbe239SXin Li TEST(uint32_t, cases) {
6*46dbe239SXin Li EXPECT_EQ(UINT32_C(42) / UINT32_C(7),
7*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_C(42),
8*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_C(7))));
9*46dbe239SXin Li EXPECT_EQ(UINT32_C(42) / UINT32_C(6),
10*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_C(42),
11*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_C(6))));
12*46dbe239SXin Li EXPECT_EQ(UINT32_C(42) / UINT32_C(5),
13*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_C(42),
14*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_C(5))));
15*46dbe239SXin Li EXPECT_EQ(UINT32_C(1) / UINT32_C(1),
16*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_C(1),
17*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_C(1))));
18*46dbe239SXin Li EXPECT_EQ(UINT32_MAX / UINT32_C(1),
19*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_MAX,
20*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_C(1))));
21*46dbe239SXin Li EXPECT_EQ(UINT32_MAX / UINT32_MAX,
22*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_MAX,
23*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_MAX)));
24*46dbe239SXin Li EXPECT_EQ((UINT32_MAX - 1) / UINT32_MAX,
25*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_MAX - 1,
26*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_MAX)));
27*46dbe239SXin Li EXPECT_EQ(UINT32_MAX / (UINT32_MAX - 1),
28*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_MAX,
29*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_MAX - 1)));
30*46dbe239SXin Li EXPECT_EQ(UINT32_C(0) / UINT32_C(1),
31*46dbe239SXin Li fxdiv_quotient_uint32_t(UINT32_C(0),
32*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_C(1))));
33*46dbe239SXin Li }
34*46dbe239SXin Li
TEST(uint32_t,divide_by_1)35*46dbe239SXin Li TEST(uint32_t, divide_by_1) {
36*46dbe239SXin Li const fxdiv_divisor_uint32_t d = fxdiv_init_uint32_t(UINT32_C(1));
37*46dbe239SXin Li const uint32_t step = UINT32_C(487);
38*46dbe239SXin Li for (uint32_t n = 0; n <= UINT32_MAX - step + 1; n += step) {
39*46dbe239SXin Li EXPECT_EQ(n, fxdiv_quotient_uint32_t(n, d));
40*46dbe239SXin Li }
41*46dbe239SXin Li }
42*46dbe239SXin Li
TEST(uint32_t,divide_zero)43*46dbe239SXin Li TEST(uint32_t, divide_zero) {
44*46dbe239SXin Li const uint32_t step = UINT32_C(491);
45*46dbe239SXin Li for (uint32_t d = 1; d <= UINT32_MAX - step + 1; d += step) {
46*46dbe239SXin Li EXPECT_EQ(0,
47*46dbe239SXin Li fxdiv_quotient_uint32_t(0,
48*46dbe239SXin Li fxdiv_init_uint32_t(d)));
49*46dbe239SXin Li }
50*46dbe239SXin Li }
51*46dbe239SXin Li
TEST(uint32_t,divide_by_n_minus_1)52*46dbe239SXin Li TEST(uint32_t, divide_by_n_minus_1) {
53*46dbe239SXin Li const uint32_t step = UINT32_C(523);
54*46dbe239SXin Li for (uint32_t n = 3; n <= UINT32_MAX - step + 1; n += step) {
55*46dbe239SXin Li EXPECT_EQ(UINT32_C(1),
56*46dbe239SXin Li fxdiv_quotient_uint32_t(n,
57*46dbe239SXin Li fxdiv_init_uint32_t(n - 1)));
58*46dbe239SXin Li }
59*46dbe239SXin Li }
60*46dbe239SXin Li
TEST(uint32_t,divide_by_power_of_2)61*46dbe239SXin Li TEST(uint32_t, divide_by_power_of_2) {
62*46dbe239SXin Li const uint32_t step = UINT32_C(25183);
63*46dbe239SXin Li for (uint32_t p = 0; p < 32; p += 1) {
64*46dbe239SXin Li const fxdiv_divisor_uint32_t divisor =
65*46dbe239SXin Li fxdiv_init_uint32_t(UINT32_C(1) << p);
66*46dbe239SXin Li for (uint32_t n = 0; n <= UINT32_MAX - step + 1; n += step) {
67*46dbe239SXin Li EXPECT_EQ(n >> p, fxdiv_quotient_uint32_t(n, divisor));
68*46dbe239SXin Li }
69*46dbe239SXin Li }
70*46dbe239SXin Li }
71*46dbe239SXin Li
TEST(uint32_t,divide_by_power_of_2_plus_1)72*46dbe239SXin Li TEST(uint32_t, divide_by_power_of_2_plus_1) {
73*46dbe239SXin Li const uint32_t step = UINT32_C(25183);
74*46dbe239SXin Li for (uint32_t p = 0; p < 32; p += 1) {
75*46dbe239SXin Li const uint32_t d = (UINT32_C(1) << p) + UINT32_C(1);
76*46dbe239SXin Li const fxdiv_divisor_uint32_t divisor = fxdiv_init_uint32_t(d);
77*46dbe239SXin Li for (uint32_t n = 0; n <= UINT32_MAX - step + 1; n += step) {
78*46dbe239SXin Li EXPECT_EQ(n / d, fxdiv_quotient_uint32_t(n, divisor));
79*46dbe239SXin Li }
80*46dbe239SXin Li }
81*46dbe239SXin Li }
82*46dbe239SXin Li
TEST(uint32_t,divide_by_power_of_2_minus_1)83*46dbe239SXin Li TEST(uint32_t, divide_by_power_of_2_minus_1) {
84*46dbe239SXin Li const uint32_t step = UINT64_C(25183);
85*46dbe239SXin Li for (uint32_t p = 0; p < 32; p += 1) {
86*46dbe239SXin Li const uint32_t d = (UINT32_C(2) << p) - UINT32_C(1);
87*46dbe239SXin Li const fxdiv_divisor_uint32_t divisor = fxdiv_init_uint32_t(d);
88*46dbe239SXin Li for (uint32_t n = 0; n <= UINT32_MAX - step + 1; n += step) {
89*46dbe239SXin Li EXPECT_EQ(n / d, fxdiv_quotient_uint32_t(n, divisor));
90*46dbe239SXin Li }
91*46dbe239SXin Li }
92*46dbe239SXin Li }
93*46dbe239SXin Li
TEST(uint32_t,match_native)94*46dbe239SXin Li TEST(uint32_t, match_native) {
95*46dbe239SXin Li const uint32_t stepD = UINT32_C(821603);
96*46dbe239SXin Li const uint32_t stepN = UINT32_C(821641);
97*46dbe239SXin Li for (uint32_t d = UINT32_MAX; d >= stepD; d -= stepD) {
98*46dbe239SXin Li const fxdiv_divisor_uint32_t divisor = fxdiv_init_uint32_t(d);
99*46dbe239SXin Li for (uint32_t n = UINT32_MAX; n >= stepN; n -= stepN) {
100*46dbe239SXin Li EXPECT_EQ(n / d, fxdiv_quotient_uint32_t(n, divisor));
101*46dbe239SXin Li }
102*46dbe239SXin Li }
103*46dbe239SXin Li }
104*46dbe239SXin Li
TEST(uint64_t,cases)105*46dbe239SXin Li TEST(uint64_t, cases) {
106*46dbe239SXin Li EXPECT_EQ(UINT64_C(42) / UINT64_C(7),
107*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_C(42),
108*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_C(7))));
109*46dbe239SXin Li EXPECT_EQ(UINT64_C(42) / UINT64_C(6),
110*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_C(42),
111*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_C(6))));
112*46dbe239SXin Li EXPECT_EQ(UINT64_C(42) / UINT64_C(5),
113*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_C(42),
114*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_C(5))));
115*46dbe239SXin Li EXPECT_EQ(UINT64_C(1) / UINT64_C(1),
116*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_C(1),
117*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_C(1))));
118*46dbe239SXin Li EXPECT_EQ(UINT64_MAX / UINT64_C(1),
119*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_MAX,
120*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_C(1))));
121*46dbe239SXin Li EXPECT_EQ(UINT64_MAX / UINT64_MAX,
122*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_MAX,
123*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_MAX)));
124*46dbe239SXin Li EXPECT_EQ((UINT64_MAX - 1) / UINT64_MAX,
125*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_MAX - 1,
126*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_MAX)));
127*46dbe239SXin Li EXPECT_EQ(UINT64_MAX / (UINT64_MAX - 1),
128*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_MAX,
129*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_MAX - 1)));
130*46dbe239SXin Li EXPECT_EQ(UINT64_C(0) / UINT64_C(1),
131*46dbe239SXin Li fxdiv_quotient_uint64_t(UINT64_C(0),
132*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_C(1))));
133*46dbe239SXin Li }
134*46dbe239SXin Li
TEST(uint64_t,divide_by_1)135*46dbe239SXin Li TEST(uint64_t, divide_by_1) {
136*46dbe239SXin Li const fxdiv_divisor_uint64_t d = fxdiv_init_uint64_t(UINT64_C(1));
137*46dbe239SXin Li const uint64_t step = UINT64_C(2048116998241);
138*46dbe239SXin Li for (uint64_t n = 0; n <= UINT64_MAX - step + 1; n += step) {
139*46dbe239SXin Li EXPECT_EQ(n, fxdiv_quotient_uint64_t(n, d));
140*46dbe239SXin Li }
141*46dbe239SXin Li }
142*46dbe239SXin Li
TEST(uint64_t,divide_zero)143*46dbe239SXin Li TEST(uint64_t, divide_zero) {
144*46dbe239SXin Li const uint64_t step = UINT64_C(8624419641811);
145*46dbe239SXin Li for (uint64_t d = 1; d <= UINT64_MAX - step + 1; d += step) {
146*46dbe239SXin Li EXPECT_EQ(0,
147*46dbe239SXin Li fxdiv_quotient_uint64_t(0,
148*46dbe239SXin Li fxdiv_init_uint64_t(d)));
149*46dbe239SXin Li }
150*46dbe239SXin Li }
151*46dbe239SXin Li
TEST(uint64_t,divide_by_n_minus_1)152*46dbe239SXin Li TEST(uint64_t, divide_by_n_minus_1) {
153*46dbe239SXin Li const uint64_t step = UINT64_C(8624419641833);
154*46dbe239SXin Li for (uint64_t n = 3; n <= UINT64_MAX - step + 1; n += step) {
155*46dbe239SXin Li EXPECT_EQ(UINT64_C(1),
156*46dbe239SXin Li fxdiv_quotient_uint64_t(n,
157*46dbe239SXin Li fxdiv_init_uint64_t(n - 1)));
158*46dbe239SXin Li }
159*46dbe239SXin Li }
160*46dbe239SXin Li
TEST(uint64_t,divide_by_power_of_2)161*46dbe239SXin Li TEST(uint64_t, divide_by_power_of_2) {
162*46dbe239SXin Li const uint64_t step = UINT64_C(93400375993241);
163*46dbe239SXin Li for (uint32_t p = 0; p < 64; p += 1) {
164*46dbe239SXin Li const fxdiv_divisor_uint64_t divisor =
165*46dbe239SXin Li fxdiv_init_uint64_t(UINT64_C(1) << p);
166*46dbe239SXin Li for (uint64_t n = 0; n <= UINT64_MAX - step + 1; n += step) {
167*46dbe239SXin Li EXPECT_EQ(n >> p, fxdiv_quotient_uint64_t(n, divisor));
168*46dbe239SXin Li }
169*46dbe239SXin Li }
170*46dbe239SXin Li }
171*46dbe239SXin Li
TEST(uint64_t,divide_by_power_of_2_plus_1)172*46dbe239SXin Li TEST(uint64_t, divide_by_power_of_2_plus_1) {
173*46dbe239SXin Li const uint64_t step = UINT64_C(93400375993241);
174*46dbe239SXin Li for (uint32_t p = 0; p < 64; p += 1) {
175*46dbe239SXin Li const uint64_t d = (UINT64_C(1) << p) + UINT64_C(1);
176*46dbe239SXin Li const fxdiv_divisor_uint64_t divisor = fxdiv_init_uint64_t(d);
177*46dbe239SXin Li for (uint64_t n = 0; n <= UINT64_MAX - step + 1; n += step) {
178*46dbe239SXin Li EXPECT_EQ(n / d, fxdiv_quotient_uint64_t(n, divisor));
179*46dbe239SXin Li }
180*46dbe239SXin Li }
181*46dbe239SXin Li }
182*46dbe239SXin Li
TEST(uint64_t,divide_by_power_of_2_minus_1)183*46dbe239SXin Li TEST(uint64_t, divide_by_power_of_2_minus_1) {
184*46dbe239SXin Li const uint64_t step = UINT64_C(93400375993241);
185*46dbe239SXin Li for (uint32_t p = 0; p < 64; p += 1) {
186*46dbe239SXin Li const uint64_t d = (UINT64_C(2) << p) - UINT64_C(1);
187*46dbe239SXin Li const fxdiv_divisor_uint64_t divisor = fxdiv_init_uint64_t(d);
188*46dbe239SXin Li for (uint64_t n = 0; n <= UINT64_MAX - step + 1; n += step) {
189*46dbe239SXin Li EXPECT_EQ(n / d, fxdiv_quotient_uint64_t(n, divisor));
190*46dbe239SXin Li }
191*46dbe239SXin Li }
192*46dbe239SXin Li }
193*46dbe239SXin Li
TEST(uint64_t,match_native)194*46dbe239SXin Li TEST(uint64_t, match_native) {
195*46dbe239SXin Li const uint64_t stepD = UINT64_C(7093600525704701);
196*46dbe239SXin Li const uint64_t stepN = UINT64_C(7093600525704677);
197*46dbe239SXin Li for (uint64_t d = UINT64_MAX; d >= stepD; d -= stepD) {
198*46dbe239SXin Li const fxdiv_divisor_uint64_t divisor = fxdiv_init_uint64_t(d);
199*46dbe239SXin Li for (uint64_t n = UINT64_MAX; n >= stepN; n -= stepN) {
200*46dbe239SXin Li EXPECT_EQ(n / d, fxdiv_quotient_uint64_t(n, divisor));
201*46dbe239SXin Li }
202*46dbe239SXin Li }
203*46dbe239SXin Li }
204*46dbe239SXin Li
TEST(size_t,cases)205*46dbe239SXin Li TEST(size_t, cases) {
206*46dbe239SXin Li EXPECT_EQ(42 / 7,
207*46dbe239SXin Li fxdiv_quotient_size_t(42,
208*46dbe239SXin Li fxdiv_init_size_t(7)));
209*46dbe239SXin Li EXPECT_EQ(42 / 6,
210*46dbe239SXin Li fxdiv_quotient_size_t(42,
211*46dbe239SXin Li fxdiv_init_size_t(6)));
212*46dbe239SXin Li EXPECT_EQ(42 / 5,
213*46dbe239SXin Li fxdiv_quotient_size_t(42,
214*46dbe239SXin Li fxdiv_init_size_t(5)));
215*46dbe239SXin Li EXPECT_EQ(1 / 1,
216*46dbe239SXin Li fxdiv_quotient_size_t(1,
217*46dbe239SXin Li fxdiv_init_size_t(1)));
218*46dbe239SXin Li EXPECT_EQ(SIZE_MAX / 1,
219*46dbe239SXin Li fxdiv_quotient_size_t(SIZE_MAX,
220*46dbe239SXin Li fxdiv_init_size_t(1)));
221*46dbe239SXin Li EXPECT_EQ(SIZE_MAX / SIZE_MAX,
222*46dbe239SXin Li fxdiv_quotient_size_t(SIZE_MAX,
223*46dbe239SXin Li fxdiv_init_size_t(SIZE_MAX)));
224*46dbe239SXin Li EXPECT_EQ((SIZE_MAX - 1) / SIZE_MAX,
225*46dbe239SXin Li fxdiv_quotient_size_t(SIZE_MAX - 1,
226*46dbe239SXin Li fxdiv_init_size_t(SIZE_MAX)));
227*46dbe239SXin Li EXPECT_EQ(SIZE_MAX / (SIZE_MAX - 1),
228*46dbe239SXin Li fxdiv_quotient_size_t(SIZE_MAX,
229*46dbe239SXin Li fxdiv_init_size_t(SIZE_MAX - 1)));
230*46dbe239SXin Li EXPECT_EQ(0 / 1,
231*46dbe239SXin Li fxdiv_quotient_size_t(0,
232*46dbe239SXin Li fxdiv_init_size_t(1)));
233*46dbe239SXin Li }
234