Browse Source

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: Mans Rullgard <mans@mansr.com>
tags/n0.10
Mans Rullgard 13 years ago
parent
commit
f64c2e710f
3 changed files with 8 additions and 11 deletions
  1. +2
    -0
      libavutil/arm/bswap.h
  2. +2
    -11
      libavutil/bswap.h
  3. +4
    -0
      libavutil/x86/bswap.h

+ 2
- 0
libavutil/arm/bswap.h View File

@@ -51,6 +51,7 @@ static av_always_inline av_const unsigned av_bswap16(unsigned x)
} }
#endif #endif


#if !AV_GCC_VERSION_AT_LEAST(4,5)
#define av_bswap32 av_bswap32 #define av_bswap32 av_bswap32
static av_always_inline av_const uint32_t av_bswap32(uint32_t x) 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 */ #endif /* HAVE_ARMV6 */
return x; return x;
} }
#endif /* !AV_GCC_VERSION_AT_LEAST(4,5) */


#endif /* __ARMCC_VERSION */ #endif /* __ARMCC_VERSION */




+ 2
- 11
libavutil/bswap.h View File

@@ -65,23 +65,14 @@ static av_always_inline av_const uint16_t av_bswap16(uint16_t x)
#ifndef av_bswap32 #ifndef av_bswap32
static av_always_inline av_const uint32_t av_bswap32(uint32_t x) 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 #endif


#ifndef av_bswap64 #ifndef av_bswap64
static inline uint64_t av_const av_bswap64(uint64_t x) 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 #endif




+ 4
- 0
libavutil/x86/bswap.h View File

@@ -28,13 +28,16 @@
#include "config.h" #include "config.h"
#include "libavutil/attributes.h" #include "libavutil/attributes.h"


#if !AV_GCC_VERSION_AT_LEAST(4,1)
#define av_bswap16 av_bswap16 #define av_bswap16 av_bswap16
static av_always_inline av_const unsigned av_bswap16(unsigned x) static av_always_inline av_const unsigned av_bswap16(unsigned x)
{ {
__asm__("rorw $8, %w0" : "+r"(x)); __asm__("rorw $8, %w0" : "+r"(x));
return x; return x;
} }
#endif /* !AV_GCC_VERSION_AT_LEAST(4,1) */


#if !AV_GCC_VERSION_AT_LEAST(4,5)
#define av_bswap32 av_bswap32 #define av_bswap32 av_bswap32
static av_always_inline av_const uint32_t av_bswap32(uint32_t x) 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; return x;
} }
#endif #endif
#endif /* !AV_GCC_VERSION_AT_LEAST(4,5) */


#endif /* AVUTIL_X86_BSWAP_H */ #endif /* AVUTIL_X86_BSWAP_H */

Loading…
Cancel
Save