28#if defined(BOTAN_HAS_SERPENT_AVX512)
29 if(CPUID::has_avx512()) {
31 avx512_encrypt_16(in, out);
39#if defined(BOTAN_HAS_SERPENT_AVX2)
40 if(CPUID::has_avx2()) {
42 avx2_encrypt_8(in, out);
50#if defined(BOTAN_HAS_SERPENT_SIMD)
53 simd_encrypt_4(in, out);
63 for(
size_t i = 0; i < blocks; ++i) {
64 uint32_t B0, B1, B2, B3;
65 load_le(in + 16 * i, B0, B1, B2, B3);
67 key_xor(0, B0, B1, B2, B3);
69 transform(B0, B1, B2, B3);
70 key_xor(1, B0, B1, B2, B3);
72 transform(B0, B1, B2, B3);
73 key_xor(2, B0, B1, B2, B3);
75 transform(B0, B1, B2, B3);
76 key_xor(3, B0, B1, B2, B3);
78 transform(B0, B1, B2, B3);
79 key_xor(4, B0, B1, B2, B3);
81 transform(B0, B1, B2, B3);
82 key_xor(5, B0, B1, B2, B3);
84 transform(B0, B1, B2, B3);
85 key_xor(6, B0, B1, B2, B3);
87 transform(B0, B1, B2, B3);
88 key_xor(7, B0, B1, B2, B3);
90 transform(B0, B1, B2, B3);
91 key_xor(8, B0, B1, B2, B3);
93 transform(B0, B1, B2, B3);
94 key_xor(9, B0, B1, B2, B3);
96 transform(B0, B1, B2, B3);
97 key_xor(10, B0, B1, B2, B3);
99 transform(B0, B1, B2, B3);
100 key_xor(11, B0, B1, B2, B3);
102 transform(B0, B1, B2, B3);
103 key_xor(12, B0, B1, B2, B3);
105 transform(B0, B1, B2, B3);
106 key_xor(13, B0, B1, B2, B3);
108 transform(B0, B1, B2, B3);
109 key_xor(14, B0, B1, B2, B3);
111 transform(B0, B1, B2, B3);
112 key_xor(15, B0, B1, B2, B3);
114 transform(B0, B1, B2, B3);
115 key_xor(16, B0, B1, B2, B3);
117 transform(B0, B1, B2, B3);
118 key_xor(17, B0, B1, B2, B3);
120 transform(B0, B1, B2, B3);
121 key_xor(18, B0, B1, B2, B3);
123 transform(B0, B1, B2, B3);
124 key_xor(19, B0, B1, B2, B3);
126 transform(B0, B1, B2, B3);
127 key_xor(20, B0, B1, B2, B3);
129 transform(B0, B1, B2, B3);
130 key_xor(21, B0, B1, B2, B3);
132 transform(B0, B1, B2, B3);
133 key_xor(22, B0, B1, B2, B3);
135 transform(B0, B1, B2, B3);
136 key_xor(23, B0, B1, B2, B3);
138 transform(B0, B1, B2, B3);
139 key_xor(24, B0, B1, B2, B3);
141 transform(B0, B1, B2, B3);
142 key_xor(25, B0, B1, B2, B3);
144 transform(B0, B1, B2, B3);
145 key_xor(26, B0, B1, B2, B3);
147 transform(B0, B1, B2, B3);
148 key_xor(27, B0, B1, B2, B3);
150 transform(B0, B1, B2, B3);
151 key_xor(28, B0, B1, B2, B3);
153 transform(B0, B1, B2, B3);
154 key_xor(29, B0, B1, B2, B3);
156 transform(B0, B1, B2, B3);
157 key_xor(30, B0, B1, B2, B3);
159 transform(B0, B1, B2, B3);
160 key_xor(31, B0, B1, B2, B3);
162 key_xor(32, B0, B1, B2, B3);
164 store_le(out + 16 * i, B0, B1, B2, B3);
176#if defined(BOTAN_HAS_SERPENT_AVX512)
177 if(CPUID::has_avx512()) {
178 while(blocks >= 16) {
179 avx512_decrypt_16(in, out);
187#if defined(BOTAN_HAS_SERPENT_AVX2)
188 if(CPUID::has_avx2()) {
190 avx2_decrypt_8(in, out);
198#if defined(BOTAN_HAS_SERPENT_SIMD)
201 simd_decrypt_4(in, out);
211 for(
size_t i = 0; i < blocks; ++i) {
212 uint32_t B0, B1, B2, B3;
213 load_le(in + 16 * i, B0, B1, B2, B3);
215 key_xor(32, B0, B1, B2, B3);
217 key_xor(31, B0, B1, B2, B3);
218 i_transform(B0, B1, B2, B3);
220 key_xor(30, B0, B1, B2, B3);
221 i_transform(B0, B1, B2, B3);
223 key_xor(29, B0, B1, B2, B3);
224 i_transform(B0, B1, B2, B3);
226 key_xor(28, B0, B1, B2, B3);
227 i_transform(B0, B1, B2, B3);
229 key_xor(27, B0, B1, B2, B3);
230 i_transform(B0, B1, B2, B3);
232 key_xor(26, B0, B1, B2, B3);
233 i_transform(B0, B1, B2, B3);
235 key_xor(25, B0, B1, B2, B3);
236 i_transform(B0, B1, B2, B3);
238 key_xor(24, B0, B1, B2, B3);
239 i_transform(B0, B1, B2, B3);
241 key_xor(23, B0, B1, B2, B3);
242 i_transform(B0, B1, B2, B3);
244 key_xor(22, B0, B1, B2, B3);
245 i_transform(B0, B1, B2, B3);
247 key_xor(21, B0, B1, B2, B3);
248 i_transform(B0, B1, B2, B3);
250 key_xor(20, B0, B1, B2, B3);
251 i_transform(B0, B1, B2, B3);
253 key_xor(19, B0, B1, B2, B3);
254 i_transform(B0, B1, B2, B3);
256 key_xor(18, B0, B1, B2, B3);
257 i_transform(B0, B1, B2, B3);
259 key_xor(17, B0, B1, B2, B3);
260 i_transform(B0, B1, B2, B3);
262 key_xor(16, B0, B1, B2, B3);
263 i_transform(B0, B1, B2, B3);
265 key_xor(15, B0, B1, B2, B3);
266 i_transform(B0, B1, B2, B3);
268 key_xor(14, B0, B1, B2, B3);
269 i_transform(B0, B1, B2, B3);
271 key_xor(13, B0, B1, B2, B3);
272 i_transform(B0, B1, B2, B3);
274 key_xor(12, B0, B1, B2, B3);
275 i_transform(B0, B1, B2, B3);
277 key_xor(11, B0, B1, B2, B3);
278 i_transform(B0, B1, B2, B3);
280 key_xor(10, B0, B1, B2, B3);
281 i_transform(B0, B1, B2, B3);
283 key_xor(9, B0, B1, B2, B3);
284 i_transform(B0, B1, B2, B3);
286 key_xor(8, B0, B1, B2, B3);
287 i_transform(B0, B1, B2, B3);
289 key_xor(7, B0, B1, B2, B3);
290 i_transform(B0, B1, B2, B3);
292 key_xor(6, B0, B1, B2, B3);
293 i_transform(B0, B1, B2, B3);
295 key_xor(5, B0, B1, B2, B3);
296 i_transform(B0, B1, B2, B3);
298 key_xor(4, B0, B1, B2, B3);
299 i_transform(B0, B1, B2, B3);
301 key_xor(3, B0, B1, B2, B3);
302 i_transform(B0, B1, B2, B3);
304 key_xor(2, B0, B1, B2, B3);
305 i_transform(B0, B1, B2, B3);
307 key_xor(1, B0, B1, B2, B3);
308 i_transform(B0, B1, B2, B3);
310 key_xor(0, B0, B1, B2, B3);
312 store_le(out + 16 * i, B0, B1, B2, B3);