gpu_neon: revive the old tests
[pcsx_rearmed.git] / deps / lightrec / CMakeLists.txt
index 6ac5cd4..c3eb6f8 100644 (file)
@@ -1,33 +1,9 @@
-cmake_minimum_required(VERSION 3.0)
-project(lightrec LANGUAGES C VERSION 0.3)
-
-set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries")
-if (NOT BUILD_SHARED_LIBS)
-       add_definitions(-DLIGHTREC_STATIC)
-endif (NOT BUILD_SHARED_LIBS)
-
-if (NOT LOG_LEVEL)
-       set(LOG_LEVEL Info CACHE STRING "Log level" FORCE)
-       set_property(CACHE LOG_LEVEL PROPERTY STRINGS NoLog Error Warning Info Debug)
-endif()
-
-if (NOT CMAKE_BUILD_TYPE)
-       set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
-               "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
-               FORCE)
-       set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS None Debug Release RelWithDebInfo MinSizeRel)
-endif()
-
-string(TOUPPER ${LOG_LEVEL} LIGHTREC_LOG_LEVEL)
-add_definitions(-DLOG_LEVEL=${LIGHTREC_LOG_LEVEL}_L)
-
-if (CMAKE_COMPILER_IS_GNUCC)
-       add_compile_options(-fvisibility=hidden)
-endif()
+cmake_minimum_required(VERSION 3.5)
+project(lightrec LANGUAGES C VERSION 0.9)
 
 list(APPEND LIGHTREC_SOURCES
        blockcache.c
-       disassembler.c
+       constprop.c
        emitter.c
        interpreter.c
        lightrec.c
@@ -37,6 +13,7 @@ list(APPEND LIGHTREC_SOURCES
 )
 list(APPEND LIGHTREC_HEADERS
        blockcache.h
+       constprop.h
        debug.h
        disassembler.h
        emitter.h
@@ -49,69 +26,105 @@ list(APPEND LIGHTREC_HEADERS
        regcache.h
 )
 
+add_library(lightrec ${LIGHTREC_SOURCES} ${LIGHTREC_HEADERS})
+set_target_properties(lightrec PROPERTIES
+       VERSION ${PROJECT_VERSION}
+       SOVERSION ${PROJECT_VERSION_MAJOR}
+       PUBLIC_HEADER lightrec.h
+       C_STANDARD 11
+       C_STANDARD_REQUIRED ON
+       C_EXTENSIONS OFF
+)
+
+set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries")
+if (NOT BUILD_SHARED_LIBS)
+       target_compile_definitions(lightrec PRIVATE LIGHTREC_STATIC)
+endif (NOT BUILD_SHARED_LIBS)
+
+if (NOT LOG_LEVEL)
+       set(LOG_LEVEL Info CACHE STRING "Log level" FORCE)
+       set_property(CACHE LOG_LEVEL PROPERTY STRINGS NoLog Error Warning Info Debug)
+endif()
+
+if (NOT CMAKE_BUILD_TYPE)
+       set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
+               "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel."
+               FORCE)
+       set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS None Debug Release RelWithDebInfo MinSizeRel)
+endif()
+
+string(TOUPPER ${LOG_LEVEL} LIGHTREC_LOG_LEVEL)
+target_compile_definitions(lightrec PRIVATE LOG_LEVEL=${LIGHTREC_LOG_LEVEL}_L)
+
+if (CMAKE_COMPILER_IS_GNUCC)
+       target_compile_options(lightrec PRIVATE -fvisibility=hidden)
+endif()
+
+set(HAS_DEFAULT_ELM ${CMAKE_COMPILER_IS_GNUCC})
+
 option(ENABLE_FIRST_PASS "Run the interpreter as first-pass optimization" ON)
 
 option(ENABLE_THREADED_COMPILER "Enable threaded compiler" ON)
 if (ENABLE_THREADED_COMPILER)
-       list(APPEND LIGHTREC_SOURCES recompiler.c)
+       target_sources(lightrec PRIVATE recompiler.c reaper.c)
 
        if (NOT ENABLE_FIRST_PASS)
                message(SEND_ERROR "Threaded compiler requires first-pass optimization")
        endif (NOT ENABLE_FIRST_PASS)
 endif (ENABLE_THREADED_COMPILER)
 
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
-
-add_library(${PROJECT_NAME} ${LIGHTREC_SOURCES} ${LIGHTREC_HEADERS})
-set_target_properties(${PROJECT_NAME} PROPERTIES
-       VERSION ${PROJECT_VERSION}
-       SOVERSION ${PROJECT_VERSION_MAJOR}
-       PUBLIC_HEADER lightrec.h
-       C_STANDARD 11
-       C_STANDARD_REQUIRED ON
-       C_EXTENSIONS OFF
-)
-
-option(ENABLE_TINYMM "Enable optional libtinymm dependency" OFF)
-if (ENABLE_TINYMM)
-       find_library(TINYMM_LIBRARIES tinymm REQUIRED)
-       find_path(TINYMM_INCLUDE_DIR tinymm.h REQUIRED)
-
-       include_directories(${TINYMM_INCLUDE_DIR})
-       target_link_libraries(${PROJECT_NAME} PRIVATE ${TINYMM_LIBRARIES})
-endif (ENABLE_TINYMM)
+option(OPT_REMOVE_DIV_BY_ZERO_SEQ "(optimization) Remove div-by-zero check sequence" ON)
+option(OPT_REPLACE_MEMSET "(optimization) Detect and replace memset with host variant" ON)
+option(OPT_DETECT_IMPOSSIBLE_BRANCHES "(optimization) Detect impossible branches" ON)
+option(OPT_HANDLE_LOAD_DELAYS "(optimization) Detect load delays" ON)
+option(OPT_TRANSFORM_OPS "(optimization) Transform opcodes" ON)
+option(OPT_LOCAL_BRANCHES "(optimization) Detect local branches" ON)
+option(OPT_SWITCH_DELAY_SLOTS "(optimization) Switch delay slots" ON)
+option(OPT_FLAG_IO "(optimization) Flag I/O opcodes when the target can be detected" ON)
+option(OPT_FLAG_MULT_DIV "(optimization) Flag MULT/DIV that only use one of HI/LO" ON)
+option(OPT_EARLY_UNLOAD "(optimization) Unload registers early" ON)
+option(OPT_PRELOAD_PC "(optimization) Preload PC value into register" ON)
+
+target_include_directories(lightrec PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+
+if (CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
+       target_compile_options(lightrec PRIVATE -Wall)
+endif()
+if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
+       target_compile_options(lightrec PRIVATE -Wno-initializer-overrides)
+endif()
 
 if (ENABLE_THREADED_COMPILER)
-       find_library(PTHREAD_LIBRARIES pthread REQUIRED)
-       find_path(PTHREAD_INCLUDE_DIR pthread.h REQUIRED)
+       include(FindThreads)
 
-       include_directories(${PTHREAD_INCLUDE_DIR})
-       target_link_libraries(${PROJECT_NAME} PRIVATE ${PTHREAD_LIBRARIES})
+       if (NOT CMAKE_USE_PTHREADS_INIT)
+               message(SEND_ERROR "Could not find compatible threads library")
+       endif()
+
+       target_link_libraries(lightrec PUBLIC Threads::Threads)
 endif (ENABLE_THREADED_COMPILER)
 
+option(ENABLE_CODE_BUFFER "Enable external code buffer" ON)
+if (ENABLE_CODE_BUFFER)
+       target_sources(lightrec PRIVATE tlsf/tlsf.c)
+       target_include_directories(lightrec PRIVATE tlsf)
+endif (ENABLE_CODE_BUFFER)
+
 find_library(LIBLIGHTNING lightning REQUIRED)
 find_path(LIBLIGHTNING_INCLUDE_DIR lightning.h REQUIRED)
 
-include_directories(${LIBLIGHTNING_INCLUDE_DIR})
-target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBLIGHTNING})
+target_include_directories(lightrec PUBLIC ${LIBLIGHTNING_INCLUDE_DIR})
+target_link_libraries(lightrec PUBLIC ${LIBLIGHTNING})
 
 if (LOG_LEVEL STREQUAL Debug)
-       find_library(LIBOPCODES NAMES opcodes-multiarch opcodes)
-       find_path(LIBOPCODES_INCLUDE_DIR dis-asm.h)
-
-       if (NOT LIBOPCODES OR NOT LIBOPCODES_INCLUDE_DIR)
-               message(SEND_ERROR "Debug log level requires libopcodes (from binutils) to be installed.")
-       endif ()
-
        set(ENABLE_DISASSEMBLER ON)
-       include_directories(${LIBOPCODES_INCLUDE_DIR})
-       target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBOPCODES})
+       target_sources(lightrec PRIVATE disassembler.c)
 endif()
 
-configure_file(config.h.cmakein config.h @ONLY)
+configure_file(lightrec-config.h.cmakein lightrec-config.h @ONLY)
 
 include(GNUInstallDirs)
-install(TARGETS ${PROJECT_NAME}
+install(TARGETS lightrec
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}