150
|
1 /*===---- tbmintrin.h - TBM intrinsics -------------------------------------===
|
|
2 *
|
|
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4 * See https://llvm.org/LICENSE.txt for license information.
|
|
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
6 *
|
|
7 *===-----------------------------------------------------------------------===
|
|
8 */
|
|
9
|
|
10 #ifndef __X86INTRIN_H
|
|
11 #error "Never use <tbmintrin.h> directly; include <x86intrin.h> instead."
|
|
12 #endif
|
|
13
|
|
14 #ifndef __TBMINTRIN_H
|
|
15 #define __TBMINTRIN_H
|
|
16
|
|
17 /* Define the default attributes for the functions in this file. */
|
|
18 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("tbm")))
|
|
19
|
|
20 #define __bextri_u32(a, b) \
|
|
21 ((unsigned int)__builtin_ia32_bextri_u32((unsigned int)(a), \
|
|
22 (unsigned int)(b)))
|
|
23
|
|
24 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
25 __blcfill_u32(unsigned int __a)
|
|
26 {
|
|
27 return __a & (__a + 1);
|
|
28 }
|
|
29
|
|
30 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
31 __blci_u32(unsigned int __a)
|
|
32 {
|
|
33 return __a | ~(__a + 1);
|
|
34 }
|
|
35
|
|
36 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
37 __blcic_u32(unsigned int __a)
|
|
38 {
|
|
39 return ~__a & (__a + 1);
|
|
40 }
|
|
41
|
|
42 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
43 __blcmsk_u32(unsigned int __a)
|
|
44 {
|
|
45 return __a ^ (__a + 1);
|
|
46 }
|
|
47
|
|
48 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
49 __blcs_u32(unsigned int __a)
|
|
50 {
|
|
51 return __a | (__a + 1);
|
|
52 }
|
|
53
|
|
54 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
55 __blsfill_u32(unsigned int __a)
|
|
56 {
|
|
57 return __a | (__a - 1);
|
|
58 }
|
|
59
|
|
60 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
61 __blsic_u32(unsigned int __a)
|
|
62 {
|
|
63 return ~__a | (__a - 1);
|
|
64 }
|
|
65
|
|
66 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
67 __t1mskc_u32(unsigned int __a)
|
|
68 {
|
|
69 return ~__a | (__a + 1);
|
|
70 }
|
|
71
|
|
72 static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
73 __tzmsk_u32(unsigned int __a)
|
|
74 {
|
|
75 return ~__a & (__a - 1);
|
|
76 }
|
|
77
|
|
78 #ifdef __x86_64__
|
|
79 #define __bextri_u64(a, b) \
|
|
80 ((unsigned long long)__builtin_ia32_bextri_u64((unsigned long long)(a), \
|
|
81 (unsigned long long)(b)))
|
|
82
|
|
83 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
84 __blcfill_u64(unsigned long long __a)
|
|
85 {
|
|
86 return __a & (__a + 1);
|
|
87 }
|
|
88
|
|
89 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
90 __blci_u64(unsigned long long __a)
|
|
91 {
|
|
92 return __a | ~(__a + 1);
|
|
93 }
|
|
94
|
|
95 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
96 __blcic_u64(unsigned long long __a)
|
|
97 {
|
|
98 return ~__a & (__a + 1);
|
|
99 }
|
|
100
|
|
101 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
102 __blcmsk_u64(unsigned long long __a)
|
|
103 {
|
|
104 return __a ^ (__a + 1);
|
|
105 }
|
|
106
|
|
107 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
108 __blcs_u64(unsigned long long __a)
|
|
109 {
|
|
110 return __a | (__a + 1);
|
|
111 }
|
|
112
|
|
113 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
114 __blsfill_u64(unsigned long long __a)
|
|
115 {
|
|
116 return __a | (__a - 1);
|
|
117 }
|
|
118
|
|
119 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
120 __blsic_u64(unsigned long long __a)
|
|
121 {
|
|
122 return ~__a | (__a - 1);
|
|
123 }
|
|
124
|
|
125 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
126 __t1mskc_u64(unsigned long long __a)
|
|
127 {
|
|
128 return ~__a | (__a + 1);
|
|
129 }
|
|
130
|
|
131 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
132 __tzmsk_u64(unsigned long long __a)
|
|
133 {
|
|
134 return ~__a & (__a - 1);
|
|
135 }
|
|
136 #endif
|
|
137
|
|
138 #undef __DEFAULT_FN_ATTRS
|
|
139
|
|
140 #endif /* __TBMINTRIN_H */
|