mathops: mips: Correctly enable loongson-specific assembly

The code wrongly assumed that the instructions used are supported
on mips64, while it is supported only on loongson cpus.
This commit is contained in:
Luca Barbato 2016-01-18 16:53:56 +01:00
parent 8fd361f53b
commit c4de754d4d
1 changed files with 25 additions and 22 deletions

View File

@ -28,13 +28,16 @@
#if HAVE_INLINE_ASM #if HAVE_INLINE_ASM
#if HAVE_LOONGSON #if HAVE_LOONGSON
#if ARCH_MIPS64
static inline av_const int64_t MAC64(int64_t d, int a, int b) static inline av_const int64_t MAC64(int64_t d, int a, int b)
{ {
int64_t m; int64_t m;
__asm__ ("dmult.g %1, %2, %3 \n\t" __asm__ ("dmult %2, %3 \n\t"
"mflo %1 \n\t"
"daddu %0, %0, %1 \n\t" "daddu %0, %0, %1 \n\t"
: "+r"(d), "=&r"(m) : "r"(a), "r"(b)); : "+r"(d), "=&r"(m) : "r"(a), "r"(b)
: "hi", "lo");
return d; return d;
} }
#define MAC64(d, a, b) ((d) = MAC64(d, a, b)) #define MAC64(d, a, b) ((d) = MAC64(d, a, b))
@ -42,23 +45,23 @@ static inline av_const int64_t MAC64(int64_t d, int a, int b)
static inline av_const int64_t MLS64(int64_t d, int a, int b) static inline av_const int64_t MLS64(int64_t d, int a, int b)
{ {
int64_t m; int64_t m;
__asm__ ("dmult.g %1, %2, %3 \n\t" __asm__ ("dmult %2, %3 \n\t"
"mflo %1 \n\t"
"dsubu %0, %0, %1 \n\t" "dsubu %0, %0, %1 \n\t"
: "+r"(d), "=&r"(m) : "r"(a), "r"(b)); : "+r"(d), "=&r"(m) : "r"(a), "r"(b)
: "hi", "lo");
return d; return d;
} }
#define MLS64(d, a, b) ((d) = MLS64(d, a, b)) #define MLS64(d, a, b) ((d) = MLS64(d, a, b))
#elif ARCH_MIPS64 #else
static inline av_const int64_t MAC64(int64_t d, int a, int b) static inline av_const int64_t MAC64(int64_t d, int a, int b)
{ {
int64_t m; int64_t m;
__asm__ ("dmult %2, %3 \n\t" __asm__ ("dmult.g %1, %2, %3 \n\t"
"mflo %1 \n\t"
"daddu %0, %0, %1 \n\t" "daddu %0, %0, %1 \n\t"
: "+r"(d), "=&r"(m) : "r"(a), "r"(b) : "+r"(d), "=&r"(m) : "r"(a), "r"(b));
: "hi", "lo");
return d; return d;
} }
#define MAC64(d, a, b) ((d) = MAC64(d, a, b)) #define MAC64(d, a, b) ((d) = MAC64(d, a, b))
@ -66,17 +69,17 @@ static inline av_const int64_t MAC64(int64_t d, int a, int b)
static inline av_const int64_t MLS64(int64_t d, int a, int b) static inline av_const int64_t MLS64(int64_t d, int a, int b)
{ {
int64_t m; int64_t m;
__asm__ ("dmult %2, %3 \n\t" __asm__ ("dmult.g %1, %2, %3 \n\t"
"mflo %1 \n\t"
"dsubu %0, %0, %1 \n\t" "dsubu %0, %0, %1 \n\t"
: "+r"(d), "=&r"(m) : "r"(a), "r"(b) : "+r"(d), "=&r"(m) : "r"(a), "r"(b));
: "hi", "lo");
return d; return d;
} }
#define MLS64(d, a, b) ((d) = MLS64(d, a, b)) #define MLS64(d, a, b) ((d) = MLS64(d, a, b))
#endif #endif
#endif /* HAVE_LOONGSON */
#endif /* HAVE_INLINE_ASM */ #endif /* HAVE_INLINE_ASM */
#endif /* AVCODEC_MIPS_MATHOPS_H */ #endif /* AVCODEC_MIPS_MATHOPS_H */