diff --git a/rpcs3/Emu/Cell/PPUOpcodes.h b/rpcs3/Emu/Cell/PPUOpcodes.h index 4a34f846f7..17503650d7 100644 --- a/rpcs3/Emu/Cell/PPUOpcodes.h +++ b/rpcs3/Emu/Cell/PPUOpcodes.h @@ -63,12 +63,13 @@ union ppu_opcode_t constexpr u64 ppu_rotate_mask(u32 mb, u32 me) { - return std::rotr(~0ull << (~(me - mb) & 63), mb & 63); + const u64 mask = ~0ull << (~(me - mb) & 63); + return (mask >> (mb & 63)) | (mask << ((64 - mb) & 63)); } constexpr u32 ppu_decode(u32 inst) { - return std::rotr(inst, 26) & 0x1ffff; // Rotate + mask + return ((inst >> 26) | (inst << 6)) & 0x1ffff; // Rotate + mask } // PPU decoder object. D provides functions. T is function pointer type returned. diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 87b2316785..c1b1df4989 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -14,6 +14,7 @@ #include "Overlays/overlay_perf_metrics.h" #include "Utilities/date_time.h" #include "Utilities/span.h" +#include "Utilities/asm.h" #include "Utilities/StrUtil.h" #include @@ -2443,7 +2444,7 @@ namespace rsx for (u32 ea = address >> 20, end = ea + (size >> 20); ea < end; ea++) { - const u32 io = std::rotr(iomap_table.io[ea], 20); + const u32 io = utils::ror32(iomap_table.io[ea], 20); if (io + 1) {