[PATCH v6 4/4] x86/string: Make page-unrolled memmove default for Intel processors

Noah Goldstein goldstein.w.n@gmail.com
Fri Dec 5 01:02:16 GMT 2025


On Thu, Dec 4, 2025, 17:04 Sunil Pandey <skpgkp2@gmail.com> wrote:

>
>
> On Fri, Nov 28, 2025 at 12:47 AM Noah Goldstein <goldstein.w.n@gmail.com>
> wrote:
>
>> Continue using page-unrolled large memmove implementation for all
>> Intel processors to stay consistent with how it has been since glibc
>> 2.34.
>>
>> So far the page-unrolled implementation has been benchmarked on
>> HSW-SPR, with it yielding 5-15% performance improvements on
>> HSW-ICX. On SPR it appears to be roughly equal, and it is not known
>> how it compares on newer hardware (although Sunil has some benchmarks
>> that suggest it may still yield performance improvements).
>>
>> Since as of now, we only have positive or roughly neutral benchmark
>> results on Intel hardware, it seems fair to continue using this
>> implementation as the default. It would be prudent, however, to
>> continue benchmarking the page-unrolled vs standard implementation for
>> future hardware to ensure that is remains performant.
>> ---
>>  sysdeps/x86/cpu-features.c                    | 14 ++++
>>  sysdeps/x86_64/multiarch/Makefile             |  2 +
>>  sysdeps/x86_64/multiarch/ifunc-impl-list.c    | 72 +++++++++++++++++--
>>  sysdeps/x86_64/multiarch/ifunc-memmove.h      | 38 +++++++---
>>  ...move-avx512-unaligned-erms-page-unrolled.S | 24 +++++++
>>  ...emmove-sse2-unaligned-erms-page-unrolled.S | 24 +++++++
>>  .../multiarch/memmove-sse2-unaligned-erms.S   |  2 +-
>>  7 files changed, 161 insertions(+), 15 deletions(-)
>>  create mode 100644
>> sysdeps/x86_64/multiarch/memmove-avx512-unaligned-erms-page-unrolled.S
>>  create mode 100644
>> sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms-page-unrolled.S
>>
>> diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
>> index 36803aa53f..2d9ded010f 100644
>> --- a/sysdeps/x86/cpu-features.c
>> +++ b/sysdeps/x86/cpu-features.c
>> @@ -769,6 +769,20 @@ init_cpu_features (struct cpu_features *cpu_features)
>>        cpu_features->preferred[index_arch_Avoid_Non_Temporal_Memset]
>>           &= ~bit_arch_Avoid_Non_Temporal_Memset;
>>
>> +      /* Enable page unrolled large implementation to remain consistent
>> +        with glibc 2.34 and earlier. Thus far all benchmarks on Intel
>> Bigcore
>> +        hardware suggest the large implementation is equal to or more
>> +        performant than the standard large memmove implementation.
>> +        However, since the page-unrolled implementation is less
>> +        standard/obvious, it may not receive as much optimization
>> +        attention from hardware implementors, so we should continue to
>> +        benchmark new hardware to ensure this is the right decision.
>> +        Note: As of writing this, there have been no benchmarks
>> indicating the
>> +        page-unrolled implementation is prefered on Atom processors.
>
>
> This is not correct. Current implementation provides better performance on
> current atom core
> processors as well as on big core processors, so I don't see any reason
> for change on Intel
> side.
>


Hmm? Did I mess up? This should be setting page unrolled preference for all
Intel machines. Atom and Big core.

The comment is just a comment which I believe is accurate regarding
publicly known benchmarks.

>
> We keep
>> +        enabled in the interest of remaining consistent with glibc
>> 2.34.  */
>> +      cpu_features->preferred[index_arch_Prefer_Page_Unrolled_Large_Copy]
>> +         |= bit_arch_Prefer_Page_Unrolled_Large_Copy;
>> +
>>        enum intel_microarch microarch = INTEL_UNKNOWN;
>>        if (family == 0x06)
>>         {
>> diff --git a/sysdeps/x86_64/multiarch/Makefile
>> b/sysdeps/x86_64/multiarch/Makefile
>> index 381eaef455..c4573f27df 100644
>> --- a/sysdeps/x86_64/multiarch/Makefile
>> +++ b/sysdeps/x86_64/multiarch/Makefile
>> @@ -21,10 +21,12 @@ sysdep_routines += \
>>    memmove-avx-unaligned-erms-rtm \
>>    memmove-avx512-no-vzeroupper \
>>    memmove-avx512-unaligned-erms \
>> +  memmove-avx512-unaligned-erms-page-unrolled \
>>    memmove-erms \
>>    memmove-evex-unaligned-erms \
>>    memmove-evex-unaligned-erms-page-unrolled \
>>    memmove-sse2-unaligned-erms \
>> +  memmove-sse2-unaligned-erms-page-unrolled \
>>    memmove-ssse3 \
>>    memrchr-avx2 \
>>    memrchr-avx2-rtm \
>> diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
>> b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
>> index f9add65d24..26278da8d4 100644
>> --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
>> +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
>> @@ -127,9 +127,15 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memmove_chk_avx512_unaligned)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memmove_chk_avx512_unaligned_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memmove_chk_avx512_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memmove_chk_avx512_unaligned_erms_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __memmove_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memmove_chk_evex_unaligned)
>> @@ -181,7 +187,11 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
>>                                      __memmove_chk_sse2_unaligned)
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
>> -                                    __memmove_chk_sse2_unaligned_erms))
>> +
>> __memmove_chk_sse2_unaligned_page_unrolled)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
>> +                                    __memmove_chk_sse2_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, __memmove_chk, 1,
>> +
>> __memmove_chk_sse2_unaligned_erms_page_unrolled))
>>  #endif
>>
>>    /* Support sysdeps/x86_64/multiarch/memmove.c.  */
>> @@ -194,9 +204,15 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memmove_avx512_unaligned)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memmove_avx512_unaligned_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memmove_avx512_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memmove_avx512_unaligned_erms_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, memmove,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memmove_evex_unaligned)
>> @@ -248,7 +264,11 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
>>                                      __memmove_sse2_unaligned)
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
>> -                                    __memmove_sse2_unaligned_erms))
>> +
>> __memmove_sse2_unaligned_page_unrolled)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
>> +                                    __memmove_sse2_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, memmove, 1,
>> +
>> __memmove_sse2_unaligned_erms_page_unrolled))
>>
>>    /* Support sysdeps/x86_64/multiarch/memrchr.c.  */
>>    IFUNC_IMPL (i, name, memrchr,
>> @@ -1174,9 +1194,15 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memcpy_chk_avx512_unaligned)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memcpy_chk_avx512_unaligned_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memcpy_chk_avx512_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memcpy_chk_avx512_unaligned_erms_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __memcpy_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memcpy_chk_evex_unaligned)
>> @@ -1228,7 +1254,11 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
>>                                      __memcpy_chk_sse2_unaligned)
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
>> -                                    __memcpy_chk_sse2_unaligned_erms))
>> +
>> __memcpy_chk_sse2_unaligned_page_unrolled)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
>> +                                    __memcpy_chk_sse2_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, __memcpy_chk, 1,
>> +
>> __memcpy_chk_sse2_unaligned_erms_page_unrolled))
>>  #endif
>>
>>    /* Support sysdeps/x86_64/multiarch/memcpy.c.  */
>> @@ -1241,9 +1271,15 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memcpy_avx512_unaligned)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memcpy_avx512_unaligned_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memcpy_avx512_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __memcpy_avx512_unaligned_erms_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, memcpy,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __memcpy_evex_unaligned)
>> @@ -1295,7 +1331,11 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
>>                                      __memcpy_sse2_unaligned)
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
>> -                                    __memcpy_sse2_unaligned_erms))
>> +
>> __memcpy_sse2_unaligned_page_unrolled)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
>> +                                    __memcpy_sse2_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, memcpy, 1,
>> +
>> __memcpy_sse2_unaligned_erms_page_unrolled))
>>
>>  #ifdef SHARED
>>    /* Support sysdeps/x86_64/multiarch/mempcpy_chk.c.  */
>> @@ -1308,9 +1348,15 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __mempcpy_chk_avx512_unaligned)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __mempcpy_chk_avx512_unaligned_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __mempcpy_chk_avx512_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __mempcpy_chk_avx512_unaligned_erms_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, __mempcpy_chk,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __mempcpy_chk_evex_unaligned)
>> @@ -1362,7 +1408,11 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
>>                                      __mempcpy_chk_sse2_unaligned)
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
>> -                                    __mempcpy_chk_sse2_unaligned_erms))
>> +
>> __mempcpy_chk_sse2_unaligned_page_unrolled)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
>> +                                    __mempcpy_chk_sse2_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, __mempcpy_chk, 1,
>> +
>> __mempcpy_chk_sse2_unaligned_erms_page_unrolled))
>>  #endif
>>
>>    /* Support sysdeps/x86_64/multiarch/mempcpy.c.  */
>> @@ -1375,9 +1425,15 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __mempcpy_avx512_unaligned)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __mempcpy_avx512_unaligned_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __mempcpy_avx512_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
>> +                                    CPU_FEATURE_USABLE (AVX512VL),
>> +
>> __mempcpy_avx512_unaligned_erms_page_unrolled)
>>               X86_IFUNC_IMPL_ADD_V4 (array, i, mempcpy,
>>                                      CPU_FEATURE_USABLE (AVX512VL),
>>                                      __mempcpy_evex_unaligned)
>> @@ -1429,7 +1485,11 @@ __libc_ifunc_impl_list (const char *name, struct
>> libc_ifunc_impl *array,
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
>>                                      __mempcpy_sse2_unaligned)
>>               X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
>> -                                    __mempcpy_sse2_unaligned_erms))
>> +
>> __mempcpy_sse2_unaligned_page_unrolled)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
>> +                                    __mempcpy_sse2_unaligned_erms)
>> +             X86_IFUNC_IMPL_ADD_V2 (array, i, mempcpy, 1,
>> +
>> __mempcpy_sse2_unaligned_erms_page_unrolled))
>>
>>    /* Support sysdeps/x86_64/multiarch/strncmp.c.  */
>>    IFUNC_IMPL (i, name, strncmp,
>> diff --git a/sysdeps/x86_64/multiarch/ifunc-memmove.h
>> b/sysdeps/x86_64/multiarch/ifunc-memmove.h
>> index 6d5df8a9eb..dc03269d8f 100644
>> --- a/sysdeps/x86_64/multiarch/ifunc-memmove.h
>> +++ b/sysdeps/x86_64/multiarch/ifunc-memmove.h
>> @@ -23,10 +23,14 @@ extern __typeof (REDIRECT_NAME) OPTIMIZE (erms)
>> attribute_hidden;
>>
>>  extern __typeof (REDIRECT_NAME) OPTIMIZE (avx512_unaligned)
>>    attribute_hidden;
>> -extern __typeof (REDIRECT_NAME) OPTIMIZE (avx512_unaligned_erms)
>> -  attribute_hidden;
>> -extern __typeof (REDIRECT_NAME) OPTIMIZE (avx512_no_vzeroupper)
>> -  attribute_hidden;
>> +extern __typeof (REDIRECT_NAME)
>> +    OPTIMIZE (avx512_unaligned_page_unrolled) attribute_hidden;
>> +extern __typeof (REDIRECT_NAME)
>> +    OPTIMIZE (avx512_unaligned_erms) attribute_hidden;
>> +extern __typeof (REDIRECT_NAME)
>> +    OPTIMIZE (avx512_unaligned_erms_page_unrolled) attribute_hidden;
>> +extern __typeof (REDIRECT_NAME)
>> +    OPTIMIZE (avx512_no_vzeroupper) attribute_hidden;
>>
>>  extern __typeof (REDIRECT_NAME) OPTIMIZE (evex_unaligned)
>> attribute_hidden;
>>  extern __typeof (REDIRECT_NAME)
>> @@ -54,8 +58,12 @@ extern __typeof (REDIRECT_NAME) OPTIMIZE (ssse3)
>> attribute_hidden;
>>
>>  extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2_unaligned)
>>    attribute_hidden;
>> -extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2_unaligned_erms)
>> -  attribute_hidden;
>> +extern __typeof (REDIRECT_NAME)
>> +    OPTIMIZE (sse2_unaligned_page_unrolled) attribute_hidden;
>> +extern __typeof (REDIRECT_NAME)
>> +    OPTIMIZE (sse2_unaligned_erms) attribute_hidden;
>> +extern __typeof (REDIRECT_NAME)
>> +    OPTIMIZE (sse2_unaligned_erms_page_unrolled) attribute_hidden;
>>
>>  static inline void *
>>  IFUNC_SELECTOR (void)
>> @@ -72,8 +80,16 @@ IFUNC_SELECTOR (void)
>>        if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512VL))
>>         {
>>           if (CPU_FEATURE_USABLE_P (cpu_features, ERMS))
>> -           return OPTIMIZE (avx512_unaligned_erms);
>> +           {
>> +             if (CPU_FEATURES_ARCH_P (cpu_features,
>> +                                      Prefer_Page_Unrolled_Large_Copy))
>> +               return OPTIMIZE (avx512_unaligned_erms_page_unrolled);
>> +             return OPTIMIZE (avx512_unaligned_erms);
>> +           }
>>
>> +         if (CPU_FEATURES_ARCH_P (cpu_features,
>> +                                  Prefer_Page_Unrolled_Large_Copy))
>> +           return OPTIMIZE (avx512_unaligned_page_unrolled);
>>           return OPTIMIZE (avx512_unaligned);
>>         }
>>
>> @@ -140,7 +156,13 @@ IFUNC_SELECTOR (void)
>>      }
>>
>>    if (CPU_FEATURE_USABLE_P (cpu_features, ERMS))
>> -    return OPTIMIZE (sse2_unaligned_erms);
>> +    {
>> +      if (CPU_FEATURES_ARCH_P (cpu_features,
>> Prefer_Page_Unrolled_Large_Copy))
>> +       return OPTIMIZE (sse2_unaligned_erms_page_unrolled);
>> +      return OPTIMIZE (sse2_unaligned_erms);
>> +    }
>>
>> +  if (CPU_FEATURES_ARCH_P (cpu_features,
>> Prefer_Page_Unrolled_Large_Copy))
>> +    return OPTIMIZE (sse2_unaligned_page_unrolled);
>>    return OPTIMIZE (sse2_unaligned);
>>  }
>> diff --git
>> a/sysdeps/x86_64/multiarch/memmove-avx512-unaligned-erms-page-unrolled.S
>> b/sysdeps/x86_64/multiarch/memmove-avx512-unaligned-erms-page-unrolled.S
>> new file mode 100644
>> index 0000000000..a7dee420b4
>> --- /dev/null
>> +++
>> b/sysdeps/x86_64/multiarch/memmove-avx512-unaligned-erms-page-unrolled.S
>> @@ -0,0 +1,24 @@
>> +/* Memmove w/ AVX512 and Page Unrolled Large Copy
>> +   Copyright (C) 2025 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +
>> +#ifndef MEMMOVE_SYMBOL
>> +# define MEMMOVE_SYMBOL(p,s)   p##_avx512_##s##_page_unrolled
>> +#endif
>> +#define MEMMOVE_VEC_LARGE_IMPL "memmove-vec-large-page-unrolled.S"
>> +#include "memmove-avx512-unaligned-erms.S"
>> diff --git
>> a/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms-page-unrolled.S
>> b/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms-page-unrolled.S
>> new file mode 100644
>> index 0000000000..9ecd223e4e
>> --- /dev/null
>> +++ b/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms-page-unrolled.S
>> @@ -0,0 +1,24 @@
>> +/* Memmove w/ SSE2 and Page Unrolled Large Copy
>> +   Copyright (C) 2025 Free Software Foundation, Inc.
>> +   This file is part of the GNU C Library.
>> +
>> +   The GNU C Library is free software; you can redistribute it and/or
>> +   modify it under the terms of the GNU Lesser General Public
>> +   License as published by the Free Software Foundation; either
>> +   version 2.1 of the License, or (at your option) any later version.
>> +
>> +   The GNU C Library is distributed in the hope that it will be useful,
>> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> +   Lesser General Public License for more details.
>> +
>> +   You should have received a copy of the GNU Lesser General Public
>> +   License along with the GNU C Library; if not, see
>> +   <https://www.gnu.org/licenses/>.  */
>> +
>> +#ifndef MEMMOVE_SYMBOL
>> +# define MEMMOVE_SYMBOL(p,s)   p##_sse2_##s##_page_unrolled
>> +#endif
>> +#define MEMMOVE_VEC_LARGE_IMPL "memmove-vec-large-page-unrolled.S"
>> +#define PAGE_UNROLLED  1
>> +#include "memmove-sse2-unaligned-erms.S"
>> diff --git a/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S
>> b/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S
>> index aeaa3bd2f0..c941d62279 100644
>> --- a/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S
>> +++ b/sysdeps/x86_64/multiarch/memmove-sse2-unaligned-erms.S
>> @@ -32,7 +32,7 @@
>>
>>  # include "multiarch/memmove-vec-unaligned-erms.S"
>>
>> -# if MINIMUM_X86_ISA_LEVEL <= 2
>> +# if MINIMUM_X86_ISA_LEVEL <= 2 && !(defined PAGE_UNROLLED)
>>  #  include "memmove-shlib-compat.h"
>>  # endif
>>  #endif
>> --
>> 2.43.0
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20251204/a7dfe276/attachment-0001.htm>


More information about the Libc-alpha mailing list