diff options
author | 3gg <3gg@shellblade.net> | 2025-08-30 16:53:58 -0700 |
---|---|---|
committer | 3gg <3gg@shellblade.net> | 2025-08-30 16:53:58 -0700 |
commit | 6aaedb813fa11ba0679c3051bc2eb28646b9506c (patch) | |
tree | 34acbfc9840e02cb4753e6306ea7ce978bf8b58e /src/contrib/SDL-3.2.20/test/testplatform.c | |
parent | 8f228ade99dd3d4c8da9b78ade1815c9adf85c8f (diff) |
Update to SDL3
Diffstat (limited to 'src/contrib/SDL-3.2.20/test/testplatform.c')
-rw-r--r-- | src/contrib/SDL-3.2.20/test/testplatform.c | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/src/contrib/SDL-3.2.20/test/testplatform.c b/src/contrib/SDL-3.2.20/test/testplatform.c new file mode 100644 index 0000000..c1eb6aa --- /dev/null +++ b/src/contrib/SDL-3.2.20/test/testplatform.c | |||
@@ -0,0 +1,494 @@ | |||
1 | /* | ||
2 | Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org> | ||
3 | |||
4 | This software is provided 'as-is', without any express or implied | ||
5 | warranty. In no event will the authors be held liable for any damages | ||
6 | arising from the use of this software. | ||
7 | |||
8 | Permission is granted to anyone to use this software for any purpose, | ||
9 | including commercial applications, and to alter it and redistribute it | ||
10 | freely. | ||
11 | */ | ||
12 | #include <SDL3/SDL.h> | ||
13 | #include <SDL3/SDL_main.h> | ||
14 | #include <SDL3/SDL_test.h> | ||
15 | |||
16 | /* | ||
17 | * Watcom C flags these as Warning 201: "Unreachable code" if you just | ||
18 | * compare them directly, so we push it through a function to keep the | ||
19 | * compiler quiet. --ryan. | ||
20 | */ | ||
21 | static int | ||
22 | badsize(size_t sizeoftype, size_t hardcodetype) | ||
23 | { | ||
24 | return sizeoftype != hardcodetype; | ||
25 | } | ||
26 | |||
27 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT8, SDL_MAX_SINT8 == 127); | ||
28 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT8, SDL_MIN_SINT8 == -128); | ||
29 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT8, SDL_MAX_UINT8 == 255); | ||
30 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT8, SDL_MIN_UINT8 == 0); | ||
31 | |||
32 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT16, SDL_MAX_SINT16 == 32767); | ||
33 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT16, SDL_MIN_SINT16 == -32768); | ||
34 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT16, SDL_MAX_UINT16 == 65535); | ||
35 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT16, SDL_MIN_UINT16 == 0); | ||
36 | |||
37 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT32, SDL_MAX_SINT32 == 2147483647); | ||
38 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT32, SDL_MIN_SINT32 == ~0x7fffffff); /* Instead of -2147483648, which is treated as unsigned by some compilers */ | ||
39 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT32, SDL_MAX_UINT32 == 4294967295u); | ||
40 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT32, SDL_MIN_UINT32 == 0); | ||
41 | |||
42 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT64, SDL_MAX_SINT64 == INT64_C(9223372036854775807)); | ||
43 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT64, SDL_MIN_SINT64 == ~INT64_C(0x7fffffffffffffff)); /* Instead of -9223372036854775808, which is treated as unsigned by compilers */ | ||
44 | SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT64, SDL_MAX_UINT64 == UINT64_C(18446744073709551615)); | ||
45 | SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT64, SDL_MIN_UINT64 == 0); | ||
46 | |||
47 | static int TestTypes(bool verbose) | ||
48 | { | ||
49 | int error = 0; | ||
50 | |||
51 | if (badsize(sizeof(bool), 1)) { | ||
52 | if (verbose) { | ||
53 | SDL_Log("sizeof(bool) != 1, instead = %u", (unsigned int)sizeof(bool)); | ||
54 | } | ||
55 | ++error; | ||
56 | } | ||
57 | if (badsize(sizeof(Uint8), 1)) { | ||
58 | if (verbose) { | ||
59 | SDL_Log("sizeof(Uint8) != 1, instead = %u", (unsigned int)sizeof(Uint8)); | ||
60 | } | ||
61 | ++error; | ||
62 | } | ||
63 | if (badsize(sizeof(Uint16), 2)) { | ||
64 | if (verbose) { | ||
65 | SDL_Log("sizeof(Uint16) != 2, instead = %u", (unsigned int)sizeof(Uint16)); | ||
66 | } | ||
67 | ++error; | ||
68 | } | ||
69 | if (badsize(sizeof(Uint32), 4)) { | ||
70 | if (verbose) { | ||
71 | SDL_Log("sizeof(Uint32) != 4, instead = %u", (unsigned int)sizeof(Uint32)); | ||
72 | } | ||
73 | ++error; | ||
74 | } | ||
75 | if (badsize(sizeof(Uint64), 8)) { | ||
76 | if (verbose) { | ||
77 | SDL_Log("sizeof(Uint64) != 8, instead = %u", (unsigned int)sizeof(Uint64)); | ||
78 | } | ||
79 | ++error; | ||
80 | } | ||
81 | if (verbose && !error) { | ||
82 | SDL_Log("All data types are the expected size."); | ||
83 | } | ||
84 | |||
85 | return error ? 1 : 0; | ||
86 | } | ||
87 | |||
88 | static int TestEndian(bool verbose) | ||
89 | { | ||
90 | int error = 0; | ||
91 | Uint16 value = 0x1234; | ||
92 | int real_byteorder; | ||
93 | int real_floatwordorder = 0; | ||
94 | Uint16 value16 = 0xCDAB; | ||
95 | Uint16 swapped16 = 0xABCD; | ||
96 | Uint32 value32 = 0xEFBEADDE; | ||
97 | Uint32 swapped32 = 0xDEADBEEF; | ||
98 | Uint64 value64, swapped64; | ||
99 | |||
100 | union | ||
101 | { | ||
102 | double d; | ||
103 | Uint32 ui32[2]; | ||
104 | } value_double; | ||
105 | |||
106 | value64 = 0xEFBEADDE; | ||
107 | value64 <<= 32; | ||
108 | value64 |= 0xCDAB3412; | ||
109 | swapped64 = 0x1234ABCD; | ||
110 | swapped64 <<= 32; | ||
111 | swapped64 |= 0xDEADBEEF; | ||
112 | value_double.d = 3.141593; | ||
113 | |||
114 | if (verbose) { | ||
115 | SDL_Log("Detected a %s endian machine.", | ||
116 | (SDL_BYTEORDER == SDL_LIL_ENDIAN) ? "little" : "big"); | ||
117 | } | ||
118 | if ((*((char *)&value) >> 4) == 0x1) { | ||
119 | real_byteorder = SDL_BIG_ENDIAN; | ||
120 | } else { | ||
121 | real_byteorder = SDL_LIL_ENDIAN; | ||
122 | } | ||
123 | if (real_byteorder != SDL_BYTEORDER) { | ||
124 | if (verbose) { | ||
125 | SDL_Log("Actually a %s endian machine!", | ||
126 | (real_byteorder == SDL_LIL_ENDIAN) ? "little" : "big"); | ||
127 | } | ||
128 | ++error; | ||
129 | } | ||
130 | if (verbose) { | ||
131 | SDL_Log("Detected a %s endian float word order machine.", | ||
132 | (SDL_FLOATWORDORDER == SDL_LIL_ENDIAN) ? "little" : "big"); | ||
133 | } | ||
134 | if (value_double.ui32[0] == 0x82c2bd7f && value_double.ui32[1] == 0x400921fb) { | ||
135 | real_floatwordorder = SDL_LIL_ENDIAN; | ||
136 | } else if (value_double.ui32[0] == 0x400921fb && value_double.ui32[1] == 0x82c2bd7f) { | ||
137 | real_floatwordorder = SDL_BIG_ENDIAN; | ||
138 | } | ||
139 | if (real_floatwordorder != SDL_FLOATWORDORDER) { | ||
140 | if (verbose) { | ||
141 | SDL_Log("Actually a %s endian float word order machine!", | ||
142 | (real_floatwordorder == SDL_LIL_ENDIAN) ? "little" : (real_floatwordorder == SDL_BIG_ENDIAN) ? "big" | ||
143 | : "unknown"); | ||
144 | } | ||
145 | ++error; | ||
146 | } | ||
147 | if (verbose) { | ||
148 | SDL_Log("Value 16 = 0x%X, swapped = 0x%X", value16, | ||
149 | SDL_Swap16(value16)); | ||
150 | } | ||
151 | if (SDL_Swap16(value16) != swapped16) { | ||
152 | if (verbose) { | ||
153 | SDL_Log("16 bit value swapped incorrectly!"); | ||
154 | } | ||
155 | ++error; | ||
156 | } | ||
157 | if (verbose) { | ||
158 | SDL_Log("Value 32 = 0x%" SDL_PRIX32 ", swapped = 0x%" SDL_PRIX32, | ||
159 | value32, | ||
160 | SDL_Swap32(value32)); | ||
161 | } | ||
162 | if (SDL_Swap32(value32) != swapped32) { | ||
163 | if (verbose) { | ||
164 | SDL_Log("32 bit value swapped incorrectly!"); | ||
165 | } | ||
166 | ++error; | ||
167 | } | ||
168 | if (verbose) { | ||
169 | SDL_Log("Value 64 = 0x%" SDL_PRIX64 ", swapped = 0x%" SDL_PRIX64, value64, | ||
170 | SDL_Swap64(value64)); | ||
171 | } | ||
172 | if (SDL_Swap64(value64) != swapped64) { | ||
173 | if (verbose) { | ||
174 | SDL_Log("64 bit value swapped incorrectly!"); | ||
175 | } | ||
176 | ++error; | ||
177 | } | ||
178 | return error ? 1 : 0; | ||
179 | } | ||
180 | |||
181 | static int TST_allmul(void *a, void *b, int arg, void *result, void *expected) | ||
182 | { | ||
183 | (*(unsigned long long *)result) = ((*(unsigned long long *)a) * (*(unsigned long long *)b)); | ||
184 | return (*(unsigned long long *)result) == (*(unsigned long long *)expected); | ||
185 | } | ||
186 | |||
187 | static int TST_alldiv(void *a, void *b, int arg, void *result, void *expected) | ||
188 | { | ||
189 | (*(long long *)result) = ((*(long long *)a) / (*(long long *)b)); | ||
190 | return (*(long long *)result) == (*(long long *)expected); | ||
191 | } | ||
192 | |||
193 | static int TST_allrem(void *a, void *b, int arg, void *result, void *expected) | ||
194 | { | ||
195 | (*(long long *)result) = ((*(long long *)a) % (*(long long *)b)); | ||
196 | return (*(long long *)result) == (*(long long *)expected); | ||
197 | } | ||
198 | |||
199 | static int TST_ualldiv(void *a, void *b, int arg, void *result, void *expected) | ||
200 | { | ||
201 | (*(unsigned long long *)result) = ((*(unsigned long long *)a) / (*(unsigned long long *)b)); | ||
202 | return (*(unsigned long long *)result) == (*(unsigned long long *)expected); | ||
203 | } | ||
204 | |||
205 | static int TST_uallrem(void *a, void *b, int arg, void *result, void *expected) | ||
206 | { | ||
207 | (*(unsigned long long *)result) = ((*(unsigned long long *)a) % (*(unsigned long long *)b)); | ||
208 | return (*(unsigned long long *)result) == (*(unsigned long long *)expected); | ||
209 | } | ||
210 | |||
211 | static int TST_allshl(void *a, void *b, int arg, void *result, void *expected) | ||
212 | { | ||
213 | (*(long long *)result) = (*(long long *)a) << arg; | ||
214 | return (*(long long *)result) == (*(long long *)expected); | ||
215 | } | ||
216 | |||
217 | static int TST_aullshl(void *a, void *b, int arg, void *result, void *expected) | ||
218 | { | ||
219 | (*(unsigned long long *)result) = (*(unsigned long long *)a) << arg; | ||
220 | return (*(unsigned long long *)result) == (*(unsigned long long *)expected); | ||
221 | } | ||
222 | |||
223 | static int TST_allshr(void *a, void *b, int arg, void *result, void *expected) | ||
224 | { | ||
225 | (*(long long *)result) = (*(long long *)a) >> arg; | ||
226 | return (*(long long *)result) == (*(long long *)expected); | ||
227 | } | ||
228 | |||
229 | static int TST_aullshr(void *a, void *b, int arg, void *result, void *expected) | ||
230 | { | ||
231 | (*(unsigned long long *)result) = (*(unsigned long long *)a) >> arg; | ||
232 | return (*(unsigned long long *)result) == (*(unsigned long long *)expected); | ||
233 | } | ||
234 | |||
235 | typedef int (*LL_Intrinsic)(void *a, void *b, int arg, void *result, void *expected); | ||
236 | |||
237 | typedef struct | ||
238 | { | ||
239 | const char *operation; | ||
240 | LL_Intrinsic routine; | ||
241 | unsigned long long a, b; | ||
242 | int arg; | ||
243 | unsigned long long expected_result; | ||
244 | } LL_Test; | ||
245 | |||
246 | static LL_Test LL_Tests[] = { | ||
247 | /* UNDEFINED {"_allshl", &TST_allshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 65, 0x0000000000000000ll}, */ | ||
248 | { "_allshl", &TST_allshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 1, 0xFFFFFFFFFFFFFFFEllu }, | ||
249 | { "_allshl", &TST_allshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 32, 0xFFFFFFFF00000000llu }, | ||
250 | { "_allshl", &TST_allshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 33, 0xFFFFFFFE00000000llu }, | ||
251 | { "_allshl", &TST_allshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
252 | |||
253 | { "_allshr", &TST_allshr, 0xAAAAAAAA55555555llu, 0llu, 63, 0xFFFFFFFFFFFFFFFFllu }, | ||
254 | /* UNDEFINED {"_allshr", &TST_allshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 65, 0xFFFFFFFFFFFFFFFFll}, */ | ||
255 | { "_allshr", &TST_allshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 1, 0xFFFFFFFFFFFFFFFFllu }, | ||
256 | { "_allshr", &TST_allshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 32, 0xFFFFFFFFFFFFFFFFllu }, | ||
257 | { "_allshr", &TST_allshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 33, 0xFFFFFFFFFFFFFFFFllu }, | ||
258 | { "_allshr", &TST_allshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
259 | /* UNDEFINED {"_allshr", &TST_allshr, 0x5F5F5F5F5F5F5F5Fllu, 0llu, 65, 0x0000000000000000ll}, */ | ||
260 | { "_allshr", &TST_allshr, 0x5F5F5F5F5F5F5F5Fllu, 0llu, 1, 0x2FAFAFAFAFAFAFAFllu }, | ||
261 | { "_allshr", &TST_allshr, 0x5F5F5F5F5F5F5F5Fllu, 0llu, 32, 0x000000005F5F5F5Fllu }, | ||
262 | { "_allshr", &TST_allshr, 0x5F5F5F5F5F5F5F5Fllu, 0llu, 33, 0x000000002FAFAFAFllu }, | ||
263 | |||
264 | /* UNDEFINED {"_aullshl", &TST_aullshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 65, 0x0000000000000000ll}, */ | ||
265 | { "_aullshl", &TST_aullshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 1, 0xFFFFFFFFFFFFFFFEllu }, | ||
266 | { "_aullshl", &TST_aullshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 32, 0xFFFFFFFF00000000llu }, | ||
267 | { "_aullshl", &TST_aullshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 33, 0xFFFFFFFE00000000llu }, | ||
268 | { "_aullshl", &TST_aullshl, 0xFFFFFFFFFFFFFFFFllu, 0llu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
269 | |||
270 | /* UNDEFINED {"_aullshr", &TST_aullshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 65, 0x0000000000000000ll}, */ | ||
271 | { "_aullshr", &TST_aullshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 1, 0x7FFFFFFFFFFFFFFFllu }, | ||
272 | { "_aullshr", &TST_aullshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 32, 0x00000000FFFFFFFFllu }, | ||
273 | { "_aullshr", &TST_aullshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 33, 0x000000007FFFFFFFllu }, | ||
274 | { "_aullshr", &TST_aullshr, 0xFFFFFFFFFFFFFFFFllu, 0llu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
275 | |||
276 | { "_allmul", &TST_allmul, 0xFFFFFFFFFFFFFFFFllu, 0x0000000000000000llu, 0, 0x0000000000000000llu }, | ||
277 | { "_allmul", &TST_allmul, 0x0000000000000000llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
278 | { "_allmul", &TST_allmul, 0x000000000FFFFFFFllu, 0x0000000000000001llu, 0, 0x000000000FFFFFFFllu }, | ||
279 | { "_allmul", &TST_allmul, 0x0000000000000001llu, 0x000000000FFFFFFFllu, 0, 0x000000000FFFFFFFllu }, | ||
280 | { "_allmul", &TST_allmul, 0x000000000FFFFFFFllu, 0x0000000000000010llu, 0, 0x00000000FFFFFFF0llu }, | ||
281 | { "_allmul", &TST_allmul, 0x0000000000000010llu, 0x000000000FFFFFFFllu, 0, 0x00000000FFFFFFF0llu }, | ||
282 | { "_allmul", &TST_allmul, 0x000000000FFFFFFFllu, 0x0000000000000100llu, 0, 0x0000000FFFFFFF00llu }, | ||
283 | { "_allmul", &TST_allmul, 0x0000000000000100llu, 0x000000000FFFFFFFllu, 0, 0x0000000FFFFFFF00llu }, | ||
284 | { "_allmul", &TST_allmul, 0x000000000FFFFFFFllu, 0x0000000010000000llu, 0, 0x00FFFFFFF0000000llu }, | ||
285 | { "_allmul", &TST_allmul, 0x0000000010000000llu, 0x000000000FFFFFFFllu, 0, 0x00FFFFFFF0000000llu }, | ||
286 | { "_allmul", &TST_allmul, 0x000000000FFFFFFFllu, 0x0000000080000000llu, 0, 0x07FFFFFF80000000llu }, | ||
287 | { "_allmul", &TST_allmul, 0x0000000080000000llu, 0x000000000FFFFFFFllu, 0, 0x07FFFFFF80000000llu }, | ||
288 | { "_allmul", &TST_allmul, 0xFFFFFFFFFFFFFFFEllu, 0x0000000080000000llu, 0, 0xFFFFFFFF00000000llu }, | ||
289 | { "_allmul", &TST_allmul, 0x0000000080000000llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0xFFFFFFFF00000000llu }, | ||
290 | { "_allmul", &TST_allmul, 0xFFFFFFFFFFFFFFFEllu, 0x0000000080000008llu, 0, 0xFFFFFFFEFFFFFFF0llu }, | ||
291 | { "_allmul", &TST_allmul, 0x0000000080000008llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0xFFFFFFFEFFFFFFF0llu }, | ||
292 | { "_allmul", &TST_allmul, 0x00000000FFFFFFFFllu, 0x00000000FFFFFFFFllu, 0, 0xFFFFFFFE00000001llu }, | ||
293 | |||
294 | { "_alldiv", &TST_alldiv, 0x0000000000000000llu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
295 | { "_alldiv", &TST_alldiv, 0x0000000000000000llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
296 | { "_alldiv", &TST_alldiv, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
297 | { "_alldiv", &TST_alldiv, 0xFFFFFFFFFFFFFFFFllu, 0x0000000000000001llu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
298 | { "_alldiv", &TST_alldiv, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
299 | { "_alldiv", &TST_alldiv, 0x0000000000000001llu, 0x0000000000000001llu, 0, 0x0000000000000001llu }, | ||
300 | { "_alldiv", &TST_alldiv, 0xFFFFFFFFFFFFFFFFllu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000001llu }, | ||
301 | { "_alldiv", &TST_alldiv, 0x000000000FFFFFFFllu, 0x0000000000000001llu, 0, 0x000000000FFFFFFFllu }, | ||
302 | { "_alldiv", &TST_alldiv, 0x0000000FFFFFFFFFllu, 0x0000000000000010llu, 0, 0x00000000FFFFFFFFllu }, | ||
303 | { "_alldiv", &TST_alldiv, 0x0000000000000100llu, 0x000000000FFFFFFFllu, 0, 0x0000000000000000llu }, | ||
304 | { "_alldiv", &TST_alldiv, 0x00FFFFFFF0000000llu, 0x0000000010000000llu, 0, 0x000000000FFFFFFFllu }, | ||
305 | { "_alldiv", &TST_alldiv, 0x07FFFFFF80000000llu, 0x0000000080000000llu, 0, 0x000000000FFFFFFFllu }, | ||
306 | { "_alldiv", &TST_alldiv, 0xFFFFFFFFFFFFFFFEllu, 0x0000000080000000llu, 0, 0x0000000000000000llu }, | ||
307 | { "_alldiv", &TST_alldiv, 0xFFFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0x0000000080000008llu }, | ||
308 | { "_alldiv", &TST_alldiv, 0x7FFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0xC000000080000008llu }, | ||
309 | { "_alldiv", &TST_alldiv, 0x7FFFFFFEFFFFFFF0llu, 0x0000FFFFFFFFFFFEllu, 0, 0x0000000000007FFFllu }, | ||
310 | { "_alldiv", &TST_alldiv, 0x7FFFFFFEFFFFFFF0llu, 0x7FFFFFFEFFFFFFF0llu, 0, 0x0000000000000001llu }, | ||
311 | |||
312 | { "_allrem", &TST_allrem, 0x0000000000000000llu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
313 | { "_allrem", &TST_allrem, 0x0000000000000000llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
314 | { "_allrem", &TST_allrem, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
315 | { "_allrem", &TST_allrem, 0xFFFFFFFFFFFFFFFFllu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
316 | { "_allrem", &TST_allrem, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
317 | { "_allrem", &TST_allrem, 0x0000000000000001llu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
318 | { "_allrem", &TST_allrem, 0xFFFFFFFFFFFFFFFFllu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
319 | { "_allrem", &TST_allrem, 0x000000000FFFFFFFllu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
320 | { "_allrem", &TST_allrem, 0x0000000FFFFFFFFFllu, 0x0000000000000010llu, 0, 0x000000000000000Fllu }, | ||
321 | { "_allrem", &TST_allrem, 0x0000000000000100llu, 0x000000000FFFFFFFllu, 0, 0x0000000000000100llu }, | ||
322 | { "_allrem", &TST_allrem, 0x00FFFFFFF0000000llu, 0x0000000010000000llu, 0, 0x0000000000000000llu }, | ||
323 | { "_allrem", &TST_allrem, 0x07FFFFFF80000000llu, 0x0000000080000000llu, 0, 0x0000000000000000llu }, | ||
324 | { "_allrem", &TST_allrem, 0xFFFFFFFFFFFFFFFEllu, 0x0000000080000000llu, 0, 0xFFFFFFFFFFFFFFFEllu }, | ||
325 | { "_allrem", &TST_allrem, 0xFFFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0x0000000000000000llu }, | ||
326 | { "_allrem", &TST_allrem, 0x7FFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0x0000000000000000llu }, | ||
327 | { "_allrem", &TST_allrem, 0x7FFFFFFEFFFFFFF0llu, 0x0000FFFFFFFFFFFEllu, 0, 0x0000FFFF0000FFEEllu }, | ||
328 | { "_allrem", &TST_allrem, 0x7FFFFFFEFFFFFFF0llu, 0x7FFFFFFEFFFFFFF0llu, 0, 0x0000000000000000llu }, | ||
329 | |||
330 | { "_ualldiv", &TST_ualldiv, 0x0000000000000000llu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
331 | { "_ualldiv", &TST_ualldiv, 0x0000000000000000llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
332 | { "_ualldiv", &TST_ualldiv, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
333 | { "_ualldiv", &TST_ualldiv, 0xFFFFFFFFFFFFFFFFllu, 0x0000000000000001llu, 0, 0xFFFFFFFFFFFFFFFFllu }, | ||
334 | { "_ualldiv", &TST_ualldiv, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
335 | { "_ualldiv", &TST_ualldiv, 0x0000000000000001llu, 0x0000000000000001llu, 0, 0x0000000000000001llu }, | ||
336 | { "_ualldiv", &TST_ualldiv, 0xFFFFFFFFFFFFFFFFllu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000001llu }, | ||
337 | { "_ualldiv", &TST_ualldiv, 0x000000000FFFFFFFllu, 0x0000000000000001llu, 0, 0x000000000FFFFFFFllu }, | ||
338 | { "_ualldiv", &TST_ualldiv, 0x0000000FFFFFFFFFllu, 0x0000000000000010llu, 0, 0x00000000FFFFFFFFllu }, | ||
339 | { "_ualldiv", &TST_ualldiv, 0x0000000000000100llu, 0x000000000FFFFFFFllu, 0, 0x0000000000000000llu }, | ||
340 | { "_ualldiv", &TST_ualldiv, 0x00FFFFFFF0000000llu, 0x0000000010000000llu, 0, 0x000000000FFFFFFFllu }, | ||
341 | { "_ualldiv", &TST_ualldiv, 0x07FFFFFF80000000llu, 0x0000000080000000llu, 0, 0x000000000FFFFFFFllu }, | ||
342 | { "_ualldiv", &TST_ualldiv, 0xFFFFFFFFFFFFFFFEllu, 0x0000000080000000llu, 0, 0x00000001FFFFFFFFllu }, | ||
343 | { "_ualldiv", &TST_ualldiv, 0xFFFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0x0000000000000000llu }, | ||
344 | { "_ualldiv", &TST_ualldiv, 0x7FFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0x0000000000000000llu }, | ||
345 | { "_ualldiv", &TST_ualldiv, 0x7FFFFFFEFFFFFFF0llu, 0x0000FFFFFFFFFFFEllu, 0, 0x0000000000007FFFllu }, | ||
346 | { "_ualldiv", &TST_ualldiv, 0x7FFFFFFEFFFFFFF0llu, 0x7FFFFFFEFFFFFFF0llu, 0, 0x0000000000000001llu }, | ||
347 | |||
348 | { "_uallrem", &TST_uallrem, 0x0000000000000000llu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
349 | { "_uallrem", &TST_uallrem, 0x0000000000000000llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
350 | { "_uallrem", &TST_uallrem, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000001llu }, | ||
351 | { "_uallrem", &TST_uallrem, 0xFFFFFFFFFFFFFFFFllu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
352 | { "_uallrem", &TST_uallrem, 0x0000000000000001llu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000001llu }, | ||
353 | { "_uallrem", &TST_uallrem, 0x0000000000000001llu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
354 | { "_uallrem", &TST_uallrem, 0xFFFFFFFFFFFFFFFFllu, 0xFFFFFFFFFFFFFFFFllu, 0, 0x0000000000000000llu }, | ||
355 | { "_uallrem", &TST_uallrem, 0x000000000FFFFFFFllu, 0x0000000000000001llu, 0, 0x0000000000000000llu }, | ||
356 | { "_uallrem", &TST_uallrem, 0x0000000FFFFFFFFFllu, 0x0000000000000010llu, 0, 0x000000000000000Fllu }, | ||
357 | { "_uallrem", &TST_uallrem, 0x0000000000000100llu, 0x000000000FFFFFFFllu, 0, 0x0000000000000100llu }, | ||
358 | { "_uallrem", &TST_uallrem, 0x00FFFFFFF0000000llu, 0x0000000010000000llu, 0, 0x0000000000000000llu }, | ||
359 | { "_uallrem", &TST_uallrem, 0x07FFFFFF80000000llu, 0x0000000080000000llu, 0, 0x0000000000000000llu }, | ||
360 | { "_uallrem", &TST_uallrem, 0xFFFFFFFFFFFFFFFEllu, 0x0000000080000000llu, 0, 0x000000007FFFFFFEllu }, | ||
361 | { "_uallrem", &TST_uallrem, 0xFFFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0xFFFFFFFEFFFFFFF0llu }, | ||
362 | { "_uallrem", &TST_uallrem, 0x7FFFFFFEFFFFFFF0llu, 0xFFFFFFFFFFFFFFFEllu, 0, 0x7FFFFFFEFFFFFFF0llu }, | ||
363 | { "_uallrem", &TST_uallrem, 0x7FFFFFFEFFFFFFF0llu, 0x0000FFFFFFFFFFFEllu, 0, 0x0000FFFF0000FFEEllu }, | ||
364 | { "_uallrem", &TST_uallrem, 0x7FFFFFFEFFFFFFF0llu, 0x7FFFFFFEFFFFFFF0llu, 0, 0x0000000000000000llu }, | ||
365 | |||
366 | { NULL, NULL, 0, 0, 0, 0 } | ||
367 | }; | ||
368 | |||
369 | static int Test64Bit(bool verbose) | ||
370 | { | ||
371 | LL_Test *t; | ||
372 | int failed = 0; | ||
373 | |||
374 | for (t = LL_Tests; t->routine; t++) { | ||
375 | unsigned long long result = 0; | ||
376 | unsigned int *al = (unsigned int *)&t->a; | ||
377 | unsigned int *bl = (unsigned int *)&t->b; | ||
378 | unsigned int *el = (unsigned int *)&t->expected_result; | ||
379 | unsigned int *rl = (unsigned int *)&result; | ||
380 | |||
381 | if (!t->routine(&t->a, &t->b, t->arg, &result, &t->expected_result)) { | ||
382 | if (verbose) { | ||
383 | SDL_Log("%s(0x%08X%08X, 0x%08X%08X, %3d, produced: 0x%08X%08X, expected: 0x%08X%08X", t->operation, al[1], al[0], bl[1], bl[0], | ||
384 | t->arg, rl[1], rl[0], el[1], el[0]); | ||
385 | } | ||
386 | ++failed; | ||
387 | } | ||
388 | } | ||
389 | if (verbose && (failed == 0)) { | ||
390 | SDL_Log("All 64bit intrinsic tests passed"); | ||
391 | } | ||
392 | return failed ? 1 : 0; | ||
393 | } | ||
394 | |||
395 | static int TestCPUInfo(bool verbose) | ||
396 | { | ||
397 | if (verbose) { | ||
398 | SDL_Log("Number of logical CPU cores: %d", SDL_GetNumLogicalCPUCores()); | ||
399 | SDL_Log("CPU cache line size: %d", SDL_GetCPUCacheLineSize()); | ||
400 | SDL_Log("AltiVec %s", SDL_HasAltiVec() ? "detected" : "not detected"); | ||
401 | SDL_Log("MMX %s", SDL_HasMMX() ? "detected" : "not detected"); | ||
402 | SDL_Log("SSE %s", SDL_HasSSE() ? "detected" : "not detected"); | ||
403 | SDL_Log("SSE2 %s", SDL_HasSSE2() ? "detected" : "not detected"); | ||
404 | SDL_Log("SSE3 %s", SDL_HasSSE3() ? "detected" : "not detected"); | ||
405 | SDL_Log("SSE4.1 %s", SDL_HasSSE41() ? "detected" : "not detected"); | ||
406 | SDL_Log("SSE4.2 %s", SDL_HasSSE42() ? "detected" : "not detected"); | ||
407 | SDL_Log("AVX %s", SDL_HasAVX() ? "detected" : "not detected"); | ||
408 | SDL_Log("AVX2 %s", SDL_HasAVX2() ? "detected" : "not detected"); | ||
409 | SDL_Log("AVX-512F %s", SDL_HasAVX512F() ? "detected" : "not detected"); | ||
410 | SDL_Log("ARM SIMD %s", SDL_HasARMSIMD() ? "detected" : "not detected"); | ||
411 | SDL_Log("NEON %s", SDL_HasNEON() ? "detected" : "not detected"); | ||
412 | SDL_Log("LSX %s", SDL_HasLSX() ? "detected" : "not detected"); | ||
413 | SDL_Log("LASX %s", SDL_HasLASX() ? "detected" : "not detected"); | ||
414 | SDL_Log("System RAM %d MB", SDL_GetSystemRAM()); | ||
415 | } | ||
416 | return 0; | ||
417 | } | ||
418 | |||
419 | static int TestAssertions(bool verbose) | ||
420 | { | ||
421 | SDL_assert(1); | ||
422 | SDL_assert_release(1); | ||
423 | SDL_assert_paranoid(1); | ||
424 | SDL_assert(0 || 1); | ||
425 | SDL_assert_release(0 || 1); | ||
426 | SDL_assert_paranoid(0 || 1); | ||
427 | |||
428 | #if 0 /* enable this to test assertion failures. */ | ||
429 | SDL_assert_release(1 == 2); | ||
430 | SDL_assert_release(5 < 4); | ||
431 | SDL_assert_release(0 && "This is a test"); | ||
432 | #endif | ||
433 | |||
434 | { | ||
435 | const SDL_AssertData *item = SDL_GetAssertionReport(); | ||
436 | while (item) { | ||
437 | SDL_Log("'%s', %s (%s:%d), triggered %u times, always ignore: %s.", | ||
438 | item->condition, item->function, item->filename, | ||
439 | item->linenum, item->trigger_count, | ||
440 | item->always_ignore ? "yes" : "no"); | ||
441 | item = item->next; | ||
442 | } | ||
443 | } | ||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | int main(int argc, char *argv[]) | ||
448 | { | ||
449 | int i; | ||
450 | bool verbose = true; | ||
451 | int status = 0; | ||
452 | SDLTest_CommonState *state; | ||
453 | |||
454 | /* Initialize test framework */ | ||
455 | state = SDLTest_CommonCreateState(argv, 0); | ||
456 | if (!state) { | ||
457 | return 1; | ||
458 | } | ||
459 | |||
460 | /* Parse commandline */ | ||
461 | for (i = 1; i < argc;) { | ||
462 | int consumed; | ||
463 | |||
464 | consumed = SDLTest_CommonArg(state, i); | ||
465 | if (!consumed) { | ||
466 | if (SDL_strcmp(argv[i], "-q") == 0) { | ||
467 | verbose = false; | ||
468 | consumed = 1; | ||
469 | } | ||
470 | } | ||
471 | if (consumed <= 0) { | ||
472 | static const char *options[] = { "[-q]", NULL }; | ||
473 | SDLTest_CommonLogUsage(state, argv[0], options); | ||
474 | return 1; | ||
475 | } | ||
476 | |||
477 | i += consumed; | ||
478 | } | ||
479 | |||
480 | if (verbose) { | ||
481 | SDL_Log("This system is running %s", SDL_GetPlatform()); | ||
482 | } | ||
483 | |||
484 | status += TestTypes(verbose); | ||
485 | status += TestEndian(verbose); | ||
486 | status += Test64Bit(verbose); | ||
487 | status += TestCPUInfo(verbose); | ||
488 | status += TestAssertions(verbose); | ||
489 | |||
490 | SDL_Quit(); | ||
491 | SDLTest_CommonDestroyState(state); | ||
492 | |||
493 | return status; | ||
494 | } | ||