summaryrefslogtreecommitdiffstats
path: root/libhb/ports.c
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2014-02-15 16:31:11 +0000
committerjstebbins <[email protected]>2014-02-15 16:31:11 +0000
commitd6309a23ece277239608547500b0bc9b15873dc3 (patch)
tree879754eefc755612270f61c7fb5ed26480190f8e /libhb/ports.c
parent1a1b1591ef5acd8495dc8e736a47852e93694020 (diff)
libhb: Add cpuid inline asm macro
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
Diffstat (limited to 'libhb/ports.c')
-rw-r--r--libhb/ports.c54
1 files changed, 37 insertions, 17 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
}
}