all repos — mgba @ 5afd8ea1bbcda765fc60d465ebcb61ba14595eb6

mGBA Game Boy Advance Emulator

The old implementation of endian swapping was sufficient, put it back
Jeffrey Pfau jeffrey@endrift.com
Wed, 01 Oct 2014 00:57:52 -0700
commit

5afd8ea1bbcda765fc60d465ebcb61ba14595eb6

parent

f4d27e5e40bc1630e1da506a8b9a0f3dd49635f0

1 files changed, 4 insertions(+), 37 deletions(-)

jump to
M src/arm/common.hsrc/arm/common.h

@@ -16,44 +16,11 @@ #include <unistd.h>

#define UNUSED(V) (void)(V) -#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; \ -} - +#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)) #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]