From fd6b28c4b261a59b35f8f6a225a8fbe87b41f993 Mon Sep 17 00:00:00 2001 From: nmzik Date: Tue, 27 Oct 2026 06:57:29 +0100 Subject: [PATCH] build: target x86-64-v3 without floating-point contraction --- CMakeLists.txt | 4 ++++ src/utils.cmake | 5 ++++- tests/BuildFlagsTests.cpp | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 tests/BuildFlagsTests.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 56e03a638..04a20abd9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -407,6 +407,8 @@ add_executable(scalar_provenance_tests EXCLUDE_FROM_ALL target_link_libraries(scalar_provenance_tests fmt::fmt xbyak::xbyak) target_include_directories(scalar_provenance_tests PRIVATE ${inc_headers}) +add_executable(build_flags_tests EXCLUDE_FROM_ALL "${KYTY_TESTS_DIR}/BuildFlagsTests.cpp") + add_executable(page_manager_tests EXCLUDE_FROM_ALL "${KYTY_TESTS_DIR}/PageManagerTests.cpp" "${KYTY_SOURCE_DIR}/graphics/host_gpu/pageManager.cpp" @@ -650,6 +652,7 @@ if(BUILD_TESTING) add_test(NAME image_page_table COMMAND $) add_test(NAME memory_tracker COMMAND $) add_test(NAME page_manager COMMAND $) + add_test(NAME build_flags COMMAND $) add_test(NAME archive_file COMMAND $) add_test(NAME trophy_system COMMAND $) add_test(NAME avplayer_file COMMAND $) @@ -743,6 +746,7 @@ if(BUILD_TESTING) image_page_table_tests memory_tracker_tests page_manager_tests + build_flags_tests archive_file_tests trophy_system_tests avplayer_file_tests diff --git a/src/utils.cmake b/src/utils.cmake index 998e00919..279dd9eb9 100644 --- a/src/utils.cmake +++ b/src/utils.cmake @@ -65,6 +65,8 @@ else() SET(CMAKE_NINJA_FORCE_RESPONSE_FILE 1 CACHE INTERNAL "") endif() +# Guest code runs natively and needs x86-64-v3 (AVX2, BMI2, FMA), so every host has it. +# No FMA contraction: a * b + c keeps both roundings. if(KYTY_CLANG_CL) if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") string(REGEX REPLACE "/W[0-4]" "/W3" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") @@ -79,7 +81,7 @@ if(KYTY_CLANG_CL) string(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") string(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - set(KYTY_CPP_FLAGS "${KYTY_CPP_FLAGS} /utf-8 /Oy- /wd4244 /wd4305 /wd4800 /wd4345") + set(KYTY_CPP_FLAGS "${KYTY_CPP_FLAGS} /utf-8 /Oy- /clang:-march=x86-64-v3 /clang:-ffp-contract=off /wd4244 /wd4305 /wd4800 /wd4345") if(KYTY_WARNINGS_ARE_ERRORS) #set(KYTY_CPP_FLAGS "${KYTY_CPP_FLAGS} /WX") @@ -103,6 +105,7 @@ elseif(CLANG OR GCC) else() set(KYTY_CPP_FLAGS "${KYTY_CPP_FLAGS} -fno-exceptions -fdiagnostics-color=always -finput-charset=UTF-8 -fexec-charset=UTF-8 -static-libgcc -static-libstdc++ -g -fno-strict-aliasing -fno-omit-frame-pointer -Wall -Wno-unused-value -fmessage-length=0") endif() + set(KYTY_CPP_FLAGS "${KYTY_CPP_FLAGS} -march=x86-64-v3 -ffp-contract=off") if(KYTY_WARNINGS_ARE_ERRORS) #set(KYTY_CPP_FLAGS "${KYTY_CPP_FLAGS} -Werror") diff --git a/tests/BuildFlagsTests.cpp b/tests/BuildFlagsTests.cpp new file mode 100644 index 000000000..10712ea1e --- /dev/null +++ b/tests/BuildFlagsTests.cpp @@ -0,0 +1,17 @@ +#include + +#if !defined(__AVX2__) || !defined(__BMI2__) || !defined(__FMA__) +#error "x86-64 builds target x86-64-v3" +#endif + +int main() { + // (1 + 2^-23)^2 = 1 + 2^-22 + 2^-46; only a fused multiply-add keeps the 2^-46. + volatile float a = 1.0f + 0x1p-23f; + const float result = a * a - (1.0f + 0x1p-22f); + if (result != 0.0f) { + std::fprintf(stderr, "BuildFlagsTests: failed: a * a - b was contracted (%a)\n", result); + return 1; + } + std::puts("BuildFlagsTests: all cases passed"); + return 0; +}