|
|
@@ -29,12 +29,15 @@ |
|
|
#define AV_RN32 AV_RN32 |
|
|
#define AV_RN32 AV_RN32 |
|
|
static av_always_inline uint32_t AV_RN32(const void *p) |
|
|
static av_always_inline uint32_t AV_RN32(const void *p) |
|
|
{ |
|
|
{ |
|
|
|
|
|
struct __attribute__((packed)) u32 { uint32_t v; }; |
|
|
|
|
|
const uint8_t *q = p; |
|
|
|
|
|
const struct u32 *pl = (const struct u32 *)(q + 3 * !HAVE_BIGENDIAN); |
|
|
|
|
|
const struct u32 *pr = (const struct u32 *)(q + 3 * HAVE_BIGENDIAN); |
|
|
uint32_t v; |
|
|
uint32_t v; |
|
|
__asm__ ("lwl %0, %1 \n\t" |
|
|
__asm__ ("lwl %0, %1 \n\t" |
|
|
"lwr %0, %2 \n\t" |
|
|
"lwr %0, %2 \n\t" |
|
|
: "=&r"(v) |
|
|
: "=&r"(v) |
|
|
: "m"(*(const uint32_t *)((const uint8_t *)p+3*!HAVE_BIGENDIAN)), |
|
|
|
|
|
"m"(*(const uint32_t *)((const uint8_t *)p+3*HAVE_BIGENDIAN))); |
|
|
|
|
|
|
|
|
: "m"(*pl), "m"(*pr)); |
|
|
return v; |
|
|
return v; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|