aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2017-10-12 23:30:51 -0400
committerJack Lloyd <[email protected]>2017-10-12 23:30:51 -0400
commita085c32f3bb81f0f1606b5b558bf472bdd02f29e (patch)
tree5df31f583209c04a457e02b1d079d671befc7010 /src
parent388cb52bc6a6c818e0a2051b7be5f8f4a3d87beb (diff)
Somewhat faster xor_buf
Avoids the cast alignment problems of yesteryear
Diffstat (limited to 'src')
-rw-r--r--src/lib/utils/mem_ops.h33
1 files changed, 15 insertions, 18 deletions
diff --git a/src/lib/utils/mem_ops.h b/src/lib/utils/mem_ops.h
index 175f38e2f..55d572618 100644
--- a/src/lib/utils/mem_ops.h
+++ b/src/lib/utils/mem_ops.h
@@ -166,28 +166,25 @@ inline void xor_buf(uint8_t out[],
{
while(length >= 16)
{
- out[0] ^= in[0];
- out[1] ^= in[1];
- out[2] ^= in[2];
- out[3] ^= in[3];
- out[4] ^= in[4];
- out[5] ^= in[5];
- out[6] ^= in[6];
- out[7] ^= in[7];
- out[8] ^= in[8];
- out[9] ^= in[9];
- out[10] ^= in[10];
- out[11] ^= in[11];
- out[12] ^= in[12];
- out[13] ^= in[13];
- out[14] ^= in[14];
- out[15] ^= in[15];
+ uint64_t x0, x1, y0, y1;
+ memcpy(&x0, in, 8);
+ memcpy(&x1, in + 8, 8);
+ memcpy(&y0, out, 8);
+ memcpy(&y1, out + 8, 8);
+
+ y0 ^= x0;
+ y1 ^= x1;
+ memcpy(out, &y0, 8);
+ memcpy(out + 8, &y1, 8);
out += 16; in += 16; length -= 16;
}
- for(size_t i = 0; i != length; ++i)
+ while(length > 0)
{
- out[i] ^= in[i];
+ out[0] ^= in[0];
+ out += 1;
+ in += 1;
+ length -= 1;
}
}