1 /*
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 __dtoi64/dtou64/stoi64/stou64 on ARM
5 * COPYRIGHT: Copyright 2021 Roman Masanin <36927roma@gmail.com>
6 */
7
8 #include <apitest.h>
9
10 typedef struct _DTOI64_TEST_DATA
11 {
12 union
13 {
14 double value;
15 unsigned long long raw;
16 } given;
17 long long expected;
18 } DTOI64_TEST_DATA;
19
20 typedef struct _DTOU64_TEST_DATA
21 {
22 union
23 {
24 double value;
25 unsigned long long raw;
26 } given;
27 unsigned long long expected;
28 } DTOU64_TEST_DATA;
29
30 typedef struct _STOI64_TEST_DATA
31 {
32 union
33 {
34 float value;
35 unsigned int raw;
36 } given;
37 long long expected;
38 } STOI64_TEST_DATA;
39
40 typedef struct _STOU64_TEST_DATA
41 {
42 union
43 {
44 float value;
45 unsigned int raw;
46 } given;
47 unsigned long long expected;
48 } STOU64_TEST_DATA;
49
START_TEST(__fto64)50 START_TEST(__fto64)
51 {
52 DTOI64_TEST_DATA dtoi64[] =
53 {
54 { 1383034209.0, 1383034209LL }, /* test 32bit number */
55 { -1383034209.0, -1383034209LL }, /* test negative 32bit number */
56 { 1383034209.1383034209, 1383034209LL }, /* test rounding 32bit */
57 { -1383034209.1383034209, -1383034209LL }, /* test negative rounding 32bit */
58 { 1383034209.83034209, 1383034209LL }, /* test rounding up 32bit */
59 { -1383034209.83034209, -1383034209LL }, /* test negative rounding up 32bit */
60 { 354056757614.0, 354056757614LL }, /* test 64bit int */
61 { -354056757614.0, -354056757614LL }, /* test negative 64bit int */
62 { 354056757614.83034209, 354056757614LL }, /* test 64bit rounding */
63 { 18445937028656326656.0, 0x8000000000000000LL }, /* test unsigned 64bit */
64 { 1.0000001, 1LL },
65 { 0.0000001, 0LL },
66 { -0.0000001, 0LL },
67
68 /* special values tests */
69
70 { -0.0, 0LL }, /* test -0 */
71 { +0.0, 0LL }, /* test +0 */
72 { .given.raw = 0x7FF0000000000000ULL, 0x8000000000000000LL }, /* test +INFINITY */
73 { .given.raw = 0xFFF0000000000000ULL, 0x8000000000000000LL }, /* test -INFINITY */
74 { .given.raw = 0x7FF0000000000001ULL, 0x8000000000000000LL }, /* test NaN1 */
75 { .given.raw = 0x7FF8000000000001ULL, 0x8000000000000000LL }, /* test NaN2 */
76 { .given.raw = 0x7FFFFFFFFFFFFFFFULL, 0x8000000000000000LL }, /* test NaN3 */
77 { .given.raw = 0x7FF80000000000F1ULL, 0x8000000000000000LL }, /* test NaN4 */
78 };
79 DTOU64_TEST_DATA dtou64[] =
80 {
81 { 1383034209.0, 1383034209ULL }, /* test 32bit number */
82 { -1383034209.0, 18446744072326517407ULL }, /* test negative 32bit number */
83 { 1383034209.1383034209, 1383034209ULL }, /* test rounding 32bit */
84 { -1383034209.1383034209, 18446744072326517407ULL }, /* test negative rounding 32bit */
85 { 1383034209.83034209, 1383034209ULL }, /* test rounding up 32bit */
86 { -1383034209.83034209, 18446744072326517407ULL }, /* test negative rounding up 32bit */
87 { 354056757614.0, 354056757614ULL }, /* test 64bit int */
88 { -354056757614.0, 18446743719652794002ULL }, /* test negative 64bit int */
89 { 354056757614.83034209, 354056757614ULL }, /* test 64bit rounding */
90 { 18445937028656326656.0, 18445937028656326656ULL }, /* test unsigned 64bit */
91 { 1.0000001, 1ULL },
92 { 0.0000001, 0ULL },
93 { -0.0000001, 0ULL },
94
95 /* special values tests */
96
97 { -0.0, 0ULL }, /* test -0 */
98 { +0.0, 0ULL }, /* test +0 */
99 { .given.raw = 0x7FF0000000000000ULL, 0x8000000000000000LL }, /* test +INFINITY */
100 { .given.raw = 0xFFF0000000000000ULL, 0x8000000000000000LL }, /* test -INFINITY */
101 { .given.raw = 0x7FF0000000000001ULL, 0x8000000000000000LL }, /* test NaN1 */
102 { .given.raw = 0x7FF8000000000001ULL, 0x8000000000000000LL }, /* test NaN2 */
103 { .given.raw = 0x7FFFFFFFFFFFFFFFULL, 0x8000000000000000LL }, /* test NaN3 */
104 { .given.raw = 0x7FF80000000000F1ULL, 0x8000000000000000LL }, /* test NaN4 */
105 };
106 STOI64_TEST_DATA stoi64[] =
107 {
108 { 1383034.0f, 1383034LL }, /* test 32bit number */
109 { -1383034.0f, -1383034LL }, /* test negative 32bit number */
110 { 1383034.1383034209f, 1383034LL }, /* test rounding 32bit */
111 { -1383034.1383034209f, -1383034LL }, /* test negative rounding 32bit */
112 { 1383034.83034209f, 1383034LL }, /* test rounding up 32bit */
113 { -1383034.83034209f, -1383034LL }, /* test negative rounding up 32bit */
114 { 354056765440.0f, 354056765440LL }, /* test 64bit int */
115 { -354056765440.0f, -354056765440LL }, /* test negative 64bit int */
116 { 3000000.75f, 3000000LL }, /* test 64bit rounding */
117 { 18445937032174764032.0f, 0x8000000000000000LL }, /* test unsigned 64bit */
118 { 1.0000001f, 1LL },
119 { 0.0000001f, 0LL },
120 { -0.0000001f, 0LL },
121
122 /* special values tests */
123
124 { -0.0f, 0LL }, /* test -0 */
125 { +0.0f, 0LL }, /* test +0 */
126 { .given.raw = 0x7F800000U, 0x8000000000000000LL }, /* test +INFINITY */
127 { .given.raw = 0xFF800000U, 0x8000000000000000LL }, /* test -INFINITY */
128 { .given.raw = 0x7F800001U, 0x8000000000000000LL }, /* test NaN1 */
129 { .given.raw = 0x7FC00001U, 0x8000000000000000LL }, /* test NaN2 */
130 { .given.raw = 0x7F8FFFFFU, 0x8000000000000000LL }, /* test NaN3 */
131 { .given.raw = 0x7F8000F1U, 0x8000000000000000LL }, /* test NaN4 */
132 };
133 STOU64_TEST_DATA stou64[] =
134 {
135 { 1383034.0f, 1383034ULL }, /* test 32bit number */
136 { -1383034.0f, 18446744073708168582ULL }, /* test negative 32bit number */
137 { 1383034.1383034209f, 1383034ULL }, /* test rounding 32bit */
138 { -1383034.1383034209f, 18446744073708168582ULL }, /* test negative rounding 32bit */
139 { 1383034.83034209f, 1383034ULL }, /* test rounding up 32bit */
140 { -1383034.83034209f, 18446744073708168582ULL }, /* test negative rounding up 32bit */
141 { 354056765440.0f, 354056765440ULL }, /* test 64bit int */
142 { -354056765440.0f, 18446743719652786176ULL }, /* test negative 64bit int */
143 { 3000000.75f, 3000000ULL }, /* test 64bit rounding */
144 { 18445937032174764032.0f, 18445937032174764032ULL }, /* test unsigned 64bit */
145 { 1.0000001f, 1ULL },
146 { 0.0000001f, 0ULL },
147 { -0.0000001f, 0ULL },
148
149 /* special values tests */
150
151 { -0.0f, 0LL }, /* test -0 */
152 { +0.0f, 0LL }, /* test +0 */
153 {.given.raw = 0x7F800000U, 0x8000000000000000LL }, /* test +INFINITY */
154 {.given.raw = 0xFF800000U, 0x8000000000000000LL }, /* test -INFINITY */
155 {.given.raw = 0x7F800001U, 0x8000000000000000LL }, /* test NaN1 */
156 {.given.raw = 0x7FC00001U, 0x8000000000000000LL }, /* test NaN2 */
157 {.given.raw = 0x7F8FFFFFU, 0x8000000000000000LL }, /* test NaN3 */
158 {.given.raw = 0x7F8000F1U, 0x8000000000000000LL }, /* test NaN4 */
159 };
160
161 unsigned int i;
162
163 for (i = 0; i < _countof(dtoi64); ++i)
164 {
165 long long actual;
166
167 actual = (long long)dtoi64[i].given.value;
168 ok(actual == dtoi64[i].expected, "(dtoi64) %d: Expected %lld, but %lf -> %lld\n",
169 i, dtoi64[i].expected, dtoi64[i].given.value, actual);
170 }
171
172 for (i = 0; i < _countof(dtou64); ++i)
173 {
174 unsigned long long actual;
175
176 actual = (unsigned long long)dtou64[i].given.value;
177 ok(actual == dtou64[i].expected, "(dtou64) %d: Expected %llu, but %lf -> %llu\n",
178 i, dtou64[i].expected, dtou64[i].given.value, actual);
179 }
180
181 for (i = 0; i < _countof(stoi64); ++i)
182 {
183 long long actual;
184
185 actual = (long long)stoi64[i].given.value;
186 ok(actual == stoi64[i].expected, "(stoi64) %d: Expected %lld, but %f -> %lld\n",
187 i, stoi64[i].expected, stoi64[i].given.value, actual);
188 }
189
190 for (i = 0; i < _countof(stou64); ++i)
191 {
192 unsigned long long actual;
193
194 actual = (unsigned long long)stou64[i].given.value;
195 ok(actual == stou64[i].expected, "(stou64) %d: Expected %llu, but %f -> %llu\n",
196 i, stou64[i].expected, stou64[i].given.value, actual);
197 }
198 }
199