diff --git a/src/cpu.cpp b/src/cpu.cpp index 5cb5a7f67..01f42685e 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -5,7 +5,6 @@ #include "platform.h" -#include #include #ifndef __wasi__ #include @@ -14,9 +13,13 @@ #include #include #include + +#if !NCNN_SIMPLESTL #include +#include #include #include +#endif #ifdef _OPENMP #if NCNN_SIMPLEOMP @@ -2422,41 +2425,41 @@ namespace ncnn { // New unified CpuSet implementation supporting >64 CPUs CpuSet::CpuSet() - : fast_mask(0), extended_mask(nullptr), extended_capacity(0), use_extended(false) + : fast_mask(0) + , extended_mask(nullptr) + , extended_capacity(0) + , use_extended(false) #if defined _WIN32 - , - legacy_mask_cache(0), - legacy_mask_valid(false) + , legacy_mask_cache(0) + , legacy_mask_valid(false) #endif #if defined __ANDROID__ || defined __linux__ - , - cpu_set_cache(nullptr), - cpu_set_valid(false) + , cpu_set_cache(nullptr) + , cpu_set_valid(false) #endif #if __APPLE__ - , - legacy_policy_cache(0), - legacy_policy_valid(false) + , legacy_policy_cache(0) + , legacy_policy_valid(false) #endif { } CpuSet::CpuSet(const CpuSet& other) - : fast_mask(0), extended_mask(nullptr), extended_capacity(0), use_extended(false) + : fast_mask(0) + , extended_mask(nullptr) + , extended_capacity(0) + , use_extended(false) #if defined _WIN32 - , - legacy_mask_cache(0), - legacy_mask_valid(false) + , legacy_mask_cache(0) + , legacy_mask_valid(false) #endif #if defined __ANDROID__ || defined __linux__ - , - cpu_set_cache(nullptr), - cpu_set_valid(false) + , cpu_set_cache(nullptr) + , cpu_set_valid(false) #endif #if __APPLE__ - , - legacy_policy_cache(0), - legacy_policy_valid(false) + , legacy_policy_cache(0) + , legacy_policy_valid(false) #endif { copy_from(other); @@ -2781,12 +2784,30 @@ ULONG_PTR CpuSet::get_legacy_mask() const if (!use_extended) { // Fast path: directly use fast_mask (truncated to ULONG_PTR size) - legacy_mask_cache = (ULONG_PTR)(fast_mask & ((1ULL << (sizeof(ULONG_PTR) * 8)) - 1)); + if (sizeof(ULONG_PTR) >= sizeof(uint64_t)) + { + legacy_mask_cache = (ULONG_PTR)fast_mask; + } + else + { + // Create mask for ULONG_PTR size without undefined behavior + const uint64_t ptr_mask = (sizeof(ULONG_PTR) == 4) ? 0xFFFFFFFFULL : 0xFFFFFFFFFFFFFFFFULL; + legacy_mask_cache = (ULONG_PTR)(fast_mask & ptr_mask); + } } else if (extended_mask && extended_capacity > 0) { // Extended path: use first word, truncated to ULONG_PTR size - legacy_mask_cache = (ULONG_PTR)(extended_mask[0] & ((1ULL << (sizeof(ULONG_PTR) * 8)) - 1)); + if (sizeof(ULONG_PTR) >= sizeof(uint64_t)) + { + legacy_mask_cache = (ULONG_PTR)extended_mask[0]; + } + else + { + // Create mask for ULONG_PTR size without undefined behavior + const uint64_t ptr_mask = (sizeof(ULONG_PTR) == 4) ? 0xFFFFFFFFULL : 0xFFFFFFFFFFFFFFFFULL; + legacy_mask_cache = (ULONG_PTR)(extended_mask[0] & ptr_mask); + } } legacy_mask_valid = true; diff --git a/src/cpu.h b/src/cpu.h index 8d77b2736..1a13636bc 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -5,7 +5,6 @@ #define NCNN_CPU_H #include -#include #if defined _WIN32 #define WIN32_LEAN_AND_MEAN diff --git a/src/platform.h.in b/src/platform.h.in index 6ee6a497c..cd45ce4fd 100644 --- a/src/platform.h.in +++ b/src/platform.h.in @@ -4,7 +4,12 @@ #ifndef NCNN_PLATFORM_H #define NCNN_PLATFORM_H +// Ensure basic integer types are available in all modes +#if NCNN_SIMPLESTL +#include +#else #include +#endif #cmakedefine01 NCNN_STDIO #cmakedefine01 NCNN_STRING