]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blobdiff - libavcodec/ppc/check_altivec.c
Add necessary header for CONFIG_RUNTIME_CPUDETECT preprocessor definition.
[frescor/ffmpeg.git] / libavcodec / ppc / check_altivec.c
index b3778cab31cfe452ec82589afc38016cc4922b70..7f5143341b197b07992e8877091df0ffe00b304d 100644 (file)
 
 
 /**
- * @file check_altivec.c
+ * @file libavcodec/ppc/check_altivec.c
  * Checks for AltiVec presence.
  */
 
+#include "config.h"
+
 #ifdef __APPLE__
+#undef _POSIX_C_SOURCE
+#include <sys/sysctl.h>
+#elif defined(__OpenBSD__)
+#include <sys/param.h>
 #include <sys/sysctl.h>
-#elif __AMIGAOS4__
+#include <machine/cpu.h>
+#elif defined(__AMIGAOS4__)
 #include <exec/exec.h>
 #include <interfaces/exec.h>
 #include <proto/exec.h>
 #endif /* __APPLE__ */
 
 /**
- * This function MAY rely on signal() or fork() in order to make sure altivec
- * is present
+ * This function MAY rely on signal() or fork() in order to make sure AltiVec
+ * is present.
  */
 
 int has_altivec(void)
@@ -44,18 +51,34 @@ int has_altivec(void)
     IExec->GetCPUInfoTags(GCIT_VectorUnit, &result, TAG_DONE);
     if (result == VECTORTYPE_ALTIVEC) return 1;
     return 0;
-#elif __APPLE__
+#elif defined(__APPLE__) || defined(__OpenBSD__)
+#ifdef __OpenBSD__
+    int sels[2] = {CTL_MACHDEP, CPU_ALTIVEC};
+#else
     int sels[2] = {CTL_HW, HW_VECTORUNIT};
+#endif
     int has_vu = 0;
     size_t len = sizeof(has_vu);
     int err;
 
     err = sysctl(sels, 2, &has_vu, &len, NULL, 0);
 
-    if (err == 0) return (has_vu != 0);
+    if (err == 0) return has_vu != 0;
+    return 0;
+#elif CONFIG_RUNTIME_CPUDETECT
+    int proc_ver;
+    // Support of mfspr PVR emulation added in Linux 2.6.17.
+    __asm__ volatile("mfspr %0, 287" : "=r" (proc_ver));
+    proc_ver >>= 16;
+    if (proc_ver  & 0x8000 ||
+        proc_ver == 0x000c ||
+        proc_ver == 0x0039 || proc_ver == 0x003c ||
+        proc_ver == 0x0044 || proc_ver == 0x0045 ||
+        proc_ver == 0x0070)
+        return 1;
     return 0;
 #else
-    // since we were compiled for altivec, just assume we have it
+    // Since we were compiled for AltiVec, just assume we have it
     // until someone comes up with a proper way (not involving signal hacks).
     return 1;
 #endif /* __AMIGAOS4__ */