commit 8c1988e

xplshn  ·  2026-06-27 06:34:57 +0000 UTC
parent 45c1c16
extra pragmas for avx code in b3sum

Signed-off-by: xplshn <anto@xplshn.com.ar>
1 files changed,  +50, -10
+50, -10
  1@@ -1,10 +1,18 @@
  2 /* See LICENSE file for copyright and license details. */
  3 
  4+#if defined(__x86_64__) && (defined(__clang__) || (defined(__GNUC__) && !defined(__TINYC__)))
  5+#define BLAKE3_X86_SIMD 1
  6+#else
  7+#define BLAKE3_X86_SIMD 0
  8+#endif
  9+
 10 #include "util.h"
 11 #include "arg.h"
 12 
 13 #include <assert.h>
 14+#if BLAKE3_X86_SIMD
 15 #include <immintrin.h>
 16+#endif
 17 #include <stdint.h>
 18 #include <stdio.h>
 19 #include <stdlib.h>
 20@@ -17,7 +25,7 @@
 21 #define BLAKE3_CHUNK_LEN      1024
 22 #define BLAKE3_MAX_DEPTH      54
 23 
 24-#if defined(__x86_64__)
 25+#if BLAKE3_X86_SIMD
 26 #define MAX_SIMD_DEGREE 16
 27 #else
 28 #define MAX_SIMD_DEGREE 1
 29@@ -123,7 +131,7 @@ counter_high(uint64_t counter)
 30 }
 31 
 32 /* forward declarations */
 33-#if defined(__x86_64__)
 34+#if BLAKE3_X86_SIMD
 35 void blake3_compress_in_place_sse2(uint32_t cv[8], const uint8_t block[BLAKE3_BLOCK_LEN], uint8_t block_len, uint64_t counter, uint8_t flags);
 36 void blake3_compress_xof_sse2(const uint32_t cv[8], const uint8_t block[BLAKE3_BLOCK_LEN], uint8_t block_len, uint64_t counter, uint8_t flags, uint8_t out[64]);
 37 void blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs, size_t blocks, const uint32_t key[8], uint64_t counter, int increment_counter, uint8_t flags, uint8_t flags_start, uint8_t flags_end, uint8_t *out);
 38@@ -317,7 +325,7 @@ enum {
 39 static int blake3_cpu_features = 0;
 40 static int blake3_cpu_detected = 0;
 41 
 42-#if defined(__x86_64__)
 43+#if BLAKE3_X86_SIMD
 44 #include <cpuid.h>
 45 
 46 static void
 47@@ -339,7 +347,7 @@ blake3_xgetbv(void)
 48 static void
 49 blake3_detect_cpu_features(void)
 50 {
 51-#if defined(__x86_64__)
 52+#if BLAKE3_X86_SIMD
 53 	enum { EAX, EBX, ECX, EDX };
 54 	uint32_t regs[4];
 55 	uint64_t xcr0;
 56@@ -369,7 +377,7 @@ blake3_detect_cpu_features(void)
 57 	blake3_cpu_detected = 1;
 58 }
 59 
 60-#if defined(__x86_64__)
 61+#if BLAKE3_X86_SIMD
 62 __attribute__((constructor))
 63 static void
 64 blake3_init_cpu(void)
 65@@ -379,9 +387,13 @@ blake3_init_cpu(void)
 66 }
 67 #endif
 68 
 69-#if defined(__x86_64__)
 70+#if BLAKE3_X86_SIMD
 71+#if defined(__clang__)
 72+#pragma clang attribute push (__attribute__((target("sse2"))), apply_to=function)
 73+#elif defined(__GNUC__)
 74 #pragma GCC push_options
 75 #pragma GCC target("sse2")
 76+#endif
 77 #define DEGREE_SSE2 4
 78 
 79 #define _mm_shuffle_ps2(a, b, c)                                               \
 80@@ -995,10 +1007,18 @@ blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs, size_t bl
 81 		out_bytes = &out_bytes[BLAKE3_OUT_LEN];
 82 	}
 83 }
 84+#if defined(__clang__)
 85+#pragma clang attribute pop
 86+#elif defined(__GNUC__)
 87 #pragma GCC pop_options
 88+#endif
 89 
 90+#if defined(__clang__)
 91+#pragma clang attribute push (__attribute__((target("sse4.1"))), apply_to=function)
 92+#elif defined(__GNUC__)
 93 #pragma GCC push_options
 94 #pragma GCC target("sse4.1")
 95+#endif
 96 #define DEGREE_SSE41 4
 97 
 98 #define _mm_shuffle_ps2_sse41(a, b, c)                                         \
 99@@ -1601,10 +1621,18 @@ blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inputs, size_t b
100 		out_bytes = &out_bytes[BLAKE3_OUT_LEN];
101 	}
102 }
103+#if defined(__clang__)
104+#pragma clang attribute pop
105+#elif defined(__GNUC__)
106 #pragma GCC pop_options
107+#endif
108 
109+#if defined(__clang__)
110+#pragma clang attribute push (__attribute__((target("avx2"))), apply_to=function)
111+#elif defined(__GNUC__)
112 #pragma GCC push_options
113 #pragma GCC target("avx2")
114+#endif
115 #define DEGREE_AVX2 8
116 
117 static inline __m256i
118@@ -1952,10 +1980,18 @@ blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs, size_t bl
119 	}
120 	blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter, increment_counter, flags, flags_start, flags_end, out_bytes);
121 }
122+#if defined(__clang__)
123+#pragma clang attribute pop
124+#elif defined(__GNUC__)
125 #pragma GCC pop_options
126+#endif
127 
128+#if defined(__clang__)
129+#pragma clang attribute push (__attribute__((target("avx512f,avx512vl"))), apply_to=function)
130+#elif defined(__GNUC__)
131 #pragma GCC push_options
132 #pragma GCC target("avx512f,avx512vl")
133+#endif
134 static inline __m128i
135 loadu_128_avx512(const uint8_t src[16])
136 {
137@@ -3215,14 +3251,18 @@ blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs, size_t
138 		out_bytes = &out_bytes[BLAKE3_OUT_LEN];
139 	}
140 }
141+#if defined(__clang__)
142+#pragma clang attribute pop
143+#elif defined(__GNUC__)
144 #pragma GCC pop_options
145 #endif
146+#endif
147 
148 /* dispatch functions */
149 void
150 blake3_compress_in_place(uint32_t cv[8], const uint8_t block[BLAKE3_BLOCK_LEN], uint8_t block_len, uint64_t counter, uint8_t flags)
151 {
152-#if defined(__x86_64__)
153+#if BLAKE3_X86_SIMD
154 	if (!blake3_cpu_detected)
155 		blake3_detect_cpu_features();
156 	if (blake3_cpu_features & AVX512) {
157@@ -3244,7 +3284,7 @@ blake3_compress_in_place(uint32_t cv[8], const uint8_t block[BLAKE3_BLOCK_LEN],
158 void
159 blake3_compress_xof(const uint32_t cv[8], const uint8_t block[BLAKE3_BLOCK_LEN], uint8_t block_len, uint64_t counter, uint8_t flags, uint8_t out[64])
160 {
161-#if defined(__x86_64__)
162+#if BLAKE3_X86_SIMD
163 	if (!blake3_cpu_detected)
164 		blake3_detect_cpu_features();
165 	if (blake3_cpu_features & AVX512) {
166@@ -3266,7 +3306,7 @@ blake3_compress_xof(const uint32_t cv[8], const uint8_t block[BLAKE3_BLOCK_LEN],
167 void
168 blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs, size_t blocks, const uint32_t key[8], uint64_t counter, int increment_counter, uint8_t flags, uint8_t flags_start, uint8_t flags_end, uint8_t *out)
169 {
170-#if defined(__x86_64__)
171+#if BLAKE3_X86_SIMD
172 	if (!blake3_cpu_detected)
173 		blake3_detect_cpu_features();
174 	if (blake3_cpu_features & AVX512) {
175@@ -3292,7 +3332,7 @@ blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs, size_t blocks,
176 size_t
177 blake3_simd_degree(void)
178 {
179-#if defined(__x86_64__)
180+#if BLAKE3_X86_SIMD
181 	if (!blake3_cpu_detected)
182 		blake3_detect_cpu_features();
183 	if (blake3_cpu_features & AVX512)