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)