mirror of
https://github.com/FEX-Emu/FEX.git
synced 2024-12-14 01:18:46 +00:00
acbd920c9a
Only installs the tables if SVE256 isn't supported yet AVX is explicitly enabled with HostFeatures, to protect accidental enablement early. - Only implements 85 instructions starting out - Basic vector moves - Basic vector unary operations - Basic vector binary operations - VZeroUpper/VZeroAll The bulk of the implementation is currently the handling for loading and storing the halves of the registers from the context or from memory. This means the load/store helpers must always return a pair unless only requesting the bottom half of the register, which occurs with 128-bit AVX operations. The store side then needing to consume the named zero register if it occurs since those cases will zero the upper bits. This implementation approach has a few benefits. - I can pound this out extremely quickly - SSE implementations are unaffected and don't need to deal with the insert behaviour of SVE256. - We still keep the SVE256 implementation for the inevitable future when hardware vendors actually do implement it (Give it 8 years or something). - We can actually unit test this path in CI once it is complete. - We can partially optimize some paths with SVE128 (Gathers) and support a full ASIMD path if necessary. One downside is that I can't enable this in CI yet because it can't pass all unittests. but that's a non-issue since it is going to be in heavy flux as I'm hammering out the implementation. It'll get switched on at the end when it's passing all 1265 AVX unittests. Currently at 1001 on this.
398 lines
13 KiB
CMake
398 lines
13 KiB
CMake
set (MAN_DIR share/man CACHE PATH "MAN_DIR")
|
|
|
|
set (FEXCORE_BASE_SRCS
|
|
Interface/Config/Config.cpp
|
|
Utils/Allocator.cpp
|
|
Utils/CPUInfo.cpp
|
|
Utils/FileLoading.cpp
|
|
Utils/ForcedAssert.cpp
|
|
Utils/LogManager.cpp
|
|
Utils/SpinWaitLock.cpp
|
|
)
|
|
|
|
if (NOT MINGW_BUILD)
|
|
list(APPEND FEXCORE_BASE_SRCS
|
|
Utils/Allocator/64BitAllocator.cpp)
|
|
endif()
|
|
|
|
set (SRCS
|
|
Common/JitSymbols.cpp
|
|
Common/SoftFloat-3e/extF80_add.c
|
|
Common/SoftFloat-3e/extF80_div.c
|
|
Common/SoftFloat-3e/extF80_sub.c
|
|
Common/SoftFloat-3e/extF80_mul.c
|
|
Common/SoftFloat-3e/extF80_rem.c
|
|
Common/SoftFloat-3e/extF80_sqrt.c
|
|
Common/SoftFloat-3e/s_add128.c
|
|
Common/SoftFloat-3e/s_sub128.c
|
|
Common/SoftFloat-3e/s_le128.c
|
|
Common/SoftFloat-3e/extF80_to_i32.c
|
|
Common/SoftFloat-3e/extF80_to_i64.c
|
|
Common/SoftFloat-3e/extF80_to_ui64.c
|
|
Common/SoftFloat-3e/extF80_to_f32.c
|
|
Common/SoftFloat-3e/extF80_to_f64.c
|
|
Common/SoftFloat-3e/i32_to_extF80.c
|
|
Common/SoftFloat-3e/ui64_to_extF80.c
|
|
Common/SoftFloat-3e/extF80_to_f128.c
|
|
Common/SoftFloat-3e/f128_to_extF80.c
|
|
Common/SoftFloat-3e/s_roundToUI64.c
|
|
Common/SoftFloat-3e/s_f128UIToCommonNaN.c
|
|
Common/SoftFloat-3e/s_commonNaNToF128UI.c
|
|
Common/SoftFloat-3e/s_shortShiftRight128.c
|
|
Common/SoftFloat-3e/s_normSubnormalF128Sig.c
|
|
Common/SoftFloat-3e/s_roundToI32.c
|
|
Common/SoftFloat-3e/s_roundToI64.c
|
|
Common/SoftFloat-3e/s_roundPackToF32.c
|
|
Common/SoftFloat-3e/s_addMagsExtF80.c
|
|
Common/SoftFloat-3e/s_extF80UIToCommonNaN.c
|
|
Common/SoftFloat-3e/s_commonNaNToF32UI.c
|
|
Common/SoftFloat-3e/s_commonNaNToF64UI.c
|
|
Common/SoftFloat-3e/s_shortShiftRightJam64.c
|
|
Common/SoftFloat-3e/s_shortShiftRightJam64Extra.c
|
|
Common/SoftFloat-3e/s_shiftRightJam64Extra.c
|
|
Common/SoftFloat-3e/s_shortShiftRightJam64Extra.c
|
|
Common/SoftFloat-3e/s_roundPackToF64.c
|
|
Common/SoftFloat-3e/s_propagateNaNExtF80UI.c
|
|
Common/SoftFloat-3e/s_roundPackToExtF80.c
|
|
Common/SoftFloat-3e/s_normSubnormalExtF80Sig.c
|
|
Common/SoftFloat-3e/s_shiftRightJam64.c
|
|
Common/SoftFloat-3e/s_subMagsExtF80.c
|
|
Common/SoftFloat-3e/s_shiftRightJam32.c
|
|
Common/SoftFloat-3e/s_shiftRightJam128.c
|
|
Common/SoftFloat-3e/s_shiftRightJam128Extra.c
|
|
Common/SoftFloat-3e/s_normRoundPackToExtF80.c
|
|
Common/SoftFloat-3e/s_shortShiftLeft128.c
|
|
Common/SoftFloat-3e/s_approxRecip32_1.c
|
|
Common/SoftFloat-3e/s_approxRecip_1Ks.c
|
|
Common/SoftFloat-3e/s_approxRecipSqrt32_1.c
|
|
Common/SoftFloat-3e/s_approxRecipSqrt_1Ks.c
|
|
Common/SoftFloat-3e/softfloat_raiseFlags.c
|
|
Common/SoftFloat-3e/softfloat_state.c
|
|
Common/SoftFloat-3e/f64_to_extF80.c
|
|
Common/SoftFloat-3e/s_commonNaNToExtF80UI.c
|
|
Common/SoftFloat-3e/s_normSubnormalF64Sig.c
|
|
Common/SoftFloat-3e/s_f64UIToCommonNaN.c
|
|
Common/SoftFloat-3e/extF80_roundToInt.c
|
|
Common/SoftFloat-3e/extF80_eq.c
|
|
Common/SoftFloat-3e/extF80_lt.c
|
|
Common/SoftFloat-3e/s_lt128.c
|
|
Common/SoftFloat-3e/s_mul64ByShifted32To128.c
|
|
Common/SoftFloat-3e/s_mul64To128.c
|
|
Common/SoftFloat-3e/s_countLeadingZeros8.c
|
|
Common/SoftFloat-3e/s_countLeadingZeros32.c
|
|
Common/SoftFloat-3e/s_countLeadingZeros64.c
|
|
Common/SoftFloat-3e/f32_to_extF80.c
|
|
Common/SoftFloat-3e/s_normSubnormalF32Sig.c
|
|
Common/SoftFloat-3e/s_f32UIToCommonNaN.c
|
|
Interface/Context/Context.cpp
|
|
Interface/Core/LookupCache.cpp
|
|
Interface/Core/BlockSamplingData.cpp
|
|
Interface/Core/Core.cpp
|
|
Interface/Core/CPUBackend.cpp
|
|
Interface/Core/CPUID.cpp
|
|
Interface/Core/Frontend.cpp
|
|
Interface/Core/HostFeatures.cpp
|
|
Interface/Core/ObjectCache/JobHandling.cpp
|
|
Interface/Core/ObjectCache/NamedRegionObjectHandler.cpp
|
|
Interface/Core/ObjectCache/ObjectCacheService.cpp
|
|
Interface/Core/OpcodeDispatcher/AVX_128.cpp
|
|
Interface/Core/OpcodeDispatcher/Crypto.cpp
|
|
Interface/Core/OpcodeDispatcher/Flags.cpp
|
|
Interface/Core/OpcodeDispatcher/Vector.cpp
|
|
Interface/Core/OpcodeDispatcher/X87.cpp
|
|
Interface/Core/OpcodeDispatcher/X87F64.cpp
|
|
Interface/Core/OpcodeDispatcher.cpp
|
|
Interface/Core/X86Tables.cpp
|
|
Interface/Core/X86HelperGen.cpp
|
|
Interface/Core/ArchHelpers/Arm64Emitter.cpp
|
|
Interface/Core/Dispatcher/Dispatcher.cpp
|
|
Interface/Core/Interpreter/Fallbacks/InterpreterFallbacks.cpp
|
|
Interface/Core/JIT/Arm64/JIT.cpp
|
|
Interface/Core/JIT/Arm64/ALUOps.cpp
|
|
Interface/Core/JIT/Arm64/AtomicOps.cpp
|
|
Interface/Core/JIT/Arm64/BranchOps.cpp
|
|
Interface/Core/JIT/Arm64/ConversionOps.cpp
|
|
Interface/Core/JIT/Arm64/EncryptionOps.cpp
|
|
Interface/Core/JIT/Arm64/FlagOps.cpp
|
|
Interface/Core/JIT/Arm64/MemoryOps.cpp
|
|
Interface/Core/JIT/Arm64/MiscOps.cpp
|
|
Interface/Core/JIT/Arm64/MoveOps.cpp
|
|
Interface/Core/JIT/Arm64/VectorOps.cpp
|
|
Interface/Core/JIT/Arm64/Arm64Relocations.cpp
|
|
Interface/Core/X86Tables/BaseTables.cpp
|
|
Interface/Core/X86Tables/DDDTables.cpp
|
|
Interface/Core/X86Tables/EVEXTables.cpp
|
|
Interface/Core/X86Tables/H0F38Tables.cpp
|
|
Interface/Core/X86Tables/H0F3ATables.cpp
|
|
Interface/Core/X86Tables/PrimaryGroupTables.cpp
|
|
Interface/Core/X86Tables/SecondaryGroupTables.cpp
|
|
Interface/Core/X86Tables/SecondaryModRMTables.cpp
|
|
Interface/Core/X86Tables/SecondaryTables.cpp
|
|
Interface/Core/X86Tables/VEXTables.cpp
|
|
Interface/Core/X86Tables/X87Tables.cpp
|
|
Interface/Core/X86Tables/XOPTables.cpp
|
|
Interface/HLE/Thunks/Thunks.cpp
|
|
Interface/GDBJIT/GDBJIT.cpp
|
|
Interface/IR/AOTIR.cpp
|
|
Interface/IR/IRDumper.cpp
|
|
Interface/IR/IREmitter.cpp
|
|
Interface/IR/PassManager.cpp
|
|
Interface/IR/Passes/ConstProp.cpp
|
|
Interface/IR/Passes/DeadContextStoreElimination.cpp
|
|
Interface/IR/Passes/IRDumperPass.cpp
|
|
Interface/IR/Passes/IRValidation.cpp
|
|
Interface/IR/Passes/RAValidation.cpp
|
|
Interface/IR/Passes/RedundantFlagCalculationElimination.cpp
|
|
Interface/IR/Passes/DeadStoreElimination.cpp
|
|
Interface/IR/Passes/RegisterAllocationPass.cpp
|
|
Utils/Telemetry.cpp
|
|
Utils/Threads.cpp
|
|
Utils/Profiler.cpp
|
|
)
|
|
|
|
if (_M_ARM_64)
|
|
list(APPEND SRCS Utils/ArchHelpers/Arm64.cpp)
|
|
else()
|
|
list(APPEND SRCS Utils/ArchHelpers/Arm64_stubs.cpp)
|
|
endif()
|
|
|
|
if (ENABLE_GLIBC_ALLOCATOR_HOOK_FAULT)
|
|
list(APPEND FEXCORE_BASE_SRCS
|
|
Utils/AllocatorOverride.cpp)
|
|
endif()
|
|
|
|
set(DEFINES -DTHREAD_LOCAL=_Thread_local -DJIT_ARM64)
|
|
|
|
if (_M_X86_64)
|
|
list(APPEND DEFINES -D_M_X86_64=1)
|
|
endif()
|
|
|
|
if (_M_ARM_64)
|
|
list(APPEND DEFINES -D_M_ARM_64=1)
|
|
endif()
|
|
|
|
if (ENABLE_VIXL_SIMULATOR)
|
|
# We can run the simulator on both x86-64 or AArch64 hosts
|
|
list(APPEND DEFINES -DVIXL_SIMULATOR=1 -DVIXL_INCLUDE_SIMULATOR_AARCH64=1)
|
|
endif()
|
|
|
|
if (ENABLE_VIXL_DISASSEMBLER)
|
|
list(APPEND DEFINES -DVIXL_DISASSEMBLER=1)
|
|
endif()
|
|
|
|
if (_M_ARM_64 AND HAS_CLANG_PRESERVE_ALL)
|
|
list(APPEND DEFINES "-DFEXCORE_PRESERVE_ALL_ATTR=__attribute__((preserve_all));-DFEXCORE_HAS_PRESERVE_ALL_ATTR=1")
|
|
else()
|
|
list(APPEND DEFINES "-DFEXCORE_PRESERVE_ALL_ATTR=;-DFEXCORE_HAS_PRESERVE_ALL_ATTR=0")
|
|
endif()
|
|
|
|
# Some defines for the softfloat library
|
|
list(APPEND DEFINES "-DSOFTFLOAT_BUILTIN_CLZ")
|
|
|
|
set (LIBS fmt::fmt vixl xxHash::xxhash FEXHeaderUtils CodeEmitter)
|
|
|
|
if (NOT MINGW_BUILD)
|
|
list (APPEND LIBS dl)
|
|
else()
|
|
list (APPEND LIBS synchronization)
|
|
if (_M_ARM_64EC)
|
|
list (APPEND LIBS kernelbase)
|
|
endif()
|
|
endif()
|
|
|
|
if (ENABLE_JEMALLOC)
|
|
list (APPEND LIBS FEX_jemalloc)
|
|
endif()
|
|
|
|
if (ENABLE_JEMALLOC_GLIBC_ALLOC)
|
|
list (APPEND LIBS FEX_jemalloc_glibc)
|
|
endif()
|
|
|
|
# Generate config
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/Interface/Config/Config.json.in
|
|
${CMAKE_BINARY_DIR}/generated/Config/Config.json)
|
|
|
|
# Generate IR include file
|
|
set(OUTPUT_IR_FOLDER "${CMAKE_BINARY_DIR}/include/FEXCore/IR")
|
|
set(OUTPUT_NAME "${OUTPUT_IR_FOLDER}/IRDefines.inc")
|
|
set(OUTPUT_DISPATCHER_NAME "${OUTPUT_IR_FOLDER}/IRDefines_Dispatch.inc")
|
|
set(INPUT_NAME "${CMAKE_CURRENT_SOURCE_DIR}/Interface/IR/IR.json")
|
|
|
|
file(MAKE_DIRECTORY "${OUTPUT_IR_FOLDER}")
|
|
|
|
add_custom_command(
|
|
OUTPUT "${OUTPUT_NAME}" "${OUTPUT_DISPATCHER_NAME}"
|
|
DEPENDS "${INPUT_NAME}"
|
|
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_generator.py"
|
|
COMMAND "python3" "${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_generator.py" "${INPUT_NAME}" "${OUTPUT_NAME}" "${OUTPUT_DISPATCHER_NAME}"
|
|
)
|
|
|
|
set_source_files_properties(${OUTPUT_NAME} PROPERTIES
|
|
GENERATED TRUE)
|
|
|
|
# Generate IR documentation
|
|
set(OUTPUT_IR_DOC "${CMAKE_BINARY_DIR}/IR.md")
|
|
|
|
add_custom_command(
|
|
OUTPUT "${OUTPUT_IR_DOC}"
|
|
DEPENDS "${INPUT_NAME}"
|
|
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_doc_generator.py"
|
|
COMMAND "python3" "${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/json_ir_doc_generator.py" "${INPUT_NAME}" "${OUTPUT_IR_DOC}"
|
|
)
|
|
|
|
set_source_files_properties(${OUTPUT_IR_NAME} PROPERTIES
|
|
GENERATED TRUE)
|
|
|
|
# Create the target
|
|
add_custom_target(IR_INC
|
|
DEPENDS "${OUTPUT_NAME}"
|
|
DEPENDS "${OUTPUT_IR_DOC}")
|
|
|
|
# Generate the configuration include file
|
|
set(OUTPUT_CONFIG_FOLDER "${CMAKE_BINARY_DIR}/include/FEXCore/Config")
|
|
set(OUTPUT_CONFIG_NAME "${OUTPUT_CONFIG_FOLDER}/ConfigValues.inl")
|
|
set(OUTPUT_CONFIG_OPTION_NAME "${OUTPUT_CONFIG_FOLDER}/ConfigOptions.inl")
|
|
set(INPUT_CONFIG_NAME "${CMAKE_BINARY_DIR}/generated/Config/Config.json")
|
|
set(OUTPUT_MAN_NAME "${CMAKE_BINARY_DIR}/generated/FEX.1")
|
|
set(OUTPUT_MAN_NAME_COMPRESS "${CMAKE_BINARY_DIR}/generated/FEX.1.gz")
|
|
|
|
file(MAKE_DIRECTORY "${OUTPUT_CONFIG_FOLDER}")
|
|
|
|
add_custom_command(
|
|
OUTPUT "${OUTPUT_CONFIG_NAME}"
|
|
OUTPUT "${OUTPUT_CONFIG_OPTION_NAME}"
|
|
OUTPUT "${OUTPUT_MAN_NAME}"
|
|
DEPENDS "${INPUT_CONFIG_NAME}"
|
|
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/config_generator.py"
|
|
COMMAND "python3" "${CMAKE_CURRENT_SOURCE_DIR}/../Scripts/config_generator.py" "${INPUT_CONFIG_NAME}" "${OUTPUT_CONFIG_NAME}" "${OUTPUT_MAN_NAME}"
|
|
"${OUTPUT_CONFIG_OPTION_NAME}"
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT "${OUTPUT_MAN_NAME_COMPRESS}"
|
|
DEPENDS "${OUTPUT_MAN_NAME}"
|
|
COMMAND "gzip" "-kf9n" "${OUTPUT_MAN_NAME}"
|
|
)
|
|
|
|
set_source_files_properties(${OUTPUT_CONFIG_NAME} PROPERTIES
|
|
GENERATED TRUE)
|
|
set_source_files_properties(${OUTPUT_CONFIG_OPTION_NAME} PROPERTIES
|
|
GENERATED TRUE)
|
|
|
|
set_source_files_properties(${OUTPUT_MAN_NAME} PROPERTIES
|
|
GENERATED TRUE)
|
|
set_source_files_properties(${OUTPUT_MAN_NAME_COMPRESS} PROPERTIES
|
|
GENERATED TRUE)
|
|
|
|
# Create the target
|
|
add_custom_target(CONFIG_INC
|
|
DEPENDS "${OUTPUT_CONFIG_NAME}"
|
|
DEPENDS "${OUTPUT_CONFIG_OPTION_NAME}"
|
|
DEPENDS "${OUTPUT_MAN_NAME}"
|
|
DEPENDS "${OUTPUT_MAN_NAME_COMPRESS}")
|
|
|
|
# Install the compressed man page
|
|
install(FILES ${OUTPUT_MAN_NAME_COMPRESS} DESTINATION ${MAN_DIR}/man1)
|
|
|
|
# Add in diagnostic colours if the option is available.
|
|
# Ninja code generator will kill colours if this isn't here
|
|
check_cxx_compiler_flag(-fdiagnostics-color=always GCC_COLOR)
|
|
check_cxx_compiler_flag(-fcolor-diagnostics CLANG_COLOR)
|
|
|
|
function(AddDefaultOptionsToTarget Name)
|
|
set_target_properties(${Name} PROPERTIES C_VISIBILITY_PRESET hidden)
|
|
set_target_properties(${Name} PROPERTIES CXX_VISIBILITY_PRESET hidden)
|
|
set_target_properties(${Name} PROPERTIES VISIBILITY_INLINES_HIDDEN TRUE)
|
|
target_include_directories(${Name} PUBLIC "${CMAKE_CURRENT_BINARY_DIR}")
|
|
|
|
target_include_directories(${Name} PRIVATE IncludePrivate/)
|
|
target_include_directories(${Name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/)
|
|
|
|
target_include_directories(${Name} PUBLIC "${PROJECT_SOURCE_DIR}/include/")
|
|
target_include_directories(${Name} PUBLIC "${CMAKE_BINARY_DIR}/include/")
|
|
|
|
target_compile_definitions(${Name} PRIVATE ${DEFINES})
|
|
add_dependencies(${Name} CONFIG_INC IR_INC)
|
|
|
|
target_compile_options(${Name}
|
|
PRIVATE
|
|
-Wall
|
|
-Werror=cast-qual
|
|
-Werror=ignored-qualifiers
|
|
-Werror=implicit-fallthrough
|
|
|
|
-Wno-trigraphs
|
|
-ffunction-sections
|
|
-fwrapv
|
|
)
|
|
|
|
if (GCC_COLOR)
|
|
target_compile_options(${Name}
|
|
PRIVATE
|
|
"-fdiagnostics-color=always")
|
|
endif()
|
|
if (CLANG_COLOR)
|
|
target_compile_options(${Name}
|
|
PRIVATE
|
|
"-fcolor-diagnostics")
|
|
endif()
|
|
|
|
if (CMAKE_BUILD_TYPE MATCHES "RELEASE")
|
|
target_link_options(${Name}
|
|
PRIVATE
|
|
"LINKER:--gc-sections"
|
|
"LINKER:--strip-all"
|
|
"LINKER:--as-needed"
|
|
)
|
|
endif()
|
|
endfunction()
|
|
|
|
# Build FEXCore_Config static library
|
|
add_library(FEXCore_Base STATIC ${FEXCORE_BASE_SRCS})
|
|
target_link_libraries(FEXCore_Base ${LIBS})
|
|
AddDefaultOptionsToTarget(FEXCore_Base)
|
|
|
|
function(AddObject Name Type)
|
|
add_library(${Name} ${Type} ${SRCS})
|
|
|
|
target_link_libraries(${Name} FEXCore_Base)
|
|
target_compile_options(${Name} PRIVATE ${FEX_TUNE_COMPILE_FLAGS})
|
|
AddDefaultOptionsToTarget(${Name})
|
|
|
|
set_target_properties(${Name} PROPERTIES OUTPUT_NAME FEXCore)
|
|
endfunction()
|
|
|
|
function(AddLibrary Name Type)
|
|
add_library(${Name} ${Type} $<TARGET_OBJECTS:${PROJECT_NAME}_object>)
|
|
target_link_libraries(${Name} FEXCore_Base)
|
|
target_compile_options(${Name} PRIVATE ${FEX_TUNE_COMPILE_FLAGS})
|
|
set_target_properties(${Name} PROPERTIES OUTPUT_NAME FEXCore)
|
|
if (MINGW_BUILD)
|
|
# Mingw build isn't building a linux shared library, so it can't have a SONAME.
|
|
set_target_properties(${Name} PROPERTIES NO_SONAME ON)
|
|
# Change the suffixes otherwise cmake continues using .a and .so
|
|
if (${Type} STREQUAL SHARED)
|
|
set_target_properties(${Name} PROPERTIES SUFFIX ".dll")
|
|
elseif(${Type} STREQUAL STATIC)
|
|
set_target_properties(${Name} PROPERTIES SUFFIX ".lib")
|
|
endif()
|
|
endif()
|
|
|
|
AddDefaultOptionsToTarget(${Name})
|
|
endfunction()
|
|
|
|
AddObject(${PROJECT_NAME}_object OBJECT)
|
|
AddLibrary(${PROJECT_NAME} STATIC)
|
|
AddLibrary(${PROJECT_NAME}_shared SHARED)
|
|
|
|
if (NOT MINGW_BUILD)
|
|
install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_shared
|
|
LIBRARY
|
|
DESTINATION lib
|
|
COMPONENT Libraries
|
|
ARCHIVE
|
|
DESTINATION lib
|
|
COMPONENT Libraries)
|
|
endif()
|