From 2e4b40042a3e3926bb4e4021f577404d4893b789 Mon Sep 17 00:00:00 2001 From: Paul Kulchenko Date: Fri, 17 Sep 2021 23:25:43 -0700 Subject: [PATCH] Add missing Intel SSE2 intrinsics needed for Argon2 --- libc/bits/emmintrin.internal.h | 48 ++++++++++++++++++++++++++++++++ third_party/argon2/argon2.mk | 1 + third_party/argon2/blake2-impl.h | 2 -- third_party/argon2/blake2b.c | 1 + 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/libc/bits/emmintrin.internal.h b/libc/bits/emmintrin.internal.h index 287932a8e..7851beadb 100644 --- a/libc/bits/emmintrin.internal.h +++ b/libc/bits/emmintrin.internal.h @@ -218,6 +218,54 @@ struct thatispacked mayalias __usi128ma { #define _mm_cmpunord_sd(M128D_0, M128D_1) \ __builtin_ia32_cmpunordsd((__v2df)(M128D_0), (__v2df)(M128D_1)) +#define _mm_mul_epu32(A, B) \ + ({ \ + __m128i R = A; \ + asm("pmuludq %1, %0" \ + : "+x"(R) : "xm"(B)); \ + R; \ + }) + +#define _mm_add_epi64(A, B) \ + ({ \ + __m128i R = A; \ + asm("paddq %1, %0" \ + : "+x"(R) : "xm"(B)); \ + R; \ + }) + +#define _mm_srli_epi64(A, B) \ + ({ \ + __m128i R = A; \ + asm("psrlq %1, %0" \ + : "+x"(R) : "xm"(B)); \ + R; \ + }) + +#define _mm_slli_epi64(A, B) \ + ({ \ + __m128i R = A; \ + asm("psllq %1, %0" \ + : "+x"(R) : "xm"(B)); \ + R; \ + }) + +#define _mm_unpacklo_epi64(A, B) \ + ({ \ + __m128i R = A; \ + asm("punpcklqdq %1, %0" \ + : "+x"(R) : "xm"(B)); \ + R; \ + }) + +#define _mm_unpackhi_epi64(A, B) \ + ({ \ + __m128i R = A; \ + asm("punpckhqdq %1, %0" \ + : "+x"(R) : "xm"(B)); \ + R; \ + }) + /*───────────────────────────────────────────────────────────────────────────│─╗ │ cosmopolitan § it's a trap! » sse2 » miscellaneous ─╬─│┼ ╚────────────────────────────────────────────────────────────────────────────│*/ diff --git a/third_party/argon2/argon2.mk b/third_party/argon2/argon2.mk index 81f169b5b..5e8cf887d 100644 --- a/third_party/argon2/argon2.mk +++ b/third_party/argon2/argon2.mk @@ -19,6 +19,7 @@ THIRD_PARTY_ARGON2_A_DIRECTDEPS = \ LIBC_CALLS \ LIBC_FMT \ LIBC_INTRIN \ + LIBC_BITS \ LIBC_NEXGEN32E \ LIBC_MEM \ LIBC_SYSV \ diff --git a/third_party/argon2/blake2-impl.h b/third_party/argon2/blake2-impl.h index 666cfc5bf..181c82c65 100644 --- a/third_party/argon2/blake2-impl.h +++ b/third_party/argon2/blake2-impl.h @@ -151,6 +151,4 @@ static BLAKE2_INLINE uint64_t rotr64(const uint64_t w, const unsigned c) { return (w >> c) | (w << (64 - c)); } -void clear_internal_memory(void *v, size_t n); - #endif diff --git a/third_party/argon2/blake2b.c b/third_party/argon2/blake2b.c index b2f0768d2..99dc514e9 100644 --- a/third_party/argon2/blake2b.c +++ b/third_party/argon2/blake2b.c @@ -21,6 +21,7 @@ #include "third_party/argon2/blake2.h" #include "third_party/argon2/blake2-impl.h" +#include "third_party/argon2/core.h" // for clear_internal_memory static const uint64_t blake2b_IV[8] = { UINT64_C(0x6a09e667f3bcc908), UINT64_C(0xbb67ae8584caa73b),