rbtree: avoid generating code twice for the cached versions (tools copy)
[sfrench/cifs-2.6.git] / crypto / aegis.h
index 41a3090cda8ee069cb4b8cd315871e38fe7cc3be..6920ebe7767953c53261960f5e203aa8422c9359 100644 (file)
@@ -10,6 +10,7 @@
 #define _CRYPTO_AEGIS_H
 
 #include <crypto/aes.h>
+#include <linux/bitops.h>
 #include <linux/types.h>
 
 #define AEGIS_BLOCK_SIZE 16
@@ -23,46 +24,32 @@ union aegis_block {
 #define AEGIS_BLOCK_ALIGN (__alignof__(union aegis_block))
 #define AEGIS_ALIGNED(p) IS_ALIGNED((uintptr_t)p, AEGIS_BLOCK_ALIGN)
 
-static const union aegis_block crypto_aegis_const[2] = {
-       { .words64 = {
-               cpu_to_le64(U64_C(0x0d08050302010100)),
-               cpu_to_le64(U64_C(0x6279e99059372215)),
-       } },
-       { .words64 = {
-               cpu_to_le64(U64_C(0xf12fc26d55183ddb)),
-               cpu_to_le64(U64_C(0xdd28b57342311120)),
-       } },
-};
-
-static void crypto_aegis_block_xor(union aegis_block *dst,
-                                  const union aegis_block *src)
+static __always_inline void crypto_aegis_block_xor(union aegis_block *dst,
+                                                  const union aegis_block *src)
 {
        dst->words64[0] ^= src->words64[0];
        dst->words64[1] ^= src->words64[1];
 }
 
-static void crypto_aegis_block_and(union aegis_block *dst,
-                                  const union aegis_block *src)
+static __always_inline void crypto_aegis_block_and(union aegis_block *dst,
+                                                  const union aegis_block *src)
 {
        dst->words64[0] &= src->words64[0];
        dst->words64[1] &= src->words64[1];
 }
 
-static void crypto_aegis_aesenc(union aegis_block *dst,
-                               const union aegis_block *src,
-                               const union aegis_block *key)
+static __always_inline void crypto_aegis_aesenc(union aegis_block *dst,
+                                               const union aegis_block *src,
+                                               const union aegis_block *key)
 {
        const u8  *s  = src->bytes;
-       const u32 *t0 = crypto_ft_tab[0];
-       const u32 *t1 = crypto_ft_tab[1];
-       const u32 *t2 = crypto_ft_tab[2];
-       const u32 *t3 = crypto_ft_tab[3];
+       const u32 *t = crypto_ft_tab[0];
        u32 d0, d1, d2, d3;
 
-       d0 = t0[s[ 0]] ^ t1[s[ 5]] ^ t2[s[10]] ^ t3[s[15]];
-       d1 = t0[s[ 4]] ^ t1[s[ 9]] ^ t2[s[14]] ^ t3[s[ 3]];
-       d2 = t0[s[ 8]] ^ t1[s[13]] ^ t2[s[ 2]] ^ t3[s[ 7]];
-       d3 = t0[s[12]] ^ t1[s[ 1]] ^ t2[s[ 6]] ^ t3[s[11]];
+       d0 = t[s[ 0]] ^ rol32(t[s[ 5]], 8) ^ rol32(t[s[10]], 16) ^ rol32(t[s[15]], 24);
+       d1 = t[s[ 4]] ^ rol32(t[s[ 9]], 8) ^ rol32(t[s[14]], 16) ^ rol32(t[s[ 3]], 24);
+       d2 = t[s[ 8]] ^ rol32(t[s[13]], 8) ^ rol32(t[s[ 2]], 16) ^ rol32(t[s[ 7]], 24);
+       d3 = t[s[12]] ^ rol32(t[s[ 1]], 8) ^ rol32(t[s[ 6]], 16) ^ rol32(t[s[11]], 24);
 
        dst->words32[0] = cpu_to_le32(d0) ^ key->words32[0];
        dst->words32[1] = cpu_to_le32(d1) ^ key->words32[1];