[PATCH v2 2/3] riscv: memcpy_noalignment: Fold SZREG/BLOCK_SIZE alignment to single andi

Yao Zihong zihong.plct@isrc.iscas.ac.cn
Wed Sep 3 09:45:39 GMT 2025


Simplify the alignment steps for SZREG and BLOCK_SIZE multiples. The previous
three-instruction sequences

    addi    a7, a2, -SZREG
    andi    a7, a7, -SZREG
    addi    a7, a7, SZREG

and

    addi    a7, a2, -BLOCK_SIZE
    andi    a7, a7, -BLOCK_SIZE
    addi    a7, a7, BLOCK_SIZE

are equivalent to a single

    andi    a7, a2, -SZREG
    andi    a7, a2, -BLOCK_SIZE

because SZREG and BLOCK_SIZE are powers of two in this context, making the
surrounding addi steps cancel out. Folding to one instruction reduces code
size and favors compressed encodings, with identical semantics.

No functional change.

sysdeps/riscv/multiarch/memcpy_noalignment.S: Remove redundant addi around
alignment; keep a single andi for SZREG/BLOCK_SIZE rounding.

Signed-off-by: Yao Zihong <zihong.plct@isrc.iscas.ac.cn>
---
 sysdeps/riscv/multiarch/memcpy_noalignment.S | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/sysdeps/riscv/multiarch/memcpy_noalignment.S b/sysdeps/riscv/multiarch/memcpy_noalignment.S
index e319b710c2..c3fb0ae731 100644
--- a/sysdeps/riscv/multiarch/memcpy_noalignment.S
+++ b/sysdeps/riscv/multiarch/memcpy_noalignment.S
@@ -57,9 +57,7 @@ ENTRY (__memcpy_noalignment)
 	add	a5, a0, a4
 	add	a1, a1, a4
 	bleu	a2, a3, L(word_copy_adjust)
-	addi	a7, a2, -BLOCK_SIZE
-	andi	a7, a7, -BLOCK_SIZE
-	addi	a7, a7, BLOCK_SIZE
+	andi	a7, a2, -BLOCK_SIZE
 	add	a3, a5, a7
 	mv	a4, a1
 L(block_copy):
@@ -106,9 +104,7 @@ L(word_copy):
 	li	a5, SZREG-1
 	/* if LEN < SZREG jump to tail handling.  */
 	bleu	a2, a5, L(tail_adjust)
-	addi	a7, a2, -SZREG
-	andi	a7, a7, -SZREG
-	addi	a7, a7, SZREG
+	andi	a7, a2, -SZREG
 	add	a6, a3, a7
 	mv	a5, a1
 L(word_copy_loop):
-- 
2.47.2



More information about the Libc-alpha mailing list