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