diff --git a/Utilities/BEType.h b/Utilities/BEType.h index 5274fe5f56..750aef064e 100644 --- a/Utilities/BEType.h +++ b/Utilities/BEType.h @@ -6,13 +6,44 @@ #define re128(val) u128::byteswap(val) template struct se_t; -template struct se_t { static __forceinline void func(T& dst, const T src) { (u8&)dst = (u8&)src; } }; -template struct se_t { static __forceinline void func(T& dst, const T src) { (u16&)dst = _byteswap_ushort((u16&)src); } }; -template struct se_t { static __forceinline void func(T& dst, const T src) { (u32&)dst = _byteswap_ulong((u32&)src); } }; -template struct se_t { static __forceinline void func(T& dst, const T src) { (u64&)dst = _byteswap_uint64((u64&)src); } }; -template T re(const T val) { T res; se_t::func(res, val); return res; } -template void re(T1& dst, const T2 val) { se_t::func(dst, val); } +template struct se_t +{ + static __forceinline T func(const T src) + { + return src; + } +}; + +template struct se_t +{ + static __forceinline T func(const T src) + { + const u16 res = _byteswap_ushort((u16&)src); + return (T&)res; + } +}; + +template struct se_t +{ + static __forceinline T func(const T src) + { + const u32 res = _byteswap_ulong((u32&)src); + return (T&)res; + } +}; + +template struct se_t +{ + static __forceinline T func(const T src) + { + const u64 res = _byteswap_uint64((u64&)src); + return (T&)res; + } +}; + +//template T re(const T val) { T res; se_t::func(res, val); return res; } +//template void re(T1& dst, const T2 val) { se_t::func(dst, val); } template struct const_se_t; template struct const_se_t @@ -63,11 +94,7 @@ public: T ToLE() const { - T res; - - se_t::func(res, m_data); - - return res; + return se_t::func(m_data); } void FromBE(const T& value) @@ -77,21 +104,18 @@ public: void FromLE(const T& value) { - se_t::func(m_data, value); + m_data = se_t::func(value); } static be_t MakeFromLE(const T value) { - be_t res; - res.FromLE(value); - return res; + T data = se_t::func(value); + return (be_t&)data; } static be_t MakeFromBE(const T value) { - be_t res; - res.FromBE(value); - return res; + return (be_t&)value; } //template @@ -103,25 +127,26 @@ public: template operator const be_t() const { - be_t res; - if (sizeof(T1) < sizeof(T)) + if (sizeof(T1) > sizeof(T) || std::is_floating_point::value || std::is_floating_point::value) { - res.FromBE(ToBE() >> ((sizeof(T)-sizeof(T1)) * 8)); + T1 res = se_t::func(ToLE()); + return (be_t&)res; } - else if (sizeof(T1) > sizeof(T)) + else if (sizeof(T1) < sizeof(T)) { - res.FromLE(ToLE()); + T1 res = ToBE() >> ((sizeof(T) - sizeof(T1)) * 8); + return (be_t&)res; } else { - res.FromBE(ToBE()); + T1 res = ToBE(); + return (be_t&)res; } - return res; } be_t& operator = (const T& right) { - FromLE(right); + m_data = se_t::func(right); return *this; } @@ -171,6 +196,81 @@ public: be_t& operator-- () { *this -= 1; return *this; } }; +template +class be_t +{ + static_assert(sizeof(T2) == 1 || sizeof(T2) == 2 || sizeof(T2) == 4 || sizeof(T2) == 8, "Bad be_t type"); + const T m_data; + +public: + typedef const T type; + + const T& ToBE() const + { + return m_data; + } + + const T ToLE() const + { + return se_t::func(m_data); + } + + static be_t MakeFromLE(const T value) + { + const T data = se_t::func(value); + return (be_t&)data; + } + + static be_t MakeFromBE(const T value) + { + return (be_t&)value; + } + + //template + operator const T() const + { + return ToLE(); + } + + template + operator const be_t() const + { + if (sizeof(T1) > sizeof(T) || std::is_floating_point::value || std::is_floating_point::value) + { + T1 res = se_t::func(ToLE()); + return (be_t&)res; + } + else if (sizeof(T1) < sizeof(T)) + { + T1 res = ToBE() >> ((sizeof(T) - sizeof(T1)) * 8); + return (be_t&)res; + } + else + { + T1 res = ToBE(); + return (be_t&)res; + } + } + + template be_t operator & (const be_t& right) const { const T res; res = ToBE() & right.ToBE(); return (be_t&)res; } + template be_t operator | (const be_t& right) const { const T res; res = ToBE() | right.ToBE(); return (be_t&)res; } + template be_t operator ^ (const be_t& right) const { const T res; res = ToBE() ^ right.ToBE(); return (be_t&)res; } + + template bool operator == (T1 right) const { return (T1)ToLE() == right; } + template bool operator != (T1 right) const { return !(*this == right); } + template bool operator > (T1 right) const { return (T1)ToLE() > right; } + template bool operator < (T1 right) const { return (T1)ToLE() < right; } + template bool operator >= (T1 right) const { return (T1)ToLE() >= right; } + template bool operator <= (T1 right) const { return (T1)ToLE() <= right; } + + template bool operator == (const be_t& right) const { return ToBE() == right.ToBE(); } + template bool operator != (const be_t& right) const { return !(*this == right); } + template bool operator > (const be_t& right) const { return (T1)ToLE() > right.ToLE(); } + template bool operator < (const be_t& right) const { return (T1)ToLE() < right.ToLE(); } + template bool operator >= (const be_t& right) const { return (T1)ToLE() >= right.ToLE(); } + template bool operator <= (const be_t& right) const { return (T1)ToLE() <= right.ToLE(); } +}; + template struct is_be_t : public std::integral_constant {}; diff --git a/rpcs3/Emu/Cell/SPURecompilerCore.cpp b/rpcs3/Emu/Cell/SPURecompilerCore.cpp index 3212096697..73bc023bea 100644 --- a/rpcs3/Emu/Cell/SPURecompilerCore.cpp +++ b/rpcs3/Emu/Cell/SPURecompilerCore.cpp @@ -127,11 +127,11 @@ void SPURecompilerCore::Compile(u16 pos) m_enc->do_finalize = true; } bool fin = m_enc->do_finalize; - if (entry[pos].valid == re(opcode)) + if (entry[pos].valid == re32(opcode)) { excess++; } - entry[pos].valid = re(opcode); + entry[pos].valid = re32(opcode); if (fin) break; CPU.PC += 4; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index affa9c3449..8ae24d58ac 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -99,7 +99,7 @@ void RSXVertexData::Load(u32 start, u32 count, u32 baseOffset, u32 baseIndex=0) { const u16* c_src = (const u16*)src; u16* c_dst = (u16*)dst; - for(u32 j=0; j::func(put, std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, put)))); - se_t::func(get, std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, get)))); + put = se_t::func(std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, put)))); + get = se_t::func(std::atomic_load((volatile std::atomic*)((u8*)m_ctrl + offsetof(CellGcmControl, get)))); /* se_t::func(put, InterlockedCompareExchange((volatile unsigned long*)((u8*)m_ctrl + offsetof(CellGcmControl, put)), 0, 0)); se_t::func(get, InterlockedCompareExchange((volatile unsigned long*)((u8*)m_ctrl + offsetof(CellGcmControl, get)), 0, 0)); diff --git a/rpcs3/Emu/RSX/sysutil_video.h b/rpcs3/Emu/RSX/sysutil_video.h index d31e53102b..36bda57b4e 100644 --- a/rpcs3/Emu/RSX/sysutil_video.h +++ b/rpcs3/Emu/RSX/sysutil_video.h @@ -160,7 +160,7 @@ struct CellVideoOutDisplayMode u8 conversion; u8 aspect; u8 reserved[2]; - u16 refreshRates; + be_t refreshRates; }; struct CellVideoOutResolution diff --git a/rpcs3/Emu/SysCalls/Modules.h b/rpcs3/Emu/SysCalls/Modules.h index 60f0f92938..cb1a78bfa2 100644 --- a/rpcs3/Emu/SysCalls/Modules.h +++ b/rpcs3/Emu/SysCalls/Modules.h @@ -155,8 +155,8 @@ __forceinline void Module::AddFuncSub(const char group[8], const u64 ops[], cons op.mask = ops[i] >> 32; op.crc = (u32)ops[i]; if (op.mask) op.crc &= op.mask; - op.mask = re(op.mask); - op.crc = re(op.crc); + op.mask = re32(op.mask); + op.crc = re32(op.crc); sf->ops.push_back(op); } PushNewFuncSub(sf); diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index 80f68f8002..92a0c4225d 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -152,7 +152,7 @@ int cellVideoOutGetState(u32 videoOut, u32 deviceIndex, vm::ptrdisplayMode.scanMode = Emu.GetGSManager().GetInfo().mode.scanMode; state->displayMode.conversion = Emu.GetGSManager().GetInfo().mode.conversion; state->displayMode.aspect = Emu.GetGSManager().GetInfo().mode.aspect; - state->displayMode.refreshRates = re(Emu.GetGSManager().GetInfo().mode.refreshRates); + state->displayMode.refreshRates = Emu.GetGSManager().GetInfo().mode.refreshRates; return CELL_VIDEO_OUT_SUCCEEDED; case CELL_VIDEO_OUT_SECONDARY: