mirror of
https://github.com/BLAKE3-team/BLAKE3
synced 2024-05-28 22:06:04 +02:00
Compare commits
3 Commits
a96dab420d
...
c273deae35
Author | SHA1 | Date | |
---|---|---|---|
David CARLIER | c273deae35 | ||
Jack O'Connor | 4ec3be8bfa | ||
David Carlier | 3289c75996 |
|
@ -13,6 +13,12 @@
|
||||||
#else
|
#else
|
||||||
#undef IS_X86 /* Unimplemented! */
|
#undef IS_X86 /* Unimplemented! */
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
//
|
||||||
|
#elif defined(__linux__)
|
||||||
|
#include <sys/auxv.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(BLAKE3_ATOMICS)
|
#if !defined(BLAKE3_ATOMICS)
|
||||||
|
@ -88,7 +94,17 @@ static void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(IS_AARCH64)
|
||||||
|
static int has_neon(void) {
|
||||||
|
#if defined(__linux__)
|
||||||
|
return getauxval(AT_HWCAP) & (1 << 1);
|
||||||
|
#endif
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
enum cpu_feature {
|
enum cpu_feature {
|
||||||
|
#if defined(IS_X86)
|
||||||
SSE2 = 1 << 0,
|
SSE2 = 1 << 0,
|
||||||
SSSE3 = 1 << 1,
|
SSSE3 = 1 << 1,
|
||||||
SSE41 = 1 << 2,
|
SSE41 = 1 << 2,
|
||||||
|
@ -96,6 +112,9 @@ enum cpu_feature {
|
||||||
AVX2 = 1 << 4,
|
AVX2 = 1 << 4,
|
||||||
AVX512F = 1 << 5,
|
AVX512F = 1 << 5,
|
||||||
AVX512VL = 1 << 6,
|
AVX512VL = 1 << 6,
|
||||||
|
#else
|
||||||
|
NEON = 1 << 0,
|
||||||
|
#endif
|
||||||
/* ... */
|
/* ... */
|
||||||
UNDEFINED = 1 << 30
|
UNDEFINED = 1 << 30
|
||||||
};
|
};
|
||||||
|
@ -156,8 +175,10 @@ static
|
||||||
ATOMIC_STORE(g_cpu_features, features);
|
ATOMIC_STORE(g_cpu_features, features);
|
||||||
return features;
|
return features;
|
||||||
#else
|
#else
|
||||||
/* How to detect NEON? */
|
enum cpu_feature features = 0;
|
||||||
return 0;
|
if (has_neon())
|
||||||
|
features |= NEON;
|
||||||
|
return features;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,9 +283,12 @@ void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BLAKE3_USE_NEON == 1
|
#if BLAKE3_USE_NEON == 1
|
||||||
blake3_hash_many_neon(inputs, num_inputs, blocks, key, counter,
|
const enum cpu_feature features = get_cpu_features();
|
||||||
|
if (features & NEON) {
|
||||||
|
blake3_hash_many_neon(inputs, num_inputs, blocks, key, counter,
|
||||||
increment_counter, flags, flags_start, flags_end, out);
|
increment_counter, flags, flags_start, flags_end, out);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter,
|
blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter,
|
||||||
|
|
|
@ -78,23 +78,14 @@ fn compress(
|
||||||
block_len: u32,
|
block_len: u32,
|
||||||
flags: u32,
|
flags: u32,
|
||||||
) -> [u32; 16] {
|
) -> [u32; 16] {
|
||||||
|
let counter_low = counter as u32;
|
||||||
|
let counter_high = (counter >> 32) as u32;
|
||||||
|
#[rustfmt::skip]
|
||||||
let mut state = [
|
let mut state = [
|
||||||
chaining_value[0],
|
chaining_value[0], chaining_value[1], chaining_value[2], chaining_value[3],
|
||||||
chaining_value[1],
|
chaining_value[4], chaining_value[5], chaining_value[6], chaining_value[7],
|
||||||
chaining_value[2],
|
IV[0], IV[1], IV[2], IV[3],
|
||||||
chaining_value[3],
|
counter_low, counter_high, block_len, flags,
|
||||||
chaining_value[4],
|
|
||||||
chaining_value[5],
|
|
||||||
chaining_value[6],
|
|
||||||
chaining_value[7],
|
|
||||||
IV[0],
|
|
||||||
IV[1],
|
|
||||||
IV[2],
|
|
||||||
IV[3],
|
|
||||||
counter as u32,
|
|
||||||
(counter >> 32) as u32,
|
|
||||||
block_len,
|
|
||||||
flags,
|
|
||||||
];
|
];
|
||||||
let mut block = *block_words;
|
let mut block = *block_words;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue