From 6672aebfe46c2ce8fa61f1ad9919e0ea570b3a9d Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Tue, 30 Sep 2014 10:08:43 +0000 Subject: [PATCH] Proper endian swapping on older PPC ISAs --- src/arm/common.h | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/arm/common.h b/src/arm/common.h index ff13735c1..a1d42d1dc 100644 --- a/src/arm/common.h +++ b/src/arm/common.h @@ -16,11 +16,44 @@ #define UNUSED(V) (void)(V) -#ifdef __POWERPC__ -#define LOAD_32(DEST, ADDR, ARR) asm("lwbrx %0, %1, %2" : "=r"(DEST) : "r"(ADDR), "r"(ARR)) -#define LOAD_16(DEST, ADDR, ARR) asm("lhbrx %0, %1, %2" : "=r"(DEST) : "r"(ADDR), "r"(ARR)) -#define STORE_32(SRC, ADDR, ARR) asm("stwbrx %0, %1, %2" : : "r"(SRC), "r"(ADDR), "r"(ARR)) -#define STORE_16(SRC, ADDR, ARR) asm("sthbrx %0, %1, %2" : : "r"(SRC), "r"(ADDR), "r"(ARR)) +#ifdef __BIG_ENDIAN__ + +#if defined(__PPC__) || defined(__POWERPC__) +#define SWAP_32(DEST, VAR) asm(\ + "rlwinm %0, %1, 8, 24, 31\n" \ + "rlwimi %0, %1, 24, 16, 23\n" \ + "rlwimi %0, %1, 8, 8, 15\n" \ + "rlwimi %0, %1, 24, 0, 7\n" \ + : "+r"(DEST) : "r"(VAR) : ) + +#define SWAP_16(DEST, VAR) asm(\ + "rlwinm %0, %1, 24, 24, 31\n" \ + "rlwimi %0, %1, 8, 16, 23\n" \ + : "+r"(DEST) : "r"(VAR) : ) +#endif + +#define LOAD_32(DEST, ADDR, ARR) { \ + uint32_t _tmp = ((uint32_t*) ARR)[(ADDR) >> 2]; \ + SWAP_32(DEST, _tmp); \ +} + +#define LOAD_16(DEST, ADDR, ARR) { \ + uint16_t _tmp = ((uint16_t*) ARR)[(ADDR) >> 1]; \ + SWAP_16(DEST, _tmp); \ +} + +#define STORE_32(SRC, ADDR, ARR) { \ + uint32_t _tmp; \ + SWAP_32(_tmp, SRC); \ + ((uint32_t*) ARR)[(ADDR) >> 2] = _tmp; \ +} + +#define STORE_16(SRC, ADDR, ARR) { \ + uint16_t _tmp; \ + SWAP_16(_tmp, SRC); \ + ((uint16_t*) ARR)[(ADDR) >> 2] = _tmp; \ +} + #else #define LOAD_32(DEST, ADDR, ARR) DEST = ((uint32_t*) ARR)[(ADDR) >> 2] #define LOAD_16(DEST, ADDR, ARR) DEST = ((uint16_t*) ARR)[(ADDR) >> 1]