X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/1c8e76bd932668c8e26f9984ad008c0027dc1167..1da1ed6a5815deef6c33d74f1eb3c856793df3e5:/symm/chacha.c diff --git a/symm/chacha.c b/symm/chacha.c index e694ad22..0c8aa003 100644 --- a/symm/chacha.c +++ b/symm/chacha.c @@ -27,6 +27,8 @@ /*----- Header files ------------------------------------------------------*/ +#include "config.h" + #include #include @@ -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