[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