[FFmpeg-devel] [PATCH] avutil/intmath: enable builtin intrinsics for icl and msvc.

Matt Oliver protogonoi at gmail.com
Sun Oct 26 15:44:59 CET 2014


On 26 October 2014 21:31, Michael Niedermayer <michaelni at gmx.at> wrote:

> On Sun, Oct 26, 2014 at 08:49:07PM +1100, Matt Oliver wrote:
>
> > intmath.h already uses the gcc builtin intrinsics for log2 and ctz. This
>
> > patch just adds the equivalent icl and msvc intrinsics. All added
>
> > intrinsics have the same function (i.e. with respect to input 0s etc.) as
>
> > the existing gcc builtins.
>
>
>
> >  intmath.h |   37 +++++++++++++++++++++++++++++++------
>
> >  1 file changed, 31 insertions(+), 6 deletions(-)
>
> > 26a67ffba2f85535b6ac5dcb7643ec89c1d81d5f
> 0001-avutil-intmath-enable-builtin-intrinsics-for-icl-and.patch
>
> > From 8b2a0cc3e265750650b4399ad051ae2e98a24f42 Mon Sep 17 00:00:00 2001
>
> > From: Matthew Oliver <protogonoi at gmail.com>
>
> > Date: Wed, 22 Oct 2014 00:30:53 +1100
>
> > Subject: [PATCH] avutil/intmath: enable builtin intrinsics for icl and
>
> >  msvc.
>
> >
>
> > ---
>
> >  libavutil/intmath.h | 37 +++++++++++++++++++++++++++++++------
>
> >  1 file changed, 31 insertions(+), 6 deletions(-)
>
> >
>
> > diff --git a/libavutil/intmath.h b/libavutil/intmath.h
>
> > index 8f7a69e..7d836d9 100644
>
> > --- a/libavutil/intmath.h
>
> > +++ b/libavutil/intmath.h
>
> > @@ -35,21 +35,29 @@
>
> >   * @{
>
> >   */
>
> >
>
> > -#if HAVE_FAST_CLZ && AV_GCC_VERSION_AT_LEAST(3,4)
>
> > -
>
> > +#if HAVE_FAST_CLZ
>
> > +#if AV_GCC_VERSION_AT_LEAST(3,4)
>
> >  #ifndef ff_log2
>
> >  #   define ff_log2(x) (31 - __builtin_clz((x)|1))
>
> >  #   ifndef ff_log2_16bit
>
> >  #      define ff_log2_16bit av_log2
>
> >  #   endif
>
> >  #endif /* ff_log2 */
>
> > -
>
> > +#elif defined( __INTEL_COMPILER )
>
> > +#ifndef ff_log2
>
> > +#   define ff_log2(x) (_bit_scan_reverse(x|1))
>
> > +#   ifndef ff_log2_16bit
>
> > +#      define ff_log2_16bit av_log2
>
> > +#   endif
>
> > +#endif /* ff_log2 */
>
> > +#endif
>
> >  #endif /* AV_GCC_VERSION_AT_LEAST(3,4) */
>
> >
>
> >  extern const uint8_t ff_log2_tab[256];
>
> >
>
> >  #ifndef ff_log2
>
> >  #define ff_log2 ff_log2_c
>
> > +#if !defined( _MSC_VER )
>
> >  static av_always_inline av_const int ff_log2_c(unsigned int v)
>
> >  {
>
> >      int n = 0;
>
> > @@ -65,6 +73,15 @@ static av_always_inline av_const int
> ff_log2_c(unsigned int v)
>
> >
>
> >      return n;
>
> >  }
>
> > +#else
>
> > +static av_always_inline av_const int ff_log2_c(unsigned int v)
>
> > +{
>
>
>
> > +    int n = 0;
>
> > +    _BitScanReverse((unsigned long *)&n, v|1);
>
>
>
> strict aliasing violation
>
>
>
>
>
> [...]
>
> >      int c;
>
> > -
>
> > +#if !defined( _MSC_VER )
>
> >      if (v & 0x1)
>
> >          return 0;
>
> >
>
> > @@ -127,7 +150,9 @@ static av_always_inline av_const int ff_ctz_c(int v)
>
> >          c += 2;
>
> >      }
>
> >      c -= v & 0x1;
>
> > -
>
> > +#else
>
> > +    _BitScanForward( (unsigned long *)&c, v );
>
>
>
> here too
>
>
>
> [...]
>

Long and int are exactly the same size in msvc. But attached is a slightly
different version that avoids the casting casting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-avutil-intmath-enable-builtin-intrinsics-for-icl-and.patch
Type: application/octet-stream
Size: 2352 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141027/5a258b39/attachment.obj>


More information about the ffmpeg-devel mailing list