Merge commit '7d07ee5a9bd170a06d26fd967cf8de5d3b1ce331'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 31 May 2015 20:47:29 +0000 (22:47 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 31 May 2015 20:47:50 +0000 (22:47 +0200)
* commit '7d07ee5a9bd170a06d26fd967cf8de5d3b1ce331':
  ppc: cpu: Add support for VSX and POWER8 extensions

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavutil/cpu.h
libavutil/ppc/cpu.c
libavutil/ppc/cpu.h

diff --combined libavutil/cpu.h
@@@ -1,34 -1,36 +1,34 @@@
  /*
   * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #ifndef AVUTIL_CPU_H
  #define AVUTIL_CPU_H
  
 -#include "version.h"
 +#include "attributes.h"
  
  #define AV_CPU_FLAG_FORCE    0x80000000 /* force usage of selected flags (OR) */
  
      /* lower 16 bits - CPU features */
  #define AV_CPU_FLAG_MMX          0x0001 ///< standard MMX
  #define AV_CPU_FLAG_MMXEXT       0x0002 ///< SSE integer functions or AMD MMX ext
 -#if FF_API_CPU_FLAG_MMX2
  #define AV_CPU_FLAG_MMX2         0x0002 ///< SSE integer functions or AMD MMX ext
 -#endif
  #define AV_CPU_FLAG_3DNOW        0x0004 ///< AMD 3DNOW
  #define AV_CPU_FLAG_SSE          0x0008 ///< SSE functions
  #define AV_CPU_FLAG_SSE2         0x0010 ///< PIV SSE2 functions
  #define AV_CPU_FLAG_SSE4         0x0100 ///< Penryn SSE4.1 functions
  #define AV_CPU_FLAG_SSE42        0x0200 ///< Nehalem SSE4.2 functions
  #define AV_CPU_FLAG_AVX          0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
 +#define AV_CPU_FLAG_AVXSLOW   0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer)
  #define AV_CPU_FLAG_XOP          0x0400 ///< Bulldozer XOP functions
  #define AV_CPU_FLAG_FMA4         0x0800 ///< Bulldozer FMA4 functions
 -#define AV_CPU_FLAG_CMOV         0x1000 ///< i686 cmov
 +// #if LIBAVUTIL_VERSION_MAJOR <52
 +#define AV_CPU_FLAG_CMOV      0x1001000 ///< supports cmov instruction
 +// #else
 +// #define AV_CPU_FLAG_CMOV         0x1000 ///< supports cmov instruction
 +// #endif
  #define AV_CPU_FLAG_AVX2         0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used
  #define AV_CPU_FLAG_FMA3        0x10000 ///< Haswell FMA3 functions
  #define AV_CPU_FLAG_BMI1        0x20000 ///< Bit Manipulation Instruction Set 1
  #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)
  #define AV_CPU_FLAG_VFPV3        (1 << 4)
  #define AV_CPU_FLAG_NEON         (1 << 5)
  #define AV_CPU_FLAG_ARMV8        (1 << 6)
 +#define AV_CPU_FLAG_SETEND       (1 <<16)
  
  /**
   * Return the flags which specify extensions supported by the CPU.
 + * The returned value is affected by av_force_cpu_flags() if that was used
 + * before. So av_get_cpu_flags() can easily be used in a application to
 + * detect the enabled cpu flags.
   */
  int av_get_cpu_flags(void);
  
  /**
 + * Disables cpu detection and forces the specified flags.
 + * -1 is a special case that disables forcing of specific flags.
 + */
 +void av_force_cpu_flags(int flags);
 +
 +/**
   * Set a mask on flags returned by av_get_cpu_flags().
   * This function is mainly useful for testing.
 + * Please use av_force_cpu_flags() and av_get_cpu_flags() instead which are more flexible
   *
   * @warning this function is not thread safe.
   */
 -void av_set_cpu_flags_mask(int mask);
 +attribute_deprecated void av_set_cpu_flags_mask(int mask);
  
  /**
   * Parse CPU flags from a string.
   *
 + * The returned flags contain the specified flags as well as related unspecified flags.
 + *
 + * This function exists only for compatibility with libav.
 + * Please use av_parse_cpu_caps() when possible.
   * @return a combination of AV_CPU_* flags, negative on error.
   */
 +attribute_deprecated
  int av_parse_cpu_flags(const char *s);
  
  /**
 + * Parse CPU caps from a string and update the given AV_CPU_* flags based on that.
 + *
 + * @return negative on error.
 + */
 +int av_parse_cpu_caps(unsigned *flags, const char *s);
 +
 +/**
   * @return the number of logical CPU cores present.
   */
  int av_cpu_count(void);
diff --combined libavutil/ppc/cpu.c
@@@ -1,32 -1,28 +1,32 @@@
  /*
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
 +#include "config.h"
 +
  #ifdef __APPLE__
  #include <sys/sysctl.h>
  #elif defined(__linux__)
  #include <asm/cputable.h>
  #include <linux/auxvec.h>
  #include <fcntl.h>
 +#if HAVE_UNISTD_H
  #include <unistd.h>
 +#endif
  #elif defined(__OpenBSD__)
  #include <sys/param.h>
  #include <sys/sysctl.h>
@@@ -39,6 -35,7 +39,6 @@@
  
  #include "libavutil/cpu.h"
  #include "libavutil/cpu_internal.h"
 -#include "config.h"
  
  /**
   * This function MAY rely on signal() or fork() in order to make sure AltiVec
@@@ -88,6 -85,14 +88,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;
              }
          }
  out:
      close(fd);
      return ret;
 -#elif CONFIG_RUNTIME_CPUDETECT
 +#elif CONFIG_RUNTIME_CPUDETECT && defined(__linux__) && !ARCH_PPC64
  #define PVR_G4_7400  0x000C
  #define PVR_G5_970   0x0039
  #define PVR_G5_970FX 0x003C
  #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));
          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).
diff --combined libavutil/ppc/cpu.h
@@@ -1,18 -1,18 +1,18 @@@
  /*
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -24,5 -24,7 +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 */