1259701Sdim/*===---- tbmintrin.h - TBM intrinsics -------------------------------------=== 2259701Sdim * 3353358Sdim * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim * See https://llvm.org/LICENSE.txt for license information. 5353358Sdim * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6259701Sdim * 7259701Sdim *===-----------------------------------------------------------------------=== 8259701Sdim */ 9259701Sdim 10259701Sdim#ifndef __X86INTRIN_H 11259701Sdim#error "Never use <tbmintrin.h> directly; include <x86intrin.h> instead." 12259701Sdim#endif 13259701Sdim 14259701Sdim#ifndef __TBMINTRIN_H 15259701Sdim#define __TBMINTRIN_H 16259701Sdim 17288943Sdim/* Define the default attributes for the functions in this file. */ 18296417Sdim#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("tbm"))) 19288943Sdim 20296417Sdim#define __bextri_u32(a, b) \ 21296417Sdim ((unsigned int)__builtin_ia32_bextri_u32((unsigned int)(a), \ 22296417Sdim (unsigned int)(b))) 23259701Sdim 24288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 25309124Sdim__blcfill_u32(unsigned int __a) 26259701Sdim{ 27309124Sdim return __a & (__a + 1); 28259701Sdim} 29259701Sdim 30288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 31309124Sdim__blci_u32(unsigned int __a) 32259701Sdim{ 33309124Sdim return __a | ~(__a + 1); 34259701Sdim} 35259701Sdim 36288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 37309124Sdim__blcic_u32(unsigned int __a) 38259701Sdim{ 39309124Sdim return ~__a & (__a + 1); 40259701Sdim} 41259701Sdim 42288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 43309124Sdim__blcmsk_u32(unsigned int __a) 44259701Sdim{ 45309124Sdim return __a ^ (__a + 1); 46259701Sdim} 47259701Sdim 48288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 49309124Sdim__blcs_u32(unsigned int __a) 50259701Sdim{ 51309124Sdim return __a | (__a + 1); 52259701Sdim} 53259701Sdim 54288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 55309124Sdim__blsfill_u32(unsigned int __a) 56259701Sdim{ 57309124Sdim return __a | (__a - 1); 58259701Sdim} 59259701Sdim 60288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 61309124Sdim__blsic_u32(unsigned int __a) 62259701Sdim{ 63309124Sdim return ~__a | (__a - 1); 64259701Sdim} 65259701Sdim 66288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 67309124Sdim__t1mskc_u32(unsigned int __a) 68259701Sdim{ 69309124Sdim return ~__a | (__a + 1); 70259701Sdim} 71259701Sdim 72288943Sdimstatic __inline__ unsigned int __DEFAULT_FN_ATTRS 73309124Sdim__tzmsk_u32(unsigned int __a) 74259701Sdim{ 75309124Sdim return ~__a & (__a - 1); 76259701Sdim} 77259701Sdim 78259701Sdim#ifdef __x86_64__ 79296417Sdim#define __bextri_u64(a, b) \ 80296417Sdim ((unsigned long long)__builtin_ia32_bextri_u64((unsigned long long)(a), \ 81296417Sdim (unsigned long long)(b))) 82259701Sdim 83288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 84309124Sdim__blcfill_u64(unsigned long long __a) 85259701Sdim{ 86309124Sdim return __a & (__a + 1); 87259701Sdim} 88259701Sdim 89288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 90309124Sdim__blci_u64(unsigned long long __a) 91259701Sdim{ 92309124Sdim return __a | ~(__a + 1); 93259701Sdim} 94259701Sdim 95288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 96309124Sdim__blcic_u64(unsigned long long __a) 97259701Sdim{ 98309124Sdim return ~__a & (__a + 1); 99259701Sdim} 100259701Sdim 101288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 102309124Sdim__blcmsk_u64(unsigned long long __a) 103259701Sdim{ 104309124Sdim return __a ^ (__a + 1); 105259701Sdim} 106259701Sdim 107288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 108309124Sdim__blcs_u64(unsigned long long __a) 109259701Sdim{ 110309124Sdim return __a | (__a + 1); 111259701Sdim} 112259701Sdim 113288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 114309124Sdim__blsfill_u64(unsigned long long __a) 115259701Sdim{ 116309124Sdim return __a | (__a - 1); 117259701Sdim} 118259701Sdim 119288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 120309124Sdim__blsic_u64(unsigned long long __a) 121259701Sdim{ 122309124Sdim return ~__a | (__a - 1); 123259701Sdim} 124259701Sdim 125288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 126309124Sdim__t1mskc_u64(unsigned long long __a) 127259701Sdim{ 128309124Sdim return ~__a | (__a + 1); 129259701Sdim} 130259701Sdim 131288943Sdimstatic __inline__ unsigned long long __DEFAULT_FN_ATTRS 132309124Sdim__tzmsk_u64(unsigned long long __a) 133259701Sdim{ 134309124Sdim return ~__a & (__a - 1); 135259701Sdim} 136259701Sdim#endif 137259701Sdim 138288943Sdim#undef __DEFAULT_FN_ATTRS 139288943Sdim 140259701Sdim#endif /* __TBMINTRIN_H */ 141