Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
screetsec
GitHub Repository: screetsec/TheFatRat
Path: blob/master/tools/android-sdk/renderscript/clang-include/avx2intrin.h
496 views
1
/*===---- avx2intrin.h - AVX2 intrinsics -----------------------------------===
2
*
3
* Permission is hereby granted, free of charge, to any person obtaining a copy
4
* of this software and associated documentation files (the "Software"), to deal
5
* in the Software without restriction, including without limitation the rights
6
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
* copies of the Software, and to permit persons to whom the Software is
8
* furnished to do so, subject to the following conditions:
9
*
10
* The above copyright notice and this permission notice shall be included in
11
* all copies or substantial portions of the Software.
12
*
13
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
* THE SOFTWARE.
20
*
21
*===-----------------------------------------------------------------------===
22
*/
23
24
#ifndef __IMMINTRIN_H
25
#error "Never use <avx2intrin.h> directly; include <immintrin.h> instead."
26
#endif
27
28
#ifndef __AVX2INTRIN_H
29
#define __AVX2INTRIN_H
30
31
/* Define the default attributes for the functions in this file. */
32
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx2")))
33
34
/* SSE4 Multiple Packed Sums of Absolute Difference. */
35
#define _mm256_mpsadbw_epu8(X, Y, M) \
36
(__m256i)__builtin_ia32_mpsadbw256((__v32qi)(__m256i)(X), \
37
(__v32qi)(__m256i)(Y), (int)(M))
38
39
static __inline__ __m256i __DEFAULT_FN_ATTRS
40
_mm256_abs_epi8(__m256i __a)
41
{
42
return (__m256i)__builtin_ia32_pabsb256((__v32qi)__a);
43
}
44
45
static __inline__ __m256i __DEFAULT_FN_ATTRS
46
_mm256_abs_epi16(__m256i __a)
47
{
48
return (__m256i)__builtin_ia32_pabsw256((__v16hi)__a);
49
}
50
51
static __inline__ __m256i __DEFAULT_FN_ATTRS
52
_mm256_abs_epi32(__m256i __a)
53
{
54
return (__m256i)__builtin_ia32_pabsd256((__v8si)__a);
55
}
56
57
static __inline__ __m256i __DEFAULT_FN_ATTRS
58
_mm256_packs_epi16(__m256i __a, __m256i __b)
59
{
60
return (__m256i)__builtin_ia32_packsswb256((__v16hi)__a, (__v16hi)__b);
61
}
62
63
static __inline__ __m256i __DEFAULT_FN_ATTRS
64
_mm256_packs_epi32(__m256i __a, __m256i __b)
65
{
66
return (__m256i)__builtin_ia32_packssdw256((__v8si)__a, (__v8si)__b);
67
}
68
69
static __inline__ __m256i __DEFAULT_FN_ATTRS
70
_mm256_packus_epi16(__m256i __a, __m256i __b)
71
{
72
return (__m256i)__builtin_ia32_packuswb256((__v16hi)__a, (__v16hi)__b);
73
}
74
75
static __inline__ __m256i __DEFAULT_FN_ATTRS
76
_mm256_packus_epi32(__m256i __V1, __m256i __V2)
77
{
78
return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2);
79
}
80
81
static __inline__ __m256i __DEFAULT_FN_ATTRS
82
_mm256_add_epi8(__m256i __a, __m256i __b)
83
{
84
return (__m256i)((__v32qu)__a + (__v32qu)__b);
85
}
86
87
static __inline__ __m256i __DEFAULT_FN_ATTRS
88
_mm256_add_epi16(__m256i __a, __m256i __b)
89
{
90
return (__m256i)((__v16hu)__a + (__v16hu)__b);
91
}
92
93
static __inline__ __m256i __DEFAULT_FN_ATTRS
94
_mm256_add_epi32(__m256i __a, __m256i __b)
95
{
96
return (__m256i)((__v8su)__a + (__v8su)__b);
97
}
98
99
static __inline__ __m256i __DEFAULT_FN_ATTRS
100
_mm256_add_epi64(__m256i __a, __m256i __b)
101
{
102
return (__m256i)((__v4du)__a + (__v4du)__b);
103
}
104
105
static __inline__ __m256i __DEFAULT_FN_ATTRS
106
_mm256_adds_epi8(__m256i __a, __m256i __b)
107
{
108
return (__m256i)__builtin_ia32_paddsb256((__v32qi)__a, (__v32qi)__b);
109
}
110
111
static __inline__ __m256i __DEFAULT_FN_ATTRS
112
_mm256_adds_epi16(__m256i __a, __m256i __b)
113
{
114
return (__m256i)__builtin_ia32_paddsw256((__v16hi)__a, (__v16hi)__b);
115
}
116
117
static __inline__ __m256i __DEFAULT_FN_ATTRS
118
_mm256_adds_epu8(__m256i __a, __m256i __b)
119
{
120
return (__m256i)__builtin_ia32_paddusb256((__v32qi)__a, (__v32qi)__b);
121
}
122
123
static __inline__ __m256i __DEFAULT_FN_ATTRS
124
_mm256_adds_epu16(__m256i __a, __m256i __b)
125
{
126
return (__m256i)__builtin_ia32_paddusw256((__v16hi)__a, (__v16hi)__b);
127
}
128
129
#define _mm256_alignr_epi8(a, b, n) __extension__ ({ \
130
(__m256i)__builtin_ia32_palignr256((__v32qi)(__m256i)(a), \
131
(__v32qi)(__m256i)(b), (n)); })
132
133
static __inline__ __m256i __DEFAULT_FN_ATTRS
134
_mm256_and_si256(__m256i __a, __m256i __b)
135
{
136
return (__m256i)((__v4du)__a & (__v4du)__b);
137
}
138
139
static __inline__ __m256i __DEFAULT_FN_ATTRS
140
_mm256_andnot_si256(__m256i __a, __m256i __b)
141
{
142
return (__m256i)(~(__v4du)__a & (__v4du)__b);
143
}
144
145
static __inline__ __m256i __DEFAULT_FN_ATTRS
146
_mm256_avg_epu8(__m256i __a, __m256i __b)
147
{
148
return (__m256i)__builtin_ia32_pavgb256((__v32qi)__a, (__v32qi)__b);
149
}
150
151
static __inline__ __m256i __DEFAULT_FN_ATTRS
152
_mm256_avg_epu16(__m256i __a, __m256i __b)
153
{
154
return (__m256i)__builtin_ia32_pavgw256((__v16hi)__a, (__v16hi)__b);
155
}
156
157
static __inline__ __m256i __DEFAULT_FN_ATTRS
158
_mm256_blendv_epi8(__m256i __V1, __m256i __V2, __m256i __M)
159
{
160
return (__m256i)__builtin_ia32_pblendvb256((__v32qi)__V1, (__v32qi)__V2,
161
(__v32qi)__M);
162
}
163
164
#define _mm256_blend_epi16(V1, V2, M) __extension__ ({ \
165
(__m256i)__builtin_shufflevector((__v16hi)(__m256i)(V1), \
166
(__v16hi)(__m256i)(V2), \
167
(((M) & 0x01) ? 16 : 0), \
168
(((M) & 0x02) ? 17 : 1), \
169
(((M) & 0x04) ? 18 : 2), \
170
(((M) & 0x08) ? 19 : 3), \
171
(((M) & 0x10) ? 20 : 4), \
172
(((M) & 0x20) ? 21 : 5), \
173
(((M) & 0x40) ? 22 : 6), \
174
(((M) & 0x80) ? 23 : 7), \
175
(((M) & 0x01) ? 24 : 8), \
176
(((M) & 0x02) ? 25 : 9), \
177
(((M) & 0x04) ? 26 : 10), \
178
(((M) & 0x08) ? 27 : 11), \
179
(((M) & 0x10) ? 28 : 12), \
180
(((M) & 0x20) ? 29 : 13), \
181
(((M) & 0x40) ? 30 : 14), \
182
(((M) & 0x80) ? 31 : 15)); })
183
184
static __inline__ __m256i __DEFAULT_FN_ATTRS
185
_mm256_cmpeq_epi8(__m256i __a, __m256i __b)
186
{
187
return (__m256i)((__v32qi)__a == (__v32qi)__b);
188
}
189
190
static __inline__ __m256i __DEFAULT_FN_ATTRS
191
_mm256_cmpeq_epi16(__m256i __a, __m256i __b)
192
{
193
return (__m256i)((__v16hi)__a == (__v16hi)__b);
194
}
195
196
static __inline__ __m256i __DEFAULT_FN_ATTRS
197
_mm256_cmpeq_epi32(__m256i __a, __m256i __b)
198
{
199
return (__m256i)((__v8si)__a == (__v8si)__b);
200
}
201
202
static __inline__ __m256i __DEFAULT_FN_ATTRS
203
_mm256_cmpeq_epi64(__m256i __a, __m256i __b)
204
{
205
return (__m256i)((__v4di)__a == (__v4di)__b);
206
}
207
208
static __inline__ __m256i __DEFAULT_FN_ATTRS
209
_mm256_cmpgt_epi8(__m256i __a, __m256i __b)
210
{
211
/* This function always performs a signed comparison, but __v32qi is a char
212
which may be signed or unsigned, so use __v32qs. */
213
return (__m256i)((__v32qs)__a > (__v32qs)__b);
214
}
215
216
static __inline__ __m256i __DEFAULT_FN_ATTRS
217
_mm256_cmpgt_epi16(__m256i __a, __m256i __b)
218
{
219
return (__m256i)((__v16hi)__a > (__v16hi)__b);
220
}
221
222
static __inline__ __m256i __DEFAULT_FN_ATTRS
223
_mm256_cmpgt_epi32(__m256i __a, __m256i __b)
224
{
225
return (__m256i)((__v8si)__a > (__v8si)__b);
226
}
227
228
static __inline__ __m256i __DEFAULT_FN_ATTRS
229
_mm256_cmpgt_epi64(__m256i __a, __m256i __b)
230
{
231
return (__m256i)((__v4di)__a > (__v4di)__b);
232
}
233
234
static __inline__ __m256i __DEFAULT_FN_ATTRS
235
_mm256_hadd_epi16(__m256i __a, __m256i __b)
236
{
237
return (__m256i)__builtin_ia32_phaddw256((__v16hi)__a, (__v16hi)__b);
238
}
239
240
static __inline__ __m256i __DEFAULT_FN_ATTRS
241
_mm256_hadd_epi32(__m256i __a, __m256i __b)
242
{
243
return (__m256i)__builtin_ia32_phaddd256((__v8si)__a, (__v8si)__b);
244
}
245
246
static __inline__ __m256i __DEFAULT_FN_ATTRS
247
_mm256_hadds_epi16(__m256i __a, __m256i __b)
248
{
249
return (__m256i)__builtin_ia32_phaddsw256((__v16hi)__a, (__v16hi)__b);
250
}
251
252
static __inline__ __m256i __DEFAULT_FN_ATTRS
253
_mm256_hsub_epi16(__m256i __a, __m256i __b)
254
{
255
return (__m256i)__builtin_ia32_phsubw256((__v16hi)__a, (__v16hi)__b);
256
}
257
258
static __inline__ __m256i __DEFAULT_FN_ATTRS
259
_mm256_hsub_epi32(__m256i __a, __m256i __b)
260
{
261
return (__m256i)__builtin_ia32_phsubd256((__v8si)__a, (__v8si)__b);
262
}
263
264
static __inline__ __m256i __DEFAULT_FN_ATTRS
265
_mm256_hsubs_epi16(__m256i __a, __m256i __b)
266
{
267
return (__m256i)__builtin_ia32_phsubsw256((__v16hi)__a, (__v16hi)__b);
268
}
269
270
static __inline__ __m256i __DEFAULT_FN_ATTRS
271
_mm256_maddubs_epi16(__m256i __a, __m256i __b)
272
{
273
return (__m256i)__builtin_ia32_pmaddubsw256((__v32qi)__a, (__v32qi)__b);
274
}
275
276
static __inline__ __m256i __DEFAULT_FN_ATTRS
277
_mm256_madd_epi16(__m256i __a, __m256i __b)
278
{
279
return (__m256i)__builtin_ia32_pmaddwd256((__v16hi)__a, (__v16hi)__b);
280
}
281
282
static __inline__ __m256i __DEFAULT_FN_ATTRS
283
_mm256_max_epi8(__m256i __a, __m256i __b)
284
{
285
return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)__a, (__v32qi)__b);
286
}
287
288
static __inline__ __m256i __DEFAULT_FN_ATTRS
289
_mm256_max_epi16(__m256i __a, __m256i __b)
290
{
291
return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)__a, (__v16hi)__b);
292
}
293
294
static __inline__ __m256i __DEFAULT_FN_ATTRS
295
_mm256_max_epi32(__m256i __a, __m256i __b)
296
{
297
return (__m256i)__builtin_ia32_pmaxsd256((__v8si)__a, (__v8si)__b);
298
}
299
300
static __inline__ __m256i __DEFAULT_FN_ATTRS
301
_mm256_max_epu8(__m256i __a, __m256i __b)
302
{
303
return (__m256i)__builtin_ia32_pmaxub256((__v32qi)__a, (__v32qi)__b);
304
}
305
306
static __inline__ __m256i __DEFAULT_FN_ATTRS
307
_mm256_max_epu16(__m256i __a, __m256i __b)
308
{
309
return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)__a, (__v16hi)__b);
310
}
311
312
static __inline__ __m256i __DEFAULT_FN_ATTRS
313
_mm256_max_epu32(__m256i __a, __m256i __b)
314
{
315
return (__m256i)__builtin_ia32_pmaxud256((__v8si)__a, (__v8si)__b);
316
}
317
318
static __inline__ __m256i __DEFAULT_FN_ATTRS
319
_mm256_min_epi8(__m256i __a, __m256i __b)
320
{
321
return (__m256i)__builtin_ia32_pminsb256((__v32qi)__a, (__v32qi)__b);
322
}
323
324
static __inline__ __m256i __DEFAULT_FN_ATTRS
325
_mm256_min_epi16(__m256i __a, __m256i __b)
326
{
327
return (__m256i)__builtin_ia32_pminsw256((__v16hi)__a, (__v16hi)__b);
328
}
329
330
static __inline__ __m256i __DEFAULT_FN_ATTRS
331
_mm256_min_epi32(__m256i __a, __m256i __b)
332
{
333
return (__m256i)__builtin_ia32_pminsd256((__v8si)__a, (__v8si)__b);
334
}
335
336
static __inline__ __m256i __DEFAULT_FN_ATTRS
337
_mm256_min_epu8(__m256i __a, __m256i __b)
338
{
339
return (__m256i)__builtin_ia32_pminub256((__v32qi)__a, (__v32qi)__b);
340
}
341
342
static __inline__ __m256i __DEFAULT_FN_ATTRS
343
_mm256_min_epu16(__m256i __a, __m256i __b)
344
{
345
return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)__a, (__v16hi)__b);
346
}
347
348
static __inline__ __m256i __DEFAULT_FN_ATTRS
349
_mm256_min_epu32(__m256i __a, __m256i __b)
350
{
351
return (__m256i)__builtin_ia32_pminud256((__v8si)__a, (__v8si)__b);
352
}
353
354
static __inline__ int __DEFAULT_FN_ATTRS
355
_mm256_movemask_epi8(__m256i __a)
356
{
357
return __builtin_ia32_pmovmskb256((__v32qi)__a);
358
}
359
360
static __inline__ __m256i __DEFAULT_FN_ATTRS
361
_mm256_cvtepi8_epi16(__m128i __V)
362
{
363
/* This function always performs a signed extension, but __v16qi is a char
364
which may be signed or unsigned, so use __v16qs. */
365
return (__m256i)__builtin_convertvector((__v16qs)__V, __v16hi);
366
}
367
368
static __inline__ __m256i __DEFAULT_FN_ATTRS
369
_mm256_cvtepi8_epi32(__m128i __V)
370
{
371
/* This function always performs a signed extension, but __v16qi is a char
372
which may be signed or unsigned, so use __v16qs. */
373
return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8si);
374
}
375
376
static __inline__ __m256i __DEFAULT_FN_ATTRS
377
_mm256_cvtepi8_epi64(__m128i __V)
378
{
379
/* This function always performs a signed extension, but __v16qi is a char
380
which may be signed or unsigned, so use __v16qs. */
381
return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3), __v4di);
382
}
383
384
static __inline__ __m256i __DEFAULT_FN_ATTRS
385
_mm256_cvtepi16_epi32(__m128i __V)
386
{
387
return (__m256i)__builtin_convertvector((__v8hi)__V, __v8si);
388
}
389
390
static __inline__ __m256i __DEFAULT_FN_ATTRS
391
_mm256_cvtepi16_epi64(__m128i __V)
392
{
393
return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1, 2, 3), __v4di);
394
}
395
396
static __inline__ __m256i __DEFAULT_FN_ATTRS
397
_mm256_cvtepi32_epi64(__m128i __V)
398
{
399
return (__m256i)__builtin_convertvector((__v4si)__V, __v4di);
400
}
401
402
static __inline__ __m256i __DEFAULT_FN_ATTRS
403
_mm256_cvtepu8_epi16(__m128i __V)
404
{
405
return (__m256i)__builtin_convertvector((__v16qu)__V, __v16hi);
406
}
407
408
static __inline__ __m256i __DEFAULT_FN_ATTRS
409
_mm256_cvtepu8_epi32(__m128i __V)
410
{
411
return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8si);
412
}
413
414
static __inline__ __m256i __DEFAULT_FN_ATTRS
415
_mm256_cvtepu8_epi64(__m128i __V)
416
{
417
return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3), __v4di);
418
}
419
420
static __inline__ __m256i __DEFAULT_FN_ATTRS
421
_mm256_cvtepu16_epi32(__m128i __V)
422
{
423
return (__m256i)__builtin_convertvector((__v8hu)__V, __v8si);
424
}
425
426
static __inline__ __m256i __DEFAULT_FN_ATTRS
427
_mm256_cvtepu16_epi64(__m128i __V)
428
{
429
return (__m256i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1, 2, 3), __v4di);
430
}
431
432
static __inline__ __m256i __DEFAULT_FN_ATTRS
433
_mm256_cvtepu32_epi64(__m128i __V)
434
{
435
return (__m256i)__builtin_convertvector((__v4su)__V, __v4di);
436
}
437
438
static __inline__ __m256i __DEFAULT_FN_ATTRS
439
_mm256_mul_epi32(__m256i __a, __m256i __b)
440
{
441
return (__m256i)__builtin_ia32_pmuldq256((__v8si)__a, (__v8si)__b);
442
}
443
444
static __inline__ __m256i __DEFAULT_FN_ATTRS
445
_mm256_mulhrs_epi16(__m256i __a, __m256i __b)
446
{
447
return (__m256i)__builtin_ia32_pmulhrsw256((__v16hi)__a, (__v16hi)__b);
448
}
449
450
static __inline__ __m256i __DEFAULT_FN_ATTRS
451
_mm256_mulhi_epu16(__m256i __a, __m256i __b)
452
{
453
return (__m256i)__builtin_ia32_pmulhuw256((__v16hi)__a, (__v16hi)__b);
454
}
455
456
static __inline__ __m256i __DEFAULT_FN_ATTRS
457
_mm256_mulhi_epi16(__m256i __a, __m256i __b)
458
{
459
return (__m256i)__builtin_ia32_pmulhw256((__v16hi)__a, (__v16hi)__b);
460
}
461
462
static __inline__ __m256i __DEFAULT_FN_ATTRS
463
_mm256_mullo_epi16(__m256i __a, __m256i __b)
464
{
465
return (__m256i)((__v16hu)__a * (__v16hu)__b);
466
}
467
468
static __inline__ __m256i __DEFAULT_FN_ATTRS
469
_mm256_mullo_epi32 (__m256i __a, __m256i __b)
470
{
471
return (__m256i)((__v8su)__a * (__v8su)__b);
472
}
473
474
static __inline__ __m256i __DEFAULT_FN_ATTRS
475
_mm256_mul_epu32(__m256i __a, __m256i __b)
476
{
477
return __builtin_ia32_pmuludq256((__v8si)__a, (__v8si)__b);
478
}
479
480
static __inline__ __m256i __DEFAULT_FN_ATTRS
481
_mm256_or_si256(__m256i __a, __m256i __b)
482
{
483
return (__m256i)((__v4du)__a | (__v4du)__b);
484
}
485
486
static __inline__ __m256i __DEFAULT_FN_ATTRS
487
_mm256_sad_epu8(__m256i __a, __m256i __b)
488
{
489
return __builtin_ia32_psadbw256((__v32qi)__a, (__v32qi)__b);
490
}
491
492
static __inline__ __m256i __DEFAULT_FN_ATTRS
493
_mm256_shuffle_epi8(__m256i __a, __m256i __b)
494
{
495
return (__m256i)__builtin_ia32_pshufb256((__v32qi)__a, (__v32qi)__b);
496
}
497
498
#define _mm256_shuffle_epi32(a, imm) __extension__ ({ \
499
(__m256i)__builtin_shufflevector((__v8si)(__m256i)(a), \
500
(__v8si)_mm256_undefined_si256(), \
501
0 + (((imm) >> 0) & 0x3), \
502
0 + (((imm) >> 2) & 0x3), \
503
0 + (((imm) >> 4) & 0x3), \
504
0 + (((imm) >> 6) & 0x3), \
505
4 + (((imm) >> 0) & 0x3), \
506
4 + (((imm) >> 2) & 0x3), \
507
4 + (((imm) >> 4) & 0x3), \
508
4 + (((imm) >> 6) & 0x3)); })
509
510
#define _mm256_shufflehi_epi16(a, imm) __extension__ ({ \
511
(__m256i)__builtin_shufflevector((__v16hi)(__m256i)(a), \
512
(__v16hi)_mm256_undefined_si256(), \
513
0, 1, 2, 3, \
514
4 + (((imm) >> 0) & 0x3), \
515
4 + (((imm) >> 2) & 0x3), \
516
4 + (((imm) >> 4) & 0x3), \
517
4 + (((imm) >> 6) & 0x3), \
518
8, 9, 10, 11, \
519
12 + (((imm) >> 0) & 0x3), \
520
12 + (((imm) >> 2) & 0x3), \
521
12 + (((imm) >> 4) & 0x3), \
522
12 + (((imm) >> 6) & 0x3)); })
523
524
#define _mm256_shufflelo_epi16(a, imm) __extension__ ({ \
525
(__m256i)__builtin_shufflevector((__v16hi)(__m256i)(a), \
526
(__v16hi)_mm256_undefined_si256(), \
527
0 + (((imm) >> 0) & 0x3), \
528
0 + (((imm) >> 2) & 0x3), \
529
0 + (((imm) >> 4) & 0x3), \
530
0 + (((imm) >> 6) & 0x3), \
531
4, 5, 6, 7, \
532
8 + (((imm) >> 0) & 0x3), \
533
8 + (((imm) >> 2) & 0x3), \
534
8 + (((imm) >> 4) & 0x3), \
535
8 + (((imm) >> 6) & 0x3), \
536
12, 13, 14, 15); })
537
538
static __inline__ __m256i __DEFAULT_FN_ATTRS
539
_mm256_sign_epi8(__m256i __a, __m256i __b)
540
{
541
return (__m256i)__builtin_ia32_psignb256((__v32qi)__a, (__v32qi)__b);
542
}
543
544
static __inline__ __m256i __DEFAULT_FN_ATTRS
545
_mm256_sign_epi16(__m256i __a, __m256i __b)
546
{
547
return (__m256i)__builtin_ia32_psignw256((__v16hi)__a, (__v16hi)__b);
548
}
549
550
static __inline__ __m256i __DEFAULT_FN_ATTRS
551
_mm256_sign_epi32(__m256i __a, __m256i __b)
552
{
553
return (__m256i)__builtin_ia32_psignd256((__v8si)__a, (__v8si)__b);
554
}
555
556
#define _mm256_slli_si256(a, imm) __extension__ ({ \
557
(__m256i)__builtin_shufflevector( \
558
(__v32qi)_mm256_setzero_si256(), \
559
(__v32qi)(__m256i)(a), \
560
((char)(imm)&0xF0) ? 0 : ((char)(imm)>0x0 ? 16 : 32) - (char)(imm), \
561
((char)(imm)&0xF0) ? 1 : ((char)(imm)>0x1 ? 17 : 33) - (char)(imm), \
562
((char)(imm)&0xF0) ? 2 : ((char)(imm)>0x2 ? 18 : 34) - (char)(imm), \
563
((char)(imm)&0xF0) ? 3 : ((char)(imm)>0x3 ? 19 : 35) - (char)(imm), \
564
((char)(imm)&0xF0) ? 4 : ((char)(imm)>0x4 ? 20 : 36) - (char)(imm), \
565
((char)(imm)&0xF0) ? 5 : ((char)(imm)>0x5 ? 21 : 37) - (char)(imm), \
566
((char)(imm)&0xF0) ? 6 : ((char)(imm)>0x6 ? 22 : 38) - (char)(imm), \
567
((char)(imm)&0xF0) ? 7 : ((char)(imm)>0x7 ? 23 : 39) - (char)(imm), \
568
((char)(imm)&0xF0) ? 8 : ((char)(imm)>0x8 ? 24 : 40) - (char)(imm), \
569
((char)(imm)&0xF0) ? 9 : ((char)(imm)>0x9 ? 25 : 41) - (char)(imm), \
570
((char)(imm)&0xF0) ? 10 : ((char)(imm)>0xA ? 26 : 42) - (char)(imm), \
571
((char)(imm)&0xF0) ? 11 : ((char)(imm)>0xB ? 27 : 43) - (char)(imm), \
572
((char)(imm)&0xF0) ? 12 : ((char)(imm)>0xC ? 28 : 44) - (char)(imm), \
573
((char)(imm)&0xF0) ? 13 : ((char)(imm)>0xD ? 29 : 45) - (char)(imm), \
574
((char)(imm)&0xF0) ? 14 : ((char)(imm)>0xE ? 30 : 46) - (char)(imm), \
575
((char)(imm)&0xF0) ? 15 : ((char)(imm)>0xF ? 31 : 47) - (char)(imm), \
576
((char)(imm)&0xF0) ? 16 : ((char)(imm)>0x0 ? 32 : 48) - (char)(imm), \
577
((char)(imm)&0xF0) ? 17 : ((char)(imm)>0x1 ? 33 : 49) - (char)(imm), \
578
((char)(imm)&0xF0) ? 18 : ((char)(imm)>0x2 ? 34 : 50) - (char)(imm), \
579
((char)(imm)&0xF0) ? 19 : ((char)(imm)>0x3 ? 35 : 51) - (char)(imm), \
580
((char)(imm)&0xF0) ? 20 : ((char)(imm)>0x4 ? 36 : 52) - (char)(imm), \
581
((char)(imm)&0xF0) ? 21 : ((char)(imm)>0x5 ? 37 : 53) - (char)(imm), \
582
((char)(imm)&0xF0) ? 22 : ((char)(imm)>0x6 ? 38 : 54) - (char)(imm), \
583
((char)(imm)&0xF0) ? 23 : ((char)(imm)>0x7 ? 39 : 55) - (char)(imm), \
584
((char)(imm)&0xF0) ? 24 : ((char)(imm)>0x8 ? 40 : 56) - (char)(imm), \
585
((char)(imm)&0xF0) ? 25 : ((char)(imm)>0x9 ? 41 : 57) - (char)(imm), \
586
((char)(imm)&0xF0) ? 26 : ((char)(imm)>0xA ? 42 : 58) - (char)(imm), \
587
((char)(imm)&0xF0) ? 27 : ((char)(imm)>0xB ? 43 : 59) - (char)(imm), \
588
((char)(imm)&0xF0) ? 28 : ((char)(imm)>0xC ? 44 : 60) - (char)(imm), \
589
((char)(imm)&0xF0) ? 29 : ((char)(imm)>0xD ? 45 : 61) - (char)(imm), \
590
((char)(imm)&0xF0) ? 30 : ((char)(imm)>0xE ? 46 : 62) - (char)(imm), \
591
((char)(imm)&0xF0) ? 31 : ((char)(imm)>0xF ? 47 : 63) - (char)(imm)); })
592
593
#define _mm256_bslli_epi128(a, count) _mm256_slli_si256((a), (count))
594
595
static __inline__ __m256i __DEFAULT_FN_ATTRS
596
_mm256_slli_epi16(__m256i __a, int __count)
597
{
598
return (__m256i)__builtin_ia32_psllwi256((__v16hi)__a, __count);
599
}
600
601
static __inline__ __m256i __DEFAULT_FN_ATTRS
602
_mm256_sll_epi16(__m256i __a, __m128i __count)
603
{
604
return (__m256i)__builtin_ia32_psllw256((__v16hi)__a, (__v8hi)__count);
605
}
606
607
static __inline__ __m256i __DEFAULT_FN_ATTRS
608
_mm256_slli_epi32(__m256i __a, int __count)
609
{
610
return (__m256i)__builtin_ia32_pslldi256((__v8si)__a, __count);
611
}
612
613
static __inline__ __m256i __DEFAULT_FN_ATTRS
614
_mm256_sll_epi32(__m256i __a, __m128i __count)
615
{
616
return (__m256i)__builtin_ia32_pslld256((__v8si)__a, (__v4si)__count);
617
}
618
619
static __inline__ __m256i __DEFAULT_FN_ATTRS
620
_mm256_slli_epi64(__m256i __a, int __count)
621
{
622
return __builtin_ia32_psllqi256((__v4di)__a, __count);
623
}
624
625
static __inline__ __m256i __DEFAULT_FN_ATTRS
626
_mm256_sll_epi64(__m256i __a, __m128i __count)
627
{
628
return __builtin_ia32_psllq256((__v4di)__a, __count);
629
}
630
631
static __inline__ __m256i __DEFAULT_FN_ATTRS
632
_mm256_srai_epi16(__m256i __a, int __count)
633
{
634
return (__m256i)__builtin_ia32_psrawi256((__v16hi)__a, __count);
635
}
636
637
static __inline__ __m256i __DEFAULT_FN_ATTRS
638
_mm256_sra_epi16(__m256i __a, __m128i __count)
639
{
640
return (__m256i)__builtin_ia32_psraw256((__v16hi)__a, (__v8hi)__count);
641
}
642
643
static __inline__ __m256i __DEFAULT_FN_ATTRS
644
_mm256_srai_epi32(__m256i __a, int __count)
645
{
646
return (__m256i)__builtin_ia32_psradi256((__v8si)__a, __count);
647
}
648
649
static __inline__ __m256i __DEFAULT_FN_ATTRS
650
_mm256_sra_epi32(__m256i __a, __m128i __count)
651
{
652
return (__m256i)__builtin_ia32_psrad256((__v8si)__a, (__v4si)__count);
653
}
654
655
#define _mm256_srli_si256(a, imm) __extension__ ({ \
656
(__m256i)__builtin_shufflevector( \
657
(__v32qi)(__m256i)(a), \
658
(__v32qi)_mm256_setzero_si256(), \
659
((char)(imm)&0xF0) ? 32 : (char)(imm) + ((char)(imm)>0xF ? 16 : 0), \
660
((char)(imm)&0xF0) ? 33 : (char)(imm) + ((char)(imm)>0xE ? 17 : 1), \
661
((char)(imm)&0xF0) ? 34 : (char)(imm) + ((char)(imm)>0xD ? 18 : 2), \
662
((char)(imm)&0xF0) ? 35 : (char)(imm) + ((char)(imm)>0xC ? 19 : 3), \
663
((char)(imm)&0xF0) ? 36 : (char)(imm) + ((char)(imm)>0xB ? 20 : 4), \
664
((char)(imm)&0xF0) ? 37 : (char)(imm) + ((char)(imm)>0xA ? 21 : 5), \
665
((char)(imm)&0xF0) ? 38 : (char)(imm) + ((char)(imm)>0x9 ? 22 : 6), \
666
((char)(imm)&0xF0) ? 39 : (char)(imm) + ((char)(imm)>0x8 ? 23 : 7), \
667
((char)(imm)&0xF0) ? 40 : (char)(imm) + ((char)(imm)>0x7 ? 24 : 8), \
668
((char)(imm)&0xF0) ? 41 : (char)(imm) + ((char)(imm)>0x6 ? 25 : 9), \
669
((char)(imm)&0xF0) ? 42 : (char)(imm) + ((char)(imm)>0x5 ? 26 : 10), \
670
((char)(imm)&0xF0) ? 43 : (char)(imm) + ((char)(imm)>0x4 ? 27 : 11), \
671
((char)(imm)&0xF0) ? 44 : (char)(imm) + ((char)(imm)>0x3 ? 28 : 12), \
672
((char)(imm)&0xF0) ? 45 : (char)(imm) + ((char)(imm)>0x2 ? 29 : 13), \
673
((char)(imm)&0xF0) ? 46 : (char)(imm) + ((char)(imm)>0x1 ? 30 : 14), \
674
((char)(imm)&0xF0) ? 47 : (char)(imm) + ((char)(imm)>0x0 ? 31 : 15), \
675
((char)(imm)&0xF0) ? 48 : (char)(imm) + ((char)(imm)>0xF ? 32 : 16), \
676
((char)(imm)&0xF0) ? 49 : (char)(imm) + ((char)(imm)>0xE ? 33 : 17), \
677
((char)(imm)&0xF0) ? 50 : (char)(imm) + ((char)(imm)>0xD ? 34 : 18), \
678
((char)(imm)&0xF0) ? 51 : (char)(imm) + ((char)(imm)>0xC ? 35 : 19), \
679
((char)(imm)&0xF0) ? 52 : (char)(imm) + ((char)(imm)>0xB ? 36 : 20), \
680
((char)(imm)&0xF0) ? 53 : (char)(imm) + ((char)(imm)>0xA ? 37 : 21), \
681
((char)(imm)&0xF0) ? 54 : (char)(imm) + ((char)(imm)>0x9 ? 38 : 22), \
682
((char)(imm)&0xF0) ? 55 : (char)(imm) + ((char)(imm)>0x8 ? 39 : 23), \
683
((char)(imm)&0xF0) ? 56 : (char)(imm) + ((char)(imm)>0x7 ? 40 : 24), \
684
((char)(imm)&0xF0) ? 57 : (char)(imm) + ((char)(imm)>0x6 ? 41 : 25), \
685
((char)(imm)&0xF0) ? 58 : (char)(imm) + ((char)(imm)>0x5 ? 42 : 26), \
686
((char)(imm)&0xF0) ? 59 : (char)(imm) + ((char)(imm)>0x4 ? 43 : 27), \
687
((char)(imm)&0xF0) ? 60 : (char)(imm) + ((char)(imm)>0x3 ? 44 : 28), \
688
((char)(imm)&0xF0) ? 61 : (char)(imm) + ((char)(imm)>0x2 ? 45 : 29), \
689
((char)(imm)&0xF0) ? 62 : (char)(imm) + ((char)(imm)>0x1 ? 46 : 30), \
690
((char)(imm)&0xF0) ? 63 : (char)(imm) + ((char)(imm)>0x0 ? 47 : 31)); })
691
692
#define _mm256_bsrli_epi128(a, count) _mm256_srli_si256((a), (count))
693
694
static __inline__ __m256i __DEFAULT_FN_ATTRS
695
_mm256_srli_epi16(__m256i __a, int __count)
696
{
697
return (__m256i)__builtin_ia32_psrlwi256((__v16hi)__a, __count);
698
}
699
700
static __inline__ __m256i __DEFAULT_FN_ATTRS
701
_mm256_srl_epi16(__m256i __a, __m128i __count)
702
{
703
return (__m256i)__builtin_ia32_psrlw256((__v16hi)__a, (__v8hi)__count);
704
}
705
706
static __inline__ __m256i __DEFAULT_FN_ATTRS
707
_mm256_srli_epi32(__m256i __a, int __count)
708
{
709
return (__m256i)__builtin_ia32_psrldi256((__v8si)__a, __count);
710
}
711
712
static __inline__ __m256i __DEFAULT_FN_ATTRS
713
_mm256_srl_epi32(__m256i __a, __m128i __count)
714
{
715
return (__m256i)__builtin_ia32_psrld256((__v8si)__a, (__v4si)__count);
716
}
717
718
static __inline__ __m256i __DEFAULT_FN_ATTRS
719
_mm256_srli_epi64(__m256i __a, int __count)
720
{
721
return __builtin_ia32_psrlqi256((__v4di)__a, __count);
722
}
723
724
static __inline__ __m256i __DEFAULT_FN_ATTRS
725
_mm256_srl_epi64(__m256i __a, __m128i __count)
726
{
727
return __builtin_ia32_psrlq256((__v4di)__a, __count);
728
}
729
730
static __inline__ __m256i __DEFAULT_FN_ATTRS
731
_mm256_sub_epi8(__m256i __a, __m256i __b)
732
{
733
return (__m256i)((__v32qu)__a - (__v32qu)__b);
734
}
735
736
static __inline__ __m256i __DEFAULT_FN_ATTRS
737
_mm256_sub_epi16(__m256i __a, __m256i __b)
738
{
739
return (__m256i)((__v16hu)__a - (__v16hu)__b);
740
}
741
742
static __inline__ __m256i __DEFAULT_FN_ATTRS
743
_mm256_sub_epi32(__m256i __a, __m256i __b)
744
{
745
return (__m256i)((__v8su)__a - (__v8su)__b);
746
}
747
748
static __inline__ __m256i __DEFAULT_FN_ATTRS
749
_mm256_sub_epi64(__m256i __a, __m256i __b)
750
{
751
return (__m256i)((__v4du)__a - (__v4du)__b);
752
}
753
754
static __inline__ __m256i __DEFAULT_FN_ATTRS
755
_mm256_subs_epi8(__m256i __a, __m256i __b)
756
{
757
return (__m256i)__builtin_ia32_psubsb256((__v32qi)__a, (__v32qi)__b);
758
}
759
760
static __inline__ __m256i __DEFAULT_FN_ATTRS
761
_mm256_subs_epi16(__m256i __a, __m256i __b)
762
{
763
return (__m256i)__builtin_ia32_psubsw256((__v16hi)__a, (__v16hi)__b);
764
}
765
766
static __inline__ __m256i __DEFAULT_FN_ATTRS
767
_mm256_subs_epu8(__m256i __a, __m256i __b)
768
{
769
return (__m256i)__builtin_ia32_psubusb256((__v32qi)__a, (__v32qi)__b);
770
}
771
772
static __inline__ __m256i __DEFAULT_FN_ATTRS
773
_mm256_subs_epu16(__m256i __a, __m256i __b)
774
{
775
return (__m256i)__builtin_ia32_psubusw256((__v16hi)__a, (__v16hi)__b);
776
}
777
778
static __inline__ __m256i __DEFAULT_FN_ATTRS
779
_mm256_unpackhi_epi8(__m256i __a, __m256i __b)
780
{
781
return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 8, 32+8, 9, 32+9, 10, 32+10, 11, 32+11, 12, 32+12, 13, 32+13, 14, 32+14, 15, 32+15, 24, 32+24, 25, 32+25, 26, 32+26, 27, 32+27, 28, 32+28, 29, 32+29, 30, 32+30, 31, 32+31);
782
}
783
784
static __inline__ __m256i __DEFAULT_FN_ATTRS
785
_mm256_unpackhi_epi16(__m256i __a, __m256i __b)
786
{
787
return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
788
}
789
790
static __inline__ __m256i __DEFAULT_FN_ATTRS
791
_mm256_unpackhi_epi32(__m256i __a, __m256i __b)
792
{
793
return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 2, 8+2, 3, 8+3, 6, 8+6, 7, 8+7);
794
}
795
796
static __inline__ __m256i __DEFAULT_FN_ATTRS
797
_mm256_unpackhi_epi64(__m256i __a, __m256i __b)
798
{
799
return (__m256i)__builtin_shufflevector((__v4di)__a, (__v4di)__b, 1, 4+1, 3, 4+3);
800
}
801
802
static __inline__ __m256i __DEFAULT_FN_ATTRS
803
_mm256_unpacklo_epi8(__m256i __a, __m256i __b)
804
{
805
return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 0, 32+0, 1, 32+1, 2, 32+2, 3, 32+3, 4, 32+4, 5, 32+5, 6, 32+6, 7, 32+7, 16, 32+16, 17, 32+17, 18, 32+18, 19, 32+19, 20, 32+20, 21, 32+21, 22, 32+22, 23, 32+23);
806
}
807
808
static __inline__ __m256i __DEFAULT_FN_ATTRS
809
_mm256_unpacklo_epi16(__m256i __a, __m256i __b)
810
{
811
return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11);
812
}
813
814
static __inline__ __m256i __DEFAULT_FN_ATTRS
815
_mm256_unpacklo_epi32(__m256i __a, __m256i __b)
816
{
817
return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 0, 8+0, 1, 8+1, 4, 8+4, 5, 8+5);
818
}
819
820
static __inline__ __m256i __DEFAULT_FN_ATTRS
821
_mm256_unpacklo_epi64(__m256i __a, __m256i __b)
822
{
823
return (__m256i)__builtin_shufflevector((__v4di)__a, (__v4di)__b, 0, 4+0, 2, 4+2);
824
}
825
826
static __inline__ __m256i __DEFAULT_FN_ATTRS
827
_mm256_xor_si256(__m256i __a, __m256i __b)
828
{
829
return (__m256i)((__v4du)__a ^ (__v4du)__b);
830
}
831
832
static __inline__ __m256i __DEFAULT_FN_ATTRS
833
_mm256_stream_load_si256(__m256i const *__V)
834
{
835
return (__m256i)__builtin_ia32_movntdqa256((const __v4di *)__V);
836
}
837
838
static __inline__ __m128 __DEFAULT_FN_ATTRS
839
_mm_broadcastss_ps(__m128 __X)
840
{
841
return (__m128)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0);
842
}
843
844
static __inline__ __m128d __DEFAULT_FN_ATTRS
845
_mm_broadcastsd_pd(__m128d __a)
846
{
847
return __builtin_shufflevector((__v2df)__a, (__v2df)__a, 0, 0);
848
}
849
850
static __inline__ __m256 __DEFAULT_FN_ATTRS
851
_mm256_broadcastss_ps(__m128 __X)
852
{
853
return (__m256)__builtin_shufflevector((__v4sf)__X, (__v4sf)__X, 0, 0, 0, 0, 0, 0, 0, 0);
854
}
855
856
static __inline__ __m256d __DEFAULT_FN_ATTRS
857
_mm256_broadcastsd_pd(__m128d __X)
858
{
859
return (__m256d)__builtin_shufflevector((__v2df)__X, (__v2df)__X, 0, 0, 0, 0);
860
}
861
862
static __inline__ __m256i __DEFAULT_FN_ATTRS
863
_mm256_broadcastsi128_si256(__m128i __X)
864
{
865
return (__m256i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 1, 0, 1);
866
}
867
868
#define _mm_blend_epi32(V1, V2, M) __extension__ ({ \
869
(__m128i)__builtin_shufflevector((__v4si)(__m128i)(V1), \
870
(__v4si)(__m128i)(V2), \
871
(((M) & 0x01) ? 4 : 0), \
872
(((M) & 0x02) ? 5 : 1), \
873
(((M) & 0x04) ? 6 : 2), \
874
(((M) & 0x08) ? 7 : 3)); })
875
876
#define _mm256_blend_epi32(V1, V2, M) __extension__ ({ \
877
(__m256i)__builtin_shufflevector((__v8si)(__m256i)(V1), \
878
(__v8si)(__m256i)(V2), \
879
(((M) & 0x01) ? 8 : 0), \
880
(((M) & 0x02) ? 9 : 1), \
881
(((M) & 0x04) ? 10 : 2), \
882
(((M) & 0x08) ? 11 : 3), \
883
(((M) & 0x10) ? 12 : 4), \
884
(((M) & 0x20) ? 13 : 5), \
885
(((M) & 0x40) ? 14 : 6), \
886
(((M) & 0x80) ? 15 : 7)); })
887
888
static __inline__ __m256i __DEFAULT_FN_ATTRS
889
_mm256_broadcastb_epi8(__m128i __X)
890
{
891
return (__m256i)__builtin_shufflevector((__v16qi)__X, (__v16qi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
892
}
893
894
static __inline__ __m256i __DEFAULT_FN_ATTRS
895
_mm256_broadcastw_epi16(__m128i __X)
896
{
897
return (__m256i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
898
}
899
900
static __inline__ __m256i __DEFAULT_FN_ATTRS
901
_mm256_broadcastd_epi32(__m128i __X)
902
{
903
return (__m256i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0, 0, 0, 0, 0);
904
}
905
906
static __inline__ __m256i __DEFAULT_FN_ATTRS
907
_mm256_broadcastq_epi64(__m128i __X)
908
{
909
return (__m256i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 0, 0, 0);
910
}
911
912
static __inline__ __m128i __DEFAULT_FN_ATTRS
913
_mm_broadcastb_epi8(__m128i __X)
914
{
915
return (__m128i)__builtin_shufflevector((__v16qi)__X, (__v16qi)__X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
916
}
917
918
static __inline__ __m128i __DEFAULT_FN_ATTRS
919
_mm_broadcastw_epi16(__m128i __X)
920
{
921
return (__m128i)__builtin_shufflevector((__v8hi)__X, (__v8hi)__X, 0, 0, 0, 0, 0, 0, 0, 0);
922
}
923
924
925
static __inline__ __m128i __DEFAULT_FN_ATTRS
926
_mm_broadcastd_epi32(__m128i __X)
927
{
928
return (__m128i)__builtin_shufflevector((__v4si)__X, (__v4si)__X, 0, 0, 0, 0);
929
}
930
931
static __inline__ __m128i __DEFAULT_FN_ATTRS
932
_mm_broadcastq_epi64(__m128i __X)
933
{
934
return (__m128i)__builtin_shufflevector((__v2di)__X, (__v2di)__X, 0, 0);
935
}
936
937
static __inline__ __m256i __DEFAULT_FN_ATTRS
938
_mm256_permutevar8x32_epi32(__m256i __a, __m256i __b)
939
{
940
return (__m256i)__builtin_ia32_permvarsi256((__v8si)__a, (__v8si)__b);
941
}
942
943
#define _mm256_permute4x64_pd(V, M) __extension__ ({ \
944
(__m256d)__builtin_shufflevector((__v4df)(__m256d)(V), \
945
(__v4df)_mm256_undefined_pd(), \
946
((M) >> 0) & 0x3, \
947
((M) >> 2) & 0x3, \
948
((M) >> 4) & 0x3, \
949
((M) >> 6) & 0x3); })
950
951
static __inline__ __m256 __DEFAULT_FN_ATTRS
952
_mm256_permutevar8x32_ps(__m256 __a, __m256i __b)
953
{
954
return (__m256)__builtin_ia32_permvarsf256((__v8sf)__a, (__v8si)__b);
955
}
956
957
#define _mm256_permute4x64_epi64(V, M) __extension__ ({ \
958
(__m256i)__builtin_shufflevector((__v4di)(__m256i)(V), \
959
(__v4di)_mm256_undefined_si256(), \
960
((M) >> 0) & 0x3, \
961
((M) >> 2) & 0x3, \
962
((M) >> 4) & 0x3, \
963
((M) >> 6) & 0x3); })
964
965
#define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \
966
(__m256i)__builtin_ia32_permti256((__m256i)(V1), (__m256i)(V2), (M)); })
967
968
#define _mm256_extracti128_si256(V, M) __extension__ ({ \
969
(__m128i)__builtin_shufflevector((__v4di)(__m256i)(V), \
970
(__v4di)_mm256_undefined_si256(), \
971
(((M) & 1) ? 2 : 0), \
972
(((M) & 1) ? 3 : 1) ); })
973
974
#define _mm256_inserti128_si256(V1, V2, M) __extension__ ({ \
975
(__m256i)__builtin_shufflevector((__v4di)(__m256i)(V1), \
976
(__v4di)_mm256_castsi128_si256((__m128i)(V2)), \
977
(((M) & 1) ? 0 : 4), \
978
(((M) & 1) ? 1 : 5), \
979
(((M) & 1) ? 4 : 2), \
980
(((M) & 1) ? 5 : 3) ); })
981
982
static __inline__ __m256i __DEFAULT_FN_ATTRS
983
_mm256_maskload_epi32(int const *__X, __m256i __M)
984
{
985
return (__m256i)__builtin_ia32_maskloadd256((const __v8si *)__X, (__v8si)__M);
986
}
987
988
static __inline__ __m256i __DEFAULT_FN_ATTRS
989
_mm256_maskload_epi64(long long const *__X, __m256i __M)
990
{
991
return (__m256i)__builtin_ia32_maskloadq256((const __v4di *)__X, (__v4di)__M);
992
}
993
994
static __inline__ __m128i __DEFAULT_FN_ATTRS
995
_mm_maskload_epi32(int const *__X, __m128i __M)
996
{
997
return (__m128i)__builtin_ia32_maskloadd((const __v4si *)__X, (__v4si)__M);
998
}
999
1000
static __inline__ __m128i __DEFAULT_FN_ATTRS
1001
_mm_maskload_epi64(long long const *__X, __m128i __M)
1002
{
1003
return (__m128i)__builtin_ia32_maskloadq((const __v2di *)__X, (__v2di)__M);
1004
}
1005
1006
static __inline__ void __DEFAULT_FN_ATTRS
1007
_mm256_maskstore_epi32(int *__X, __m256i __M, __m256i __Y)
1008
{
1009
__builtin_ia32_maskstored256((__v8si *)__X, (__v8si)__M, (__v8si)__Y);
1010
}
1011
1012
static __inline__ void __DEFAULT_FN_ATTRS
1013
_mm256_maskstore_epi64(long long *__X, __m256i __M, __m256i __Y)
1014
{
1015
__builtin_ia32_maskstoreq256((__v4di *)__X, (__v4di)__M, (__v4di)__Y);
1016
}
1017
1018
static __inline__ void __DEFAULT_FN_ATTRS
1019
_mm_maskstore_epi32(int *__X, __m128i __M, __m128i __Y)
1020
{
1021
__builtin_ia32_maskstored((__v4si *)__X, (__v4si)__M, (__v4si)__Y);
1022
}
1023
1024
static __inline__ void __DEFAULT_FN_ATTRS
1025
_mm_maskstore_epi64(long long *__X, __m128i __M, __m128i __Y)
1026
{
1027
__builtin_ia32_maskstoreq(( __v2di *)__X, (__v2di)__M, (__v2di)__Y);
1028
}
1029
1030
static __inline__ __m256i __DEFAULT_FN_ATTRS
1031
_mm256_sllv_epi32(__m256i __X, __m256i __Y)
1032
{
1033
return (__m256i)__builtin_ia32_psllv8si((__v8si)__X, (__v8si)__Y);
1034
}
1035
1036
static __inline__ __m128i __DEFAULT_FN_ATTRS
1037
_mm_sllv_epi32(__m128i __X, __m128i __Y)
1038
{
1039
return (__m128i)__builtin_ia32_psllv4si((__v4si)__X, (__v4si)__Y);
1040
}
1041
1042
static __inline__ __m256i __DEFAULT_FN_ATTRS
1043
_mm256_sllv_epi64(__m256i __X, __m256i __Y)
1044
{
1045
return (__m256i)__builtin_ia32_psllv4di((__v4di)__X, (__v4di)__Y);
1046
}
1047
1048
static __inline__ __m128i __DEFAULT_FN_ATTRS
1049
_mm_sllv_epi64(__m128i __X, __m128i __Y)
1050
{
1051
return (__m128i)__builtin_ia32_psllv2di((__v2di)__X, (__v2di)__Y);
1052
}
1053
1054
static __inline__ __m256i __DEFAULT_FN_ATTRS
1055
_mm256_srav_epi32(__m256i __X, __m256i __Y)
1056
{
1057
return (__m256i)__builtin_ia32_psrav8si((__v8si)__X, (__v8si)__Y);
1058
}
1059
1060
static __inline__ __m128i __DEFAULT_FN_ATTRS
1061
_mm_srav_epi32(__m128i __X, __m128i __Y)
1062
{
1063
return (__m128i)__builtin_ia32_psrav4si((__v4si)__X, (__v4si)__Y);
1064
}
1065
1066
static __inline__ __m256i __DEFAULT_FN_ATTRS
1067
_mm256_srlv_epi32(__m256i __X, __m256i __Y)
1068
{
1069
return (__m256i)__builtin_ia32_psrlv8si((__v8si)__X, (__v8si)__Y);
1070
}
1071
1072
static __inline__ __m128i __DEFAULT_FN_ATTRS
1073
_mm_srlv_epi32(__m128i __X, __m128i __Y)
1074
{
1075
return (__m128i)__builtin_ia32_psrlv4si((__v4si)__X, (__v4si)__Y);
1076
}
1077
1078
static __inline__ __m256i __DEFAULT_FN_ATTRS
1079
_mm256_srlv_epi64(__m256i __X, __m256i __Y)
1080
{
1081
return (__m256i)__builtin_ia32_psrlv4di((__v4di)__X, (__v4di)__Y);
1082
}
1083
1084
static __inline__ __m128i __DEFAULT_FN_ATTRS
1085
_mm_srlv_epi64(__m128i __X, __m128i __Y)
1086
{
1087
return (__m128i)__builtin_ia32_psrlv2di((__v2di)__X, (__v2di)__Y);
1088
}
1089
1090
#define _mm_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
1091
(__m128d)__builtin_ia32_gatherd_pd((__v2df)(__m128i)(a), \
1092
(double const *)(m), \
1093
(__v4si)(__m128i)(i), \
1094
(__v2df)(__m128d)(mask), (s)); })
1095
1096
#define _mm256_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
1097
(__m256d)__builtin_ia32_gatherd_pd256((__v4df)(__m256d)(a), \
1098
(double const *)(m), \
1099
(__v4si)(__m128i)(i), \
1100
(__v4df)(__m256d)(mask), (s)); })
1101
1102
#define _mm_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
1103
(__m128d)__builtin_ia32_gatherq_pd((__v2df)(__m128d)(a), \
1104
(double const *)(m), \
1105
(__v2di)(__m128i)(i), \
1106
(__v2df)(__m128d)(mask), (s)); })
1107
1108
#define _mm256_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
1109
(__m256d)__builtin_ia32_gatherq_pd256((__v4df)(__m256d)(a), \
1110
(double const *)(m), \
1111
(__v4di)(__m256i)(i), \
1112
(__v4df)(__m256d)(mask), (s)); })
1113
1114
#define _mm_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
1115
(__m128)__builtin_ia32_gatherd_ps((__v4sf)(__m128)(a), \
1116
(float const *)(m), \
1117
(__v4si)(__m128i)(i), \
1118
(__v4sf)(__m128)(mask), (s)); })
1119
1120
#define _mm256_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
1121
(__m256)__builtin_ia32_gatherd_ps256((__v8sf)(__m256)(a), \
1122
(float const *)(m), \
1123
(__v8si)(__m256i)(i), \
1124
(__v8sf)(__m256)(mask), (s)); })
1125
1126
#define _mm_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
1127
(__m128)__builtin_ia32_gatherq_ps((__v4sf)(__m128)(a), \
1128
(float const *)(m), \
1129
(__v2di)(__m128i)(i), \
1130
(__v4sf)(__m128)(mask), (s)); })
1131
1132
#define _mm256_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
1133
(__m128)__builtin_ia32_gatherq_ps256((__v4sf)(__m128)(a), \
1134
(float const *)(m), \
1135
(__v4di)(__m256i)(i), \
1136
(__v4sf)(__m128)(mask), (s)); })
1137
1138
#define _mm_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
1139
(__m128i)__builtin_ia32_gatherd_d((__v4si)(__m128i)(a), \
1140
(int const *)(m), \
1141
(__v4si)(__m128i)(i), \
1142
(__v4si)(__m128i)(mask), (s)); })
1143
1144
#define _mm256_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
1145
(__m256i)__builtin_ia32_gatherd_d256((__v8si)(__m256i)(a), \
1146
(int const *)(m), \
1147
(__v8si)(__m256i)(i), \
1148
(__v8si)(__m256i)(mask), (s)); })
1149
1150
#define _mm_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
1151
(__m128i)__builtin_ia32_gatherq_d((__v4si)(__m128i)(a), \
1152
(int const *)(m), \
1153
(__v2di)(__m128i)(i), \
1154
(__v4si)(__m128i)(mask), (s)); })
1155
1156
#define _mm256_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
1157
(__m128i)__builtin_ia32_gatherq_d256((__v4si)(__m128i)(a), \
1158
(int const *)(m), \
1159
(__v4di)(__m256i)(i), \
1160
(__v4si)(__m128i)(mask), (s)); })
1161
1162
#define _mm_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
1163
(__m128i)__builtin_ia32_gatherd_q((__v2di)(__m128i)(a), \
1164
(long long const *)(m), \
1165
(__v4si)(__m128i)(i), \
1166
(__v2di)(__m128i)(mask), (s)); })
1167
1168
#define _mm256_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
1169
(__m256i)__builtin_ia32_gatherd_q256((__v4di)(__m256i)(a), \
1170
(long long const *)(m), \
1171
(__v4si)(__m128i)(i), \
1172
(__v4di)(__m256i)(mask), (s)); })
1173
1174
#define _mm_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
1175
(__m128i)__builtin_ia32_gatherq_q((__v2di)(__m128i)(a), \
1176
(long long const *)(m), \
1177
(__v2di)(__m128i)(i), \
1178
(__v2di)(__m128i)(mask), (s)); })
1179
1180
#define _mm256_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
1181
(__m256i)__builtin_ia32_gatherq_q256((__v4di)(__m256i)(a), \
1182
(long long const *)(m), \
1183
(__v4di)(__m256i)(i), \
1184
(__v4di)(__m256i)(mask), (s)); })
1185
1186
#define _mm_i32gather_pd(m, i, s) __extension__ ({ \
1187
(__m128d)__builtin_ia32_gatherd_pd((__v2df)_mm_undefined_pd(), \
1188
(double const *)(m), \
1189
(__v4si)(__m128i)(i), \
1190
(__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \
1191
_mm_setzero_pd()), \
1192
(s)); })
1193
1194
#define _mm256_i32gather_pd(m, i, s) __extension__ ({ \
1195
(__m256d)__builtin_ia32_gatherd_pd256((__v4df)_mm256_undefined_pd(), \
1196
(double const *)(m), \
1197
(__v4si)(__m128i)(i), \
1198
(__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \
1199
_mm256_setzero_pd(), \
1200
_CMP_EQ_OQ), \
1201
(s)); })
1202
1203
#define _mm_i64gather_pd(m, i, s) __extension__ ({ \
1204
(__m128d)__builtin_ia32_gatherq_pd((__v2df)_mm_undefined_pd(), \
1205
(double const *)(m), \
1206
(__v2di)(__m128i)(i), \
1207
(__v2df)_mm_cmpeq_pd(_mm_setzero_pd(), \
1208
_mm_setzero_pd()), \
1209
(s)); })
1210
1211
#define _mm256_i64gather_pd(m, i, s) __extension__ ({ \
1212
(__m256d)__builtin_ia32_gatherq_pd256((__v4df)_mm256_undefined_pd(), \
1213
(double const *)(m), \
1214
(__v4di)(__m256i)(i), \
1215
(__v4df)_mm256_cmp_pd(_mm256_setzero_pd(), \
1216
_mm256_setzero_pd(), \
1217
_CMP_EQ_OQ), \
1218
(s)); })
1219
1220
#define _mm_i32gather_ps(m, i, s) __extension__ ({ \
1221
(__m128)__builtin_ia32_gatherd_ps((__v4sf)_mm_undefined_ps(), \
1222
(float const *)(m), \
1223
(__v4si)(__m128i)(i), \
1224
(__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
1225
_mm_setzero_ps()), \
1226
(s)); })
1227
1228
#define _mm256_i32gather_ps(m, i, s) __extension__ ({ \
1229
(__m256)__builtin_ia32_gatherd_ps256((__v8sf)_mm256_undefined_ps(), \
1230
(float const *)(m), \
1231
(__v8si)(__m256i)(i), \
1232
(__v8sf)_mm256_cmp_ps(_mm256_setzero_ps(), \
1233
_mm256_setzero_ps(), \
1234
_CMP_EQ_OQ), \
1235
(s)); })
1236
1237
#define _mm_i64gather_ps(m, i, s) __extension__ ({ \
1238
(__m128)__builtin_ia32_gatherq_ps((__v4sf)_mm_undefined_ps(), \
1239
(float const *)(m), \
1240
(__v2di)(__m128i)(i), \
1241
(__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
1242
_mm_setzero_ps()), \
1243
(s)); })
1244
1245
#define _mm256_i64gather_ps(m, i, s) __extension__ ({ \
1246
(__m128)__builtin_ia32_gatherq_ps256((__v4sf)_mm_undefined_ps(), \
1247
(float const *)(m), \
1248
(__v4di)(__m256i)(i), \
1249
(__v4sf)_mm_cmpeq_ps(_mm_setzero_ps(), \
1250
_mm_setzero_ps()), \
1251
(s)); })
1252
1253
#define _mm_i32gather_epi32(m, i, s) __extension__ ({ \
1254
(__m128i)__builtin_ia32_gatherd_d((__v4si)_mm_undefined_si128(), \
1255
(int const *)(m), (__v4si)(__m128i)(i), \
1256
(__v4si)_mm_set1_epi32(-1), (s)); })
1257
1258
#define _mm256_i32gather_epi32(m, i, s) __extension__ ({ \
1259
(__m256i)__builtin_ia32_gatherd_d256((__v8si)_mm256_undefined_si256(), \
1260
(int const *)(m), (__v8si)(__m256i)(i), \
1261
(__v8si)_mm256_set1_epi32(-1), (s)); })
1262
1263
#define _mm_i64gather_epi32(m, i, s) __extension__ ({ \
1264
(__m128i)__builtin_ia32_gatherq_d((__v4si)_mm_undefined_si128(), \
1265
(int const *)(m), (__v2di)(__m128i)(i), \
1266
(__v4si)_mm_set1_epi32(-1), (s)); })
1267
1268
#define _mm256_i64gather_epi32(m, i, s) __extension__ ({ \
1269
(__m128i)__builtin_ia32_gatherq_d256((__v4si)_mm_undefined_si128(), \
1270
(int const *)(m), (__v4di)(__m256i)(i), \
1271
(__v4si)_mm_set1_epi32(-1), (s)); })
1272
1273
#define _mm_i32gather_epi64(m, i, s) __extension__ ({ \
1274
(__m128i)__builtin_ia32_gatherd_q((__v2di)_mm_undefined_si128(), \
1275
(long long const *)(m), \
1276
(__v4si)(__m128i)(i), \
1277
(__v2di)_mm_set1_epi64x(-1), (s)); })
1278
1279
#define _mm256_i32gather_epi64(m, i, s) __extension__ ({ \
1280
(__m256i)__builtin_ia32_gatherd_q256((__v4di)_mm256_undefined_si256(), \
1281
(long long const *)(m), \
1282
(__v4si)(__m128i)(i), \
1283
(__v4di)_mm256_set1_epi64x(-1), (s)); })
1284
1285
#define _mm_i64gather_epi64(m, i, s) __extension__ ({ \
1286
(__m128i)__builtin_ia32_gatherq_q((__v2di)_mm_undefined_si128(), \
1287
(long long const *)(m), \
1288
(__v2di)(__m128i)(i), \
1289
(__v2di)_mm_set1_epi64x(-1), (s)); })
1290
1291
#define _mm256_i64gather_epi64(m, i, s) __extension__ ({ \
1292
(__m256i)__builtin_ia32_gatherq_q256((__v4di)_mm256_undefined_si256(), \
1293
(long long const *)(m), \
1294
(__v4di)(__m256i)(i), \
1295
(__v4di)_mm256_set1_epi64x(-1), (s)); })
1296
1297
#undef __DEFAULT_FN_ATTRS
1298
1299
#endif /* __AVX2INTRIN_H */
1300
1301