Line data Source code
1 : /*
2 : * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3 : *
4 : * This source code is subject to the terms of the BSD 2 Clause License and
5 : * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 : * was not distributed with this source code in the LICENSE file, you can
7 : * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 : * Media Patent License 1.0 was not distributed with this source code in the
9 : * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 : */
11 :
12 : #ifndef _V256_INTRINSICS_V128_H
13 : #define _V256_INTRINSICS_V128_H
14 :
15 : #if HAVE_NEON
16 : #include "./v128_intrinsics_arm.h"
17 : #elif HAVE_SSE2
18 : #include "./v128_intrinsics_x86.h"
19 : #else
20 : #include "./v128_intrinsics.h"
21 : #endif
22 :
23 : typedef struct { v128 lo, hi; } v256;
24 :
25 : SIMD_INLINE uint32_t v256_low_u32(v256 a) { return v128_low_u32(a.lo); }
26 :
27 : SIMD_INLINE v64 v256_low_v64(v256 a) { return v128_low_v64(a.lo); }
28 :
29 0 : SIMD_INLINE v128 v256_low_v128(v256 a) { return a.lo; }
30 :
31 0 : SIMD_INLINE v128 v256_high_v128(v256 a) { return a.hi; }
32 :
33 : SIMD_INLINE v256 v256_from_v128(v128 hi, v128 lo) {
34 : v256 t;
35 0 : t.hi = hi;
36 0 : t.lo = lo;
37 0 : return t;
38 : }
39 :
40 : SIMD_INLINE v256 v256_from_64(uint64_t a, uint64_t b, uint64_t c, uint64_t d) {
41 : return v256_from_v128(v128_from_64(a, b), v128_from_64(c, d));
42 : }
43 :
44 : SIMD_INLINE v256 v256_from_v64(v64 a, v64 b, v64 c, v64 d) {
45 0 : return v256_from_v128(v128_from_v64(a, b), v128_from_v64(c, d));
46 : }
47 :
48 : SIMD_INLINE v256 v256_load_unaligned(const void *p) {
49 : return v256_from_v128(v128_load_unaligned((uint8_t *)p + 16),
50 : v128_load_unaligned(p));
51 : }
52 :
53 : SIMD_INLINE v256 v256_load_aligned(const void *p) {
54 : return v256_from_v128(v128_load_aligned((uint8_t *)p + 16),
55 : v128_load_aligned(p));
56 : }
57 :
58 : SIMD_INLINE void v256_store_unaligned(void *p, v256 a) {
59 : v128_store_unaligned(p, a.lo);
60 : v128_store_unaligned((uint8_t *)p + 16, a.hi);
61 : }
62 :
63 : SIMD_INLINE void v256_store_aligned(void *p, v256 a) {
64 : v128_store_aligned(p, a.lo);
65 : v128_store_aligned((uint8_t *)p + 16, a.hi);
66 : }
67 :
68 : SIMD_INLINE v256 v256_zero() {
69 : return v256_from_v128(v128_zero(), v128_zero());
70 : }
71 :
72 : SIMD_INLINE v256 v256_dup_8(uint8_t x) {
73 : v128 t = v128_dup_8(x);
74 : return v256_from_v128(t, t);
75 : }
76 :
77 : SIMD_INLINE v256 v256_dup_16(uint16_t x) {
78 : v128 t = v128_dup_16(x);
79 : return v256_from_v128(t, t);
80 : }
81 :
82 : SIMD_INLINE v256 v256_dup_32(uint32_t x) {
83 : v128 t = v128_dup_32(x);
84 : return v256_from_v128(t, t);
85 : }
86 :
87 : SIMD_INLINE int64_t v256_dotp_s16(v256 a, v256 b) {
88 : return v128_dotp_s16(a.hi, b.hi) + v128_dotp_s16(a.lo, b.lo);
89 : }
90 :
91 : SIMD_INLINE uint64_t v256_hadd_u8(v256 a) {
92 : return v128_hadd_u8(a.hi) + v128_hadd_u8(a.lo);
93 : }
94 :
95 : typedef struct {
96 : sad128_internal hi;
97 : sad128_internal lo;
98 : } sad256_internal;
99 :
100 : SIMD_INLINE sad256_internal v256_sad_u8_init() {
101 : sad256_internal t;
102 : t.hi = v128_sad_u8_init();
103 : t.lo = v128_sad_u8_init();
104 : return t;
105 : }
106 :
107 : /* Implementation dependent return value. Result must be finalised with
108 : v256_sad_u8_sum().
109 : The result for more than 16 v256_sad_u8() calls is undefined. */
110 : SIMD_INLINE sad256_internal v256_sad_u8(sad256_internal s, v256 a, v256 b) {
111 : sad256_internal t;
112 : t.hi = v128_sad_u8(s.hi, a.hi, b.hi);
113 : t.lo = v128_sad_u8(s.lo, a.lo, b.lo);
114 : return t;
115 : }
116 :
117 : SIMD_INLINE uint32_t v256_sad_u8_sum(sad256_internal s) {
118 : return v128_sad_u8_sum(s.hi) + v128_sad_u8_sum(s.lo);
119 : }
120 :
121 : typedef struct {
122 : ssd128_internal hi;
123 : ssd128_internal lo;
124 : } ssd256_internal;
125 :
126 : SIMD_INLINE ssd256_internal v256_ssd_u8_init() {
127 : ssd256_internal t;
128 : t.hi = v128_ssd_u8_init();
129 : t.lo = v128_ssd_u8_init();
130 : return t;
131 : }
132 :
133 : /* Implementation dependent return value. Result must be finalised with
134 : * v256_ssd_u8_sum(). */
135 : SIMD_INLINE ssd256_internal v256_ssd_u8(ssd256_internal s, v256 a, v256 b) {
136 : ssd256_internal t;
137 : t.hi = v128_ssd_u8(s.hi, a.hi, b.hi);
138 : t.lo = v128_ssd_u8(s.lo, a.lo, b.lo);
139 : return t;
140 : }
141 :
142 : SIMD_INLINE uint32_t v256_ssd_u8_sum(ssd256_internal s) {
143 : return v128_ssd_u8_sum(s.hi) + v128_ssd_u8_sum(s.lo);
144 : }
145 :
146 : SIMD_INLINE v256 v256_or(v256 a, v256 b) {
147 : return v256_from_v128(v128_or(a.hi, b.hi), v128_or(a.lo, b.lo));
148 : }
149 :
150 : SIMD_INLINE v256 v256_xor(v256 a, v256 b) {
151 : return v256_from_v128(v128_xor(a.hi, b.hi), v128_xor(a.lo, b.lo));
152 : }
153 :
154 : SIMD_INLINE v256 v256_and(v256 a, v256 b) {
155 : return v256_from_v128(v128_and(a.hi, b.hi), v128_and(a.lo, b.lo));
156 : }
157 :
158 : SIMD_INLINE v256 v256_andn(v256 a, v256 b) {
159 : return v256_from_v128(v128_andn(a.hi, b.hi), v128_andn(a.lo, b.lo));
160 : }
161 :
162 : SIMD_INLINE v256 v256_add_8(v256 a, v256 b) {
163 : return v256_from_v128(v128_add_8(a.hi, b.hi), v128_add_8(a.lo, b.lo));
164 : }
165 :
166 : SIMD_INLINE v256 v256_add_16(v256 a, v256 b) {
167 : return v256_from_v128(v128_add_16(a.hi, b.hi), v128_add_16(a.lo, b.lo));
168 : }
169 :
170 : SIMD_INLINE v256 v256_sadd_s16(v256 a, v256 b) {
171 : return v256_from_v128(v128_sadd_s16(a.hi, b.hi), v128_sadd_s16(a.lo, b.lo));
172 : }
173 :
174 : SIMD_INLINE v256 v256_add_32(v256 a, v256 b) {
175 : return v256_from_v128(v128_add_32(a.hi, b.hi), v128_add_32(a.lo, b.lo));
176 : }
177 :
178 : SIMD_INLINE v256 v256_padd_s16(v256 a) {
179 : return v256_from_v128(v128_padd_s16(a.hi), v128_padd_s16(a.lo));
180 : }
181 :
182 : SIMD_INLINE v256 v256_sub_8(v256 a, v256 b) {
183 : return v256_from_v128(v128_sub_8(a.hi, b.hi), v128_sub_8(a.lo, b.lo));
184 : }
185 :
186 : SIMD_INLINE v256 v256_ssub_u8(v256 a, v256 b) {
187 : return v256_from_v128(v128_ssub_u8(a.hi, b.hi), v128_ssub_u8(a.lo, b.lo));
188 : }
189 :
190 : SIMD_INLINE v256 v256_ssub_s8(v256 a, v256 b) {
191 : return v256_from_v128(v128_ssub_s8(a.hi, b.hi), v128_ssub_s8(a.lo, b.lo));
192 : }
193 :
194 : SIMD_INLINE v256 v256_sub_16(v256 a, v256 b) {
195 0 : return v256_from_v128(v128_sub_16(a.hi, b.hi), v128_sub_16(a.lo, b.lo));
196 : }
197 :
198 : SIMD_INLINE v256 v256_ssub_s16(v256 a, v256 b) {
199 : return v256_from_v128(v128_ssub_s16(a.hi, b.hi), v128_ssub_s16(a.lo, b.lo));
200 : }
201 :
202 : SIMD_INLINE v256 v256_ssub_u16(v256 a, v256 b) {
203 : return v256_from_v128(v128_ssub_u16(a.hi, b.hi), v128_ssub_u16(a.lo, b.lo));
204 : }
205 :
206 : SIMD_INLINE v256 v256_sub_32(v256 a, v256 b) {
207 : return v256_from_v128(v128_sub_32(a.hi, b.hi), v128_sub_32(a.lo, b.lo));
208 : }
209 :
210 : SIMD_INLINE v256 v256_abs_s16(v256 a) {
211 : return v256_from_v128(v128_abs_s16(a.hi), v128_abs_s16(a.lo));
212 : }
213 :
214 : SIMD_INLINE v256 v256_abs_s8(v256 a) {
215 : return v256_from_v128(v128_abs_s8(a.hi), v128_abs_s8(a.lo));
216 : }
217 :
218 : SIMD_INLINE v256 v256_mul_s16(v128 a, v128 b) {
219 : v128 lo_bits = v128_mullo_s16(a, b);
220 : v128 hi_bits = v128_mulhi_s16(a, b);
221 : return v256_from_v128(v128_ziphi_16(hi_bits, lo_bits),
222 : v128_ziplo_16(hi_bits, lo_bits));
223 : }
224 :
225 : SIMD_INLINE v256 v256_mullo_s16(v256 a, v256 b) {
226 : return v256_from_v128(v128_mullo_s16(a.hi, b.hi), v128_mullo_s16(a.lo, b.lo));
227 : }
228 :
229 : SIMD_INLINE v256 v256_mulhi_s16(v256 a, v256 b) {
230 : return v256_from_v128(v128_mulhi_s16(a.hi, b.hi), v128_mulhi_s16(a.lo, b.lo));
231 : }
232 :
233 : SIMD_INLINE v256 v256_mullo_s32(v256 a, v256 b) {
234 : return v256_from_v128(v128_mullo_s32(a.hi, b.hi), v128_mullo_s32(a.lo, b.lo));
235 : }
236 :
237 : SIMD_INLINE v256 v256_madd_s16(v256 a, v256 b) {
238 : return v256_from_v128(v128_madd_s16(a.hi, b.hi), v128_madd_s16(a.lo, b.lo));
239 : }
240 :
241 : SIMD_INLINE v256 v256_madd_us8(v256 a, v256 b) {
242 : return v256_from_v128(v128_madd_us8(a.hi, b.hi), v128_madd_us8(a.lo, b.lo));
243 : }
244 :
245 : SIMD_INLINE v256 v256_avg_u8(v256 a, v256 b) {
246 : return v256_from_v128(v128_avg_u8(a.hi, b.hi), v128_avg_u8(a.lo, b.lo));
247 : }
248 :
249 : SIMD_INLINE v256 v256_rdavg_u8(v256 a, v256 b) {
250 : return v256_from_v128(v128_rdavg_u8(a.hi, b.hi), v128_rdavg_u8(a.lo, b.lo));
251 : }
252 :
253 : SIMD_INLINE v256 v256_avg_u16(v256 a, v256 b) {
254 : return v256_from_v128(v128_avg_u16(a.hi, b.hi), v128_avg_u16(a.lo, b.lo));
255 : }
256 :
257 : SIMD_INLINE v256 v256_min_u8(v256 a, v256 b) {
258 : return v256_from_v128(v128_min_u8(a.hi, b.hi), v128_min_u8(a.lo, b.lo));
259 : }
260 :
261 : SIMD_INLINE v256 v256_max_u8(v256 a, v256 b) {
262 : return v256_from_v128(v128_max_u8(a.hi, b.hi), v128_max_u8(a.lo, b.lo));
263 : }
264 :
265 : SIMD_INLINE v256 v256_min_s8(v256 a, v256 b) {
266 : return v256_from_v128(v128_min_s8(a.hi, b.hi), v128_min_s8(a.lo, b.lo));
267 : }
268 :
269 : SIMD_INLINE v256 v256_max_s8(v256 a, v256 b) {
270 : return v256_from_v128(v128_max_s8(a.hi, b.hi), v128_max_s8(a.lo, b.lo));
271 : }
272 :
273 : SIMD_INLINE v256 v256_min_s16(v256 a, v256 b) {
274 : return v256_from_v128(v128_min_s16(a.hi, b.hi), v128_min_s16(a.lo, b.lo));
275 : }
276 :
277 : SIMD_INLINE v256 v256_max_s16(v256 a, v256 b) {
278 : return v256_from_v128(v128_max_s16(a.hi, b.hi), v128_max_s16(a.lo, b.lo));
279 : }
280 :
281 : SIMD_INLINE v256 v256_ziplo_8(v256 a, v256 b) {
282 : return v256_from_v128(v128_ziphi_8(a.lo, b.lo), v128_ziplo_8(a.lo, b.lo));
283 : }
284 :
285 : SIMD_INLINE v256 v256_ziphi_8(v256 a, v256 b) {
286 : return v256_from_v128(v128_ziphi_8(a.hi, b.hi), v128_ziplo_8(a.hi, b.hi));
287 : }
288 :
289 : SIMD_INLINE v256 v256_ziplo_16(v256 a, v256 b) {
290 : return v256_from_v128(v128_ziphi_16(a.lo, b.lo), v128_ziplo_16(a.lo, b.lo));
291 : }
292 :
293 : SIMD_INLINE v256 v256_ziphi_16(v256 a, v256 b) {
294 : return v256_from_v128(v128_ziphi_16(a.hi, b.hi), v128_ziplo_16(a.hi, b.hi));
295 : }
296 :
297 : SIMD_INLINE v256 v256_ziplo_32(v256 a, v256 b) {
298 : return v256_from_v128(v128_ziphi_32(a.lo, b.lo), v128_ziplo_32(a.lo, b.lo));
299 : }
300 :
301 : SIMD_INLINE v256 v256_ziphi_32(v256 a, v256 b) {
302 : return v256_from_v128(v128_ziphi_32(a.hi, b.hi), v128_ziplo_32(a.hi, b.hi));
303 : }
304 :
305 : SIMD_INLINE v256 v256_ziplo_64(v256 a, v256 b) {
306 : return v256_from_v128(v128_ziphi_64(a.lo, b.lo), v128_ziplo_64(a.lo, b.lo));
307 : }
308 :
309 : SIMD_INLINE v256 v256_ziphi_64(v256 a, v256 b) {
310 : return v256_from_v128(v128_ziphi_64(a.hi, b.hi), v128_ziplo_64(a.hi, b.hi));
311 : }
312 :
313 : SIMD_INLINE v256 v256_ziplo_128(v256 a, v256 b) {
314 : return v256_from_v128(a.lo, b.lo);
315 : }
316 :
317 : SIMD_INLINE v256 v256_ziphi_128(v256 a, v256 b) {
318 : return v256_from_v128(a.hi, b.hi);
319 : }
320 :
321 : SIMD_INLINE v256 v256_zip_8(v128 a, v128 b) {
322 : return v256_from_v128(v128_ziphi_8(a, b), v128_ziplo_8(a, b));
323 : }
324 :
325 : SIMD_INLINE v256 v256_zip_16(v128 a, v128 b) {
326 : return v256_from_v128(v128_ziphi_16(a, b), v128_ziplo_16(a, b));
327 : }
328 :
329 : SIMD_INLINE v256 v256_zip_32(v128 a, v128 b) {
330 : return v256_from_v128(v128_ziphi_32(a, b), v128_ziplo_32(a, b));
331 : }
332 :
333 : SIMD_INLINE v256 v256_unziplo_8(v256 a, v256 b) {
334 : return v256_from_v128(v128_unziplo_8(a.hi, a.lo), v128_unziplo_8(b.hi, b.lo));
335 : }
336 :
337 : SIMD_INLINE v256 v256_unziphi_8(v256 a, v256 b) {
338 : return v256_from_v128(v128_unziphi_8(a.hi, a.lo), v128_unziphi_8(b.hi, b.lo));
339 : }
340 :
341 : SIMD_INLINE v256 v256_unziplo_16(v256 a, v256 b) {
342 : return v256_from_v128(v128_unziplo_16(a.hi, a.lo),
343 : v128_unziplo_16(b.hi, b.lo));
344 : }
345 :
346 : SIMD_INLINE v256 v256_unziphi_16(v256 a, v256 b) {
347 : return v256_from_v128(v128_unziphi_16(a.hi, a.lo),
348 : v128_unziphi_16(b.hi, b.lo));
349 : }
350 :
351 : SIMD_INLINE v256 v256_unziplo_32(v256 a, v256 b) {
352 : return v256_from_v128(v128_unziplo_32(a.hi, a.lo),
353 : v128_unziplo_32(b.hi, b.lo));
354 : }
355 :
356 : SIMD_INLINE v256 v256_unziphi_32(v256 a, v256 b) {
357 : return v256_from_v128(v128_unziphi_32(a.hi, a.lo),
358 : v128_unziphi_32(b.hi, b.lo));
359 : }
360 :
361 : SIMD_INLINE v256 v256_unpack_u8_s16(v128 a) {
362 : return v256_from_v128(v128_unpackhi_u8_s16(a), v128_unpacklo_u8_s16(a));
363 : }
364 :
365 : SIMD_INLINE v256 v256_unpacklo_u8_s16(v256 a) {
366 : return v256_from_v128(v128_unpackhi_u8_s16(a.lo), v128_unpacklo_u8_s16(a.lo));
367 : }
368 :
369 : SIMD_INLINE v256 v256_unpackhi_u8_s16(v256 a) {
370 : return v256_from_v128(v128_unpackhi_u8_s16(a.hi), v128_unpacklo_u8_s16(a.hi));
371 : }
372 :
373 : SIMD_INLINE v256 v256_unpack_s8_s16(v128 a) {
374 : return v256_from_v128(v128_unpackhi_s8_s16(a), v128_unpacklo_s8_s16(a));
375 : }
376 :
377 : SIMD_INLINE v256 v256_unpacklo_s8_s16(v256 a) {
378 : return v256_from_v128(v128_unpackhi_s8_s16(a.lo), v128_unpacklo_s8_s16(a.lo));
379 : }
380 :
381 : SIMD_INLINE v256 v256_unpackhi_s8_s16(v256 a) {
382 : return v256_from_v128(v128_unpackhi_s8_s16(a.hi), v128_unpacklo_s8_s16(a.hi));
383 : }
384 :
385 : SIMD_INLINE v256 v256_pack_s32_s16(v256 a, v256 b) {
386 : return v256_from_v128(v128_pack_s32_s16(a.hi, a.lo),
387 : v128_pack_s32_s16(b.hi, b.lo));
388 : }
389 :
390 : SIMD_INLINE v256 v256_pack_s16_u8(v256 a, v256 b) {
391 : return v256_from_v128(v128_pack_s16_u8(a.hi, a.lo),
392 : v128_pack_s16_u8(b.hi, b.lo));
393 : }
394 :
395 : SIMD_INLINE v256 v256_pack_s16_s8(v256 a, v256 b) {
396 : return v256_from_v128(v128_pack_s16_s8(a.hi, a.lo),
397 : v128_pack_s16_s8(b.hi, b.lo));
398 : }
399 :
400 : SIMD_INLINE v256 v256_unpack_u16_s32(v128 a) {
401 : return v256_from_v128(v128_unpackhi_u16_s32(a), v128_unpacklo_u16_s32(a));
402 : }
403 :
404 : SIMD_INLINE v256 v256_unpack_s16_s32(v128 a) {
405 : return v256_from_v128(v128_unpackhi_s16_s32(a), v128_unpacklo_s16_s32(a));
406 : }
407 :
408 : SIMD_INLINE v256 v256_unpacklo_u16_s32(v256 a) {
409 : return v256_from_v128(v128_unpackhi_u16_s32(a.lo),
410 : v128_unpacklo_u16_s32(a.lo));
411 : }
412 :
413 : SIMD_INLINE v256 v256_unpacklo_s16_s32(v256 a) {
414 : return v256_from_v128(v128_unpackhi_s16_s32(a.lo),
415 : v128_unpacklo_s16_s32(a.lo));
416 : }
417 :
418 : SIMD_INLINE v256 v256_unpackhi_u16_s32(v256 a) {
419 : return v256_from_v128(v128_unpackhi_u16_s32(a.hi),
420 : v128_unpacklo_u16_s32(a.hi));
421 : }
422 :
423 : SIMD_INLINE v256 v256_unpackhi_s16_s32(v256 a) {
424 : return v256_from_v128(v128_unpackhi_s16_s32(a.hi),
425 : v128_unpacklo_s16_s32(a.hi));
426 : }
427 :
428 : SIMD_INLINE v256 v256_shuffle_8(v256 a, v256 pattern) {
429 : v128 c16 = v128_dup_8(16);
430 : v128 maskhi = v128_cmplt_s8(pattern.hi, c16);
431 : v128 masklo = v128_cmplt_s8(pattern.lo, c16);
432 : return v256_from_v128(
433 : v128_or(
434 : v128_and(v128_shuffle_8(a.lo, pattern.hi), maskhi),
435 : v128_andn(v128_shuffle_8(a.hi, v128_sub_8(pattern.hi, c16)), maskhi)),
436 : v128_or(v128_and(v128_shuffle_8(a.lo, pattern.lo), masklo),
437 : v128_andn(v128_shuffle_8(a.hi, v128_sub_8(pattern.lo, c16)),
438 : masklo)));
439 : }
440 :
441 : SIMD_INLINE v256 v256_pshuffle_8(v256 a, v256 pattern) {
442 : return v256_from_v128(
443 : v128_shuffle_8(v256_high_v128(a), v256_high_v128(pattern)),
444 : v128_shuffle_8(v256_low_v128(a), v256_low_v128(pattern)));
445 : }
446 :
447 : SIMD_INLINE v256 v256_cmpgt_s8(v256 a, v256 b) {
448 : return v256_from_v128(v128_cmpgt_s8(a.hi, b.hi), v128_cmpgt_s8(a.lo, b.lo));
449 : }
450 :
451 : SIMD_INLINE v256 v256_cmplt_s8(v256 a, v256 b) {
452 : return v256_from_v128(v128_cmplt_s8(a.hi, b.hi), v128_cmplt_s8(a.lo, b.lo));
453 : }
454 :
455 : SIMD_INLINE v256 v256_cmpeq_8(v256 a, v256 b) {
456 : return v256_from_v128(v128_cmpeq_8(a.hi, b.hi), v128_cmpeq_8(a.lo, b.lo));
457 : }
458 :
459 : SIMD_INLINE v256 v256_cmpgt_s16(v256 a, v256 b) {
460 : return v256_from_v128(v128_cmpgt_s16(a.hi, b.hi), v128_cmpgt_s16(a.lo, b.lo));
461 : }
462 :
463 : SIMD_INLINE v256 v256_cmplt_s16(v256 a, v256 b) {
464 : return v256_from_v128(v128_cmplt_s16(a.hi, b.hi), v128_cmplt_s16(a.lo, b.lo));
465 : }
466 :
467 : SIMD_INLINE v256 v256_cmpeq_16(v256 a, v256 b) {
468 : return v256_from_v128(v128_cmpeq_16(a.hi, b.hi), v128_cmpeq_16(a.lo, b.lo));
469 : }
470 :
471 : SIMD_INLINE v256 v256_shl_8(v256 a, unsigned int c) {
472 : return v256_from_v128(v128_shl_8(a.hi, c), v128_shl_8(a.lo, c));
473 : }
474 :
475 : SIMD_INLINE v256 v256_shr_u8(v256 a, unsigned int c) {
476 : return v256_from_v128(v128_shr_u8(a.hi, c), v128_shr_u8(a.lo, c));
477 : }
478 :
479 : SIMD_INLINE v256 v256_shr_s8(v256 a, unsigned int c) {
480 : return v256_from_v128(v128_shr_s8(a.hi, c), v128_shr_s8(a.lo, c));
481 : }
482 :
483 : SIMD_INLINE v256 v256_shl_16(v256 a, unsigned int c) {
484 : return v256_from_v128(v128_shl_16(a.hi, c), v128_shl_16(a.lo, c));
485 : }
486 :
487 : SIMD_INLINE v256 v256_shr_u16(v256 a, unsigned int c) {
488 : return v256_from_v128(v128_shr_u16(a.hi, c), v128_shr_u16(a.lo, c));
489 : }
490 :
491 : SIMD_INLINE v256 v256_shr_s16(v256 a, unsigned int c) {
492 : return v256_from_v128(v128_shr_s16(a.hi, c), v128_shr_s16(a.lo, c));
493 : }
494 :
495 : SIMD_INLINE v256 v256_shl_32(v256 a, unsigned int c) {
496 : return v256_from_v128(v128_shl_32(a.hi, c), v128_shl_32(a.lo, c));
497 : }
498 :
499 : SIMD_INLINE v256 v256_shr_u32(v256 a, unsigned int c) {
500 : return v256_from_v128(v128_shr_u32(a.hi, c), v128_shr_u32(a.lo, c));
501 : }
502 :
503 : SIMD_INLINE v256 v256_shr_s32(v256 a, unsigned int c) {
504 : return v256_from_v128(v128_shr_s32(a.hi, c), v128_shr_s32(a.lo, c));
505 : }
506 :
507 : /* These intrinsics require immediate values, so we must use #defines
508 : to enforce that. */
509 : #define v256_shl_n_byte(a, n) \
510 : ((n) < 16 ? v256_from_v128(v128_or(v128_shl_n_byte(a.hi, n), \
511 : v128_shr_n_byte(a.lo, 16 - (n))), \
512 : v128_shl_n_byte(a.lo, (n))) \
513 : : v256_from_v128((n) > 16 ? v128_shl_n_byte(a.lo, (n)-16) : a.lo, \
514 : v128_zero()))
515 :
516 : #define v256_shr_n_byte(a, n) \
517 : ((n) < 16 ? v256_from_v128(v128_shr_n_byte(a.hi, n), \
518 : v128_or(v128_shr_n_byte(a.lo, n), \
519 : v128_shl_n_byte(a.hi, 16 - (n)))) \
520 : : v256_from_v128(v128_zero(), \
521 : (n) > 16 ? v128_shr_n_byte(a.hi, (n)-16) : a.hi))
522 :
523 : #define v256_align(a, b, c) \
524 : ((c) ? v256_or(v256_shr_n_byte(b, c), v256_shl_n_byte(a, 32 - (c))) : b)
525 :
526 : #define v256_shl_n_8(a, n) \
527 : v256_from_v128(v128_shl_n_8(a.hi, n), v128_shl_n_8(a.lo, n))
528 : #define v256_shl_n_16(a, n) \
529 : v256_from_v128(v128_shl_n_16(a.hi, n), v128_shl_n_16(a.lo, n))
530 : #define v256_shl_n_32(a, n) \
531 : v256_from_v128(v128_shl_n_32(a.hi, n), v128_shl_n_32(a.lo, n))
532 : #define v256_shr_n_u8(a, n) \
533 : v256_from_v128(v128_shr_n_u8(a.hi, n), v128_shr_n_u8(a.lo, n))
534 : #define v256_shr_n_u16(a, n) \
535 : v256_from_v128(v128_shr_n_u16(a.hi, n), v128_shr_n_u16(a.lo, n))
536 : #define v256_shr_n_u32(a, n) \
537 : v256_from_v128(v128_shr_n_u32(a.hi, n), v128_shr_n_u32(a.lo, n))
538 : #define v256_shr_n_s8(a, n) \
539 : v256_from_v128(v128_shr_n_s8(a.hi, n), v128_shr_n_s8(a.lo, n))
540 : #define v256_shr_n_s16(a, n) \
541 : v256_from_v128(v128_shr_n_s16(a.hi, n), v128_shr_n_s16(a.lo, n))
542 : #define v256_shr_n_s32(a, n) \
543 : v256_from_v128(v128_shr_n_s32(a.hi, n), v128_shr_n_s32(a.lo, n))
544 :
545 : #endif /* _V256_INTRINSICS_V128_H */
|