diff options
Diffstat (limited to 'contrib/SDL-3.2.8/test/testplatform.c')
| -rw-r--r-- | contrib/SDL-3.2.8/test/testplatform.c | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/test/testplatform.c b/contrib/SDL-3.2.8/test/testplatform.c new file mode 100644 index 0000000..c1eb6aa --- /dev/null +++ b/contrib/SDL-3.2.8/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 | } | ||
