]> granicus.if.org Git - zfs/commitdiff
SPARC optimizations for Encode()
authorKireinaHoro <i@jsteward.moe>
Wed, 11 Oct 2017 05:16:46 +0000 (13:16 +0800)
committerKireinaHoro <i@jsteward.moe>
Wed, 11 Oct 2017 17:36:16 +0000 (01:36 +0800)
Normally a SPARC processor runs in big endian mode. Save the extra labor
needed for little endian machines when the target is a big endian one
(sparc).

Signed-off-by: Pengcheng Xu <i@jsteward.moe>
module/icp/algs/sha1/sha1.c

index 5a4a7da929809641f43d7cc5aa08b2b8c481560c..7f28b3796b5d5c01aed99c81f2c45d5c85467de4 100644 (file)
@@ -817,10 +817,22 @@ Encode(uint8_t *_RESTRICT_KYWD output, const uint32_t *_RESTRICT_KYWD input,
 {
        size_t          i, j;
 
-       for (i = 0, j = 0; j < len; i++, j += 4) {
-               output[j]       = (input[i] >> 24) & 0xff;
-               output[j + 1]   = (input[i] >> 16) & 0xff;
-               output[j + 2]   = (input[i] >>  8) & 0xff;
-               output[j + 3]   = input[i] & 0xff;
+#if defined(__sparc)
+       if (IS_P2ALIGNED(output, sizeof (uint32_t))) {
+               for (i = 0, j = 0; j < len; i++, j += 4) {
+                       /* LINTED E_BAD_PTR_CAST_ALIGN */
+                       *((uint32_t *)(output + j)) = input[i];
+               }
+       } else {
+#endif /* little endian -- will work on big endian, but slowly */
+
+               for (i = 0, j = 0; j < len; i++, j += 4) {
+                       output[j]       = (input[i] >> 24) & 0xff;
+                       output[j + 1]   = (input[i] >> 16) & 0xff;
+                       output[j + 2]   = (input[i] >>  8) & 0xff;
+                       output[j + 3]   = input[i] & 0xff;
+               }
+#if defined(__sparc)
        }
+#endif
 }