PR target/115751: Avoid force_reg in ix86_expand_ternlog.
[official-gcc.git] / gcc / config / riscv / riscv_bitmanip.h
blobc0cc86b84001b9c7a3d4c390ea37af6dd0285bbc
1 /* RISC-V Bitmanip Extension intrinsics include file.
2 Copyright (C) 2024 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published
8 by the Free Software Foundation; either version 3, or (at your
9 option) any later version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 <http://www.gnu.org/licenses/>. */
25 #ifndef __RISCV_BITMANIP_H
26 #define __RISCV_BITMANIP_H
28 #include <stdint.h>
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
34 #if defined (__riscv_zbb)
36 extern __inline unsigned
37 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
38 __riscv_clz_32 (uint32_t x)
40 return __builtin_riscv_clz_32 (x);
43 extern __inline unsigned
44 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
45 __riscv_ctz_32 (uint32_t x)
47 return __builtin_riscv_ctz_32 (x);
50 extern __inline unsigned
51 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
52 __riscv_cpop_32 (uint32_t x)
54 return __builtin_riscv_popcount_32 (x);
57 extern __inline uint32_t
58 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
59 __riscv_orc_b_32 (uint32_t x)
61 return __builtin_riscv_orc_b_32 (x);
64 #if __riscv_xlen == 64
66 extern __inline unsigned
67 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
68 __riscv_clz_64 (uint64_t x)
70 return __builtin_riscv_clz_64 (x);
73 extern __inline unsigned
74 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
75 __riscv_ctz_64 (uint64_t x)
77 return __builtin_riscv_ctz_64 (x);
80 extern __inline unsigned
81 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
82 __riscv_cpop_64 (uint64_t x)
84 return __builtin_riscv_popcount_64 (x);
87 extern __inline uint64_t
88 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
89 __riscv_orc_b_64 (uint64_t x)
91 return __builtin_riscv_orc_b_64 (x);
94 #endif
96 #endif // __riscv_zbb
98 #if defined (__riscv_zbb) || defined (__riscv_zbkb)
100 extern __inline uint32_t
101 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
102 __riscv_ror_32 (uint32_t x, uint32_t shamt)
104 return __builtin_riscv_ror_32 (x,shamt);
107 extern __inline uint32_t
108 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
109 __riscv_rol_32 (uint32_t x, uint32_t shamt)
111 return __builtin_riscv_rol_32 (x,shamt);
114 extern __inline uint32_t
115 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
116 __riscv_rev8_32 (uint32_t x)
118 return __builtin_bswap32 (x);
121 #if __riscv_xlen == 64
123 extern __inline uint64_t
124 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
125 __riscv_ror_64 (uint64_t x, uint32_t shamt)
127 return __builtin_riscv_ror_64 (x,shamt);
130 extern __inline uint64_t
131 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
132 __riscv_rol_64 (uint64_t x, uint32_t shamt)
134 return __builtin_riscv_rol_64 (x,shamt);
137 extern __inline uint64_t
138 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
139 __riscv_rev8_64 (uint64_t x)
141 return __builtin_bswap64 (x);
144 #endif
146 #endif // __riscv_zbb || __riscv_zbkb
148 #if defined (__riscv_zbkb)
150 extern __inline uint32_t
151 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
152 __riscv_brev8_32 (uint32_t x)
154 return __builtin_riscv_brev8_32 (x);
157 #if __riscv_xlen == 32
159 extern __inline uint32_t
160 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
161 __riscv_zip_32 (uint32_t x)
163 return __builtin_riscv_zip (x);
166 extern __inline uint32_t
167 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
168 __riscv_unzip_32 (uint32_t x)
170 return __builtin_riscv_unzip (x);
173 #endif
175 #if __riscv_xlen == 64
177 extern __inline uint64_t
178 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
179 __riscv_brev8_64 (uint64_t x)
181 return __builtin_riscv_brev8_64 (x);
184 #endif
186 #endif // __riscv_zbkb
188 #if defined (__riscv_zbc) || defined (__riscv_zbkc)
190 extern __inline uint32_t
191 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
192 __riscv_clmul_32 (uint32_t rs1, uint32_t rs2)
194 return __builtin_riscv_clmul_32 (rs1,rs2);
197 #if __riscv_xlen == 32
199 extern __inline uint32_t
200 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
201 __riscv_clmulh_32 (uint32_t rs1, uint32_t rs2)
203 return __builtin_riscv_clmulh_32 (rs1,rs2);
206 #endif
208 #if __riscv_xlen == 64
210 extern __inline uint64_t
211 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
212 __riscv_clmul_64 (uint64_t rs1, uint64_t rs2)
214 return __builtin_riscv_clmul_64 (rs1,rs2);
217 extern __inline uint64_t
218 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
219 __riscv_clmulh_64 (uint64_t rs1, uint64_t rs2)
221 return __builtin_riscv_clmulh_64 (rs1,rs2);
224 #endif
226 #endif // __riscv_zbc || __riscv_zbkc
228 #if defined (__riscv_zbc)
230 #if __riscv_xlen == 32
232 extern __inline uint32_t
233 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
234 __riscv_clmulr_32 (uint32_t rs1, uint32_t rs2)
236 return __builtin_riscv_clmulr_32 (rs1,rs2);
239 #endif
241 #if __riscv_xlen == 64
243 extern __inline uint64_t
244 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
245 __riscv_clmulr_64 (uint64_t rs1, uint64_t rs2)
247 return __builtin_riscv_clmulr_64 (rs1,rs2);
250 #endif
252 #endif // __riscv_zbc
254 #if defined (__riscv_zbkx)
256 #if __riscv_xlen == 32
258 extern __inline uint32_t
259 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
260 __riscv_xperm4_32 (uint32_t rs1, uint32_t rs2)
262 return __builtin_riscv_xperm4 (rs1,rs2);
265 extern __inline uint32_t
266 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
267 __riscv_xperm8_32 (uint32_t rs1, uint32_t rs2)
269 return __builtin_riscv_xperm8 (rs1,rs2);
272 #endif
274 #if __riscv_xlen == 64
276 extern __inline uint64_t
277 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
278 __riscv_xperm4_64 (uint64_t rs1, uint64_t rs2)
280 return __builtin_riscv_xperm4 (rs1,rs2);
283 extern __inline uint64_t
284 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
285 __riscv_xperm8_64 (uint64_t rs1, uint64_t rs2)
287 return __builtin_riscv_xperm8 (rs1,rs2);
290 #endif
292 #endif // __riscv_zbkx
294 #if defined (__cplusplus)
296 #endif // __cplusplus
297 #endif // __RISCV_BITMANIP_H