On Fri, Feb 21, 2025 at 1:24 AM Devulapalli, Raghuveer <raghuveer.devulapa...@intel.com> wrote: > > > > Now, there is no equivalent on MSVC and workarounds are fragile [1]. > > Maybe we could only assert initialization happened for the backend and for > > frontend either > > - add a couple manual initializations to to the frontend programs where we > > don't > > want to lose performance for non-gcc/clang. > > - require CRC on x86-64 MSVC since Windows 10 is EOL soon, going by Thomas > > M.'s earlier findings on popcount (also SSE4.2) [2] > > > > The first is less risky but less tidy. > > Agree, let me think about this but not sure if I have any useful suggestions > here. MSVC is unfortunately not my strong suit :/
Here's another idea to make it more automatic: Give up on initializing every capability at once. The first time we call CRC, it will be uninitialized, so this part: if (pg_cpucap & PGCPUCAP_CRC32C) return COMP_CRC32C_HW(crc, data, len); else return pg_comp_crc32c_sb8(crc, data, len); ...will call the SB8 path. Inside there, do the check: #if defined(HAVE_CRC_RUNTIME) // separate init bit for each capability if (unlikely(pg_cpucap & PGCPUCAP_CRC32C_INIT == 0)) { pg_cpucap_crc32c(); // also sets PGCPUCAP_CRC32C_INIT if (pg_cpucap & PGCPUCAP_CRC32C) return COMP_CRC32C_HW(crc, data, len); } #endif // ...fallthrough to SB8 -- John Naylor Amazon Web Services