]> granicus.if.org Git - handbrake/commitdiff
libhb: Add cpuid inline asm macro
authorjstebbins <jstebbins.hb@gmail.com>
Sat, 15 Feb 2014 16:31:11 +0000 (16:31 +0000)
committerjstebbins <jstebbins.hb@gmail.com>
Sat, 15 Feb 2014 16:31:11 +0000 (16:31 +0000)
This eliminates our reliance on the private (unexported) libavutil
function ff_cpu_cpuid().

git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6032 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/ports.c
libhb/ports.h
make/configure.py

index 794c8a7f051c661466ba17da71733e9d01f9d7a9..37c75faafc3e4ace1ad35e30c989363c3441b706 100644 (file)
@@ -264,6 +264,24 @@ const char* hb_get_cpu_platform_name()
     }
 }
 
+#if ARCH_X86_64
+#    define REG_b "rbx"
+#    define REG_S "rsi"
+#elif ARCH_X86_32
+#    define REG_b "ebx"
+#    define REG_S "esi"
+#endif // ARCH_X86_32
+
+#if ARCH_X86_64 || ARCH_X86_32
+#define cpuid(index, eax, ebx, ecx, edx)                        \
+    __asm__ volatile (                                          \
+        "mov    %%"REG_b", %%"REG_S" \n\t"                      \
+        "cpuid                       \n\t"                      \
+        "xchg   %%"REG_b", %%"REG_S                             \
+        : "=a" (*eax), "=S" (*ebx), "=c" (*ecx), "=d" (*edx)    \
+        : "0" (index))
+#endif // ARCH_X86_64 || ARCH_X86_32
+
 static void init_cpu_info()
 {
     hb_cpu_info.name     = NULL;
@@ -272,9 +290,10 @@ static void init_cpu_info()
 
     if (av_get_cpu_flags() & AV_CPU_FLAG_SSE)
     {
+#if ARCH_X86_64 || ARCH_X86_32
         int eax, ebx, ecx, edx, family, model;
 
-        ff_cpu_cpuid(1, &eax, &ebx, &ecx, &edx);
+        cpuid(1, &eax, &ebx, &ecx, &edx);
         family = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff);
         model  = ((eax >> 4) & 0xf) + ((eax >> 12) & 0xf0);
 
@@ -323,24 +342,24 @@ static void init_cpu_info()
         // Intel 64 and IA-32 Architectures Software Developer's Manual, Vol. 2A
         // Figure 3-8: Determination of Support for the Processor Brand String
         // Table 3-17: Information Returned by CPUID Instruction
-        ff_cpu_cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
+        cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
         if ((eax & 0x80000004) < 0x80000004)
         {
-            ff_cpu_cpuid(0x80000002,
-                         (int*)&hb_cpu_info.buf[ 0],
-                         (int*)&hb_cpu_info.buf[ 4],
-                         (int*)&hb_cpu_info.buf[ 8],
-                         (int*)&hb_cpu_info.buf[12]);
-            ff_cpu_cpuid(0x80000003,
-                         (int*)&hb_cpu_info.buf[16],
-                         (int*)&hb_cpu_info.buf[20],
-                         (int*)&hb_cpu_info.buf[24],
-                         (int*)&hb_cpu_info.buf[28]);
-            ff_cpu_cpuid(0x80000004,
-                         (int*)&hb_cpu_info.buf[32],
-                         (int*)&hb_cpu_info.buf[36],
-                         (int*)&hb_cpu_info.buf[40],
-                         (int*)&hb_cpu_info.buf[44]);
+            cpuid(0x80000002,
+                  (int*)&hb_cpu_info.buf[ 0],
+                  (int*)&hb_cpu_info.buf[ 4],
+                  (int*)&hb_cpu_info.buf[ 8],
+                  (int*)&hb_cpu_info.buf[12]);
+            cpuid(0x80000003,
+                  (int*)&hb_cpu_info.buf[16],
+                  (int*)&hb_cpu_info.buf[20],
+                  (int*)&hb_cpu_info.buf[24],
+                  (int*)&hb_cpu_info.buf[28]);
+            cpuid(0x80000004,
+                  (int*)&hb_cpu_info.buf[32],
+                  (int*)&hb_cpu_info.buf[36],
+                  (int*)&hb_cpu_info.buf[40],
+                  (int*)&hb_cpu_info.buf[44]);
 
             hb_cpu_info.name    = hb_cpu_info.buf;
             hb_cpu_info.buf[47] = '\0'; // just in case
@@ -351,6 +370,7 @@ static void init_cpu_info()
                 hb_cpu_info.name++;
             }
         }
+#endif // ARCH_X86_64 || ARCH_X86_32
     }
 }
 
index bcc898865ff2614311b414959affc7bb385ecddc..e70cafc66204362d18baf70c80d11dc7ac709421 100644 (file)
@@ -33,7 +33,6 @@ int         hb_get_cpu_count();
 int         hb_get_cpu_platform();
 const char* hb_get_cpu_name();
 const char* hb_get_cpu_platform_name();
-extern void ff_cpu_cpuid(int index, int *eax, int *ebx, int *ecx, int *edx);
 
 /************************************************************************
  * Utils
index ea9c8b3c2019c225ccb56a3b600f39dbbd750f57..c3d4ea0ba7d3d65bdab9a02719b5726d0bb61b47 100644 (file)
@@ -1741,6 +1741,11 @@ int main ()
         doc.add( 'GCC.sysroot', '' )
         doc.add( 'GCC.minver', '' )
 
+    if build.match( 'i?86-*' ):
+        doc.add( 'LIBHB.GCC.D', 'ARCH_X86_32', append=True )
+    elif build.match( 'x86_64-*' ):
+        doc.add( 'LIBHB.GCC.D', 'ARCH_X86_64', append=True )
+
     if options.enable_asm and ( not Tools.yasm.fail or options.enable_local_yasm ):
         asm = ''
         if build.match( 'i?86-*' ):