hash-common: avoid integer division to reduce call overhead
authorJussi Kivilinna <jussi.kivilinna@iki.fi>
Mon, 14 Oct 2019 19:08:29 +0000 (22:08 +0300)
committerJussi Kivilinna <jussi.kivilinna@iki.fi>
Mon, 14 Oct 2019 19:08:29 +0000 (22:08 +0300)
* cipher/hash-common.h (gcry_md_block_ctx): Replace 'blocksize' with
'blocksize_shift'.
* cipher/hash-common.c (_gcry_md_block_write): Use bit-level operations
instead of division to get number of blocks.
* cipher/gostr2411-94.c (gost3411_init): Initialize 'blocksize_shift'
instead of 'blocksize'.
* cipher/md2.c (md2_init): Ditto.
* cipher/md4.c (md4_init): Ditto.
* cipher/md5.c (md5_init): Ditto.
* cipher/rmd160.c (rmd160_init): Ditto.
* cipher/sha1.c (sha1_init): Ditto.
* cipher/sha256.c (sha256_common_init): Ditto.
* cipher/sha512.c (sha512_init_common): Ditto.
* cipher/sm3.c (sm3_init): Ditto.
* cipher/stribog.c (stribog_init_512): Ditto.
* cipher/tiger.c (do_init): Ditto.
* cipher/whirlpool.c (whirlpool_init): Ditto.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
14 files changed:
cipher/gostr3411-94.c
cipher/hash-common.c
cipher/hash-common.h
cipher/md2.c
cipher/md4.c
cipher/md5.c
cipher/rmd160.c
cipher/sha1.c
cipher/sha256.c
cipher/sha512.c
cipher/sm3.c
cipher/stribog.c
cipher/tiger.c
cipher/whirlpool.c

index d974627..ebf9e0a 100644 (file)
@@ -61,7 +61,7 @@ gost3411_init (void *context, unsigned int flags)
 
   hd->bctx.nblocks = 0;
   hd->bctx.count = 0;
-  hd->bctx.blocksize = 32;
+  hd->bctx.blocksize_shift = _gcry_ctz(32);
   hd->bctx.bwrite = transform;
   hd->cryptopro = 0;
 }
index 74675d4..ab486f0 100644 (file)
@@ -123,7 +123,8 @@ _gcry_md_block_write (void *context, const void *inbuf_arg, size_t inlen)
   gcry_md_block_ctx_t *hd = context;
   unsigned int stack_burn = 0;
   unsigned int nburn;
-  const unsigned int blocksize = hd->blocksize;
+  const unsigned int blocksize_shift = hd->blocksize_shift;
+  const unsigned int blocksize = 1 << blocksize_shift;
   size_t inblocks;
   size_t copylen;
 
@@ -164,14 +165,14 @@ _gcry_md_block_write (void *context, const void *inbuf_arg, size_t inlen)
 
   if (inlen >= blocksize)
     {
-      inblocks = inlen / blocksize;
+      inblocks = inlen >> blocksize_shift;
       nburn = hd->bwrite (hd, inbuf, inblocks);
       stack_burn = nburn > stack_burn ? nburn : stack_burn;
       hd->count = 0;
       hd->nblocks_high += (hd->nblocks + inblocks < inblocks);
       hd->nblocks += inblocks;
-      inlen -= inblocks * blocksize;
-      inbuf += inblocks * blocksize;
+      inlen -= inblocks << blocksize_shift;
+      inbuf += inblocks << blocksize_shift;
     }
 
   if (inlen)
index 0b3ade1..561e77a 100644 (file)
@@ -51,7 +51,7 @@ typedef struct gcry_md_block_ctx
     MD_NBLOCKS_TYPE nblocks;
     MD_NBLOCKS_TYPE nblocks_high;
     int count;
-    size_t blocksize;
+    unsigned int blocksize_shift;
     _gcry_md_block_write_t bwrite;
 } gcry_md_block_ctx_t;
 
index bf2fbee..dc4deac 100644 (file)
@@ -135,7 +135,7 @@ md2_init (void *context, unsigned int flags)
   (void)flags;
 
   memset (ctx, 0, sizeof(*ctx));
-  ctx->bctx.blocksize = 16;
+  ctx->bctx.blocksize_shift = _gcry_ctz(16);
   ctx->bctx.bwrite = transform;
 }
 
index b75bc5e..24986c2 100644 (file)
@@ -83,7 +83,7 @@ md4_init (void *context, unsigned int flags)
   ctx->bctx.nblocks = 0;
   ctx->bctx.nblocks_high = 0;
   ctx->bctx.count = 0;
-  ctx->bctx.blocksize = 64;
+  ctx->bctx.blocksize_shift = _gcry_ctz(64);
   ctx->bctx.bwrite = transform;
 }
 
index 94fcdf0..6859d56 100644 (file)
@@ -67,7 +67,7 @@ md5_init( void *context, unsigned int flags)
   ctx->bctx.nblocks = 0;
   ctx->bctx.nblocks_high = 0;
   ctx->bctx.count = 0;
-  ctx->bctx.blocksize = 64;
+  ctx->bctx.blocksize_shift = _gcry_ctz(64);
   ctx->bctx.bwrite = transform;
 }
 
index 24210a0..0608f74 100644 (file)
@@ -166,7 +166,7 @@ rmd160_init (void *context, unsigned int flags)
   hd->bctx.nblocks = 0;
   hd->bctx.nblocks_high = 0;
   hd->bctx.count = 0;
-  hd->bctx.blocksize = 64;
+  hd->bctx.blocksize_shift = _gcry_ctz(64);
   hd->bctx.bwrite = transform;
 }
 
index 23aceef..d3ee982 100644 (file)
@@ -274,7 +274,7 @@ sha1_init (void *context, unsigned int flags)
   hd->bctx.nblocks = 0;
   hd->bctx.nblocks_high = 0;
   hd->bctx.count = 0;
-  hd->bctx.blocksize = 64;
+  hd->bctx.blocksize_shift = _gcry_ctz(64);
 
   /* Order of feature checks is important here; last match will be
    * selected.  Keep slower implementations at the top and faster at
index 562dee9..175da90 100644 (file)
@@ -246,7 +246,7 @@ sha256_common_init (SHA256_CONTEXT *hd)
   hd->bctx.nblocks = 0;
   hd->bctx.nblocks_high = 0;
   hd->bctx.count = 0;
-  hd->bctx.blocksize = 64;
+  hd->bctx.blocksize_shift = _gcry_ctz(64);
 
   /* Order of feature checks is important here; last match will be
    * selected.  Keep slower implementations at the top and faster at
index b05157a..df9a449 100644 (file)
@@ -302,7 +302,7 @@ sha512_init_common (SHA512_CONTEXT *ctx, unsigned int flags)
   ctx->bctx.nblocks = 0;
   ctx->bctx.nblocks_high = 0;
   ctx->bctx.count = 0;
-  ctx->bctx.blocksize = 128;
+  ctx->bctx.blocksize_shift = _gcry_ctz(128);
 
   /* Order of feature checks is important here; last match will be
    * selected.  Keep slower implementations at the top and faster at
index b6f0ab2..aee9498 100644 (file)
@@ -77,7 +77,7 @@ sm3_init (void *context, unsigned int flags)
   hd->bctx.nblocks = 0;
   hd->bctx.nblocks_high = 0;
   hd->bctx.count = 0;
-  hd->bctx.blocksize = 64;
+  hd->bctx.blocksize_shift = _gcry_ctz(64);
   hd->bctx.bwrite = transform;
 
   (void)features;
index 2678724..c919182 100644 (file)
@@ -1206,7 +1206,7 @@ stribog_init_512 (void *context, unsigned int flags)
 
   memset (hd, 0, sizeof (*hd));
 
-  hd->bctx.blocksize = 64;
+  hd->bctx.blocksize_shift = _gcry_ctz(64);
   hd->bctx.bwrite = transform;
 }
 
index c78e3ac..b2f1667 100644 (file)
@@ -601,7 +601,7 @@ do_init (void *context, int variant)
   hd->bctx.nblocks = 0;
   hd->bctx.nblocks_high = 0;
   hd->bctx.count = 0;
-  hd->bctx.blocksize = 64;
+  hd->bctx.blocksize_shift = _gcry_ctz(64);
   hd->bctx.bwrite = transform;
   hd->variant = variant;
 }
index d9b79cf..79b2026 100644 (file)
@@ -1179,7 +1179,7 @@ whirlpool_init (void *ctx, unsigned int flags)
 
   memset (context, 0, sizeof (*context));
 
-  context->bctx.blocksize = BLOCK_SIZE;
+  context->bctx.blocksize_shift = _gcry_ctz(BLOCK_SIZE);
   context->bctx.bwrite = whirlpool_transform;
   if ((flags & GCRY_MD_FLAG_BUGEMU1))
     {