svn commit: r285254 - head/sys/crypto/aesni
John-Mark Gurney
jmg at FreeBSD.org
Tue Jul 7 20:31:10 UTC 2015
Author: jmg
Date: Tue Jul 7 20:31:09 2015
New Revision: 285254
URL: https://svnweb.freebsd.org/changeset/base/285254
Log:
unroll the loop slightly... This improves performance enough to
justify, especially for CBC performance where we can't pipeline.. I
don't happen to have my measurements handy though...
Sponsored by: Netflix, Inc.
Modified:
head/sys/crypto/aesni/aesencdec.h
Modified: head/sys/crypto/aesni/aesencdec.h
==============================================================================
--- head/sys/crypto/aesni/aesencdec.h Tue Jul 7 20:15:09 2015 (r285253)
+++ head/sys/crypto/aesni/aesencdec.h Tue Jul 7 20:31:09 2015 (r285254)
@@ -1,5 +1,6 @@
/*-
* Copyright 2013 John-Mark Gurney <jmg at FreeBSD.org>
+ * Copyright 2015 Netflix, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,6 +28,9 @@
*
*/
+#ifndef _AESENCDEC_H_
+#define _AESENCDEC_H_
+
#include <crypto/aesni/aesni_os.h>
#include <wmmintrin.h>
@@ -105,6 +109,7 @@ aesni_dec8(int rounds, const __m128i *ke
out[7] = _mm_aesdeclast_si128(h, keysched[i + 1]);
}
+/* rounds is passed in as rounds - 1 */
static inline __m128i
aesni_enc(int rounds, const __m128i *keysched, const __m128i from)
{
@@ -112,11 +117,13 @@ aesni_enc(int rounds, const __m128i *key
int i;
tmp = from ^ keysched[0];
-
- for (i = 0; i < rounds; i++)
+ for (i = 1; i < rounds; i += 2) {
+ tmp = _mm_aesenc_si128(tmp, keysched[i]);
tmp = _mm_aesenc_si128(tmp, keysched[i + 1]);
+ }
- return _mm_aesenclast_si128(tmp, keysched[i + 1]);
+ tmp = _mm_aesenc_si128(tmp, keysched[rounds]);
+ return _mm_aesenclast_si128(tmp, keysched[rounds + 1]);
}
static inline __m128i
@@ -127,8 +134,13 @@ aesni_dec(int rounds, const __m128i *key
tmp = from ^ keysched[0];
- for (i = 0; i < rounds; i++)
+ for (i = 1; i < rounds; i += 2) {
+ tmp = _mm_aesdec_si128(tmp, keysched[i]);
tmp = _mm_aesdec_si128(tmp, keysched[i + 1]);
+ }
- return _mm_aesdeclast_si128(tmp, keysched[i + 1]);
+ tmp = _mm_aesdec_si128(tmp, keysched[rounds]);
+ return _mm_aesdeclast_si128(tmp, keysched[rounds + 1]);
}
+
+#endif /* _AESENCDEC_H_ */
More information about the svn-src-all
mailing list