1 /*===---- tbmintrin.h - TBM 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 __X86INTRIN_H 25 #error "Never use <tbmintrin.h> directly; include <x86intrin.h> instead." 26 #endif 27 28 #ifndef __TBMINTRIN_H 29 #define __TBMINTRIN_H 30 31 /* Define the default attributes for the functions in this file. */ 32 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("tbm"))) 33 34 #define __bextri_u32(a, b) \ 35 ((unsigned int)__builtin_ia32_bextri_u32((unsigned int)(a), \ 36 (unsigned int)(b))) 37 38 static __inline__ unsigned int __DEFAULT_FN_ATTRS 39 __blcfill_u32(unsigned int __a) 40 { 41 return __a & (__a + 1); 42 } 43 44 static __inline__ unsigned int __DEFAULT_FN_ATTRS 45 __blci_u32(unsigned int __a) 46 { 47 return __a | ~(__a + 1); 48 } 49 50 static __inline__ unsigned int __DEFAULT_FN_ATTRS 51 __blcic_u32(unsigned int __a) 52 { 53 return ~__a & (__a + 1); 54 } 55 56 static __inline__ unsigned int __DEFAULT_FN_ATTRS 57 __blcmsk_u32(unsigned int __a) 58 { 59 return __a ^ (__a + 1); 60 } 61 62 static __inline__ unsigned int __DEFAULT_FN_ATTRS 63 __blcs_u32(unsigned int __a) 64 { 65 return __a | (__a + 1); 66 } 67 68 static __inline__ unsigned int __DEFAULT_FN_ATTRS 69 __blsfill_u32(unsigned int __a) 70 { 71 return __a | (__a - 1); 72 } 73 74 static __inline__ unsigned int __DEFAULT_FN_ATTRS 75 __blsic_u32(unsigned int __a) 76 { 77 return ~__a | (__a - 1); 78 } 79 80 static __inline__ unsigned int __DEFAULT_FN_ATTRS 81 __t1mskc_u32(unsigned int __a) 82 { 83 return ~__a | (__a + 1); 84 } 85 86 static __inline__ unsigned int __DEFAULT_FN_ATTRS 87 __tzmsk_u32(unsigned int __a) 88 { 89 return ~__a & (__a - 1); 90 } 91 92 #ifdef __x86_64__ 93 #define __bextri_u64(a, b) \ 94 ((unsigned long long)__builtin_ia32_bextri_u64((unsigned long long)(a), \ 95 (unsigned long long)(b))) 96 97 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 98 __blcfill_u64(unsigned long long __a) 99 { 100 return __a & (__a + 1); 101 } 102 103 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 104 __blci_u64(unsigned long long __a) 105 { 106 return __a | ~(__a + 1); 107 } 108 109 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 110 __blcic_u64(unsigned long long __a) 111 { 112 return ~__a & (__a + 1); 113 } 114 115 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 116 __blcmsk_u64(unsigned long long __a) 117 { 118 return __a ^ (__a + 1); 119 } 120 121 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 122 __blcs_u64(unsigned long long __a) 123 { 124 return __a | (__a + 1); 125 } 126 127 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 128 __blsfill_u64(unsigned long long __a) 129 { 130 return __a | (__a - 1); 131 } 132 133 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 134 __blsic_u64(unsigned long long __a) 135 { 136 return ~__a | (__a - 1); 137 } 138 139 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 140 __t1mskc_u64(unsigned long long __a) 141 { 142 return ~__a | (__a + 1); 143 } 144 145 static __inline__ unsigned long long __DEFAULT_FN_ATTRS 146 __tzmsk_u64(unsigned long long __a) 147 { 148 return ~__a & (__a - 1); 149 } 150 #endif 151 152 #undef __DEFAULT_FN_ATTRS 153 154 #endif /* __TBMINTRIN_H */ 155