Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Jul 2015 20:31:09 +0000 (UTC)
From:      John-Mark Gurney <jmg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285254 - head/sys/crypto/aesni
Message-ID:  <201507072031.t67KV9TN098452@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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_ */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507072031.t67KV9TN098452>