avcodec/x86/mathops: clip constants used with shift instructions within inline assembly

Fixes assembling with binutil as >= 2.41

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
Rémi Denis-Courmont 2023-07-16 18:18:02 +03:00 committed by James Almer
parent ccc6849932
commit effadce6c7
1 changed files with 23 additions and 3 deletions

View File

@ -35,12 +35,20 @@
static av_always_inline av_const int MULL(int a, int b, unsigned shift) static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{ {
int rt, dummy; int rt, dummy;
if (__builtin_constant_p(shift))
__asm__ ( __asm__ (
"imull %3 \n\t" "imull %3 \n\t"
"shrdl %4, %%edx, %%eax \n\t" "shrdl %4, %%edx, %%eax \n\t"
:"=a"(rt), "=d"(dummy) :"=a"(rt), "=d"(dummy)
:"a"(a), "rm"(b), "ci"((uint8_t)shift) :"a"(a), "rm"(b), "i"(shift & 0x1F)
); );
else
__asm__ (
"imull %3 \n\t"
"shrdl %4, %%edx, %%eax \n\t"
:"=a"(rt), "=d"(dummy)
:"a"(a), "rm"(b), "c"((uint8_t)shift)
);
return rt; return rt;
} }
@ -113,19 +121,31 @@ __asm__ volatile(\
// avoid +32 for shift optimization (gcc should do that ...) // avoid +32 for shift optimization (gcc should do that ...)
#define NEG_SSR32 NEG_SSR32 #define NEG_SSR32 NEG_SSR32
static inline int32_t NEG_SSR32( int32_t a, int8_t s){ static inline int32_t NEG_SSR32( int32_t a, int8_t s){
if (__builtin_constant_p(s))
__asm__ ("sarl %1, %0\n\t" __asm__ ("sarl %1, %0\n\t"
: "+r" (a) : "+r" (a)
: "ic" ((uint8_t)(-s)) : "i" (-s & 0x1F)
); );
else
__asm__ ("sarl %1, %0\n\t"
: "+r" (a)
: "c" ((uint8_t)(-s))
);
return a; return a;
} }
#define NEG_USR32 NEG_USR32 #define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
if (__builtin_constant_p(s))
__asm__ ("shrl %1, %0\n\t" __asm__ ("shrl %1, %0\n\t"
: "+r" (a) : "+r" (a)
: "ic" ((uint8_t)(-s)) : "i" (-s & 0x1F)
); );
else
__asm__ ("shrl %1, %0\n\t"
: "+r" (a)
: "c" ((uint8_t)(-s))
);
return a; return a;
} }