Merge branch 'mdw/cpu-dispatch'
[catacomb] / symm / chacha.c
index e694ad2..0c8aa00 100644 (file)
@@ -27,6 +27,8 @@
 
 /*----- Header files ------------------------------------------------------*/
 
+#include "config.h"
+
 #include <stdarg.h>
 
 #include <mLib/bits.h>
@@ -34,6 +36,7 @@
 #include "arena.h"
 #include "chacha.h"
 #include "chacha-core.h"
+#include "dispatch.h"
 #include "gcipher.h"
 #include "grand.h"
 #include "keysz.h"
@@ -59,9 +62,29 @@ const octet chacha_keysz[] = { KSZ_SET, 32, 16, 10, 0 };
  *             the feedforward step.
  */
 
-static void core(unsigned r, const chacha_matrix src, chacha_matrix dest)
+CPU_DISPATCH(static, (void),
+            void, core, (unsigned r, const chacha_matrix src,
+                         chacha_matrix dest),
+            (r, src, dest),
+            pick_core, simple_core);
+
+static void simple_core(unsigned r, const chacha_matrix src,
+                       chacha_matrix dest)
   { CHACHA_nR(dest, src, r); CHACHA_FFWD(dest, src); }
 
+#if CPUFAM_X86 || CPUFAM_AMD64
+extern core__functype chacha_core_x86ish_sse2;
+#endif
+
+static core__functype *pick_core(void)
+{
+#if CPUFAM_X86 || CPUFAM_AMD64
+  DISPATCH_PICK_COND(chacha_core, chacha_core_x86ish_sse2,
+                    cpu_feature_p(CPUFEAT_X86_SSE2));
+#endif
+  DISPATCH_PICK_FALLBACK(chacha_core, simple_core);
+}
+
 /* --- @populate@ --- *
  *
  * Arguments:  @chacha_matrix a@ = a matrix to fill in