freebsd-ports/devel/sdl12/files/extra-patch-src_cpuinfo_SDL__cpuinfo.c

74 lines
2.6 KiB
C

--- src/cpuinfo/SDL_cpuinfo.c.orig Tue Feb 10 16:31:35 2004
+++ src/cpuinfo/SDL_cpuinfo.c Sun May 16 19:19:48 2004
@@ -22,7 +22,7 @@
#ifdef SAVE_RCSID
static char rcsid =
- "@(#) $Id: SDL_cpuinfo.c,v 1.14 2004/02/10 15:31:35 slouken Exp $";
+ "@(#) $Id: SDL_cpuinfo.c,v 1.16 2004/05/16 17:19:48 slouken Exp $";
#endif
/* CPU feature detection for SDL */
@@ -81,6 +81,26 @@
:
: "%eax", "%ecx"
);
+#elif defined(__GNUC__) && defined(__x86_64__)
+/* Technically, if this is being compiled under __x86_64__ then it has
+CPUid by definition. But it's nice to be able to prove it. :) */
+ __asm__ (
+" pushfq # Get original EFLAGS \n"
+" popq %%rax \n"
+" movq %%rax,%%rcx \n"
+" xorl $0x200000,%%eax # Flip ID bit in EFLAGS \n"
+" pushq %%rax # Save new EFLAGS value on stack \n"
+" popfq # Replace current EFLAGS value \n"
+" pushfq # Get new EFLAGS \n"
+" popq %%rax # Store new EFLAGS in EAX \n"
+" xorl %%ecx,%%eax # Can not toggle ID bit, \n"
+" jz 1f # Processor=80486 \n"
+" movl $1,%0 # We have CPUID support \n"
+"1: \n"
+ : "=m" (has_CPUID)
+ :
+ : "%rax", "%rcx"
+ );
#elif defined(_MSC_VER)
__asm {
pushfd ; Get original EFLAGS
@@ -103,7 +123,7 @@
static __inline__ int CPU_getCPUIDFeatures()
{
int features = 0;
-#if defined(__GNUC__) && defined(i386)
+#if defined(__GNUC__) && ( defined(i386) || defined(__x86_64__) )
__asm__ (
" movl %%ebx,%%edi\n"
" xorl %%eax,%%eax # Set up for CPUID instruction \n"
@@ -118,7 +138,7 @@
" movl %%edi,%%ebx\n"
: "=m" (features)
:
- : "%eax", "%ebx", "%ecx", "%edx", "%edi"
+ : "%eax", "%ecx", "%edx", "%edi"
);
#elif defined(_MSC_VER)
__asm {
@@ -139,7 +159,7 @@
static __inline__ int CPU_getCPUIDFeaturesExt()
{
int features = 0;
-#if defined(__GNUC__) && defined(i386)
+#if defined(__GNUC__) && (defined(i386) || defined (__x86_64__) )
__asm__ (
" movl %%ebx,%%edi\n"
" movl $0x80000000,%%eax # Query for extended functions \n"
@@ -153,7 +173,7 @@
" movl %%edi,%%ebx\n"
: "=m" (features)
:
- : "%eax", "%ebx", "%ecx", "%edx", "%edi"
+ : "%eax", "%ecx", "%edx", "%edi"
);
#elif defined(_MSC_VER)
__asm {