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