SDL  2.0
SDL_cpuinfo.c File Reference
#include "../SDL_internal.h"
#include "SDL_cpuinfo.h"
+ Include dependency graph for SDL_cpuinfo.c:

Go to the source code of this file.

Macros

#define CPU_HAS_RDTSC   0x00000001
 
#define CPU_HAS_ALTIVEC   0x00000002
 
#define CPU_HAS_MMX   0x00000004
 
#define CPU_HAS_3DNOW   0x00000008
 
#define CPU_HAS_SSE   0x00000010
 
#define CPU_HAS_SSE2   0x00000020
 
#define CPU_HAS_SSE3   0x00000040
 
#define CPU_HAS_SSE41   0x00000100
 
#define CPU_HAS_SSE42   0x00000200
 
#define CPU_HAS_AVX   0x00000400
 
#define CPU_HAS_AVX2   0x00000800
 
#define CPU_HAS_NEON   0x00001000
 
#define cpuid(func, a, b, c, d)   do { a = b = c = d = 0; (void) a; (void) b; (void) c; (void) d; } while (0)
 
#define CPU_haveRDTSC()   (CPU_CPUIDFeatures[3] & 0x00000010)
 
#define CPU_haveMMX()   (CPU_CPUIDFeatures[3] & 0x00800000)
 
#define CPU_haveSSE()   (CPU_CPUIDFeatures[3] & 0x02000000)
 
#define CPU_haveSSE2()   (CPU_CPUIDFeatures[3] & 0x04000000)
 
#define CPU_haveSSE3()   (CPU_CPUIDFeatures[2] & 0x00000001)
 
#define CPU_haveSSE41()   (CPU_CPUIDFeatures[2] & 0x00080000)
 
#define CPU_haveSSE42()   (CPU_CPUIDFeatures[2] & 0x00100000)
 
#define CPU_haveAVX()   (CPU_OSSavesYMM && (CPU_CPUIDFeatures[2] & 0x10000000))
 
#define CPU_FEATURE_AVAILABLE(f)   ((SDL_GetCPUFeatures() & f) ? SDL_TRUE : SDL_FALSE)
 

Functions

static int CPU_haveCPUID (void)
 
static void CPU_calcCPUIDFeatures (void)
 
static int CPU_haveAltiVec (void)
 
static int CPU_haveNEON (void)
 
static int CPU_have3DNow (void)
 
static int CPU_haveAVX2 (void)
 
int SDL_GetCPUCount (void)
 
static const char * SDL_GetCPUType (void)
 
int SDL_GetCPUCacheLineSize (void)
 
static Uint32 SDL_GetCPUFeatures (void)
 
SDL_bool SDL_HasRDTSC (void)
 
SDL_bool SDL_HasAltiVec (void)
 
SDL_bool SDL_HasMMX (void)
 
SDL_bool SDL_Has3DNow (void)
 
SDL_bool SDL_HasSSE (void)
 
SDL_bool SDL_HasSSE2 (void)
 
SDL_bool SDL_HasSSE3 (void)
 
SDL_bool SDL_HasSSE41 (void)
 
SDL_bool SDL_HasSSE42 (void)
 
SDL_bool SDL_HasAVX (void)
 
SDL_bool SDL_HasAVX2 (void)
 
SDL_bool SDL_HasNEON (void)
 
int SDL_GetSystemRAM (void)
 

Variables

static int CPU_CPUIDFeatures [4]
 
static int CPU_CPUIDMaxFunction = 0
 
static SDL_bool CPU_OSSavesYMM = SDL_FALSE
 
static int SDL_CPUCount = 0
 
static Uint32 SDL_CPUFeatures = 0xFFFFFFFF
 
static int SDL_SystemRAM = 0
 

Macro Definition Documentation

◆ CPU_FEATURE_AVAILABLE

◆ CPU_HAS_3DNOW

#define CPU_HAS_3DNOW   0x00000008

Definition at line 82 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_Has3DNow().

◆ CPU_HAS_ALTIVEC

#define CPU_HAS_ALTIVEC   0x00000002

Definition at line 80 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasAltiVec().

◆ CPU_HAS_AVX

#define CPU_HAS_AVX   0x00000400

Definition at line 88 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasAVX().

◆ CPU_HAS_AVX2

#define CPU_HAS_AVX2   0x00000800

Definition at line 89 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasAVX2().

◆ CPU_HAS_MMX

#define CPU_HAS_MMX   0x00000004

Definition at line 81 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasMMX().

◆ CPU_HAS_NEON

#define CPU_HAS_NEON   0x00001000

Definition at line 90 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasNEON().

◆ CPU_HAS_RDTSC

#define CPU_HAS_RDTSC   0x00000001

Definition at line 79 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasRDTSC().

◆ CPU_HAS_SSE

#define CPU_HAS_SSE   0x00000010

Definition at line 83 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasSSE().

◆ CPU_HAS_SSE2

#define CPU_HAS_SSE2   0x00000020

Definition at line 84 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasSSE2().

◆ CPU_HAS_SSE3

#define CPU_HAS_SSE3   0x00000040

Definition at line 85 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasSSE3().

◆ CPU_HAS_SSE41

#define CPU_HAS_SSE41   0x00000100

Definition at line 86 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasSSE41().

◆ CPU_HAS_SSE42

#define CPU_HAS_SSE42   0x00000200

Definition at line 87 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures(), and SDL_HasSSE42().

◆ CPU_haveAVX

#define CPU_haveAVX ( )    (CPU_OSSavesYMM && (CPU_CPUIDFeatures[2] & 0x10000000))

Definition at line 389 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ CPU_haveMMX

#define CPU_haveMMX ( )    (CPU_CPUIDFeatures[3] & 0x00800000)

Definition at line 383 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ CPU_haveRDTSC

#define CPU_haveRDTSC ( )    (CPU_CPUIDFeatures[3] & 0x00000010)

Definition at line 382 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ CPU_haveSSE

#define CPU_haveSSE ( )    (CPU_CPUIDFeatures[3] & 0x02000000)

Definition at line 384 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ CPU_haveSSE2

#define CPU_haveSSE2 ( )    (CPU_CPUIDFeatures[3] & 0x04000000)

Definition at line 385 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ CPU_haveSSE3

#define CPU_haveSSE3 ( )    (CPU_CPUIDFeatures[2] & 0x00000001)

Definition at line 386 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ CPU_haveSSE41

#define CPU_haveSSE41 ( )    (CPU_CPUIDFeatures[2] & 0x00080000)

Definition at line 387 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ CPU_haveSSE42

#define CPU_haveSSE42 ( )    (CPU_CPUIDFeatures[2] & 0x00100000)

Definition at line 388 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ cpuid

#define cpuid (   func,
  a,
  b,
  c,
  d 
)    do { a = b = c = d = 0; (void) a; (void) b; (void) c; (void) d; } while (0)

Function Documentation

◆ CPU_calcCPUIDFeatures()

static void CPU_calcCPUIDFeatures ( void  )
static

Definition at line 251 of file SDL_cpuinfo.c.

References CPU_CPUIDFeatures, CPU_CPUIDMaxFunction, CPU_haveCPUID(), CPU_OSSavesYMM, cpuid, d, SDL_FALSE, and SDL_TRUE.

Referenced by SDL_GetCPUFeatures(), and SDL_GetCPUType().

252 {
253  static SDL_bool checked = SDL_FALSE;
254  if (!checked) {
255  checked = SDL_TRUE;
256  if (CPU_haveCPUID()) {
257  int a, b, c, d;
258  cpuid(0, a, b, c, d);
260  if (CPU_CPUIDMaxFunction >= 1) {
261  cpuid(1, a, b, c, d);
262  CPU_CPUIDFeatures[0] = a;
263  CPU_CPUIDFeatures[1] = b;
264  CPU_CPUIDFeatures[2] = c;
265  CPU_CPUIDFeatures[3] = d;
266 
267  /* Check to make sure we can call xgetbv */
268  if (c & 0x08000000) {
269  /* Call xgetbv to see if YMM register state is saved */
270 #if defined(__GNUC__) && (defined(i386) || defined(__x86_64__))
271  __asm__(".byte 0x0f, 0x01, 0xd0" : "=a" (a) : "c" (0) : "%edx");
272 #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) && (_MSC_FULL_VER >= 160040219) /* VS2010 SP1 */
273  a = (int)_xgetbv(0);
274 #elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
275  __asm
276  {
277  xor ecx, ecx
278  _asm _emit 0x0f _asm _emit 0x01 _asm _emit 0xd0
279  mov a, eax
280  }
281 #endif
282  CPU_OSSavesYMM = ((a & 6) == 6) ? SDL_TRUE : SDL_FALSE;
283  }
284  }
285  }
286  }
287 }
static SDL_bool CPU_OSSavesYMM
Definition: SDL_cpuinfo.c:248
static int CPU_CPUIDMaxFunction
Definition: SDL_cpuinfo.c:247
static int CPU_haveCPUID(void)
Definition: SDL_cpuinfo.c:105
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
const GLubyte * c
#define cpuid(func, a, b, c, d)
Definition: SDL_cpuinfo.c:242
SDL_bool
Definition: SDL_stdinc.h:139
static int CPU_CPUIDFeatures[4]
Definition: SDL_cpuinfo.c:246
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean GLboolean b

◆ CPU_have3DNow()

static int CPU_have3DNow ( void  )
static

Definition at line 369 of file SDL_cpuinfo.c.

References CPU_CPUIDMaxFunction, cpuid, and d.

Referenced by SDL_GetCPUFeatures().

370 {
371  if (CPU_CPUIDMaxFunction > 0) { /* that is, do we have CPUID at all? */
372  int a, b, c, d;
373  cpuid(0x80000000, a, b, c, d);
374  if (a >= 0x80000001) {
375  cpuid(0x80000001, a, b, c, d);
376  return (d & 0x80000000);
377  }
378  }
379  return 0;
380 }
static int CPU_CPUIDMaxFunction
Definition: SDL_cpuinfo.c:247
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
const GLubyte * c
#define cpuid(func, a, b, c, d)
Definition: SDL_cpuinfo.c:242
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean GLboolean b

◆ CPU_haveAltiVec()

static int CPU_haveAltiVec ( void  )
static

Definition at line 290 of file SDL_cpuinfo.c.

References NULL, and void.

Referenced by SDL_GetCPUFeatures().

291 {
292  volatile int altivec = 0;
293 #ifndef SDL_CPUINFO_DISABLED
294 #if (defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))) || (defined(__OpenBSD__) && defined(__powerpc__))
295 #ifdef __OpenBSD__
296  int selectors[2] = { CTL_MACHDEP, CPU_ALTIVEC };
297 #else
298  int selectors[2] = { CTL_HW, HW_VECTORUNIT };
299 #endif
300  int hasVectorUnit = 0;
301  size_t length = sizeof(hasVectorUnit);
302  int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0);
303  if (0 == error)
304  altivec = (hasVectorUnit != 0);
305 #elif SDL_ALTIVEC_BLITTERS && HAVE_SETJMP
306  void (*handler) (int sig);
307  handler = signal(SIGILL, illegal_instruction);
308  if (setjmp(jmpbuf) == 0) {
309  asm volatile ("mtspr 256, %0\n\t" "vand %%v0, %%v0, %%v0"::"r" (-1));
310  altivec = 1;
311  }
312  signal(SIGILL, handler);
313 #endif
314 #endif
315  return altivec;
316 }
#define NULL
Definition: begin_code.h:164
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
GLuint GLsizei GLsizei * length

◆ CPU_haveAVX2()

static int CPU_haveAVX2 ( void  )
static

Definition at line 392 of file SDL_cpuinfo.c.

References CPU_CPUIDMaxFunction, CPU_OSSavesYMM, cpuid, d, and void.

Referenced by SDL_GetCPUFeatures().

393 {
394  if (CPU_OSSavesYMM && (CPU_CPUIDMaxFunction >= 7)) {
395  int a, b, c, d;
396  (void) a; (void) b; (void) c; (void) d; /* compiler warnings... */
397  cpuid(7, a, b, c, d);
398  return (b & 0x00000020);
399  }
400  return 0;
401 }
static SDL_bool CPU_OSSavesYMM
Definition: SDL_cpuinfo.c:248
static int CPU_CPUIDMaxFunction
Definition: SDL_cpuinfo.c:247
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
const GLubyte * c
#define cpuid(func, a, b, c, d)
Definition: SDL_cpuinfo.c:242
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean GLboolean b

◆ CPU_haveCPUID()

static int CPU_haveCPUID ( void  )
static

Definition at line 105 of file SDL_cpuinfo.c.

References done, and pop.

Referenced by CPU_calcCPUIDFeatures().

106 {
107  int has_CPUID = 0;
108 
109 /* *INDENT-OFF* */
110 #ifndef SDL_CPUINFO_DISABLED
111 #if defined(__GNUC__) && defined(i386)
112  __asm__ (
113 " pushfl # Get original EFLAGS \n"
114 " popl %%eax \n"
115 " movl %%eax,%%ecx \n"
116 " xorl $0x200000,%%eax # Flip ID bit in EFLAGS \n"
117 " pushl %%eax # Save new EFLAGS value on stack \n"
118 " popfl # Replace current EFLAGS value \n"
119 " pushfl # Get new EFLAGS \n"
120 " popl %%eax # Store new EFLAGS in EAX \n"
121 " xorl %%ecx,%%eax # Can not toggle ID bit, \n"
122 " jz 1f # Processor=80486 \n"
123 " movl $1,%0 # We have CPUID support \n"
124 "1: \n"
125  : "=m" (has_CPUID)
126  :
127  : "%eax", "%ecx"
128  );
129 #elif defined(__GNUC__) && defined(__x86_64__)
130 /* Technically, if this is being compiled under __x86_64__ then it has
131  CPUid by definition. But it's nice to be able to prove it. :) */
132  __asm__ (
133 " pushfq # Get original EFLAGS \n"
134 " popq %%rax \n"
135 " movq %%rax,%%rcx \n"
136 " xorl $0x200000,%%eax # Flip ID bit in EFLAGS \n"
137 " pushq %%rax # Save new EFLAGS value on stack \n"
138 " popfq # Replace current EFLAGS value \n"
139 " pushfq # Get new EFLAGS \n"
140 " popq %%rax # Store new EFLAGS in EAX \n"
141 " xorl %%ecx,%%eax # Can not toggle ID bit, \n"
142 " jz 1f # Processor=80486 \n"
143 " movl $1,%0 # We have CPUID support \n"
144 "1: \n"
145  : "=m" (has_CPUID)
146  :
147  : "%rax", "%rcx"
148  );
149 #elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
150  __asm {
151  pushfd ; Get original EFLAGS
152  pop eax
153  mov ecx, eax
154  xor eax, 200000h ; Flip ID bit in EFLAGS
155  push eax ; Save new EFLAGS value on stack
156  popfd ; Replace current EFLAGS value
157  pushfd ; Get new EFLAGS
158  pop eax ; Store new EFLAGS in EAX
159  xor eax, ecx ; Can not toggle ID bit,
160  jz done ; Processor=80486
161  mov has_CPUID,1 ; We have CPUID support
162 done:
163  }
164 #elif defined(_MSC_VER) && defined(_M_X64)
165  has_CPUID = 1;
166 #elif defined(__sun) && defined(__i386)
167  __asm (
168 " pushfl \n"
169 " popl %eax \n"
170 " movl %eax,%ecx \n"
171 " xorl $0x200000,%eax \n"
172 " pushl %eax \n"
173 " popfl \n"
174 " pushfl \n"
175 " popl %eax \n"
176 " xorl %ecx,%eax \n"
177 " jz 1f \n"
178 " movl $1,-8(%ebp) \n"
179 "1: \n"
180  );
181 #elif defined(__sun) && defined(__amd64)
182  __asm (
183 " pushfq \n"
184 " popq %rax \n"
185 " movq %rax,%rcx \n"
186 " xorl $0x200000,%eax \n"
187 " pushq %rax \n"
188 " popfq \n"
189 " pushfq \n"
190 " popq %rax \n"
191 " xorl %ecx,%eax \n"
192 " jz 1f \n"
193 " movl $1,-8(%rbp) \n"
194 "1: \n"
195  );
196 #endif
197 #endif
198 /* *INDENT-ON* */
199  return has_CPUID;
200 }
GLfloat GLfloat GLfloat GLfloat h
#define pop
Definition: SDL_qsort.c:192
int done
Definition: checkkeys.c:28
GLsizei const GLfloat * value
GLuint in

◆ CPU_haveNEON()

static int CPU_haveNEON ( void  )
static

Definition at line 340 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

341 {
342 /* The way you detect NEON is a privileged instruction on ARM, so you have
343  query the OS kernel in a platform-specific way. :/ */
344 #if defined(SDL_CPUINFO_DISABLED) || !defined(__ARM_ARCH)
345  return 0; /* disabled or not an ARM CPU at all. */
346 #elif __ARM_ARCH >= 8
347  return 1; /* ARMv8 always has non-optional NEON support. */
348 #elif defined(__APPLE__) && (__ARM_ARCH >= 7)
349  /* (note that sysctlbyname("hw.optional.neon") doesn't work!) */
350  return 1; /* all Apple ARMv7 chips and later have NEON. */
351 #elif defined(__APPLE__)
352  return 0; /* assume anything else from Apple doesn't have NEON. */
353 #elif defined(__QNXNTO__)
354  return SYSPAGE_ENTRY(cpuinfo)->flags & ARM_CPU_FLAG_NEON;
355 #elif (defined(__LINUX__) || defined(__ANDROID__)) && defined(HAVE_GETAUXVAL)
356  return ((getauxval(AT_HWCAP) & HWCAP_NEON) == HWCAP_NEON);
357 #elif (defined(__LINUX__) || defined(__ANDROID__))
358  return readProcAuxvForNeon(); /* Android offers a static library for this, but it just parses /proc/self/auxv */
359 #elif (defined(__WINDOWS__) || defined(__WINRT__)) && defined(_M_ARM)
360  /* All WinRT ARM devices are required to support NEON, but just in case. */
361  return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) != 0;
362 #else
363 #warning SDL_HasNEON is not implemented for this ARM platform. Write me.
364  return 0;
365 #endif
366 }

◆ SDL_GetCPUCacheLineSize()

int SDL_GetCPUCacheLineSize ( void  )

This function returns the L1 cache line size of the CPU

This is useful for determining multi-threaded structure padding or SIMD prefetch sizes.

Definition at line 556 of file SDL_cpuinfo.c.

References cpuid, d, SDL_CACHELINE_SIZE, SDL_GetCPUType(), SDL_strcmp, and void.

Referenced by SDL_GetSystemRAM().

557 {
558  const char *cpuType = SDL_GetCPUType();
559  int a, b, c, d;
560  (void) a; (void) b; (void) c; (void) d;
561  if (SDL_strcmp(cpuType, "GenuineIntel") == 0) {
562  cpuid(0x00000001, a, b, c, d);
563  return (((b >> 8) & 0xff) * 8);
564  } else if (SDL_strcmp(cpuType, "AuthenticAMD") == 0) {
565  cpuid(0x80000005, a, b, c, d);
566  return (c & 0xff);
567  } else {
568  /* Just make a guess here... */
569  return SDL_CACHELINE_SIZE;
570  }
571 }
static const char * SDL_GetCPUType(void)
Definition: SDL_cpuinfo.c:445
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
#define SDL_CACHELINE_SIZE
Definition: SDL_cpuinfo.h:92
const GLubyte * c
#define cpuid(func, a, b, c, d)
Definition: SDL_cpuinfo.c:242
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
#define SDL_strcmp
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean GLboolean b

◆ SDL_GetCPUCount()

int SDL_GetCPUCount ( void  )

This function returns the number of CPU cores available.

Definition at line 406 of file SDL_cpuinfo.c.

References NULL, and SDL_CPUCount.

Referenced by SDL_GetSystemRAM().

407 {
408  if (!SDL_CPUCount) {
409 #ifndef SDL_CPUINFO_DISABLED
410 #if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
411  if (SDL_CPUCount <= 0) {
412  SDL_CPUCount = (int)sysconf(_SC_NPROCESSORS_ONLN);
413  }
414 #endif
415 #ifdef HAVE_SYSCTLBYNAME
416  if (SDL_CPUCount <= 0) {
417  size_t size = sizeof(SDL_CPUCount);
418  sysctlbyname("hw.ncpu", &SDL_CPUCount, &size, NULL, 0);
419  }
420 #endif
421 #ifdef __WIN32__
422  if (SDL_CPUCount <= 0) {
423  SYSTEM_INFO info;
424  GetSystemInfo(&info);
425  SDL_CPUCount = info.dwNumberOfProcessors;
426  }
427 #endif
428 #ifdef __OS2__
429  if (SDL_CPUCount <= 0) {
430  DosQuerySysInfo(QSV_NUMPROCESSORS, QSV_NUMPROCESSORS,
431  &SDL_CPUCount, sizeof(SDL_CPUCount) );
432  }
433 #endif
434 #endif
435  /* There has to be at least 1, right? :) */
436  if (SDL_CPUCount <= 0) {
437  SDL_CPUCount = 1;
438  }
439  }
440  return SDL_CPUCount;
441 }
GLsizeiptr size
#define NULL
Definition: begin_code.h:164
static int SDL_CPUCount
Definition: SDL_cpuinfo.c:403

◆ SDL_GetCPUFeatures()

static Uint32 SDL_GetCPUFeatures ( void  )
static

Definition at line 576 of file SDL_cpuinfo.c.

References CPU_calcCPUIDFeatures(), CPU_HAS_3DNOW, CPU_HAS_ALTIVEC, CPU_HAS_AVX, CPU_HAS_AVX2, CPU_HAS_MMX, CPU_HAS_NEON, CPU_HAS_RDTSC, CPU_HAS_SSE, CPU_HAS_SSE2, CPU_HAS_SSE3, CPU_HAS_SSE41, CPU_HAS_SSE42, CPU_have3DNow(), CPU_haveAltiVec(), CPU_haveAVX, CPU_haveAVX2(), CPU_haveMMX, CPU_haveNEON(), CPU_haveRDTSC, CPU_haveSSE, CPU_haveSSE2, CPU_haveSSE3, CPU_haveSSE41, CPU_haveSSE42, and SDL_CPUFeatures.

577 {
578  if (SDL_CPUFeatures == 0xFFFFFFFF) {
580  SDL_CPUFeatures = 0;
581  if (CPU_haveRDTSC()) {
583  }
584  if (CPU_haveAltiVec()) {
586  }
587  if (CPU_haveMMX()) {
589  }
590  if (CPU_have3DNow()) {
592  }
593  if (CPU_haveSSE()) {
595  }
596  if (CPU_haveSSE2()) {
598  }
599  if (CPU_haveSSE3()) {
601  }
602  if (CPU_haveSSE41()) {
604  }
605  if (CPU_haveSSE42()) {
607  }
608  if (CPU_haveAVX()) {
610  }
611  if (CPU_haveAVX2()) {
613  }
614  if (CPU_haveNEON()) {
616  }
617  }
618  return SDL_CPUFeatures;
619 }
#define CPU_haveSSE2()
Definition: SDL_cpuinfo.c:385
#define CPU_haveAVX()
Definition: SDL_cpuinfo.c:389
#define CPU_HAS_SSE41
Definition: SDL_cpuinfo.c:86
#define CPU_HAS_RDTSC
Definition: SDL_cpuinfo.c:79
#define CPU_HAS_SSE3
Definition: SDL_cpuinfo.c:85
static void CPU_calcCPUIDFeatures(void)
Definition: SDL_cpuinfo.c:251
#define CPU_HAS_SSE2
Definition: SDL_cpuinfo.c:84
static int CPU_have3DNow(void)
Definition: SDL_cpuinfo.c:369
#define CPU_haveRDTSC()
Definition: SDL_cpuinfo.c:382
#define CPU_HAS_ALTIVEC
Definition: SDL_cpuinfo.c:80
#define CPU_haveMMX()
Definition: SDL_cpuinfo.c:383
static int CPU_haveAltiVec(void)
Definition: SDL_cpuinfo.c:290
#define CPU_HAS_AVX
Definition: SDL_cpuinfo.c:88
#define CPU_haveSSE42()
Definition: SDL_cpuinfo.c:388
#define CPU_HAS_NEON
Definition: SDL_cpuinfo.c:90
#define CPU_haveSSE3()
Definition: SDL_cpuinfo.c:386
static Uint32 SDL_CPUFeatures
Definition: SDL_cpuinfo.c:573
#define CPU_HAS_SSE
Definition: SDL_cpuinfo.c:83
static int CPU_haveAVX2(void)
Definition: SDL_cpuinfo.c:392
#define CPU_HAS_AVX2
Definition: SDL_cpuinfo.c:89
static int CPU_haveNEON(void)
Definition: SDL_cpuinfo.c:340
#define CPU_haveSSE()
Definition: SDL_cpuinfo.c:384
#define CPU_HAS_MMX
Definition: SDL_cpuinfo.c:81
#define CPU_haveSSE41()
Definition: SDL_cpuinfo.c:387
#define CPU_HAS_SSE42
Definition: SDL_cpuinfo.c:87
#define CPU_HAS_3DNOW
Definition: SDL_cpuinfo.c:82

◆ SDL_GetCPUType()

static const char* SDL_GetCPUType ( void  )
static

Definition at line 445 of file SDL_cpuinfo.c.

References CPU_calcCPUIDFeatures(), CPU_CPUIDMaxFunction, cpuid, d, i, SDL_strlcpy, and void.

Referenced by SDL_GetCPUCacheLineSize(), and SDL_GetSystemRAM().

446 {
447  static char SDL_CPUType[13];
448 
449  if (!SDL_CPUType[0]) {
450  int i = 0;
451 
453  if (CPU_CPUIDMaxFunction > 0) { /* do we have CPUID at all? */
454  int a, b, c, d;
455  cpuid(0x00000000, a, b, c, d);
456  (void) a;
457  SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
458  SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
459  SDL_CPUType[i++] = (char)(b & 0xff); b >>= 8;
460  SDL_CPUType[i++] = (char)(b & 0xff);
461 
462  SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
463  SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
464  SDL_CPUType[i++] = (char)(d & 0xff); d >>= 8;
465  SDL_CPUType[i++] = (char)(d & 0xff);
466 
467  SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
468  SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
469  SDL_CPUType[i++] = (char)(c & 0xff); c >>= 8;
470  SDL_CPUType[i++] = (char)(c & 0xff);
471  }
472  if (!SDL_CPUType[0]) {
473  SDL_strlcpy(SDL_CPUType, "Unknown", sizeof(SDL_CPUType));
474  }
475  }
476  return SDL_CPUType;
477 }
#define SDL_strlcpy
static void CPU_calcCPUIDFeatures(void)
Definition: SDL_cpuinfo.c:251
static int CPU_CPUIDMaxFunction
Definition: SDL_cpuinfo.c:247
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
const GLubyte * c
#define cpuid(func, a, b, c, d)
Definition: SDL_cpuinfo.c:242
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean GLboolean b

◆ SDL_GetSystemRAM()

int SDL_GetSystemRAM ( void  )

This function returns the amount of RAM configured in the system, in MB.

Definition at line 697 of file SDL_cpuinfo.c.

References main, NULL, SDL_GetCPUCacheLineSize(), SDL_GetCPUCount(), SDL_GetCPUType(), SDL_Has3DNow(), SDL_HasAltiVec(), SDL_HasAVX(), SDL_HasAVX2(), SDL_HasMMX(), SDL_HasNEON(), SDL_HasRDTSC(), SDL_HasSSE(), SDL_HasSSE2(), SDL_HasSSE3(), SDL_HasSSE41(), SDL_HasSSE42(), and SDL_SystemRAM.

698 {
699  if (!SDL_SystemRAM) {
700 #ifndef SDL_CPUINFO_DISABLED
701 #if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
702  if (SDL_SystemRAM <= 0) {
703  SDL_SystemRAM = (int)((Sint64)sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE) / (1024*1024));
704  }
705 #endif
706 #ifdef HAVE_SYSCTLBYNAME
707  if (SDL_SystemRAM <= 0) {
708 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
709 #ifdef HW_REALMEM
710  int mib[2] = {CTL_HW, HW_REALMEM};
711 #else
712  /* might only report up to 2 GiB */
713  int mib[2] = {CTL_HW, HW_PHYSMEM};
714 #endif /* HW_REALMEM */
715 #else
716  int mib[2] = {CTL_HW, HW_MEMSIZE};
717 #endif /* __FreeBSD__ || __FreeBSD_kernel__ */
718  Uint64 memsize = 0;
719  size_t len = sizeof(memsize);
720 
721  if (sysctl(mib, 2, &memsize, &len, NULL, 0) == 0) {
722  SDL_SystemRAM = (int)(memsize / (1024*1024));
723  }
724  }
725 #endif
726 #ifdef __WIN32__
727  if (SDL_SystemRAM <= 0) {
728  MEMORYSTATUSEX stat;
729  stat.dwLength = sizeof(stat);
730  if (GlobalMemoryStatusEx(&stat)) {
731  SDL_SystemRAM = (int)(stat.ullTotalPhys / (1024 * 1024));
732  }
733  }
734 #endif
735 #ifdef __OS2__
736  if (SDL_SystemRAM <= 0) {
737  Uint32 sysram = 0;
738  DosQuerySysInfo(QSV_TOTPHYSMEM, QSV_TOTPHYSMEM, &sysram, 4);
739  SDL_SystemRAM = (int) (sysram / 0x100000U);
740  }
741 #endif
742 #endif
743  }
744  return SDL_SystemRAM;
745 }
uint32_t Uint32
Definition: SDL_stdinc.h:181
static int SDL_SystemRAM
Definition: SDL_cpuinfo.c:694
uint64_t Uint64
Definition: SDL_stdinc.h:194
GLenum GLsizei len
#define NULL
Definition: begin_code.h:164
int64_t Sint64
Definition: SDL_stdinc.h:188

◆ SDL_Has3DNow()

SDL_bool SDL_Has3DNow ( void  )

This function returns true if the CPU has 3DNow! features.

Definition at line 641 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_3DNOW.

Referenced by SDL_GetSystemRAM().

642 {
644 }
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621
#define CPU_HAS_3DNOW
Definition: SDL_cpuinfo.c:82

◆ SDL_HasAltiVec()

SDL_bool SDL_HasAltiVec ( void  )

This function returns true if the CPU has AltiVec features.

Definition at line 629 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_ALTIVEC.

Referenced by SDL_GetSystemRAM().

630 {
632 }
#define CPU_HAS_ALTIVEC
Definition: SDL_cpuinfo.c:80
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621

◆ SDL_HasAVX()

SDL_bool SDL_HasAVX ( void  )

This function returns true if the CPU has AVX features.

Definition at line 677 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_AVX.

Referenced by SDL_GetSystemRAM().

678 {
680 }
#define CPU_HAS_AVX
Definition: SDL_cpuinfo.c:88
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621

◆ SDL_HasAVX2()

SDL_bool SDL_HasAVX2 ( void  )

This function returns true if the CPU has AVX2 features.

Definition at line 683 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_AVX2.

Referenced by SDL_GetSystemRAM().

684 {
686 }
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621
#define CPU_HAS_AVX2
Definition: SDL_cpuinfo.c:89

◆ SDL_HasMMX()

SDL_bool SDL_HasMMX ( void  )

This function returns true if the CPU has MMX features.

Definition at line 635 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_MMX.

Referenced by SDL_GetSystemRAM().

636 {
638 }
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621
#define CPU_HAS_MMX
Definition: SDL_cpuinfo.c:81

◆ SDL_HasNEON()

SDL_bool SDL_HasNEON ( void  )

This function returns true if the CPU has NEON (ARM SIMD) features.

Definition at line 689 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_NEON.

Referenced by SDL_GetSystemRAM().

690 {
692 }
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621
#define CPU_HAS_NEON
Definition: SDL_cpuinfo.c:90

◆ SDL_HasRDTSC()

SDL_bool SDL_HasRDTSC ( void  )

This function returns true if the CPU has the RDTSC instruction.

Definition at line 623 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_RDTSC.

Referenced by SDL_GetSystemRAM().

624 {
626 }
#define CPU_HAS_RDTSC
Definition: SDL_cpuinfo.c:79
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621

◆ SDL_HasSSE()

SDL_bool SDL_HasSSE ( void  )

This function returns true if the CPU has SSE features.

Definition at line 647 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_SSE.

Referenced by SDL_GetSystemRAM().

648 {
650 }
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621
#define CPU_HAS_SSE
Definition: SDL_cpuinfo.c:83

◆ SDL_HasSSE2()

SDL_bool SDL_HasSSE2 ( void  )

This function returns true if the CPU has SSE2 features.

Definition at line 653 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_SSE2.

Referenced by SDL_GetSystemRAM().

654 {
656 }
#define CPU_HAS_SSE2
Definition: SDL_cpuinfo.c:84
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621

◆ SDL_HasSSE3()

SDL_bool SDL_HasSSE3 ( void  )

This function returns true if the CPU has SSE3 features.

Definition at line 659 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_SSE3.

Referenced by SDL_GetSystemRAM().

660 {
662 }
#define CPU_HAS_SSE3
Definition: SDL_cpuinfo.c:85
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621

◆ SDL_HasSSE41()

SDL_bool SDL_HasSSE41 ( void  )

This function returns true if the CPU has SSE4.1 features.

Definition at line 665 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_SSE41.

Referenced by SDL_GetSystemRAM().

666 {
668 }
#define CPU_HAS_SSE41
Definition: SDL_cpuinfo.c:86
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621

◆ SDL_HasSSE42()

SDL_bool SDL_HasSSE42 ( void  )

This function returns true if the CPU has SSE4.2 features.

Definition at line 671 of file SDL_cpuinfo.c.

References CPU_FEATURE_AVAILABLE, and CPU_HAS_SSE42.

Referenced by SDL_GetSystemRAM().

672 {
674 }
#define CPU_FEATURE_AVAILABLE(f)
Definition: SDL_cpuinfo.c:621
#define CPU_HAS_SSE42
Definition: SDL_cpuinfo.c:87

Variable Documentation

◆ CPU_CPUIDFeatures

int CPU_CPUIDFeatures[4]
static

Definition at line 246 of file SDL_cpuinfo.c.

Referenced by CPU_calcCPUIDFeatures().

◆ CPU_CPUIDMaxFunction

int CPU_CPUIDMaxFunction = 0
static

Definition at line 247 of file SDL_cpuinfo.c.

Referenced by CPU_calcCPUIDFeatures(), CPU_have3DNow(), CPU_haveAVX2(), and SDL_GetCPUType().

◆ CPU_OSSavesYMM

SDL_bool CPU_OSSavesYMM = SDL_FALSE
static

Definition at line 248 of file SDL_cpuinfo.c.

Referenced by CPU_calcCPUIDFeatures(), and CPU_haveAVX2().

◆ SDL_CPUCount

int SDL_CPUCount = 0
static

Definition at line 403 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUCount().

◆ SDL_CPUFeatures

Uint32 SDL_CPUFeatures = 0xFFFFFFFF
static

Definition at line 573 of file SDL_cpuinfo.c.

Referenced by SDL_GetCPUFeatures().

◆ SDL_SystemRAM

int SDL_SystemRAM = 0
static

Definition at line 694 of file SDL_cpuinfo.c.

Referenced by SDL_GetSystemRAM().