summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/ports.c54
-rw-r--r--libhb/ports.h1
-rw-r--r--make/configure.py5
3 files changed, 42 insertions, 18 deletions
diff --git a/libhb/ports.c b/libhb/ports.c
index 794c8a7f0..37c75faaf 100644
--- a/libhb/ports.c
+++ b/libhb/ports.c
@@ -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
}
}
diff --git a/libhb/ports.h b/libhb/ports.h
index bcc898865..e70cafc66 100644
--- a/libhb/ports.h
+++ b/libhb/ports.h
@@ -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
diff --git a/make/configure.py b/make/configure.py
index ea9c8b3c2..c3d4ea0ba 100644
--- a/make/configure.py
+++ b/make/configure.py
@@ -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-*' ):