Commit f2ea0f5f04c97b48c88edccba52b0682fbe45087

Authored by Alexey Dobriyan
Committed by Herbert Xu
1 parent 3a92d687c8

crypto: sha512 - use standard ror64()

Use standard ror64() instead of hand-written.
There is no standard ror64, so create it.

The difference is shift value being "unsigned int" instead of uint64_t
(for which there is no reason). gcc starts to emit native ROR instructions
which it doesn't do for some reason currently. This should make the code
faster.

Patch survives in-tree crypto test and ping flood with hmac(sha512) on.

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

Showing 2 changed files with 24 additions and 9 deletions Side-by-side Diff

crypto/sha512_generic.c
... ... @@ -31,11 +31,6 @@
31 31 return (x & y) | (z & (x | y));
32 32 }
33 33  
34   -static inline u64 RORu64(u64 x, u64 y)
35   -{
36   - return (x >> y) | (x << (64 - y));
37   -}
38   -
39 34 static const u64 sha512_K[80] = {
40 35 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL,
41 36 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
... ... @@ -66,10 +61,10 @@
66 61 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
67 62 };
68 63  
69   -#define e0(x) (RORu64(x,28) ^ RORu64(x,34) ^ RORu64(x,39))
70   -#define e1(x) (RORu64(x,14) ^ RORu64(x,18) ^ RORu64(x,41))
71   -#define s0(x) (RORu64(x, 1) ^ RORu64(x, 8) ^ (x >> 7))
72   -#define s1(x) (RORu64(x,19) ^ RORu64(x,61) ^ (x >> 6))
  64 +#define e0(x) (ror64(x,28) ^ ror64(x,34) ^ ror64(x,39))
  65 +#define e1(x) (ror64(x,14) ^ ror64(x,18) ^ ror64(x,41))
  66 +#define s0(x) (ror64(x, 1) ^ ror64(x, 8) ^ (x >> 7))
  67 +#define s1(x) (ror64(x,19) ^ ror64(x,61) ^ (x >> 6))
73 68  
74 69 static inline void LOAD_OP(int I, u64 *W, const u8 *input)
75 70 {
include/linux/bitops.h
... ... @@ -50,6 +50,26 @@
50 50 }
51 51  
52 52 /**
  53 + * rol64 - rotate a 64-bit value left
  54 + * @word: value to rotate
  55 + * @shift: bits to roll
  56 + */
  57 +static inline __u64 rol64(__u64 word, unsigned int shift)
  58 +{
  59 + return (word << shift) | (word >> (64 - shift));
  60 +}
  61 +
  62 +/**
  63 + * ror64 - rotate a 64-bit value right
  64 + * @word: value to rotate
  65 + * @shift: bits to roll
  66 + */
  67 +static inline __u64 ror64(__u64 word, unsigned int shift)
  68 +{
  69 + return (word >> shift) | (word << (64 - shift));
  70 +}
  71 +
  72 +/**
53 73 * rol32 - rotate a 32-bit value left
54 74 * @word: value to rotate
55 75 * @shift: bits to roll