Răsfoiți Sursa

Add ROTATE inline RISC-V zbb/zbkb asm for chacha

Reviewed-by: Hugo Landau <hlandau@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/18289)
Hongren (Zenithal) Zheng 2 ani în urmă
părinte
comite
ca6286c382
1 a modificat fișierele cu 22 adăugiri și 0 ștergeri
  1. 22 0
      crypto/chacha/chacha_enc.c

+ 22 - 0
crypto/chacha/chacha_enc.c

@@ -24,6 +24,28 @@ typedef union {
 
 # define ROTATE(v, n) (((v) << (n)) | ((v) >> (32 - (n))))
 
+# ifndef PEDANTIC
+#  if defined(__GNUC__) && __GNUC__>=2 && \
+      !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_NO_INLINE_ASM)
+#   if defined(__riscv_zbb) || defined(__riscv_zbkb)
+#    if __riscv_xlen == 64
+#    undef ROTATE
+#    define ROTATE(x, n) ({ u32 ret;                   \
+                        asm ("roriw %0, %1, %2"        \
+                        : "=r"(ret)                    \
+                        : "r"(x), "i"(32 - (n))); ret;})
+#    endif
+#    if __riscv_xlen == 32
+#    undef ROTATE
+#    define ROTATE(x, n) ({ u32 ret;                   \
+                        asm ("rori %0, %1, %2"         \
+                        : "=r"(ret)                    \
+                        : "r"(x), "i"(32 - (n))); ret;})
+#    endif
+#   endif
+#  endif
+# endif
+
 # define U32TO8_LITTLE(p, v) do { \
                                 (p)[0] = (u8)(v >>  0); \
                                 (p)[1] = (u8)(v >>  8); \