tbmintrin.h revision 309124
1259701Sdim/*===---- tbmintrin.h - TBM intrinsics -------------------------------------=== 2259701Sdim * 3259701Sdim * Permission is hereby granted, free of charge, to any person obtaining a copy 4259701Sdim * of this software and associated documentation files (the "Software"), to deal 5259701Sdim * in the Software without restriction, including without limitation the rights 6259701Sdim * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7259701Sdim * copies of the Software, and to permit persons to whom the Software is 8259701Sdim * furnished to do so, subject to the following conditions: 9259701Sdim * 10259701Sdim * The above copyright notice and this permission notice shall be included in 11259701Sdim * all copies or substantial portions of the Software. 12259701Sdim * 13259701Sdim * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14259701Sdim * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15259701Sdim * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16259701Sdim * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17259701Sdim * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18259701Sdim * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19259701Sdim * THE SOFTWARE. 20259701Sdim * 21259701Sdim *===-----------------------------------------------------------------------=== 22259701Sdim */ 23259701Sdim 24259701Sdim#ifndef __X86INTRIN_H 25259701Sdim#error "Never use <tbmintrin.h> directly; include <x86intrin.h> instead." 26259701Sdim#endif 27259701Sdim 28259701Sdim#ifndef __TBMINTRIN_H 29259701Sdim#define __TBMINTRIN_H 30259701Sdim 31288943Sdim/* Define the default attributes for the functions in this file. */ 32296417Sdim#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("tbm"))) 33288943Sdim 34296417Sdim#define __bextri_u32(a, b) \ 35296417Sdim ((unsigned int)__builtin_ia32_bextri_u32((unsigned int)(a), \ 36296417Sdim (unsigned int)(b))) 37259701Sdim 38288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 39309124Sdim__blcfill_u32(unsigned int __a) 40259701Sdim{ 41309124Sdim return __a & (__a + 1); 42259701Sdim} 43259701Sdim 44288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 45309124Sdim__blci_u32(unsigned int __a) 46259701Sdim{ 47309124Sdim return __a | ~(__a + 1); 48259701Sdim} 49259701Sdim 50288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 51309124Sdim__blcic_u32(unsigned int __a) 52259701Sdim{ 53309124Sdim return ~__a & (__a + 1); 54259701Sdim} 55259701Sdim 56288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 57309124Sdim__blcmsk_u32(unsigned int __a) 58259701Sdim{ 59309124Sdim return __a ^ (__a + 1); 60259701Sdim} 61259701Sdim 62288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 63309124Sdim__blcs_u32(unsigned int __a) 64259701Sdim{ 65309124Sdim return __a | (__a + 1); 66259701Sdim} 67259701Sdim 68288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 69309124Sdim__blsfill_u32(unsigned int __a) 70259701Sdim{ 71309124Sdim return __a | (__a - 1); 72259701Sdim} 73259701Sdim 74288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 75309124Sdim__blsic_u32(unsigned int __a) 76259701Sdim{ 77309124Sdim return ~__a | (__a - 1); 78259701Sdim} 79259701Sdim 80288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 81309124Sdim__t1mskc_u32(unsigned int __a) 82259701Sdim{ 83309124Sdim return ~__a | (__a + 1); 84259701Sdim} 85259701Sdim 86288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 87309124Sdim__tzmsk_u32(unsigned int __a) 88259701Sdim{ 89309124Sdim return ~__a & (__a - 1); 90259701Sdim} 91259701Sdim 92259701Sdim#ifdef __x86_64__ 93296417Sdim#define __bextri_u64(a, b) \ 94296417Sdim ((unsigned long long)__builtin_ia32_bextri_u64((unsigned long long)(a), \ 95296417Sdim (unsigned long long)(b))) 96259701Sdim 97288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 98309124Sdim__blcfill_u64(unsigned long long __a) 99259701Sdim{ 100309124Sdim return __a & (__a + 1); 101259701Sdim} 102259701Sdim 103288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 104309124Sdim__blci_u64(unsigned long long __a) 105259701Sdim{ 106309124Sdim return __a | ~(__a + 1); 107259701Sdim} 108259701Sdim 109288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 110309124Sdim__blcic_u64(unsigned long long __a) 111259701Sdim{ 112309124Sdim return ~__a & (__a + 1); 113259701Sdim} 114259701Sdim 115288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 116309124Sdim__blcmsk_u64(unsigned long long __a) 117259701Sdim{ 118309124Sdim return __a ^ (__a + 1); 119259701Sdim} 120259701Sdim 121288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 122309124Sdim__blcs_u64(unsigned long long __a) 123259701Sdim{ 124309124Sdim return __a | (__a + 1); 125259701Sdim} 126259701Sdim 127288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 128309124Sdim__blsfill_u64(unsigned long long __a) 129259701Sdim{ 130309124Sdim return __a | (__a - 1); 131259701Sdim} 132259701Sdim 133288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 134309124Sdim__blsic_u64(unsigned long long __a) 135259701Sdim{ 136309124Sdim return ~__a | (__a - 1); 137259701Sdim} 138259701Sdim 139288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 140309124Sdim__t1mskc_u64(unsigned long long __a) 141259701Sdim{ 142309124Sdim return ~__a | (__a + 1); 143259701Sdim} 144259701Sdim 145288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 146309124Sdim__tzmsk_u64(unsigned long long __a) 147259701Sdim{ 148309124Sdim return ~__a & (__a - 1); 149259701Sdim} 150259701Sdim#endif 151259701Sdim 152288943Sdim#undef __DEFAULT_FN_ATTRS 153288943Sdim 154259701Sdim#endif /* __TBMINTRIN_H */ 155