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

Samuel Thibault samuel.thibault@aquilenet.fr
Sat Feb 7 15:43:43 GMT 2026


Hello,

George Hu, le sam. 07 févr. 2026 23:41:12 +0800, a ecrit:
> 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..3ef524a9b1 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
> +	xorq %edx, %edx

This needs to be turned to xorl, otherwise it will fail to build.

Samuel

>  	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
> 


More information about the Libc-alpha mailing list