Atlas - testplatform.c
Home / ext / SDL / test Lines: 1 | Size: 23883 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Copyright (C) 1997-2025 Sam Lantinga <[email protected]> 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 */ 21static int 22badsize(size_t sizeoftype, size_t hardcodetype) 23{ 24 return sizeoftype != hardcodetype; 25} 26 27SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT8, SDL_MAX_SINT8 == 127); 28SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT8, SDL_MIN_SINT8 == -128); 29SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT8, SDL_MAX_UINT8 == 255); 30SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT8, SDL_MIN_UINT8 == 0); 31 32SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT16, SDL_MAX_SINT16 == 32767); 33SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT16, SDL_MIN_SINT16 == -32768); 34SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT16, SDL_MAX_UINT16 == 65535); 35SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT16, SDL_MIN_UINT16 == 0); 36 37SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT32, SDL_MAX_SINT32 == 2147483647); 38SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT32, SDL_MIN_SINT32 == ~0x7fffffff); /* Instead of -2147483648, which is treated as unsigned by some compilers */ 39SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT32, SDL_MAX_UINT32 == 4294967295u); 40SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT32, SDL_MIN_UINT32 == 0); 41 42SDL_COMPILE_TIME_ASSERT(SDL_MAX_SINT64, SDL_MAX_SINT64 == INT64_C(9223372036854775807)); 43SDL_COMPILE_TIME_ASSERT(SDL_MIN_SINT64, SDL_MIN_SINT64 == ~INT64_C(0x7fffffffffffffff)); /* Instead of -9223372036854775808, which is treated as unsigned by compilers */ 44SDL_COMPILE_TIME_ASSERT(SDL_MAX_UINT64, SDL_MAX_UINT64 == UINT64_C(18446744073709551615)); 45SDL_COMPILE_TIME_ASSERT(SDL_MIN_UINT64, SDL_MIN_UINT64 == 0); 46 47static 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 88static 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 181static 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 187static 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 193static 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 199static 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 205static 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 211static 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 217static 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 223static 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 229static 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 235typedef int (*LL_Intrinsic)(void *a, void *b, int arg, void *result, void *expected); 236 237typedef 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 246static 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 369static 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 395static 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 SDL_Log("System memory page size %d bytes", SDL_GetSystemPageSize()); 416 } 417 return 0; 418} 419 420static int TestAssertions(bool verbose) 421{ 422 SDL_assert(1); 423 SDL_assert_release(1); 424 SDL_assert_paranoid(1); 425 SDL_assert(0 || 1); 426 SDL_assert_release(0 || 1); 427 SDL_assert_paranoid(0 || 1); 428 429#if 0 /* enable this to test assertion failures. */ 430 SDL_assert_release(1 == 2); 431 SDL_assert_release(5 < 4); 432 SDL_assert_release(0 && "This is a test"); 433#endif 434 435 { 436 const SDL_AssertData *item = SDL_GetAssertionReport(); 437 while (item) { 438 SDL_Log("'%s', %s (%s:%d), triggered %u times, always ignore: %s.", 439 item->condition, item->function, item->filename, 440 item->linenum, item->trigger_count, 441 item->always_ignore ? "yes" : "no"); 442 item = item->next; 443 } 444 } 445 return 0; 446} 447 448int main(int argc, char *argv[]) 449{ 450 int i; 451 bool verbose = true; 452 int status = 0; 453 SDLTest_CommonState *state; 454 455 /* Initialize test framework */ 456 state = SDLTest_CommonCreateState(argv, 0); 457 if (!state) { 458 return 1; 459 } 460 461 /* Parse commandline */ 462 for (i = 1; i < argc;) { 463 int consumed; 464 465 consumed = SDLTest_CommonArg(state, i); 466 if (!consumed) { 467 if (SDL_strcmp(argv[i], "-q") == 0) { 468 verbose = false; 469 consumed = 1; 470 } 471 } 472 if (consumed <= 0) { 473 static const char *options[] = { "[-q]", NULL }; 474 SDLTest_CommonLogUsage(state, argv[0], options); 475 return 1; 476 } 477 478 i += consumed; 479 } 480 481 if (verbose) { 482 SDL_Log("This system is running %s", SDL_GetPlatform()); 483 } 484 485 status += TestTypes(verbose); 486 status += TestEndian(verbose); 487 status += Test64Bit(verbose); 488 status += TestCPUInfo(verbose); 489 status += TestAssertions(verbose); 490 491 SDL_Quit(); 492 SDLTest_CommonDestroyState(state); 493 494 return status; 495} 496[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.