mirror of https://github.com/PCSX2/pcsx2.git
144 lines
2.9 KiB
CMake
144 lines
2.9 KiB
CMake
set(wx_sdl_c_code "
|
|
#include <wx/setup.h>
|
|
|
|
#if (wxUSE_LIBSDL == 0)
|
|
#error cmake_WX_SDL
|
|
#endif
|
|
|
|
int main()
|
|
{
|
|
return 0;
|
|
}
|
|
")
|
|
|
|
set(gcc7_mmx_code "
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <xmmintrin.h>
|
|
#include <emmintrin.h>
|
|
|
|
class alignas(16) GSVector4i
|
|
{
|
|
public:
|
|
__m128i m;
|
|
|
|
explicit GSVector4i(__m128i m)
|
|
{
|
|
this->m = m;
|
|
}
|
|
|
|
static void storel(void* p, const GSVector4i& v)
|
|
{
|
|
_mm_storel_epi64((__m128i*)p, v.m);
|
|
}
|
|
|
|
static GSVector4i loadl(const void* p)
|
|
{
|
|
return GSVector4i(_mm_loadl_epi64((__m128i*)p));
|
|
}
|
|
|
|
bool eq(const GSVector4i& v) const
|
|
{
|
|
return _mm_movemask_epi8(_mm_cmpeq_epi32(m, v.m)) == 0xffff;
|
|
}
|
|
};
|
|
|
|
|
|
union GIFRegTRXPOS
|
|
{
|
|
unsigned long long u64;
|
|
void operator = (const GSVector4i& v) {GSVector4i::storel(this, v);}
|
|
bool operator != (const union GIFRegTRXPOS& r) const {return !((GSVector4i)r).eq(*this);}
|
|
operator GSVector4i() const {return GSVector4i::loadl(this);}
|
|
};
|
|
|
|
extern GIFRegTRXPOS TRXPOS;
|
|
GIFRegTRXPOS TRXPOS = {};
|
|
|
|
void GIFRegHandlerTRXPOS(const GIFRegTRXPOS& p)
|
|
{
|
|
if(p != TRXPOS)
|
|
{
|
|
printf(\"foo\");
|
|
}
|
|
|
|
TRXPOS = (GSVector4i)p;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
GIFRegTRXPOS r = {};
|
|
GIFRegHandlerTRXPOS(r);
|
|
|
|
uint16_t fpu[16] = {0};
|
|
__asm__ __volatile__(\"fstenv %0\" : \"=m\"(fpu));
|
|
|
|
bool ok = fpu[4] == 0xFFFF;
|
|
|
|
if (!ok) {
|
|
printf(\"Wrong MMX state !\");
|
|
exit(1);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
")
|
|
|
|
function(WX_vs_SDL)
|
|
file(WRITE "${CMAKE_BINARY_DIR}/wx_sdl.c" "${wx_sdl_c_code}")
|
|
enable_language(C)
|
|
|
|
try_compile(
|
|
wx_linked_to_sdl
|
|
"${CMAKE_BINARY_DIR}"
|
|
"${CMAKE_BINARY_DIR}/wx_sdl.c"
|
|
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${wxWidgets_INCLUDE_DIRS}"
|
|
LINK_LIBRARIES "${wxWidgets_LIBRARIES}"
|
|
COPY_FILE "${CMAKE_BINARY_DIR}/wx_sdl"
|
|
)
|
|
|
|
if (NOT wx_linked_to_sdl)
|
|
return()
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND ldd "${CMAKE_BINARY_DIR}/wx_sdl"
|
|
COMMAND grep -c SDL2
|
|
OUTPUT_VARIABLE sdl2_count
|
|
)
|
|
|
|
if (SDL2_API AND sdl2_count STREQUAL "0")
|
|
message(FATAL_ERROR "wxWidgets is linked to SDL1.2. Please use -DSDL2_API=FALSE.")
|
|
elseif (NOT SDL2_API AND NOT sdl2_count STREQUAL "0")
|
|
message(FATAL_ERROR "wxWidgets is linked to SDL2. Please use -DSDL2_API=TRUE")
|
|
endif()
|
|
endfunction()
|
|
|
|
function(GCC7_BUG)
|
|
# try_run doesn't work when cross-compiling is enabled. It is completely silly in our case
|
|
# as i386 binaries are 100% fine on x64.
|
|
set(OLD_CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING})
|
|
set(CMAKE_CROSSCOMPILING 0)
|
|
|
|
set(IN "${CMAKE_BINARY_DIR}/gcc7_mmx.cpp")
|
|
file(WRITE "${IN}" "${gcc7_mmx_code}")
|
|
|
|
enable_language(CXX)
|
|
|
|
try_run(
|
|
run_result
|
|
compile_result_unused
|
|
"${CMAKE_BINARY_DIR}"
|
|
"${IN}"
|
|
CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=-msse -msse2 -O2 -m32 -march=i686"
|
|
)
|
|
|
|
if (${run_result})
|
|
message(FATAL_ERROR "GCC 7.0/7.1 generates invalid code => https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80799\n"
|
|
"You can either backport the fix or swith to another version of GCC.")
|
|
endif()
|
|
|
|
set(CMAKE_CROSSCOMPILING ${OLD_CMAKE_CROSSCOMPILING})
|
|
|
|
endfunction()
|