Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /*===---- riscv_bitmanip.h - RISC-V Zb* 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 __RISCV_BITMANIP_H |
11 | #define __RISCV_BITMANIP_H |
12 | |
13 | #include <stdint.h> |
14 | |
15 | #if defined(__cplusplus) |
16 | extern "C" { |
17 | #endif |
18 | |
19 | #if defined(__riscv_zbb) |
20 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
21 | __riscv_orc_b_32(uint32_t __x) { |
22 | return __builtin_riscv_orc_b_32(__x); |
23 | } |
24 | |
25 | static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) |
26 | __riscv_clz_32(uint32_t __x) { |
27 | return __builtin_riscv_clz_32(__x); |
28 | } |
29 | |
30 | static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) |
31 | __riscv_ctz_32(uint32_t __x) { |
32 | return __builtin_riscv_ctz_32(__x); |
33 | } |
34 | |
35 | static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) |
36 | __riscv_cpop_32(uint32_t __x) { |
37 | return __builtin_popcount(__x); |
38 | } |
39 | |
40 | #if __riscv_xlen == 64 |
41 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
42 | __riscv_orc_b_64(uint64_t __x) { |
43 | return __builtin_riscv_orc_b_64(__x); |
44 | } |
45 | |
46 | static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) |
47 | __riscv_clz_64(uint64_t __x) { |
48 | return __builtin_riscv_clz_64(__x); |
49 | } |
50 | |
51 | static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) |
52 | __riscv_ctz_64(uint64_t __x) { |
53 | return __builtin_riscv_ctz_64(__x); |
54 | } |
55 | |
56 | static __inline__ unsigned __attribute__((__always_inline__, __nodebug__)) |
57 | __riscv_cpop_64(uint64_t __x) { |
58 | return __builtin_popcountll(__x); |
59 | } |
60 | #endif |
61 | #endif // defined(__riscv_zbb) |
62 | |
63 | #if defined(__riscv_zbb) || defined(__riscv_zbkb) |
64 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
65 | __riscv_rev8_32(uint32_t __x) { |
66 | return __builtin_bswap32(__x); |
67 | } |
68 | |
69 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
70 | __riscv_rol_32(uint32_t __x, uint32_t __y) { |
71 | return __builtin_rotateleft32(__x, __y); |
72 | } |
73 | |
74 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
75 | __riscv_ror_32(uint32_t __x, uint32_t __y) { |
76 | return __builtin_rotateright32(__x, __y); |
77 | } |
78 | |
79 | #if __riscv_xlen == 64 |
80 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
81 | __riscv_rev8_64(uint64_t __x) { |
82 | return __builtin_bswap64(__x); |
83 | } |
84 | |
85 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
86 | __riscv_rol_64(uint64_t __x, uint32_t __y) { |
87 | return __builtin_rotateleft64(__x, __y); |
88 | } |
89 | |
90 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
91 | __riscv_ror_64(uint64_t __x, uint32_t __y) { |
92 | return __builtin_rotateright64(__x, __y); |
93 | } |
94 | #endif |
95 | #endif // defined(__riscv_zbb) || defined(__riscv_zbkb) |
96 | |
97 | #if defined(__riscv_zbkb) |
98 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
99 | __riscv_brev8_32(uint32_t __x) { |
100 | return __builtin_riscv_brev8_32(__x); |
101 | } |
102 | |
103 | #if __riscv_xlen == 64 |
104 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
105 | __riscv_brev8_64(uint64_t __x) { |
106 | return __builtin_riscv_brev8_64(__x); |
107 | } |
108 | #endif |
109 | |
110 | #if __riscv_xlen == 32 |
111 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
112 | __riscv_unzip_32(uint32_t __x) { |
113 | return __builtin_riscv_unzip_32(__x); |
114 | } |
115 | |
116 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
117 | __riscv_zip_32(uint32_t __x) { |
118 | return __builtin_riscv_zip_32(__x); |
119 | } |
120 | #endif |
121 | #endif // defined(__riscv_zbkb) |
122 | |
123 | #if defined(__riscv_zbc) |
124 | #if __riscv_xlen == 32 |
125 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
126 | __riscv_clmulr_32(uint32_t __x, uint32_t __y) { |
127 | return __builtin_riscv_clmulr_32(__x, __y); |
128 | } |
129 | #endif |
130 | |
131 | #if __riscv_xlen == 64 |
132 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
133 | __riscv_clmulr_64(uint64_t __x, uint64_t __y) { |
134 | return __builtin_riscv_clmulr_64(__x, __y); |
135 | } |
136 | #endif |
137 | #endif // defined(__riscv_zbc) |
138 | |
139 | #if defined(__riscv_zbkc) || defined(__riscv_zbc) |
140 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
141 | __riscv_clmul_32(uint32_t __x, uint32_t __y) { |
142 | return __builtin_riscv_clmul_32(__x, __y); |
143 | } |
144 | |
145 | #if __riscv_xlen == 32 |
146 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
147 | __riscv_clmulh_32(uint32_t __x, uint32_t __y) { |
148 | return __builtin_riscv_clmulh_32(__x, __y); |
149 | } |
150 | #endif |
151 | |
152 | #if __riscv_xlen == 64 |
153 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
154 | __riscv_clmul_64(uint64_t __x, uint64_t __y) { |
155 | return __builtin_riscv_clmul_64(__x, __y); |
156 | } |
157 | |
158 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
159 | __riscv_clmulh_64(uint64_t __x, uint64_t __y) { |
160 | return __builtin_riscv_clmulh_64(__x, __y); |
161 | } |
162 | #endif |
163 | #endif // defined(__riscv_zbkc) || defined(__riscv_zbc) |
164 | |
165 | #if defined(__riscv_zbkx) |
166 | #if __riscv_xlen == 32 |
167 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
168 | __riscv_xperm4_32(uint32_t __x, uint32_t __y) { |
169 | return __builtin_riscv_xperm4_32(__x, __y); |
170 | } |
171 | |
172 | static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__)) |
173 | __riscv_xperm8_32(uint32_t __x, uint32_t __y) { |
174 | return __builtin_riscv_xperm8_32(__x, __y); |
175 | } |
176 | #endif |
177 | |
178 | #if __riscv_xlen == 64 |
179 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
180 | __riscv_xperm4_64(uint64_t __x, uint64_t __y) { |
181 | return __builtin_riscv_xperm4_64(__x, __y); |
182 | } |
183 | |
184 | static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__)) |
185 | __riscv_xperm8_64(uint64_t __x, uint64_t __y) { |
186 | return __builtin_riscv_xperm8_64(__x, __y); |
187 | } |
188 | #endif |
189 | #endif // defined(__riscv_zbkx) |
190 | |
191 | #if defined(__cplusplus) |
192 | } |
193 | #endif |
194 | |
195 | #endif |
196 |
Warning: This file is not a C or C++ file. It does not have highlighting.