From 720b35aa2608c885f29b5b4e1063375c1f8b5739 Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Sun, 12 Jan 2020 22:51:07 +0100 Subject: [PATCH] Move endian swapping code to endianswap.h. Remove superfluous endian swapping wrappers. --- cpu/ppc/ppcemu.h | 8 ++----- cpu/ppc/ppcopcodes.cpp | 8 +++---- endianswap.h | 51 ++++++++++++++++++++++++++++++++++++++++++ main.cpp | 29 ------------------------ 4 files changed, 57 insertions(+), 39 deletions(-) create mode 100644 endianswap.h diff --git a/cpu/ppc/ppcemu.h b/cpu/ppc/ppcemu.h index 2105aa1..0e96b26 100644 --- a/cpu/ppc/ppcemu.h +++ b/cpu/ppc/ppcemu.h @@ -9,6 +9,7 @@ #define PPCEMU_H #include +#include "endianswap.h" #include "devices/memctrlbase.h" //Uncomment this to help debug the emulator further @@ -155,11 +156,6 @@ extern uint64_t ppc_result64_b; extern uint64_t ppc_result64_c; extern uint64_t ppc_result64_d; -extern uint16_t rev_endian16(uint16_t insert_int); -extern uint32_t uimm_rev_endian16(uint32_t insert_int); -extern int32_t simm_rev_endian16(int32_t insert_int); -extern uint32_t rev_endian32(uint32_t insert_int); -extern uint64_t rev_endian64(uint64_t insert_int); /* The precise end of a basic block. */ enum class BB_end_kind { @@ -435,7 +431,7 @@ extern void ppc_fmr(); extern void ppc_mffs(); extern void ppc_mffsdot(); extern void ppc_mtfsf(); -extern void ppc_mtfsfdot(); +extern void ppc_mtfsfdot(); extern void ppc_mtfsfi(); extern void ppc_mtfsfidot(); diff --git a/cpu/ppc/ppcopcodes.cpp b/cpu/ppc/ppcopcodes.cpp index 8197223..14d14f4 100644 --- a/cpu/ppc/ppcopcodes.cpp +++ b/cpu/ppc/ppcopcodes.cpp @@ -1901,7 +1901,7 @@ void ppc_sthx(){ void ppc_sthbrx(){ ppc_grab_regssab(); ppc_effective_address = (reg_a == 0)?ppc_result_b:(ppc_result_a + ppc_result_b); - ppc_result_d = (uint32_t)(rev_endian16((uint16_t)ppc_result_d)); + ppc_result_d = (uint32_t)(BYTESWAP_16((uint16_t)ppc_result_d)); address_quickinsert_translate(ppc_result_d, ppc_effective_address, 2); } @@ -1952,7 +1952,7 @@ void ppc_stwux(){ void ppc_stwbrx(){ ppc_grab_regssab(); ppc_effective_address = (reg_a == 0)?ppc_result_b:(ppc_result_a + ppc_result_b); - ppc_result_d = rev_endian32(ppc_result_d); + ppc_result_d = BYTESWAP_32(ppc_result_d); address_quickinsert_translate(ppc_result_d, ppc_effective_address, 4); } @@ -2137,7 +2137,7 @@ void ppc_lhbrx(){ ppc_grab_regsdab(); ppc_effective_address = (reg_a == 0)?ppc_result_b:(ppc_result_a + ppc_result_b); address_quickgrab_translate(ppc_effective_address, 2); - ppc_result_d = (uint32_t)(rev_endian16((uint16_t)ppc_result_d)); + ppc_result_d = (uint32_t)(BYTESWAP_16((uint16_t)ppc_result_d)); return_value = 0; ppc_store_result_regd(); } @@ -2156,7 +2156,7 @@ void ppc_lwbrx(){ ppc_grab_regsdab(); ppc_effective_address = (reg_a == 0)?ppc_result_b:(ppc_result_a + ppc_result_b); address_quickgrab_translate(ppc_effective_address, 4); - ppc_result_d = rev_endian32(return_value); + ppc_result_d = BYTESWAP_32(return_value); return_value = 0; ppc_store_result_regd(); } diff --git a/endianswap.h b/endianswap.h new file mode 100644 index 0000000..a33111d --- /dev/null +++ b/endianswap.h @@ -0,0 +1,51 @@ +/** @file Macros for performing byte swapping for quick endian conversion. + + It will try to use the fast built-in machine instructions first + and fall back to the slow conversion if none were found. + */ + +#ifndef ENDIAN_SWAP_H +#define ENDIAN_SWAP_H + +#ifdef __GNUG__ /* GCC, ICC and Clang */ + +# ifdef __APPLE__ +# include +# else +# include +# endif + +# define BYTESWAP_16(x) (__builtin_bswap16 (x)) +# define BYTESWAP_32(x) (__builtin_bswap32 (x)) +# define BYTESWAP_64(x) (__builtin_bswap64 (x)) + +#elif _MSC_VER /* MSVC */ + +# include + +# define BYTESWAP_16(x) (_byteswap_ushort (x)) +# define BYTESWAP_32(x) (_byteswap_ulong (x)) +# define BYTESWAP_64(x) (_byteswap_uint64 (x)) + +#else + +# warning "Unknown byte swapping built-ins (do it the slow way)!" + +# define BYTESWAP_16(x) ((x) >> 8) | (((x) & 0xFFUL) << 8) + +# define BYTESWAP_32(x) ((x) >> 24) | (((x) >> 8) & 0xFF00UL) | \ + (((x) & 0xFF00UL) << 8) | ((x) << 24) + +# define BYTESWAP_64(x) \ + ((x) >> 56) | \ + (((x) & 0x00FF000000000000ULL) >> 48) | \ + (((x) & 0x0000FF0000000000ULL) >> 40) | \ + (((x) & 0x000000FF00000000ULL) >> 32) | \ + (((x) & 0x00000000FF000000ULL) << 32) | \ + (((x) & 0x0000000000FF0000ULL) << 40) | \ + (((x) & 0x000000000000FF00ULL) << 48) | \ + (((x) & 0x00000000000000FFULL) << 56) + +#endif + +#endif /* ENDIAN_SWAP_H */ diff --git a/main.cpp b/main.cpp index 31902b5..01e4cec 100644 --- a/main.cpp +++ b/main.cpp @@ -25,14 +25,6 @@ #include "devices/macio.h" #include "devices/mpc106.h" -#define max_16b_int 65535 -#define max_32b_int 4294967295 -#define ENDIAN_REVERSE16(x) (x >> 8) | (((x) & 0x00FF) << 8) -#define ENDIAN_REVERSE32(x) (x >> 24) | ((x & 0x00FF0000) >> 8) | ((x & 0x0000FF00) << 8) | (x << 24) -#define ENDIAN_REVERSE64(x) (x >> 56) | ((x & 0x00FF000000000000) >> 48) | ((x & 0x0000FF0000000000) >> 40) | ((x & 0x000000FF00000000) >> 32) | \ - ((x & 0x00000000FF000000) << 32) | ((x & 0x0000000000FF0000) << 40) | ((x & 0x000000000000FF00) << 48) | ((x & 0x00000000000000FF) << 56) - - using namespace std; /** @@ -105,27 +97,6 @@ uint32_t rom_filesize; uint32_t write_opcode; uint8_t write_char; - /* -//DISK VARIABLES -unsigned char * grab_disk_buf; -bool disk_inserted; -uint64_t disk_offset = 0; -uint32_t disk_word = 0; -*/ - - -uint16_t rev_endian16(uint16_t insert_int){ - return ENDIAN_REVERSE16(insert_int); -} - -uint32_t rev_endian32(uint32_t insert_int){ - return ENDIAN_REVERSE32(insert_int); -} - -uint64_t rev_endian64(uint64_t insert_int){ - return ENDIAN_REVERSE64(insert_int); -} - //Initialize the PPC's registers. void reg_init(){ for (uint32_t i = 0; i < 32; i++){