From 130f25474ebbfc9d1e591271dc623f64c701f343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Petryka?= <35800402+MichalPetryka@users.noreply.github.com> Date: Sat, 11 Jul 2026 22:55:35 +0200 Subject: [PATCH 1/5] Set minimum ISAs when compiling native code Match native compiler configuration with https://learn.microsoft.com/en-us/dotnet/core/compatibility/jit/11/minimum-hardware-requirements --- eng/native/configureoptimization.cmake | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/eng/native/configureoptimization.cmake b/eng/native/configureoptimization.cmake index 9669115fc931a4..167062ceaf33af 100644 --- a/eng/native/configureoptimization.cmake +++ b/eng/native/configureoptimization.cmake @@ -14,3 +14,15 @@ elseif(CLR_CMAKE_HOST_UNIX) endif() add_compile_options($<$:-O2>) endif() + +if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) + if(CLR_CMAKE_HOST_WIN32) + add_compile_options(/arch:SSE4.2) + elseif(CLR_CMAKE_HOST_UNIX) + add_compile_options(-march=x86-64-v2) + endif() +elseif (CLR_CMAKE_TARGET_ARCH_ARM64) + if(CLR_CMAKE_HOST_WIN32) + add_compile_options(/arch:armv8.0+lse) + endif() +endif() From 5f5f5ca58c74779c22960454a44f7391a6e43deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Petryka?= <35800402+MichalPetryka@users.noreply.github.com> Date: Sat, 11 Jul 2026 23:21:13 +0200 Subject: [PATCH 2/5] Update compile options for target architectures --- eng/native/configureoptimization.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/native/configureoptimization.cmake b/eng/native/configureoptimization.cmake index 167062ceaf33af..2f208454f5c8e0 100644 --- a/eng/native/configureoptimization.cmake +++ b/eng/native/configureoptimization.cmake @@ -17,12 +17,12 @@ endif() if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) if(CLR_CMAKE_HOST_WIN32) - add_compile_options(/arch:SSE4.2) + add_compile_options($<$:/arch:SSE4.2) elseif(CLR_CMAKE_HOST_UNIX) add_compile_options(-march=x86-64-v2) endif() elseif (CLR_CMAKE_TARGET_ARCH_ARM64) if(CLR_CMAKE_HOST_WIN32) - add_compile_options(/arch:armv8.0+lse) + add_compile_options($<$:/arch:armv8.0+lse) endif() endif() From cf6c6ada3f3d1223503e006ee3d60b18f3489a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Petryka?= <35800402+MichalPetryka@users.noreply.github.com> Date: Sat, 11 Jul 2026 23:21:53 +0200 Subject: [PATCH 3/5] Fix syntax for add_compile_options in CMake --- eng/native/configureoptimization.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/native/configureoptimization.cmake b/eng/native/configureoptimization.cmake index 2f208454f5c8e0..066e1c90680386 100644 --- a/eng/native/configureoptimization.cmake +++ b/eng/native/configureoptimization.cmake @@ -17,12 +17,12 @@ endif() if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) if(CLR_CMAKE_HOST_WIN32) - add_compile_options($<$:/arch:SSE4.2) + add_compile_options($<$:/arch:SSE4.2>) elseif(CLR_CMAKE_HOST_UNIX) add_compile_options(-march=x86-64-v2) endif() elseif (CLR_CMAKE_TARGET_ARCH_ARM64) if(CLR_CMAKE_HOST_WIN32) - add_compile_options($<$:/arch:armv8.0+lse) + add_compile_options($<$:/arch:armv8.0+lse>) endif() endif() From 115e220012753eae9a5d64de02fb9b9e46552872 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 13 Jul 2026 04:54:52 -0700 Subject: [PATCH 4/5] Apply suggestion from @am11 Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com> --- eng/native/configureoptimization.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/native/configureoptimization.cmake b/eng/native/configureoptimization.cmake index 066e1c90680386..665715550ef381 100644 --- a/eng/native/configureoptimization.cmake +++ b/eng/native/configureoptimization.cmake @@ -18,7 +18,7 @@ endif() if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) if(CLR_CMAKE_HOST_WIN32) add_compile_options($<$:/arch:SSE4.2>) - elseif(CLR_CMAKE_HOST_UNIX) + else() add_compile_options(-march=x86-64-v2) endif() elseif (CLR_CMAKE_TARGET_ARCH_ARM64) From 96a87b3ef442705d0cc962b4c70b86b24a0068ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Petryka?= Date: Tue, 21 Jul 2026 02:29:41 +0200 Subject: [PATCH 5/5] Move code and enable define --- eng/native/configurecompiler.cmake | 67 +++++++++++++-------- eng/native/configureoptimization.cmake | 12 ---- src/coreclr/runtime/arm64/WriteBarriers.asm | 47 --------------- 3 files changed, 41 insertions(+), 85 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index cee494e67091d1..164b5e4a91da00 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -24,9 +24,9 @@ include(${CMAKE_CURRENT_LIST_DIR}/configureoptimization.cmake) if(CLR_CMAKE_TARGET_BROWSER AND DEFINED TRYRUN_BROWSER_EMSCRIPTEN_VERSION) file(READ "${CMAKE_CURRENT_LIST_DIR}/../../src/mono/browser/emscripten-version.txt" CURRENT_EMSCRIPTEN_VERSION) string(STRIP "${CURRENT_EMSCRIPTEN_VERSION}" CURRENT_EMSCRIPTEN_VERSION) - + if(NOT TRYRUN_BROWSER_EMSCRIPTEN_VERSION STREQUAL CURRENT_EMSCRIPTEN_VERSION) - message(WARNING + message(WARNING "Emscripten version mismatch detected!\n" " Current Emscripten: ${CURRENT_EMSCRIPTEN_VERSION}\n" " Cached features for: ${TRYRUN_BROWSER_EMSCRIPTEN_VERSION}\n" @@ -880,31 +880,31 @@ if(CLR_CMAKE_TARGET_OPENBSD) endif() if(CLR_CMAKE_HOST_UNIX_ARM) - if (NOT DEFINED CLR_ARM_FPU_TYPE) - set(CLR_ARM_FPU_TYPE vfpv3) - endif(NOT DEFINED CLR_ARM_FPU_TYPE) - - # Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang - # we have to set the triple by adding a compiler argument - add_compile_options(-mthumb) - add_compile_options(-mfpu=${CLR_ARM_FPU_TYPE}) - if (NOT DEFINED CLR_ARM_FPU_CAPABILITY) - set(CLR_ARM_FPU_CAPABILITY 0x7) - endif(NOT DEFINED CLR_ARM_FPU_CAPABILITY) - add_definitions(-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY}) - add_compile_options(-march=armv7-a) - if(ARM_SOFTFP) - add_definitions(-DARM_SOFTFP) - add_compile_options(-mfloat-abi=softfp) - endif(ARM_SOFTFP) + if (NOT DEFINED CLR_ARM_FPU_TYPE) + set(CLR_ARM_FPU_TYPE vfpv3) + endif(NOT DEFINED CLR_ARM_FPU_TYPE) + + # Because we don't use CMAKE_C_COMPILER/CMAKE_CXX_COMPILER to use clang + # we have to set the triple by adding a compiler argument + add_compile_options(-mthumb) + add_compile_options(-mfpu=${CLR_ARM_FPU_TYPE}) + if (NOT DEFINED CLR_ARM_FPU_CAPABILITY) + set(CLR_ARM_FPU_CAPABILITY 0x7) + endif(NOT DEFINED CLR_ARM_FPU_CAPABILITY) + add_definitions(-DCLR_ARM_FPU_CAPABILITY=${CLR_ARM_FPU_CAPABILITY}) + add_compile_options(-march=armv7-a) + if(ARM_SOFTFP) + add_definitions(-DARM_SOFTFP) + add_compile_options(-mfloat-abi=softfp) + endif(ARM_SOFTFP) endif(CLR_CMAKE_HOST_UNIX_ARM) if(CLR_CMAKE_HOST_UNIX_ARMV6) - add_compile_options(-mfpu=vfp) - add_definitions(-DCLR_ARM_FPU_CAPABILITY=0x0) - add_compile_options(-march=armv6zk) - add_compile_options(-mcpu=arm1176jzf-s) - add_compile_options(-mfloat-abi=hard) + add_compile_options(-mfpu=vfp) + add_definitions(-DCLR_ARM_FPU_CAPABILITY=0x0) + add_compile_options(-march=armv6zk) + add_compile_options(-mcpu=arm1176jzf-s) + add_compile_options(-mfloat-abi=hard) endif(CLR_CMAKE_HOST_UNIX_ARMV6) if(CLR_CMAKE_HOST_UNIX_RISCV64) @@ -912,8 +912,23 @@ if(CLR_CMAKE_HOST_UNIX_RISCV64) add_compile_options(-mabi=lp64d) endif(CLR_CMAKE_HOST_UNIX_RISCV64) -if(CLR_CMAKE_HOST_UNIX_X86) - add_compile_options(-msse2) +if(CLR_CMAKE_TARGET_ARCH_AMD64) + if(CLR_CMAKE_HOST_WIN32) + add_compile_options($<$:/arch:SSE4.2>) + else() + add_compile_options(-march=x86-64-v2) + endif() +elseif(CLR_CMAKE_TARGET_ARCH_I386) + if(CLR_CMAKE_HOST_WIN32) + add_compile_options($<$:/arch:SSE2>) + else() + add_compile_options(-march=x86-64) + endif() +elseif(CLR_CMAKE_TARGET_ARCH_ARM64) + if(CLR_CMAKE_HOST_WIN32) + add_compile_options($<$:/arch:armv8.0+lse>) + add_compile_definitions(LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT) + endif() endif() if(CLR_CMAKE_HOST_UNIX) diff --git a/eng/native/configureoptimization.cmake b/eng/native/configureoptimization.cmake index 665715550ef381..9669115fc931a4 100644 --- a/eng/native/configureoptimization.cmake +++ b/eng/native/configureoptimization.cmake @@ -14,15 +14,3 @@ elseif(CLR_CMAKE_HOST_UNIX) endif() add_compile_options($<$:-O2>) endif() - -if (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_I386) - if(CLR_CMAKE_HOST_WIN32) - add_compile_options($<$:/arch:SSE4.2>) - else() - add_compile_options(-march=x86-64-v2) - endif() -elseif (CLR_CMAKE_TARGET_ARCH_ARM64) - if(CLR_CMAKE_HOST_WIN32) - add_compile_options($<$:/arch:armv8.0+lse>) - endif() -endif() diff --git a/src/coreclr/runtime/arm64/WriteBarriers.asm b/src/coreclr/runtime/arm64/WriteBarriers.asm index 55caf1a6811f49..a3ea80dc0e2311 100644 --- a/src/coreclr/runtime/arm64/WriteBarriers.asm +++ b/src/coreclr/runtime/arm64/WriteBarriers.asm @@ -268,30 +268,11 @@ NotInHeap ;; LEAF_ENTRY RhpCheckedLockCmpXchg -#ifndef LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT - PREPARE_EXTERNAL_VAR_INDIRECT_W g_cpuFeatures, 16 - tbz x16, #ARM64_ATOMICS_FEATURE_FLAG_BIT, CmpXchgRetry -#endif - mov x10, x2 casal x10, x1, [x0] ;; exchange cmp x2, x10 bne CmpXchgNoUpdate -#ifndef LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT - b DoCardsCmpXchg -CmpXchgRetry - ;; Check location value is what we expect. - ldaxr x10, [x0] - cmp x10, x2 - bne CmpXchgNoUpdate - - ;; Current value matches comparand, attempt to update with the new value. - stlxr w12, x1, [x0] - cbnz w12, CmpXchgRetry -#endif - -DoCardsCmpXchg ;; We have successfully updated the value of the objectref so now we need a GC write barrier. ;; The following barrier code takes the destination in x0 and the value in x1 so the arguments are ;; already correctly set up. @@ -301,12 +282,6 @@ DoCardsCmpXchg CmpXchgNoUpdate ;; x10 still contains the original value. mov x0, x10 - -#ifndef LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT - tbnz x16, #ARM64_ATOMICS_FEATURE_FLAG_BIT, NoBarrierCmpXchg - InterlockedOperationBarrier -NoBarrierCmpXchg -#endif ret lr LEAF_END RhpCheckedLockCmpXchg @@ -326,25 +301,8 @@ NoBarrierCmpXchg ;; LEAF_ENTRY RhpCheckedXchg -#ifndef LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT - PREPARE_EXTERNAL_VAR_INDIRECT_W g_cpuFeatures, 16 - tbz x16, #ARM64_ATOMICS_FEATURE_FLAG_BIT, ExchangeRetry -#endif - swpal x1, x10, [x0] ;; exchange -#ifndef LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT - b DoCardsXchg -ExchangeRetry - ;; Read the existing memory location. - ldaxr x10, [x0] - - ;; Attempt to update with the new value. - stlxr w12, x1, [x0] - cbnz w12, ExchangeRetry -#endif - -DoCardsXchg ;; We have successfully updated the value of the objectref so now we need a GC write barrier. ;; The following barrier code takes the destination in x0 and the value in x1 so the arguments are ;; already correctly set up. @@ -354,11 +312,6 @@ DoCardsXchg ;; x10 still contains the original value. mov x0, x10 -#ifndef LSE_INSTRUCTIONS_ENABLED_BY_DEFAULT - tbnz x16, #ARM64_ATOMICS_FEATURE_FLAG_BIT, NoBarrierXchg - InterlockedOperationBarrier -NoBarrierXchg -#endif ret LEAF_END RhpCheckedXchg