From 2671f68f7f8cb77bf951779c0c8e437f6171a324 Mon Sep 17 00:00:00 2001 From: slowriot Date: Fri, 6 Dec 2024 17:50:44 +0000 Subject: [PATCH] Don't enable SSE4 under Emscripten (#8213, #8169, #4933) Amend 326dc95f9 --- imgui.cpp | 10 +++++----- imgui_internal.h | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 5f6c85900..5833691db 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -2150,7 +2150,7 @@ void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, } } -#ifndef IMGUI_ENABLE_SSE4_2 +#ifndef IMGUI_ENABLE_SSE4_2_CRC // CRC32 needs a 1KB lookup table (not cache friendly) // Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily: // - avoid an unnecessary branch/memory tap, - keep the ImHashXXX functions usable by static constructors, - make it thread-safe. @@ -2184,7 +2184,7 @@ ImGuiID ImHashData(const void* data_p, size_t data_size, ImGuiID seed) ImU32 crc = ~seed; const unsigned char* data = (const unsigned char*)data_p; const unsigned char *data_end = (const unsigned char*)data_p + data_size; -#ifndef IMGUI_ENABLE_SSE4_2 +#ifndef IMGUI_ENABLE_SSE4_2_CRC const ImU32* crc32_lut = GCrc32LookupTable; while (data < data_end) crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *data++]; @@ -2212,7 +2212,7 @@ ImGuiID ImHashStr(const char* data_p, size_t data_size, ImGuiID seed) seed = ~seed; ImU32 crc = seed; const unsigned char* data = (const unsigned char*)data_p; -#ifndef IMGUI_ENABLE_SSE4_2 +#ifndef IMGUI_ENABLE_SSE4_2_CRC const ImU32* crc32_lut = GCrc32LookupTable; #endif if (data_size != 0) @@ -2222,7 +2222,7 @@ ImGuiID ImHashStr(const char* data_p, size_t data_size, ImGuiID seed) unsigned char c = *data++; if (c == '#' && data_size >= 2 && data[0] == '#' && data[1] == '#') crc = seed; -#ifndef IMGUI_ENABLE_SSE4_2 +#ifndef IMGUI_ENABLE_SSE4_2_CRC crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; #else crc = _mm_crc32_u8(crc, c); @@ -2235,7 +2235,7 @@ ImGuiID ImHashStr(const char* data_p, size_t data_size, ImGuiID seed) { if (c == '#' && data[0] == '#' && data[1] == '#') crc = seed; -#ifndef IMGUI_ENABLE_SSE4_2 +#ifndef IMGUI_ENABLE_SSE4_2_CRC crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; #else crc = _mm_crc32_u8(crc, c); diff --git a/imgui_internal.h b/imgui_internal.h index 147e30c35..f11f272c3 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -66,6 +66,10 @@ Index of this file: #include #endif #endif +// Emscripten has partial SSE 4.2 support where _mm_crc32_u32 is not available. See https://emscripten.org/docs/porting/simd.html#id11 and #8213 +#if defined(IMGUI_ENABLE_SSE4_2) || !defined(__EMSCRIPTEN__) +#define IMGUI_ENABLE_SSE4_2_CRC +#endif // Visual Studio warnings #ifdef _MSC_VER