x86/intmath: add VEX encoded versions of av_clipf() and av_clipd()

Prevents mixing inlined SSE instructions and AVX instructions when the compiler
generates the latter.

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2021-11-15 23:15:38 -03:00
parent b2aec70bd6
commit 67b92d68c6
1 changed files with 30 additions and 0 deletions

View File

@ -134,6 +134,36 @@ static av_always_inline av_const float av_clipf_sse(float a, float amin, float a
#endif /* __SSE__ */
#if defined(__AVX__) && !defined(__INTEL_COMPILER)
#undef av_clipd
#define av_clipd av_clipd_avx
static av_always_inline av_const double av_clipd_avx(double a, double amin, double amax)
{
#if defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
if (amin > amax) abort();
#endif
__asm__ ("vmaxsd %1, %0, %0 \n\t"
"vminsd %2, %0, %0 \n\t"
: "+&x"(a) : "xm"(amin), "xm"(amax));
return a;
}
#undef av_clipf
#define av_clipf av_clipf_avx
static av_always_inline av_const float av_clipf_avx(float a, float amin, float amax)
{
#if defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
if (amin > amax) abort();
#endif
__asm__ ("vmaxss %1, %0, %0 \n\t"
"vminss %2, %0, %0 \n\t"
: "+&x"(a) : "xm"(amin), "xm"(amax));
return a;
}
#endif /* __AVX__ */
#endif /* __GNUC__ */
#endif /* AVUTIL_X86_INTMATH_H */