Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /*===---- bmiintrin.h - Implementation of BMI intrinsics on PowerPC --------=== |
---|---|
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 | #if !defined X86GPRINTRIN_H_ |
11 | #error "Never use <bmiintrin.h> directly; include <x86gprintrin.h> instead." |
12 | #endif |
13 | |
14 | #ifndef BMIINTRIN_H_ |
15 | #define BMIINTRIN_H_ |
16 | |
17 | extern __inline unsigned short |
18 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
19 | __tzcnt_u16(unsigned short __X) { |
20 | return __builtin_ctz(__X); |
21 | } |
22 | |
23 | extern __inline unsigned int |
24 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
25 | __andn_u32(unsigned int __X, unsigned int __Y) { |
26 | return (~__X & __Y); |
27 | } |
28 | |
29 | extern __inline unsigned int |
30 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
31 | _bextr_u32(unsigned int __X, unsigned int __P, unsigned int __L) { |
32 | return ((__X << (32 - (__L + __P))) >> (32 - __L)); |
33 | } |
34 | |
35 | extern __inline unsigned int |
36 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
37 | __bextr_u32(unsigned int __X, unsigned int __Y) { |
38 | unsigned int __P, __L; |
39 | __P = __Y & 0xFF; |
40 | __L = (__Y >> 8) & 0xFF; |
41 | return (_bextr_u32(__X, __P, __L)); |
42 | } |
43 | |
44 | extern __inline unsigned int |
45 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
46 | __blsi_u32(unsigned int __X) { |
47 | return (__X & -__X); |
48 | } |
49 | |
50 | extern __inline unsigned int |
51 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
52 | _blsi_u32(unsigned int __X) { |
53 | return __blsi_u32(__X); |
54 | } |
55 | |
56 | extern __inline unsigned int |
57 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
58 | __blsmsk_u32(unsigned int __X) { |
59 | return (__X ^ (__X - 1)); |
60 | } |
61 | |
62 | extern __inline unsigned int |
63 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
64 | _blsmsk_u32(unsigned int __X) { |
65 | return __blsmsk_u32(__X); |
66 | } |
67 | |
68 | extern __inline unsigned int |
69 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
70 | __blsr_u32(unsigned int __X) { |
71 | return (__X & (__X - 1)); |
72 | } |
73 | |
74 | extern __inline unsigned int |
75 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
76 | _blsr_u32(unsigned int __X) { |
77 | return __blsr_u32(__X); |
78 | } |
79 | |
80 | extern __inline unsigned int |
81 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
82 | __tzcnt_u32(unsigned int __X) { |
83 | return __builtin_ctz(__X); |
84 | } |
85 | |
86 | extern __inline unsigned int |
87 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
88 | _tzcnt_u32(unsigned int __X) { |
89 | return __builtin_ctz(__X); |
90 | } |
91 | |
92 | /* use the 64-bit shift, rotate, and count leading zeros instructions |
93 | for long long. */ |
94 | #ifdef __PPC64__ |
95 | extern __inline unsigned long long |
96 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
97 | __andn_u64(unsigned long long __X, unsigned long long __Y) { |
98 | return (~__X & __Y); |
99 | } |
100 | |
101 | extern __inline unsigned long long |
102 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
103 | _bextr_u64(unsigned long long __X, unsigned int __P, unsigned int __L) { |
104 | return ((__X << (64 - (__L + __P))) >> (64 - __L)); |
105 | } |
106 | |
107 | extern __inline unsigned long long |
108 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
109 | __bextr_u64(unsigned long long __X, unsigned long long __Y) { |
110 | unsigned int __P, __L; |
111 | __P = __Y & 0xFF; |
112 | __L = (__Y & 0xFF00) >> 8; |
113 | return (_bextr_u64(__X, __P, __L)); |
114 | } |
115 | |
116 | extern __inline unsigned long long |
117 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
118 | __blsi_u64(unsigned long long __X) { |
119 | return __X & -__X; |
120 | } |
121 | |
122 | extern __inline unsigned long long |
123 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
124 | _blsi_u64(unsigned long long __X) { |
125 | return __blsi_u64(__X); |
126 | } |
127 | |
128 | extern __inline unsigned long long |
129 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
130 | __blsmsk_u64(unsigned long long __X) { |
131 | return (__X ^ (__X - 1)); |
132 | } |
133 | |
134 | extern __inline unsigned long long |
135 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
136 | _blsmsk_u64(unsigned long long __X) { |
137 | return __blsmsk_u64(__X); |
138 | } |
139 | |
140 | extern __inline unsigned long long |
141 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
142 | __blsr_u64(unsigned long long __X) { |
143 | return (__X & (__X - 1)); |
144 | } |
145 | |
146 | extern __inline unsigned long long |
147 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
148 | _blsr_u64(unsigned long long __X) { |
149 | return __blsr_u64(__X); |
150 | } |
151 | |
152 | extern __inline unsigned long long |
153 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
154 | __tzcnt_u64(unsigned long long __X) { |
155 | return __builtin_ctzll(__X); |
156 | } |
157 | |
158 | extern __inline unsigned long long |
159 | __attribute__((__gnu_inline__, __always_inline__, __artificial__)) |
160 | _tzcnt_u64(unsigned long long __X) { |
161 | return __builtin_ctzll(__X); |
162 | } |
163 | #endif /* __PPC64__ */ |
164 | |
165 | #endif /* BMIINTRIN_H_ */ |
166 |
Warning: This file is not a C or C++ file. It does not have highlighting.