2 * PROJECT: ReactOS API tests
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Tests for statically linked __rt_sdiv/udiv/sdiv64/udiv64 on ARM
5 * COPYRIGHT: Copyright 2021 Stanislav Motylkov <x86corez@gmail.com>
10 typedef struct _SDIV_TEST_DATA
18 typedef struct _UDIV_TEST_DATA
26 typedef struct _SDIV64_TEST_DATA
30 LONGLONG expected_div
;
31 LONGLONG expected_mod
;
34 typedef struct _UDIV64_TEST_DATA
38 ULONGLONG expected_div
;
39 ULONGLONG expected_mod
;
44 SDIV_TEST_DATA sdiv
[] =
46 /* Dividend is larger than divisor */
47 { 3425, 400, 8, 225 },
48 { -3425, 400, -8, -225 },
49 { 3425, -400, -8, 225 },
50 { -3425, -400, 8, -225 },
51 /* Divisor is larger than dividend */
56 /* Division without remainder */
57 { 16777216, 65536, 256, 0 },
58 { -16777216, 65536, -256, 0 },
59 { 16777216, -65536, -256, 0 },
60 { -16777216, -65536, 256, 0 },
62 UDIV_TEST_DATA udiv
[] =
64 /* Dividend is larger than divisor */
65 { 3425, 400, 8, 225 },
66 /* Divisor is larger than dividend */
68 /* Division without remainder */
69 { 16777216, 65536, 256, 0 },
71 SDIV64_TEST_DATA sdiv64
[] =
73 /* Dividend is larger than divisor */
74 { 34918215, 7, 4988316, 3 },
75 { -34918215, 7, -4988316, -3 },
76 { 34918215, -7, -4988316, 3 },
77 { -34918215, -7, 4988316, -3 },
78 /* Divisor is larger than dividend */
83 /* Division without remainder */
84 { 16777216, 65536, 256, 0 },
85 { -16777216, 65536, -256, 0 },
86 { 16777216, -65536, -256, 0 },
87 { -16777216, -65536, 256, 0 },
89 /* Big 64-bit numbers */
91 /* Dividend is larger than divisor */
92 { 0x2AFFFFFFFLL
* 100, 400, 2885681151LL, 300 },
93 { -0x2AFFFFFFFLL
* 100, 400, -2885681151LL, -300 },
94 { 0x2AFFFFFFFLL
* 100, -400, -2885681151LL, 300 },
95 { -0x2AFFFFFFFLL
* 100, -400, 2885681151LL, -300 },
96 /* Divisor is larger than dividend */
97 { 0x2AFFFFFFFLL
* 50, 0x2AFFFFFFFLL
* 100, 0, 0x2AFFFFFFFLL
* 50 },
98 { -0x2AFFFFFFFLL
* 50, 0x2AFFFFFFFLL
* 100, 0, -0x2AFFFFFFFLL
* 50 },
99 { 0x2AFFFFFFFLL
* 50, -0x2AFFFFFFFLL
* 100, 0, 0x2AFFFFFFFLL
* 50 },
100 { -0x2AFFFFFFFLL
* 50, -0x2AFFFFFFFLL
* 100, 0, -0x2AFFFFFFFLL
* 50 },
101 /* Division without remainder */
102 { 0x2AFFFFFFFLL
* 100, 100, 0x2AFFFFFFFLL
, 0 },
103 { -0x2AFFFFFFFLL
* 100, 100, -0x2AFFFFFFFLL
, 0 },
104 { 0x2AFFFFFFFLL
* 100, -100, -0x2AFFFFFFFLL
, 0 },
105 { -0x2AFFFFFFFLL
* 100, -100, 0x2AFFFFFFFLL
, 0 },
107 UDIV64_TEST_DATA udiv64
[] =
109 /* Dividend is larger than divisor */
110 { 34918215, 7, 4988316, 3 },
111 /* Divisor is larger than dividend */
113 /* Division without remainder */
114 { 16777216, 65536, 256, 0 },
116 /* Big 64-bit numbers */
118 /* Dividend is larger than divisor */
119 { 0x2AFFFFFFFULL
* 100, 400, 2885681151ULL, 300 },
120 /* Divisor is larger than dividend */
121 { 0x2AFFFFFFFULL
* 50, 0x2AFFFFFFFULL
* 100, 0, 0x2AFFFFFFFULL
* 50 },
122 /* Division without remainder */
123 { 0x2AFFFFFFFULL
* 100, 100, 0x2AFFFFFFFULL
, 0 },
127 for (i
= 0; i
< _countof(sdiv
); i
++)
129 LONG test_div
, test_mod
;
131 test_div
= sdiv
[i
].dividend
/ sdiv
[i
].divisor
;
132 test_mod
= sdiv
[i
].dividend
% sdiv
[i
].divisor
;
133 ok(test_div
== sdiv
[i
].expected_div
, "(sdiv) %d: Expected %ld, got %ld / %ld = %ld\n",
134 i
, sdiv
[i
].expected_div
, sdiv
[i
].dividend
, sdiv
[i
].divisor
, test_div
);
135 ok(test_mod
== sdiv
[i
].expected_mod
, "(sdiv) %d: Expected %ld, got %ld %% %ld = %ld\n",
136 i
, sdiv
[i
].expected_mod
, sdiv
[i
].dividend
, sdiv
[i
].divisor
, test_mod
);
139 for (i
= 0; i
< _countof(udiv
); i
++)
141 ULONG test_div
, test_mod
;
143 test_div
= udiv
[i
].dividend
/ udiv
[i
].divisor
;
144 test_mod
= udiv
[i
].dividend
% udiv
[i
].divisor
;
145 ok(test_div
== udiv
[i
].expected_div
, "(udiv) %d: Expected %lu, got %lu / %lu = %lu\n",
146 i
, udiv
[i
].expected_div
, udiv
[i
].dividend
, udiv
[i
].divisor
, test_div
);
147 ok(test_mod
== udiv
[i
].expected_mod
, "(udiv) %d: Expected %lu, got %lu %% %lu = %lu\n",
148 i
, udiv
[i
].expected_mod
, udiv
[i
].dividend
, udiv
[i
].divisor
, test_mod
);
151 for (i
= 0; i
< _countof(sdiv64
); i
++)
153 LONGLONG test_div
, test_mod
;
155 test_div
= sdiv64
[i
].dividend
/ sdiv64
[i
].divisor
;
156 test_mod
= sdiv64
[i
].dividend
% sdiv64
[i
].divisor
;
157 ok(test_div
== sdiv64
[i
].expected_div
, "(sdiv64) %d: Expected %lld, got %lld / %lld = %lld\n",
158 i
, sdiv64
[i
].expected_div
, sdiv64
[i
].dividend
, sdiv64
[i
].divisor
, test_div
);
159 ok(test_mod
== sdiv64
[i
].expected_mod
, "(sdiv64) %d: Expected %lld, got %lld %% %lld = %lld\n",
160 i
, sdiv64
[i
].expected_mod
, sdiv64
[i
].dividend
, sdiv64
[i
].divisor
, test_mod
);
163 for (i
= 0; i
< _countof(udiv64
); i
++)
165 ULONGLONG test_div
, test_mod
;
167 test_div
= udiv64
[i
].dividend
/ udiv64
[i
].divisor
;
168 test_mod
= udiv64
[i
].dividend
% udiv64
[i
].divisor
;
169 ok(test_div
== udiv64
[i
].expected_div
, "(udiv64) %d: Expected %llu, got %llu / %llu = %llu\n",
170 i
, udiv64
[i
].expected_div
, udiv64
[i
].dividend
, udiv64
[i
].divisor
, test_div
);
171 ok(test_mod
== udiv64
[i
].expected_mod
, "(udiv64) %d: Expected %llu, got %llu %% %llu = %llu\n",
172 i
, udiv64
[i
].expected_mod
, udiv64
[i
].dividend
, udiv64
[i
].divisor
, test_mod
);