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