]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/cpu-x86.c
remap: Change remapping function argument type from void to int16_t / float as approp...
[pulseaudio] / src / pulsecore / cpu-x86.c
index f194a60811e765c100a59e49dd98fa4eb505d570..8ca6b7490001e14d3aef63757f27d890412c40a6 100644 (file)
@@ -31,9 +31,7 @@
 #include "cpu-x86.h"
 
 #if defined (__i386__) || defined (__amd64__)
-static void
-get_cpuid (uint32_t op, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d)
-{
+static void get_cpuid(uint32_t op, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d) {
     __asm__ __volatile__ (
         "  push %%"PA_REG_b"   \n\t"
         "  cpuid               \n\t"
@@ -46,80 +44,94 @@ get_cpuid (uint32_t op, uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d)
 }
 #endif
 
-void pa_cpu_init_x86 (void) {
+void pa_cpu_get_x86_flags(pa_cpu_x86_flag_t *flags) {
 #if defined (__i386__) || defined (__amd64__)
     uint32_t eax, ebx, ecx, edx;
     uint32_t level;
-    pa_cpu_x86_flag_t flags = 0;
+
+    *flags = 0;
 
     /* get standard level */
-    get_cpuid (0x00000000, &level, &ebx, &ecx, &edx);
+    get_cpuid(0x00000000, &level, &ebx, &ecx, &edx);
     if (level >= 1) {
-        get_cpuid (0x00000001, &eax, &ebx, &ecx, &edx);
+        get_cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
+
+        if (edx & (1<<15))
+          *flags |= PA_CPU_X86_CMOV;
 
         if (edx & (1<<23))
-          flags |= PA_CPU_X86_MMX;
+          *flags |= PA_CPU_X86_MMX;
 
         if (edx & (1<<25))
-          flags |= PA_CPU_X86_SSE;
+          *flags |= PA_CPU_X86_SSE;
 
         if (edx & (1<<26))
-          flags |= PA_CPU_X86_SSE2;
+          *flags |= PA_CPU_X86_SSE2;
 
         if (ecx & (1<<0))
-          flags |= PA_CPU_X86_SSE3;
+          *flags |= PA_CPU_X86_SSE3;
 
         if (ecx & (1<<9))
-          flags |= PA_CPU_X86_SSSE3;
+          *flags |= PA_CPU_X86_SSSE3;
 
         if (ecx & (1<<19))
-          flags |= PA_CPU_X86_SSE4_1;
+          *flags |= PA_CPU_X86_SSE4_1;
 
         if (ecx & (1<<20))
-          flags |= PA_CPU_X86_SSE4_2;
+          *flags |= PA_CPU_X86_SSE4_2;
     }
 
     /* get extended level */
-    get_cpuid (0x80000000, &level, &ebx, &ecx, &edx);
+    get_cpuid(0x80000000, &level, &ebx, &ecx, &edx);
     if (level >= 0x80000001) {
-        get_cpuid (0x80000001, &eax, &ebx, &ecx, &edx);
+        get_cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
 
         if (edx & (1<<22))
-          flags |= PA_CPU_X86_MMXEXT;
+          *flags |= PA_CPU_X86_MMXEXT;
 
         if (edx & (1<<23))
-          flags |= PA_CPU_X86_MMX;
+          *flags |= PA_CPU_X86_MMX;
 
         if (edx & (1<<30))
-          flags |= PA_CPU_X86_3DNOWEXT;
+          *flags |= PA_CPU_X86_3DNOWEXT;
 
         if (edx & (1<<31))
-          flags |= PA_CPU_X86_3DNOW;
+          *flags |= PA_CPU_X86_3DNOW;
     }
 
-    pa_log_info ("CPU flags: %s%s%s%s%s%s%s%s%s%s",
-    (flags & PA_CPU_X86_MMX) ? "MMX " : "",
-    (flags & PA_CPU_X86_SSE) ? "SSE " : "",
-    (flags & PA_CPU_X86_SSE2) ? "SSE2 " : "",
-    (flags & PA_CPU_X86_SSE3) ? "SSE3 " : "",
-    (flags & PA_CPU_X86_SSSE3) ? "SSSE3 " : "",
-    (flags & PA_CPU_X86_SSE4_1) ? "SSE4_1 " : "",
-    (flags & PA_CPU_X86_SSE4_2) ? "SSE4_2 " : "",
-    (flags & PA_CPU_X86_MMXEXT) ? "MMXEXT " : "",
-    (flags & PA_CPU_X86_3DNOW) ? "3DNOW " : "",
-    (flags & PA_CPU_X86_3DNOWEXT) ? "3DNOWEXT " : "");
+    pa_log_info("CPU flags: %s%s%s%s%s%s%s%s%s%s%s",
+    (*flags & PA_CPU_X86_CMOV) ? "CMOV " : "",
+    (*flags & PA_CPU_X86_MMX) ? "MMX " : "",
+    (*flags & PA_CPU_X86_SSE) ? "SSE " : "",
+    (*flags & PA_CPU_X86_SSE2) ? "SSE2 " : "",
+    (*flags & PA_CPU_X86_SSE3) ? "SSE3 " : "",
+    (*flags & PA_CPU_X86_SSSE3) ? "SSSE3 " : "",
+    (*flags & PA_CPU_X86_SSE4_1) ? "SSE4_1 " : "",
+    (*flags & PA_CPU_X86_SSE4_2) ? "SSE4_2 " : "",
+    (*flags & PA_CPU_X86_MMXEXT) ? "MMXEXT " : "",
+    (*flags & PA_CPU_X86_3DNOW) ? "3DNOW " : "",
+    (*flags & PA_CPU_X86_3DNOWEXT) ? "3DNOWEXT " : "");
+#endif /* defined (__i386__) || defined (__amd64__) */
+}
+
+bool pa_cpu_init_x86(pa_cpu_x86_flag_t *flags) {
+#if defined (__i386__) || defined (__amd64__)
+    pa_cpu_get_x86_flags(flags);
 
     /* activate various optimisations */
-    if (flags & PA_CPU_X86_MMX) {
-        pa_volume_func_init_mmx (flags);
-        pa_remap_func_init_mmx (flags);
+    if (*flags & PA_CPU_X86_MMX) {
+        pa_volume_func_init_mmx(*flags);
+        pa_remap_func_init_mmx(*flags);
     }
 
-    if (flags & (PA_CPU_X86_SSE | PA_CPU_X86_SSE2)) {
-        pa_volume_func_init_sse (flags);
-        pa_remap_func_init_sse (flags);
-        pa_convert_func_init_sse (flags);
+    if (*flags & (PA_CPU_X86_SSE | PA_CPU_X86_SSE2)) {
+        pa_volume_func_init_sse(*flags);
+        pa_remap_func_init_sse(*flags);
+        pa_convert_func_init_sse(*flags);
     }
 
+    return true;
+#else /* defined (__i386__) || defined (__amd64__) */
+    return false;
 #endif /* defined (__i386__) || defined (__amd64__) */
 }