[PATCH 2/3] rinjdael-aes: use zero offset vector load/store when possible

Jussi Kivilinna jussi.kivilinna at iki.fi
Sat Feb 1 23:58:06 CET 2020


* cipher/rijndael-ppc-common.h (asm_aligned_ld, asm_aligned_st): Use
zero offset instruction variant when input offset is constant zero.
* cipher/rijndael-ppc.c (asm_load_be_noswap)
(asm_store_be_noswap): Likewise.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna at iki.fi>
---
 0 files changed

diff --git a/cipher/rijndael-ppc-common.h b/cipher/rijndael-ppc-common.h
index 165dd9f71..bbbeaac03 100644
--- a/cipher/rijndael-ppc-common.h
+++ b/cipher/rijndael-ppc-common.h
@@ -188,20 +188,36 @@ static ASM_FUNC_ATTR_INLINE block
 asm_aligned_ld(unsigned long offset, const void *ptr)
 {
   block vec;
-  __asm__ volatile ("lvx %0,%1,%2\n\t"
-		    : "=v" (vec)
-		    : "r" (offset), "r" ((uintptr_t)ptr)
-		    : "memory", "r0");
+#if __GNUC__ >= 4
+  if (__builtin_constant_p (offset) && offset == 0)
+    __asm__ volatile ("lvx %0,0,%1\n\t"
+		      : "=v" (vec)
+		      : "r" ((uintptr_t)ptr)
+		      : "memory");
+  else
+#endif
+    __asm__ volatile ("lvx %0,%1,%2\n\t"
+		      : "=v" (vec)
+		      : "r" (offset), "r" ((uintptr_t)ptr)
+		      : "memory", "r0");
   return vec;
 }
 
 static ASM_FUNC_ATTR_INLINE void
 asm_aligned_st(block vec, unsigned long offset, void *ptr)
 {
-  __asm__ volatile ("stvx %0,%1,%2\n\t"
-		    :
-		    : "v" (vec), "r" (offset), "r" ((uintptr_t)ptr)
-		    : "memory", "r0");
+#if __GNUC__ >= 4
+  if (__builtin_constant_p (offset) && offset == 0)
+    __asm__ volatile ("stvx %0,0,%1\n\t"
+		      :
+		      : "v" (vec), "r" ((uintptr_t)ptr)
+		      : "memory");
+  else
+#endif
+    __asm__ volatile ("stvx %0,%1,%2\n\t"
+		      :
+		      : "v" (vec), "r" (offset), "r" ((uintptr_t)ptr)
+		      : "memory", "r0");
 }
 
 static ASM_FUNC_ATTR_INLINE block
diff --git a/cipher/rijndael-ppc.c b/cipher/rijndael-ppc.c
index 3e727628b..f5c323611 100644
--- a/cipher/rijndael-ppc.c
+++ b/cipher/rijndael-ppc.c
@@ -69,10 +69,18 @@ static ASM_FUNC_ATTR_INLINE block
 asm_load_be_noswap(unsigned long offset, const void *ptr)
 {
   block vec;
-  __asm__ volatile ("lxvw4x %x0,%1,%2\n\t"
-		    : "=wa" (vec)
-		    : "r" (offset), "r" ((uintptr_t)ptr)
-		    : "memory", "r0");
+#if __GNUC__ >= 4
+  if (__builtin_constant_p (offset) && offset == 0)
+    __asm__ volatile ("lxvw4x %x0,0,%1\n\t"
+		      : "=wa" (vec)
+		      : "r" ((uintptr_t)ptr)
+		      : "memory");
+  else
+#endif
+    __asm__ volatile ("lxvw4x %x0,%1,%2\n\t"
+		      : "=wa" (vec)
+		      : "r" (offset), "r" ((uintptr_t)ptr)
+		      : "memory", "r0");
   /* NOTE: vec needs to be be-swapped using 'asm_be_swap' by caller */
   return vec;
 }
@@ -81,10 +89,18 @@ static ASM_FUNC_ATTR_INLINE void
 asm_store_be_noswap(block vec, unsigned long offset, void *ptr)
 {
   /* NOTE: vec be-swapped using 'asm_be_swap' by caller */
-  __asm__ volatile ("stxvw4x %x0,%1,%2\n\t"
-		    :
-		    : "wa" (vec), "r" (offset), "r" ((uintptr_t)ptr)
-		    : "memory", "r0");
+#if __GNUC__ >= 4
+  if (__builtin_constant_p (offset) && offset == 0)
+    __asm__ volatile ("stxvw4x %x0,0,%1\n\t"
+		      :
+		      : "wa" (vec), "r" ((uintptr_t)ptr)
+		      : "memory");
+  else
+#endif
+    __asm__ volatile ("stxvw4x %x0,%1,%2\n\t"
+		      :
+		      : "wa" (vec), "r" (offset), "r" ((uintptr_t)ptr)
+		      : "memory", "r0");
 }
 
 




More information about the Gcrypt-devel mailing list