Commit f64c2e71 authored by Mans Rullgard's avatar Mans Rullgard

bswap: make generic implementation more compiler-friendly

With these changes, gcc 4.5 and later recognise it as a bswap
and use the proper instructions on ARM and x86.  On x86, the
16-bit bswap is recognised from gcc 4.1.
Signed-off-by: 's avatarMans Rullgard <mans@mansr.com>
parent 5695ae46
......@@ -51,6 +51,7 @@ static av_always_inline av_const unsigned av_bswap16(unsigned x)
}
#endif
#if !AV_GCC_VERSION_AT_LEAST(4,5)
#define av_bswap32 av_bswap32
static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
{
......@@ -66,6 +67,7 @@ static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
#endif /* HAVE_ARMV6 */
return x;
}
#endif /* !AV_GCC_VERSION_AT_LEAST(4,5) */
#endif /* __ARMCC_VERSION */
......
......@@ -65,23 +65,14 @@ static av_always_inline av_const uint16_t av_bswap16(uint16_t x)
#ifndef av_bswap32
static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
{
x= ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
x= (x>>16) | (x<<16);
return x;
return AV_BSWAP32C(x);
}
#endif
#ifndef av_bswap64
static inline uint64_t av_const av_bswap64(uint64_t x)
{
union {
uint64_t ll;
uint32_t l[2];
} w, r;
w.ll = x;
r.l[0] = av_bswap32 (w.l[1]);
r.l[1] = av_bswap32 (w.l[0]);
return r.ll;
return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32);
}
#endif
......
......@@ -28,13 +28,16 @@
#include "config.h"
#include "libavutil/attributes.h"
#if !AV_GCC_VERSION_AT_LEAST(4,1)
#define av_bswap16 av_bswap16
static av_always_inline av_const unsigned av_bswap16(unsigned x)
{
__asm__("rorw $8, %w0" : "+r"(x));
return x;
}
#endif /* !AV_GCC_VERSION_AT_LEAST(4,1) */
#if !AV_GCC_VERSION_AT_LEAST(4,5)
#define av_bswap32 av_bswap32
static av_always_inline av_const uint32_t av_bswap32(uint32_t x)
{
......@@ -57,5 +60,6 @@ static inline uint64_t av_const av_bswap64(uint64_t x)
return x;
}
#endif
#endif /* !AV_GCC_VERSION_AT_LEAST(4,5) */
#endif /* AVUTIL_X86_BSWAP_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment