[PATCH 3/3] aarch64-asm: use common CLEAR_REG definition

Jussi Kivilinna jussi.kivilinna at iki.fi
Mon Sep 28 18:43:40 CEST 2026


* cipher/asm-common-aarch64.h (CLEAR_REG): Accept variadic arguments.
* cipher/chacha20-aarch64.S (clear): Remove; use CLEAR_REG.
* cipher/rijndael-armv8-aarch64-ce.S (CLEAR_REG): Remove.
* cipher/sha1-armv8-aarch64-ce.S: Likewise.
* cipher/sha256-armv8-aarch64-ce.S: Likewise.
* cipher/sha512-armv8-aarch64-ce.S: Likewise.
* cipher/sm3-aarch64.S (clear_vec): Remove; use CLEAR_REG.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
---
 cipher/asm-common-aarch64.h        |  2 +-
 cipher/chacha20-aarch64.S          | 91 +++++++++++++++---------------
 cipher/rijndael-armv8-aarch64-ce.S |  2 -
 cipher/sha1-armv8-aarch64-ce.S     |  5 --
 cipher/sha256-armv8-aarch64-ce.S   |  5 --
 cipher/sha512-armv8-aarch64-ce.S   |  6 --
 cipher/sm3-aarch64.S               | 29 +++++-----
 7 files changed, 58 insertions(+), 82 deletions(-)

diff --git a/cipher/asm-common-aarch64.h b/cipher/asm-common-aarch64.h
index 821eeda5..d3da14e4 100644
--- a/cipher/asm-common-aarch64.h
+++ b/cipher/asm-common-aarch64.h
@@ -128,7 +128,7 @@
 #define ret_spec_stop \
 	ret; SPEC_STOP;
 
-#define CLEAR_REG(reg) movi reg.16b, #0;
+#define CLEAR_REG(reg, ...) movi reg.16b, #0;
 
 #define CLEAR_ALL_REGS() \
 	CLEAR_REG(v0); CLEAR_REG(v1); CLEAR_REG(v2); CLEAR_REG(v3); \
diff --git a/cipher/chacha20-aarch64.S b/cipher/chacha20-aarch64.S
index 692f0f6a..060e0243 100644
--- a/cipher/chacha20-aarch64.S
+++ b/cipher/chacha20-aarch64.S
@@ -107,9 +107,6 @@
 	vpunpckhqdq(x2, t2, x3); \
 	vpunpcklqdq(x2, t2, x2);
 
-#define clear(x) \
-	movi x.16b, #0;
-
 /**********************************************************************
   4-way chacha20
  **********************************************************************/
@@ -334,28 +331,28 @@ _gcry_chacha20_aarch64_blocks4:
 	b.ne .Loop4;
 
 	/* clear the used vector registers and stack */
-	clear(VTMP0);
-	clear(VTMP1);
-	clear(VTMP2);
-	clear(VTMP3);
-	clear(X12_TMP);
-	clear(X13_TMP);
-	clear(X0);
-	clear(X1);
-	clear(X2);
-	clear(X3);
-	clear(X4);
-	clear(X5);
-	clear(X6);
-	clear(X7);
-	clear(X8);
-	clear(X9);
-	clear(X10);
-	clear(X11);
-	clear(X12);
-	clear(X13);
-	clear(X14);
-	clear(X15);
+	CLEAR_REG(VTMP0);
+	CLEAR_REG(VTMP1);
+	CLEAR_REG(VTMP2);
+	CLEAR_REG(VTMP3);
+	CLEAR_REG(X12_TMP);
+	CLEAR_REG(X13_TMP);
+	CLEAR_REG(X0);
+	CLEAR_REG(X1);
+	CLEAR_REG(X2);
+	CLEAR_REG(X3);
+	CLEAR_REG(X4);
+	CLEAR_REG(X5);
+	CLEAR_REG(X6);
+	CLEAR_REG(X7);
+	CLEAR_REG(X8);
+	CLEAR_REG(X9);
+	CLEAR_REG(X10);
+	CLEAR_REG(X11);
+	CLEAR_REG(X12);
+	CLEAR_REG(X13);
+	CLEAR_REG(X14);
+	CLEAR_REG(X15);
 
 	eor x0, x0, x0
 	ret_spec_stop
@@ -618,28 +615,28 @@ _gcry_chacha20_poly1305_aarch64_blocks4:
 	POLY1305_STORE_STATE()
 
 	/* clear the used vector registers and stack */
-	clear(VTMP0);
-	clear(VTMP1);
-	clear(VTMP2);
-	clear(VTMP3);
-	clear(X12_TMP);
-	clear(X13_TMP);
-	clear(X0);
-	clear(X1);
-	clear(X2);
-	clear(X3);
-	clear(X4);
-	clear(X5);
-	clear(X6);
-	clear(X7);
-	clear(X8);
-	clear(X9);
-	clear(X10);
-	clear(X11);
-	clear(X12);
-	clear(X13);
-	clear(X14);
-	clear(X15);
+	CLEAR_REG(VTMP0);
+	CLEAR_REG(VTMP1);
+	CLEAR_REG(VTMP2);
+	CLEAR_REG(VTMP3);
+	CLEAR_REG(X12_TMP);
+	CLEAR_REG(X13_TMP);
+	CLEAR_REG(X0);
+	CLEAR_REG(X1);
+	CLEAR_REG(X2);
+	CLEAR_REG(X3);
+	CLEAR_REG(X4);
+	CLEAR_REG(X5);
+	CLEAR_REG(X6);
+	CLEAR_REG(X7);
+	CLEAR_REG(X8);
+	CLEAR_REG(X9);
+	CLEAR_REG(X10);
+	CLEAR_REG(X11);
+	CLEAR_REG(X12);
+	CLEAR_REG(X13);
+	CLEAR_REG(X14);
+	CLEAR_REG(X15);
 
 	eor x0, x0, x0
 	POLY1305_POP_REGS()
diff --git a/cipher/rijndael-armv8-aarch64-ce.S b/cipher/rijndael-armv8-aarch64-ce.S
index 5152fab7..ffff766e 100644
--- a/cipher/rijndael-armv8-aarch64-ce.S
+++ b/cipher/rijndael-armv8-aarch64-ce.S
@@ -237,8 +237,6 @@
 
 /* Other functional macros */
 
-#define CLEAR_REG(reg) movi reg.16b, #0;
-
 #define aes_clear_keys(nrounds) \
 	CLEAR_REG(vk0); \
 	CLEAR_REG(vk1); \
diff --git a/cipher/sha1-armv8-aarch64-ce.S b/cipher/sha1-armv8-aarch64-ce.S
index e309c08c..0eae3401 100644
--- a/cipher/sha1-armv8-aarch64-ce.S
+++ b/cipher/sha1-armv8-aarch64-ce.S
@@ -87,11 +87,6 @@ gcry_sha1_aarch64_ce_K_VEC:
         sha1su0_fn( v##w0, v##w1, v##w2 );
 
 
-/* Other functional macros */
-
-#define CLEAR_REG(reg) movi reg.16b, #0;
-
-
 .text
 
 /*
diff --git a/cipher/sha256-armv8-aarch64-ce.S b/cipher/sha256-armv8-aarch64-ce.S
index 333e792d..bfe1c62c 100644
--- a/cipher/sha256-armv8-aarch64-ce.S
+++ b/cipher/sha256-armv8-aarch64-ce.S
@@ -97,11 +97,6 @@ gcry_sha256_aarch64_ce_K:
         su1_fn(     v##w0, v##w2, v##w3   );
 
 
-/* Other functional macros */
-
-#define CLEAR_REG(reg) movi reg.16b, #0;
-
-
 .text
 
 /*
diff --git a/cipher/sha512-armv8-aarch64-ce.S b/cipher/sha512-armv8-aarch64-ce.S
index fa225192..9be37a99 100644
--- a/cipher/sha512-armv8-aarch64-ce.S
+++ b/cipher/sha512-armv8-aarch64-ce.S
@@ -124,12 +124,6 @@
         sha512h2 Q##gh, Q##cd, ab.2d; \
 
 
-/* Other functional macros */
-
-#undef CLEAR_REG
-#define CLEAR_REG(reg, ...) movi reg.16b, #0;
-
-
 /*
  * unsigned int
  * _gcry_sha512_transform_armv8_ce (u64 state[8], const void *input_data,
diff --git a/cipher/sm3-aarch64.S b/cipher/sm3-aarch64.S
index 7ef64666..9939c815 100644
--- a/cipher/sm3-aarch64.S
+++ b/cipher/sm3-aarch64.S
@@ -125,9 +125,6 @@ ELF(.size _gcry_sm3_aarch64_consts,.-_gcry_sm3_aarch64_consts)
 
 #define _(...) /*_*/
 
-#define clear_vec(x) \
-        movi x.8h, #0;
-
 #define rolw(o, a, n) \
         ror o, a, #(32 - n);
 
@@ -596,31 +593,31 @@ _gcry_sm3_transform_aarch64:
 
   /* Update the chaining variables. */
   eor ra, ra, s0;
-  clear_vec(W0);
+  CLEAR_REG(W0);
   eor rb, rb, s1;
-  clear_vec(W1);
+  CLEAR_REG(W1);
   ldp s0, s1, [RSTATE, #16];
-  clear_vec(W2);
+  CLEAR_REG(W2);
   eor rc, rc, s2;
-  clear_vec(W3);
+  CLEAR_REG(W3);
   ldp k_even, k_odd, [RSTATE, #24];
-  clear_vec(W4);
+  CLEAR_REG(W4);
   eor rd, rd, s3;
-  clear_vec(W5);
+  CLEAR_REG(W5);
   eor re, re, s0;
-  clear_vec(XTMP0);
+  CLEAR_REG(XTMP0);
   stp ra, rb, [RSTATE, #0];
-  clear_vec(XTMP1);
+  CLEAR_REG(XTMP1);
   eor rf, rf, s1;
-  clear_vec(XTMP2);
+  CLEAR_REG(XTMP2);
   stp rc, rd, [RSTATE, #8];
-  clear_vec(XTMP3);
+  CLEAR_REG(XTMP3);
   eor rg, rg, k_even;
-  clear_vec(XTMP4);
+  CLEAR_REG(XTMP4);
   stp re, rf, [RSTATE, #16];
-  clear_vec(XTMP5);
+  CLEAR_REG(XTMP5);
   eor rh, rh, k_odd;
-  clear_vec(XTMP6);
+  CLEAR_REG(XTMP6);
   stp rg, rh, [RSTATE, #24];
 
   /* Clear message expansion area */
-- 
2.53.0



More information about the Gcrypt-devel mailing list