32/64-bit agnostic x86 bswap
Originally committed as revision 12496 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -34,16 +34,10 @@
|
|||||||
#include <byteswap.h>
|
#include <byteswap.h>
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#ifdef ARCH_X86_64
|
|
||||||
# define LEGACY_REGS "=Q"
|
|
||||||
#else
|
|
||||||
# define LEGACY_REGS "=q"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static av_always_inline uint16_t bswap_16(uint16_t x)
|
static av_always_inline uint16_t bswap_16(uint16_t x)
|
||||||
{
|
{
|
||||||
#if defined(ARCH_X86)
|
#if defined(ARCH_X86)
|
||||||
asm("rorw $8, %0" : LEGACY_REGS (x) : "0" (x));
|
asm("rorw $8, %0" : "+r"(x));
|
||||||
#elif defined(ARCH_SH4)
|
#elif defined(ARCH_SH4)
|
||||||
asm("swap.b %0,%0" : "=r"(x) : "0"(x));
|
asm("swap.b %0,%0" : "=r"(x) : "0"(x));
|
||||||
#else
|
#else
|
||||||
@@ -56,15 +50,13 @@ static av_always_inline uint32_t bswap_32(uint32_t x)
|
|||||||
{
|
{
|
||||||
#if defined(ARCH_X86)
|
#if defined(ARCH_X86)
|
||||||
#ifdef HAVE_BSWAP
|
#ifdef HAVE_BSWAP
|
||||||
asm("bswap %0":
|
asm("bswap %0" : "+r" (x));
|
||||||
"=r" (x) :
|
|
||||||
#else
|
#else
|
||||||
asm("xchgb %b0,%h0\n"
|
asm("rorw $8, %w0 \n\t"
|
||||||
"rorl $16,%0 \n"
|
"rorl $16, %0 \n\t"
|
||||||
"xchgb %b0,%h0":
|
"rorw $8, %w0"
|
||||||
LEGACY_REGS (x) :
|
: "+r"(x));
|
||||||
#endif
|
#endif
|
||||||
"0" (x));
|
|
||||||
#elif defined(ARCH_SH4)
|
#elif defined(ARCH_SH4)
|
||||||
asm("swap.b %0,%0\n"
|
asm("swap.b %0,%0\n"
|
||||||
"swap.w %0,%0\n"
|
"swap.w %0,%0\n"
|
||||||
|
Reference in New Issue
Block a user