Home | History | Annotate | Download | only in Headers
      1 /*===------------- avx512vbmiintrin.h - VBMI intrinsics ------------------===
      2  *
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a copy
      5  * of this software and associated documentation files (the "Software"), to deal
      6  * in the Software without restriction, including without limitation the rights
      7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      8  * copies of the Software, and to permit persons to whom the Software is
      9  * furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice shall be included in
     12  * all copies or substantial portions of the Software.
     13  *
     14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     20  * THE SOFTWARE.
     21  *
     22  *===-----------------------------------------------------------------------===
     23  */
     24 #ifndef __IMMINTRIN_H
     25 #error "Never use <avx512vbmiintrin.h> directly; include <immintrin.h> instead."
     26 #endif
     27 
     28 #ifndef __VBMIINTRIN_H
     29 #define __VBMIINTRIN_H
     30 
     31 /* Define the default attributes for the functions in this file. */
     32 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("avx512vbmi")))
     33 
     34 
     35 static __inline__ __m512i __DEFAULT_FN_ATTRS
     36 _mm512_mask2_permutex2var_epi8 (__m512i __A, __m512i __I,
     37          __mmask64 __U, __m512i __B)
     38 {
     39   return (__m512i) __builtin_ia32_vpermi2varqi512_mask ((__v64qi) __A,
     40               (__v64qi) __I
     41               /* idx */ ,
     42               (__v64qi) __B,
     43               (__mmask64) __U);
     44 }
     45 
     46 static __inline__ __m512i __DEFAULT_FN_ATTRS
     47 _mm512_permutex2var_epi8 (__m512i __A, __m512i __I, __m512i __B)
     48 {
     49   return (__m512i) __builtin_ia32_vpermt2varqi512_mask ((__v64qi) __I
     50               /* idx */ ,
     51               (__v64qi) __A,
     52               (__v64qi) __B,
     53               (__mmask64) -1);
     54 }
     55 
     56 static __inline__ __m512i __DEFAULT_FN_ATTRS
     57 _mm512_mask_permutex2var_epi8 (__m512i __A, __mmask64 __U,
     58         __m512i __I, __m512i __B)
     59 {
     60   return (__m512i) __builtin_ia32_vpermt2varqi512_mask ((__v64qi) __I
     61               /* idx */ ,
     62               (__v64qi) __A,
     63               (__v64qi) __B,
     64               (__mmask64) __U);
     65 }
     66 
     67 static __inline__ __m512i __DEFAULT_FN_ATTRS
     68 _mm512_maskz_permutex2var_epi8 (__mmask64 __U, __m512i __A,
     69          __m512i __I, __m512i __B)
     70 {
     71   return (__m512i) __builtin_ia32_vpermt2varqi512_maskz ((__v64qi) __I
     72                /* idx */ ,
     73                (__v64qi) __A,
     74                (__v64qi) __B,
     75                (__mmask64) __U);
     76 }
     77 
     78 static __inline__ __m512i __DEFAULT_FN_ATTRS
     79 _mm512_permutexvar_epi8 (__m512i __A, __m512i __B)
     80 {
     81   return (__m512i) __builtin_ia32_permvarqi512_mask ((__v64qi) __B,
     82                  (__v64qi) __A,
     83                  (__v64qi) _mm512_undefined_epi32 (),
     84                  (__mmask64) -1);
     85 }
     86 
     87 static __inline__ __m512i __DEFAULT_FN_ATTRS
     88 _mm512_maskz_permutexvar_epi8 (__mmask64 __M, __m512i __A,
     89         __m512i __B)
     90 {
     91   return (__m512i) __builtin_ia32_permvarqi512_mask ((__v64qi) __B,
     92                  (__v64qi) __A,
     93                  (__v64qi) _mm512_setzero_si512(),
     94                  (__mmask64) __M);
     95 }
     96 
     97 static __inline__ __m512i __DEFAULT_FN_ATTRS
     98 _mm512_mask_permutexvar_epi8 (__m512i __W, __mmask64 __M, __m512i __A,
     99              __m512i __B)
    100 {
    101   return (__m512i) __builtin_ia32_permvarqi512_mask ((__v64qi) __B,
    102                  (__v64qi) __A,
    103                  (__v64qi) __W,
    104                  (__mmask64) __M);
    105 }
    106 
    107 static __inline__ __m512i __DEFAULT_FN_ATTRS
    108 _mm512_mask_multishift_epi64_epi8 (__m512i __W, __mmask64 __M, __m512i __X, __m512i __Y)
    109 {
    110   return (__m512i) __builtin_ia32_vpmultishiftqb512_mask ((__v64qi) __X,
    111                 (__v64qi) __Y,
    112                 (__v64qi) __W,
    113                 (__mmask64) __M);
    114 }
    115 
    116 static __inline__ __m512i __DEFAULT_FN_ATTRS
    117 _mm512_maskz_multishift_epi64_epi8 (__mmask64 __M, __m512i __X, __m512i __Y)
    118 {
    119   return (__m512i) __builtin_ia32_vpmultishiftqb512_mask ((__v64qi) __X,
    120                 (__v64qi) __Y,
    121                 (__v64qi) _mm512_setzero_si512 (),
    122                 (__mmask64) __M);
    123 }
    124 
    125 static __inline__ __m512i __DEFAULT_FN_ATTRS
    126 _mm512_multishift_epi64_epi8 (__m512i __X, __m512i __Y)
    127 {
    128   return (__m512i) __builtin_ia32_vpmultishiftqb512_mask ((__v64qi) __X,
    129                 (__v64qi) __Y,
    130                 (__v64qi) _mm512_undefined_epi32 (),
    131                 (__mmask64) -1);
    132 }
    133 
    134 
    135 #undef __DEFAULT_FN_ATTRS
    136 
    137 #endif
    138