Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package simdutf for openSUSE:Factory checked in at 2026-10-23 20:21:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/simdutf (Old) and /work/SRC/openSUSE:Factory/.simdutf.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "simdutf" Fri Oct 23 20:21:17 2026 rev:10 rq:1386750 version:9.3.2 Changes: -------- --- /work/SRC/openSUSE:Factory/simdutf/simdutf.changes 2026-10-16 20:06:48.157905604 +0200 +++ /work/SRC/openSUSE:Factory/.simdutf.new.2252680/simdutf.changes 2026-10-23 20:21:31.553569739 +0200 @@ -1,0 +2,8 @@ +Sat Oct 17 11:50:15 UTC 2026 - Dominique Leuenberger <[email protected]> + +- Update to version 9.3.2: + * icelake: unroll the base64 encoding loop +- Changes from version 9.3.1: + + icelake: use plain loads in the base64 encoding loop + +------------------------------------------------------------------- Old: ---- simdutf-9.3.0.tar.xz New: ---- simdutf-9.3.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ simdutf.spec ++++++ --- /var/tmp/diff_new_pack.N9sp3X/_old 2026-10-23 20:21:32.631614852 +0200 +++ /var/tmp/diff_new_pack.N9sp3X/_new 2026-10-23 20:21:32.635615020 +0200 @@ -19,7 +19,7 @@ %define lib_ver 37.0.0 %define so_ver 37 Name: simdutf -Version: 9.3.0 +Version: 9.3.2 Release: 0 Summary: Unicode validation and transcoding at billions of characters per second ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.N9sp3X/_old 2026-10-23 20:21:32.704617907 +0200 +++ /var/tmp/diff_new_pack.N9sp3X/_new 2026-10-23 20:21:32.714618326 +0200 @@ -1,7 +1,7 @@ -mtime: 1791994885 -commit: ce4f7a1f0a5280a6363267ea84f89d45eb0c3c6f8af2abe4cc41e81c9e8cb76a +mtime: 1792237928 +commit: a1e11eb2e43ced22e8258ca57f30f4e436eb2979470c3daab35464bb94f9ae2e url: https://src.opensuse.org/GNOME/simdutf -revision: ce4f7a1f0a5280a6363267ea84f89d45eb0c3c6f8af2abe4cc41e81c9e8cb76a +revision: a1e11eb2e43ced22e8258ca57f30f4e436eb2979470c3daab35464bb94f9ae2e trackingbranch: factory projectscmsync: https://src.opensuse.org/GNOME/_ObsPrj ++++++ _service ++++++ --- /var/tmp/diff_new_pack.N9sp3X/_old 2026-10-23 20:21:32.759620209 +0200 +++ /var/tmp/diff_new_pack.N9sp3X/_new 2026-10-23 20:21:32.765620460 +0200 @@ -3,7 +3,7 @@ <service name="obs_scm" mode="manual"> <param name="scm">git</param> <param name="url">https://github.com/simdutf/simdutf.git</param> - <param name="revision">v9.3.0</param> + <param name="revision">v9.3.2</param> <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param> <param name="versionrewrite-pattern">v?(.*)\+0</param> <param name="versionrewrite-replacement">\1</param> ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-10-17 13:52:08.000000000 +0200 @@ -0,0 +1,5 @@ +*.obscpio +*.osc +_build.* +.pbuild +osc-collab.* ++++++ simdutf-9.3.0.tar.xz -> simdutf-9.3.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/simdutf-9.3.0/CMakeLists.txt new/simdutf-9.3.2/CMakeLists.txt --- old/simdutf-9.3.0/CMakeLists.txt 2026-10-14 02:30:31.000000000 +0200 +++ new/simdutf-9.3.2/CMakeLists.txt 2026-10-17 05:05:59.000000000 +0200 @@ -3,7 +3,7 @@ project(simdutf DESCRIPTION "Fast Unicode validation, transcoding and processing" LANGUAGES C CXX - VERSION 9.3.0 + VERSION 9.3.2 ) include (TestBigEndian) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/simdutf-9.3.0/Doxyfile new/simdutf-9.3.2/Doxyfile --- old/simdutf-9.3.0/Doxyfile 2026-10-14 02:30:31.000000000 +0200 +++ new/simdutf-9.3.2/Doxyfile 2026-10-17 05:05:59.000000000 +0200 @@ -38,7 +38,7 @@ # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "9.3.0" +PROJECT_NUMBER = "9.3.2" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/simdutf-9.3.0/README.md new/simdutf-9.3.2/README.md --- old/simdutf-9.3.0/README.md 2026-10-14 02:30:31.000000000 +0200 +++ new/simdutf-9.3.2/README.md 2026-10-17 05:05:59.000000000 +0200 @@ -149,7 +149,7 @@ 1. Pull the library in a directory ``` - wget https://github.com/simdutf/simdutf/releases/download/v9.3.0/singleheader.zip + wget https://github.com/simdutf/simdutf/releases/download/v9.3.2/singleheader.zip unzip singleheader.zip ``` You can replace `wget` by `curl -OL https://...` if you prefer. @@ -190,7 +190,7 @@ ## Single-header version -You can create a single-header version of the library where all of the code is put into two files (`simdutf.h` and `simdutf.cpp`). We publish a zip archive containing these files, e.g., see https://github.com/simdutf/simdutf/releases/download/v9.3.0/singleheader.zip +You can create a single-header version of the library where all of the code is put into two files (`simdutf.h` and `simdutf.cpp`). We publish a zip archive containing these files, e.g., see https://github.com/simdutf/simdutf/releases/download/v9.3.2/singleheader.zip You may generate it on your own using a Python script. @@ -3216,8 +3216,9 @@ ## References +* Daniel Lemire, [Fast Forgiving Base64 Decoding with SIMD Instructions](https://doi.org/10.1145/3859286), ACM Transactions on Architecture and Code Optimization, 2026. * Robert Clausecker, Daniel Lemire, [Fixing ill-formed UTF-16 strings with SIMD instructions](https://arxiv.org/abs/2601.06349), Software: Practice and Experience to appear, 2026. -* * Robert Clausecker, Daniel Lemire, [Transcoding Unicode Characters with AVX-512 Instructions](https://arxiv.org/abs/2212.05098), Software: Practice and Experience 53 (12), 2023. +* Robert Clausecker, Daniel Lemire, [Transcoding Unicode Characters with AVX-512 Instructions](https://arxiv.org/abs/2212.05098), Software: Practice and Experience 53 (12), 2023. * Daniel Lemire, Wojciech Muła, [Transcoding Billions of Unicode Characters per Second with SIMD Instructions](https://arxiv.org/abs/2109.10433), Software: Practice and Experience 52 (2), 2022. * John Keiser, Daniel Lemire, [Validating UTF-8 In Less Than One Instruction Per Byte](https://arxiv.org/abs/2010.03090), Software: Practice and Experience 51 (5), 2021. * Wojciech Muła, Daniel Lemire, [Base64 encoding and decoding at almost the speed of a memory copy](https://arxiv.org/abs/1910.05109), Software: Practice and Experience 50 (2), 2020. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/simdutf-9.3.0/include/simdutf/simdutf_version.h new/simdutf-9.3.2/include/simdutf/simdutf_version.h --- old/simdutf-9.3.0/include/simdutf/simdutf_version.h 2026-10-14 02:30:31.000000000 +0200 +++ new/simdutf-9.3.2/include/simdutf/simdutf_version.h 2026-10-17 05:05:59.000000000 +0200 @@ -4,7 +4,7 @@ #define SIMDUTF_SIMDUTF_VERSION_H /** The version of simdutf being used (major.minor.revision) */ -#define SIMDUTF_VERSION "9.3.0" +#define SIMDUTF_VERSION "9.3.2" namespace simdutf { enum { @@ -19,7 +19,7 @@ /** * The revision (major.minor.REVISION) of simdutf being used. */ - SIMDUTF_VERSION_REVISION = 0 + SIMDUTF_VERSION_REVISION = 2 }; } // namespace simdutf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/simdutf-9.3.0/src/icelake/icelake_base64.inl.cpp new/simdutf-9.3.2/src/icelake/icelake_base64.inl.cpp --- old/simdutf-9.3.0/src/icelake/icelake_base64.inl.cpp 2026-10-14 02:30:31.000000000 +0200 +++ new/simdutf-9.3.2/src/icelake/icelake_base64.inl.cpp 2026-10-17 05:05:59.000000000 +0200 @@ -93,6 +93,19 @@ } } +// Encodes 48 bytes (loaded with a plain 64-byte load) into 64 bytes. +static inline void encode_block(const uint8_t *input, uint8_t *out, + const __m512i shuffle_input, + const __m512i multi_shifts, + const __m512i lookup) { + const __m512i v = + _mm512_loadu_si512(reinterpret_cast<const __m512i *>(input)); + const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v); + const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in); + _mm512_storeu_si512(reinterpret_cast<__m512i *>(out), + _mm512_permutexvar_epi8(indices, lookup)); +} + template <bool base64_url, bool use_lines> size_t encode_base64_impl(char *dst, const char *src, size_t srclen, base64_options options, @@ -120,9 +133,36 @@ __mmask64 input_mask = 0xffffffffffff; // (1 << 48) - 1 // We want that input == end_input means that we must stop. const uint8_t *end_input = input + (size - (size % 48)); + // Masked loads are noticeably slower than plain loads once the data no + // longer fits in L1. We use plain 64-byte loads as long as at least 64 + // bytes remain readable, and fall back on masked loads near the end. + const uint8_t *const input_end = input + size; + if (!use_lines) { + // Most of the input: blocks that can use plain 64-byte loads, several + // blocks per iteration, without a bound check per block. The loop below + // handles the remaining full block, if any. + constexpr size_t unroll = 8; + size_t plain_blocks = size >= 64 ? (size - 16) / 48 : 0; + for (; plain_blocks >= unroll; plain_blocks -= unroll) { + for (size_t k = 0; k < unroll; k++) { + encode_block(input + 48 * k, out + 64 * k, shuffle_input, multi_shifts, + lookup); + } + input += 48 * unroll; + out += 64 * unroll; + } + for (; plain_blocks > 0; plain_blocks--) { + encode_block(input, out, shuffle_input, multi_shifts, lookup); + input += 48; + out += 64; + } + } while (input != end_input) { - const __m512i v = _mm512_maskz_loadu_epi8( - input_mask, reinterpret_cast<const __m512i *>(input)); + const __m512i v = + (size_t(input_end - input) >= 64) + ? _mm512_loadu_si512(reinterpret_cast<const __m512i *>(input)) + : _mm512_maskz_loadu_epi8(input_mask, + reinterpret_cast<const __m512i *>(input)); const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v); const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in); const __m512i result = _mm512_permutexvar_epi8(indices, lookup); ++++++ simdutf.obsinfo ++++++ --- /var/tmp/diff_new_pack.N9sp3X/_old 2026-10-23 20:21:33.500651219 +0200 +++ /var/tmp/diff_new_pack.N9sp3X/_new 2026-10-23 20:21:33.504651387 +0200 @@ -1,5 +1,5 @@ name: simdutf -version: 9.3.0 -mtime: 1791937831 -commit: bb77e7bb98fe0c2296e7cf9f324c56fcd704885a +version: 9.3.2 +mtime: 1792206359 +commit: 8d82299606e675b50de8dc16fd118aae4b65bfde
