MINGW64 fix

This commit is contained in:
Nekotekina 2015-11-26 11:13:33 +03:00
parent ca6783ba9a
commit 8a1ce6ba64
10 changed files with 51 additions and 30 deletions

View File

@ -383,19 +383,28 @@ template<typename T> struct se_storage<T, 2>
{
using type = u16;
[[deprecated]] static constexpr u16 swap(u16 src) // for reference
[[deprecated]] static constexpr u16 _swap(u16 src) // for reference
{
return (src >> 8) | (src << 8);
}
static inline u16 swap(u16 src)
{
#if defined(__GNUG__)
return __builtin_bswap16(src);
#else
return _byteswap_ushort(src);
#endif
}
static inline u16 to(const T& src)
{
return _byteswap_ushort(reinterpret_cast<const u16&>(src));
return swap(reinterpret_cast<const u16&>(src));
}
static inline T from(u16 src)
{
const u16 result = _byteswap_ushort(src);
const u16 result = swap(src);
return reinterpret_cast<const T&>(result);
}
};
@ -404,19 +413,28 @@ template<typename T> struct se_storage<T, 4>
{
using type = u32;
[[deprecated]] static constexpr u32 swap(u32 src) // for reference
[[deprecated]] static constexpr u32 _swap(u32 src) // for reference
{
return (src >> 24) | (src << 24) | ((src >> 8) & 0x0000ff00) | ((src << 8) & 0x00ff0000);
}
static inline u32 swap(u32 src)
{
#if defined(__GNUG__)
return __builtin_bswap32(src);
#else
return _byteswap_ulong(src);
#endif
}
static inline u32 to(const T& src)
{
return _byteswap_ulong(reinterpret_cast<const u32&>(src));
return swap(reinterpret_cast<const u32&>(src));
}
static inline T from(u32 src)
{
const u32 result = _byteswap_ulong(src);
const u32 result = swap(src);
return reinterpret_cast<const T&>(result);
}
};
@ -425,7 +443,7 @@ template<typename T> struct se_storage<T, 8>
{
using type = u64;
[[deprecated]] static constexpr u64 swap(u64 src) // for reference
[[deprecated]] static constexpr u64 _swap(u64 src) // for reference
{
return (src >> 56) | (src << 56) |
((src >> 40) & 0x000000000000ff00) |
@ -436,14 +454,23 @@ template<typename T> struct se_storage<T, 8>
((src << 40) & 0x00ff000000000000);
}
static inline u64 swap(u64 src)
{
#if defined(__GNUG__)
return __builtin_bswap64(src);
#else
return _byteswap_uint64(src);
#endif
}
static inline u64 to(const T& src)
{
return _byteswap_uint64(reinterpret_cast<const u64&>(src));
return swap(reinterpret_cast<const u64&>(src));
}
static inline T from(u64 src)
{
const u64 result = _byteswap_uint64(src);
const u64 result = swap(src);
return reinterpret_cast<const T&>(result);
}
};

View File

@ -40,20 +40,8 @@
#endif
#define _fpclass(x) std::fpclassify(x)
#define _byteswap_ushort(x) __builtin_bswap16(x)
#define _byteswap_uint64(x) __builtin_bswap64(x)
#define INFINITE 0xFFFFFFFF
#if !defined(__MINGW32__)
#define _byteswap_ulong(x) __builtin_bswap32(x)
#else
inline std::uint32_t _byteswap_ulong(std::uint32_t value)
{
__asm__("bswap %0" : "+r"(value));
return value;
}
#endif
#ifdef __APPLE__
// XXX only supports a single timer

View File

@ -868,7 +868,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context)
case X64OP_LOAD:
{
u32 value;
if (is_writing || !thread->read_reg(addr, value) || !put_x64_reg_value(context, reg, d_size, _byteswap_ulong(value)))
if (is_writing || !thread->read_reg(addr, value) || !put_x64_reg_value(context, reg, d_size, se_storage<u32>::swap(value)))
{
return false;
}
@ -878,7 +878,7 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context)
case X64OP_STORE:
{
u64 reg_value;
if (!is_writing || !get_x64_reg_value(context, reg, d_size, i_size, reg_value) || !thread->write_reg(addr, _byteswap_ulong((u32)reg_value)))
if (!is_writing || !get_x64_reg_value(context, reg, d_size, i_size, reg_value) || !thread->write_reg(addr, se_storage<u32>::swap((u32)reg_value)))
{
return false;
}

View File

@ -30,7 +30,7 @@ if(NOT MSVC)
if($ENV{CI})
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O1") # fix for travis gcc OoM crash. Might be fixed with the move to containers.
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fexceptions -w")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fexceptions")
add_compile_options(-msse -msse2 -mcx16 -mssse3)
if(WIN32)
add_compile_options(-municode -static -mwindows)
@ -118,7 +118,11 @@ if(WIN32)
include_directories(BEFORE "${RPCS3_SRC_DIR}/../minidx12/Include")
endif()
if(LLVM_FOUND)
if(NOT LLVM_FOUND)
Message("LLVM not found! LLVM 3.6 is required. RPCS3 will be compiled without LLVM support.")
elseif(${LLVM_PACKAGE_VERSION} VERSION_LESS "3.6" OR ${LLVM_PACKAGE_VERSION} VERSION_EQUAL "3.7" OR ${LLVM_PACKAGE_VERSION} VERSION_GREATER "3.7")
Message("LLVM ${LLVM_PACKAGE_VERSION} is not supported! LLVM 3.6 is required. RPCS3 will be compiled without LLVM support.")
else()
add_definitions(${LLVM_DEFINITIONS})
add_definitions(-DLLVM_AVAILABLE)
if (CMAKE_BUILD_TYPE STREQUAL "Release")

View File

@ -3690,7 +3690,7 @@ void ARMv7_instrs::REV(ARMv7Context& context, const ARMv7Code code, const ARMv7_
if (ConditionPassed(context, cond))
{
context.write_gpr(d, _byteswap_ulong(context.read_gpr(m)), type == T1 ? 2 : 4);
context.write_gpr(d, se_storage<u32>::swap(context.read_gpr(m)), type == T1 ? 2 : 4);
}
}

View File

@ -227,7 +227,7 @@ void CgBinaryDisasm::TaskFP()
assert((m_buffer_size - m_offset) % sizeof(u32) == 0);
for (u32 i = 0; i < (m_buffer_size - m_offset) / sizeof(u32); i++)
{
data[i] = _byteswap_ulong(data[i]); // WTF, cannot use be_t<> there?
data[i] = se_storage<u32>::swap(data[i]); // WTF, cannot use be_t<> there?
}
enum

View File

@ -365,7 +365,7 @@ public:
assert((m_buffer_size - m_offset) % sizeof(u32) == 0);
for (u32 i = 0; i < (m_buffer_size - m_offset) / sizeof(u32); i++)
{
vdata[i] = _byteswap_ulong(vdata[i]); // WTF, cannot use be_t<> there?
vdata[i] = se_storage<u32>::swap(vdata[i]); // WTF, cannot use be_t<> there?
}
for (u32 i = 0; i < prog.ucodeSize / sizeof(u32); i++)

View File

@ -405,7 +405,7 @@ namespace
u32 *casted_dest = (u32*)((char*)dest + row * dst_pitch);
u32 *casted_src = (u32*)((char*)mapped_buffer + row * src_pitch);
for (unsigned col = 0; col < src_pitch / 4; col++)
*casted_dest++ = _byteswap_ulong(*casted_src++);
*casted_dest++ = se_storage<u32>::swap(*casted_src++);
}
readback_heap.m_heap->Unmap(0, nullptr);
}

View File

@ -784,7 +784,8 @@ namespace rsx
bind_cpu_only<NV4097_CLEAR_REPORT_VALUE, nv4097::clear_report_value>();
//NV308A
bind_range<NV308A_COLOR, 1, 512, nv308a::color>();
bind_range<NV308A_COLOR, 1, 256, nv308a::color>();
bind_range<NV308A_COLOR + 256, 1, 512, nv308a::color, 256>();
//NV3089
bind<NV3089_IMAGE_IN, nv3089::image_in>();

View File

@ -7,6 +7,7 @@
#endif
#define NOMINMAX
#define __STDC_CONSTANT_MACROS
#if defined(MSVC_CRT_MEMLEAK_DETECTION) && defined(_DEBUG) && !defined(DBG_NEW)
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )