1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-11-23 21:54:53 +02:00

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>
(cherry picked from commit effadce6c7)
This commit is contained in:
Rémi Denis-Courmont
2023-07-16 18:18:02 +03:00
committed by James Almer
parent 62e1c44263
commit 9983d098ff

View File

@@ -35,11 +35,19 @@
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,18 +121,30 @@ __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;
} }