[PATCH v2] x86-64: Use 32-bit zero idiom for shorter encoding

Samuel Thibault samuel.thibault@aquilenet.fr
Mon Feb 9 19:24:00 GMT 2026


Hello,

I have pushed the hurd parts, which don't need a benchmark.

Thanks,
Samuel

Sunil Pandey, le lun. 09 févr. 2026 09:07:07 -0800, a ecrit:
> 
> 
> On Sat, Feb 7, 2026 at 8:07 AM George Hu <[1]integral@archlinux.org> wrote:
> 
>     Replace the 64-bit zero idiom with the 32-bit form. In 64-bit mode,
>     zeroing the lower 32 bits of a GPR implicitly clears the entire
>     register. The 32-bit encoding is one byte shorter while preserving
>     identical semantics.
>     ---
>      sysdeps/mach/hurd/x86_64/static-start.S          | 2 +-
>      sysdeps/mach/hurd/x86_64/tst-sig-redzone.c       | 2 +-
>      sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S | 2 +-
>      sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S    | 2 +-
>      sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S | 4 ++--
>      sysdeps/x86_64/multiarch/strlen-sse2.S           | 2 +-
>      sysdeps/x86_64/multiarch/wcschr-sse2.S           | 2 +-
>      sysdeps/x86_64/multiarch/wcscmp-sse2.S           | 2 +-
>      8 files changed, 9 insertions(+), 9 deletions(-)
> 
>     diff --git a/sysdeps/mach/hurd/x86_64/static-start.S b/sysdeps/mach/hurd/
>     x86_64/static-start.S
>     index ec9c50239e..d670d45210 100644
>     --- a/sysdeps/mach/hurd/x86_64/static-start.S
>     +++ b/sysdeps/mach/hurd/x86_64/static-start.S
>     @@ -27,7 +27,7 @@ _start:
> 
>             movq %rsp, %rdi
>             call _hurd_stack_setup
>     -       xorq %rdx, %rdx
>     +       xorl %edx, %edx
>             jmp _start1
> 
>      #define _start _start1
>     diff --git a/sysdeps/mach/hurd/x86_64/tst-sig-redzone.c b/sysdeps/mach/hurd
>     /x86_64/tst-sig-redzone.c
>     index 32c7ab90f4..24b510c0aa 100644
>     --- a/sysdeps/mach/hurd/x86_64/tst-sig-redzone.c
>     +++ b/sysdeps/mach/hurd/x86_64/tst-sig-redzone.c
>     @@ -103,7 +103,7 @@ asm (
>      "repe  scasq\n"
>      "      jne     fail\n"
> 
>     -"      xor     %rax,%rax\n"
>     +"      xor     %eax,%eax\n"
>      "      ret\n"
>      "fail:\n"
>      "      movq    $1,%rax\n"
>     diff --git a/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S b/sysdeps/
>     x86_64/multiarch/strcat-sse2-unaligned.S
>     index 1c04d611be..3c3f039047 100644
>     --- a/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S
>     +++ b/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S
>     @@ -45,7 +45,7 @@ ENTRY (STRCAT)
>      /* Inline corresponding strlen file, temporary until new strcpy
>         implementation gets merged.  */
> 
>     -       xor     %rax, %rax
>     +       xor     %eax, %eax
>             mov     %edi, %ecx
>             and     $0x3f, %ecx
>             pxor    %xmm0, %xmm0
>     diff --git a/sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S b/sysdeps/x86_64
>     /multiarch/strchr-sse2-no-bsf.S
>     index 9521cd4dc4..7d2677b4fd 100644
>     --- a/sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S
>     +++ b/sysdeps/x86_64/multiarch/strchr-sse2-no-bsf.S
>     @@ -69,7 +69,7 @@ L(loop):
>      /* Return NULL.  */
>             .p2align 4
>      L(return_null):
>     -       xor     %rax, %rax
>     +       xor     %eax, %eax
>             ret
> 
>      L(matches):
>     diff --git a/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S b/sysdeps/
>     x86_64/multiarch/strcpy-sse2-unaligned.S
>     index 3dfee3039a..59ff7bc85e 100644
>     --- a/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
>     +++ b/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
>     @@ -1657,7 +1657,7 @@ L(CopyFrom1To16BytesXmmExit):
>             .p2align 4
>      L(StrncpyFillTailWithZero):
>             pxor    %xmm0, %xmm0
>     -       xor     %rdx, %rdx
>     +       xor     %edx, %edx
>             sub     $16, %r8
>             jbe     L(StrncpyFillExit)
> 
>     @@ -1736,7 +1736,7 @@ L(Unaligned64LeaveCase3):
> 
>             .p2align 4
>      L(Unaligned64LeaveCase2):
>     -       xor     %rcx, %rcx
>     +       xor     %ecx, %ecx
>             pcmpeqb %xmm4, %xmm0
>             pmovmskb %xmm0, %rdx
>             add     $48, %r8
>     diff --git a/sysdeps/x86_64/multiarch/strlen-sse2.S b/sysdeps/x86_64/
>     multiarch/strlen-sse2.S
>     index ca6e0812be..6085ad1236 100644
>     --- a/sysdeps/x86_64/multiarch/strlen-sse2.S
>     +++ b/sysdeps/x86_64/multiarch/strlen-sse2.S
>     @@ -77,7 +77,7 @@ ENTRY(STRLEN)
>      /* Do not read anything when n==0.  */
>             test    %RSI_LP, %RSI_LP
>             jne     L(n_nonzero)
>     -       xor     %rax, %rax
>     +       xor     %eax, %eax
>             ret
>      L(n_nonzero):
>      #  ifdef AS_WCSLEN
>     diff --git a/sysdeps/x86_64/multiarch/wcschr-sse2.S b/sysdeps/x86_64/
>     multiarch/wcschr-sse2.S
>     index ec11a16a73..f0069f026a 100644
>     --- a/sysdeps/x86_64/multiarch/wcschr-sse2.S
>     +++ b/sysdeps/x86_64/multiarch/wcschr-sse2.S
>     @@ -155,7 +155,7 @@ L(match):
> 
>             .p2align 4
>      L(return_null):
>     -       xor     %rax, %rax
>     +       xor     %eax, %eax
>             ret
> 
>      END (WCSCHR)
>     diff --git a/sysdeps/x86_64/multiarch/wcscmp-sse2.S b/sysdeps/x86_64/
>     multiarch/wcscmp-sse2.S
>     index 5ab124e0a7..a54615a9ae 100644
>     --- a/sysdeps/x86_64/multiarch/wcscmp-sse2.S
>     +++ b/sysdeps/x86_64/multiarch/wcscmp-sse2.S
>     @@ -950,7 +950,7 @@ L(nequal_bigger):
> 
>             .p2align 4
>      L(equal):
>     -       xor     %rax, %rax
>     +       xor     %eax, %eax
>             ret
> 
>      END (STRCMP)
>     --
>     2.52.0
> 
> 
> 
> Can you please split this commit into multiple commits.
> Each one of them needs benchmark data to properly evaluate this change.
> 
> --Sunil 
> 
> References:
> 
> [1] mailto:integral@archlinux.org

-- 
Samuel
* B kicks DW (non mais franchement)
* DW was kicked
 -+- #ens-mim - comment ça hopeless ? -+-


More information about the Libc-alpha mailing list