[PATCH v2] x86-64: Use 32-bit zero idiom for shorter encoding
George Hu
integral@archlinux.org
Sat Feb 7 16:06:13 GMT 2026
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
More information about the Libc-alpha
mailing list