"Ronald S. Bultje" <[email protected]> writes:

> From: "Ronald S. Bultje" <[email protected]>
>
> ---
>  configure           |    9 +++++++++
>  libavutil/x86/cpu.c |   11 +++++++++++
>  2 files changed, 20 insertions(+)
>
> diff --git a/configure b/configure
> index 4fc20a2..35d4406 100755
> --- a/configure
> +++ b/configure
> @@ -1092,6 +1092,7 @@ HAVE_LIST="
>      gettimeofday
>      gnu_as
>      ibm_asm
> +    immintrin_h
>      inet_aton
>      inline_asm
>      io_h
> @@ -1171,6 +1172,7 @@ HAVE_LIST="
>      windows_h
>      winsock2_h
>      xform_asm
> +    xgetbv
>      xmm_clobbers
>      yasm
>  "
> @@ -2655,6 +2657,13 @@ int main (void) { _mm_empty(); return 0; }
>  EOF
>  fi
>
> +if check_header immintrin.h; then
> +    check_cc <<EOF && enable xgetbv
> +#include <immintrin.h>
> +int main (void) { _xgetbv(0); return 0; }
> +EOF
> +fi

The check_header call is a bit redundant since the check_cc will fail
anyway if it's missing and you're not using HAVE_IMMINTRIN_H anywhere.

I suppose you tested this, but I can't find any reference to _xgetbv()
existing anywhere.  It's not provided by any compiler on my system (and
they have immintrin.h), nor can I find it on MSDN.

>  _restrict=
>  for restrict_keyword in restrict __restrict__ __restrict; do
>      check_cc <<EOF && _restrict=$restrict_keyword && break
> diff --git a/libavutil/x86/cpu.c b/libavutil/x86/cpu.c
> index 5d77b0c..c6c96f0 100644
> --- a/libavutil/x86/cpu.c
> +++ b/libavutil/x86/cpu.c
> @@ -34,8 +34,19 @@
>          : "=a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx)        \
>          : "0" (index))
>
> +#if HAVE_INLINE_ASM
>  #define xgetbv(index, eax, edx)                                 \
>      __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c" (index))
> +#elif HAVE_XGETBV
> +#include <immintrin.h>
> +
> +#define xgetbv(index, eax, edx)                 \
> +    do {                                        \
> +        uint64_t res = _xgetbv(index);          \
> +        eax = res;                              \
> +        edx = res >> 32;                        \
> +    } while (0)
> +#endif /* HAVE_XGETBV */
>
>  #define get_eflags(x)                           \
>      __asm__ volatile ("pushfl     \n"           \
> -- 

Blank lines around the #if/else/endif lines would help readability here.

-- 
Måns Rullgård
[email protected]
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to