]> git.sesse.net Git - ffmpeg/commitdiff
ppc: cpu: Add support for VSX and POWER8 extensions
authorLuca Barbato <lu_zero@gentoo.org>
Sun, 10 May 2015 02:15:59 +0000 (04:15 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Sun, 31 May 2015 10:07:11 +0000 (12:07 +0200)
libavutil/cpu.h
libavutil/ppc/cpu.c
libavutil/ppc/cpu.h

index 7cecccc9c46fa4afcc346b14a31bdcfea5c45f64..d7fdf26f87b071fb70f105818986087ba9448fe9 100644 (file)
@@ -54,6 +54,8 @@
 #define AV_CPU_FLAG_BMI2        0x40000 ///< Bit Manipulation Instruction Set 2
 
 #define AV_CPU_FLAG_ALTIVEC      0x0001 ///< standard
+#define AV_CPU_FLAG_VSX          0x0002 ///< ISA 2.06
+#define AV_CPU_FLAG_POWER8       0x0004 ///< ISA 2.07
 
 #define AV_CPU_FLAG_ARMV5TE      (1 << 0)
 #define AV_CPU_FLAG_ARMV6        (1 << 1)
index 27a28538549dd90fcb0ab1646f901e559a08666d..298185684b0428b9b5eddeaf4ad7167961e4667b 100644 (file)
@@ -85,6 +85,14 @@ int ff_get_cpu_flags_ppc(void)
             if (buf[i] == AT_HWCAP) {
                 if (buf[i + 1] & PPC_FEATURE_HAS_ALTIVEC)
                     ret = AV_CPU_FLAG_ALTIVEC;
+#ifdef PPC_FEATURE_HAS_VSX
+                if (buf[i + 1] & PPC_FEATURE_HAS_VSX)
+                    ret |= AV_CPU_FLAG_VSX;
+#endif
+#ifdef PPC_FEATURE_ARCH_2_07
+                if (buf[i + 1] & PPC_FEATURE_HAS_POWER8)
+                    ret |= AV_CPU_FLAG_POWER8;
+#endif
                 goto out;
             }
         }
@@ -103,7 +111,7 @@ out:
 #define PVR_POWER7   0x003F
 #define PVR_POWER8   0x004B
 #define PVR_CELL_PPU 0x0070
-
+    int ret = 0;
     int proc_ver;
     // Support of mfspr PVR emulation added in Linux 2.6.17.
     __asm__ volatile("mfspr %0, 287" : "=r" (proc_ver));
@@ -118,8 +126,14 @@ out:
         proc_ver == PVR_POWER7   ||
         proc_ver == PVR_POWER8   ||
         proc_ver == PVR_CELL_PPU)
-        return AV_CPU_FLAG_ALTIVEC;
-    return 0;
+        ret = AV_CPU_FLAG_ALTIVEC;
+    if (proc_ver == PVR_POWER7 ||
+        proc_ver == PVR_POWER8)
+        ret |= AV_CPU_FLAG_VSX;
+    if (proc_ver == PVR_POWER8)
+        ret |= AV_CPU_FLAG_POWER8;
+
+    return ret;
 #else
     // Since we were compiled for AltiVec, just assume we have it
     // until someone comes up with a proper way (not involving signal hacks).
index f8fae586983c4030d72cffeb49b40f5a1e17bce2..a8b823f534b1ce80327f4b00bffa623a560550cb 100644 (file)
@@ -24,5 +24,7 @@
 #include "libavutil/cpu_internal.h"
 
 #define PPC_ALTIVEC(flags) CPUEXT(flags, ALTIVEC)
+#define PPC_VSX(flags) CPUEXT(flags, VSX)
+#define PPC_POWER8(flags) CPUEXT(flags, POWER8)
 
 #endif /* AVUTIL_PPC_CPU_H */