Skip to content

Commit 1a3b14d

Browse files
committed
[RISCV] Add C intrinsics for scalar bitmanip and crypto
This adds riscv_bitmanip and riscv_crypto.h This is based on the proposed spec here riscv-non-isa/riscv-c-api-doc#44 Tests that previously used builtins directly now use the intrinsics. Reviewed By: wangpc Differential Revision: https://reviews.llvm.org/D155647
1 parent afe8b93 commit 1a3b14d

File tree

16 files changed

+419
-57
lines changed

16 files changed

+419
-57
lines changed

clang/lib/Headers/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ set(ppc_htm_files
116116
)
117117

118118
set(riscv_files
119+
riscv_bitmanip.h
120+
riscv_crypto.h
119121
riscv_ntlh.h
120122
sifive_vector.h
121123
)

clang/lib/Headers/riscv_bitmanip.h

Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
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_riscv_cpop_32(__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_riscv_cpop_64(__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_zbkc)
124+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
125+
__riscv_clmul_32(uint32_t __x, uint32_t __y) {
126+
return __builtin_riscv_clmul_32(__x, __y);
127+
}
128+
129+
#if __riscv_xlen == 32
130+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
131+
__riscv_clmulh_32(uint32_t __x, uint32_t __y) {
132+
return __builtin_riscv_clmulh_32(__x, __y);
133+
}
134+
#endif
135+
136+
#if __riscv_xlen == 64
137+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
138+
__riscv_clmul_64(uint64_t __x, uint64_t __y) {
139+
return __builtin_riscv_clmul_64(__x, __y);
140+
}
141+
142+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
143+
__riscv_clmulh_64(uint64_t __x, uint64_t __y) {
144+
return __builtin_riscv_clmulh_64(__x, __y);
145+
}
146+
#endif
147+
#endif // defined(__riscv_zbkc)
148+
149+
#if defined(__riscv_zbkx)
150+
#if __riscv_xlen == 32
151+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
152+
__riscv_xperm4_32(uint32_t __x, uint32_t __y) {
153+
return __builtin_riscv_xperm4_32(__x, __y);
154+
}
155+
156+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
157+
__riscv_xperm8_32(uint32_t __x, uint32_t __y) {
158+
return __builtin_riscv_xperm8_32(__x, __y);
159+
}
160+
#endif
161+
162+
#if __riscv_xlen == 64
163+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
164+
__riscv_xperm4_64(uint64_t __x, uint64_t __y) {
165+
return __builtin_riscv_xperm4_64(__x, __y);
166+
}
167+
168+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
169+
__riscv_xperm8_64(uint64_t __x, uint64_t __y) {
170+
return __builtin_riscv_xperm8_64(__x, __y);
171+
}
172+
#endif
173+
#endif // defined(__riscv_zbkx)
174+
175+
#if defined(__cplusplus)
176+
}
177+
#endif
178+
179+
#endif

clang/lib/Headers/riscv_crypto.h

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
/*===---- riscv_crypto.h - RISC-V Zk* 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_CRYPTO_H
11+
#define __RISCV_CRYPTO_H
12+
13+
#include <stdint.h>
14+
15+
#if defined(__cplusplus)
16+
extern "C" {
17+
#endif
18+
19+
#if defined(__riscv_zknd)
20+
#if __riscv_xlen == 32
21+
#define __riscv_aes32dsi(x, y, bs) __builtin_riscv_aes32dsi(x, y, bs)
22+
#define __riscv_aes32dsmi(x, y, bs) __builtin_riscv_aes32dsmi(x, y, bs)
23+
#endif
24+
25+
#if __riscv_xlen == 64
26+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
27+
__riscv_aes64ds(uint64_t __x, uint64_t __y) {
28+
return __builtin_riscv_aes64ds(__x, __y);
29+
}
30+
31+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
32+
__riscv_aes64dsm(uint64_t __x, uint64_t __y) {
33+
return __builtin_riscv_aes64dsm(__x, __y);
34+
}
35+
36+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
37+
__riscv_aes64im(uint64_t __x) {
38+
return __builtin_riscv_aes64im(__x);
39+
}
40+
#endif
41+
#endif // defined(__riscv_zknd)
42+
43+
#if defined(__riscv_zkne)
44+
#if __riscv_xlen == 32
45+
#define __riscv_aes32esi(x, y, bs) __builtin_riscv_aes32esi(x, y, bs)
46+
#define __riscv_aes32esmi(x, y, bs) __builtin_riscv_aes32esmi(x, y, bs)
47+
#endif
48+
49+
#if __riscv_xlen == 64
50+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
51+
__riscv_aes64es(uint64_t __x, uint64_t __y) {
52+
return __builtin_riscv_aes64es(__x, __y);
53+
}
54+
55+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
56+
__riscv_aes64esm(uint64_t __x, uint64_t __y) {
57+
return __builtin_riscv_aes64esm(__x, __y);
58+
}
59+
#endif
60+
#endif // defined(__riscv_zknd)
61+
62+
#if defined(__riscv_zknd) || defined(__riscv_zkne)
63+
#if __riscv_xlen == 64
64+
#define __riscv_aes64ks1i(x, rnum) __builtin_riscv_aes64ks1i(x, rnum)
65+
66+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
67+
__riscv_aes64ks2(uint64_t __x, uint64_t __y) {
68+
return __builtin_riscv_aes64ks2(__x, __y);
69+
}
70+
#endif
71+
#endif // defined(__riscv_zknd) || defined(__riscv_zkne)
72+
73+
#if defined(__riscv_zknh)
74+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
75+
__riscv_sha256sig0(uint32_t __x) {
76+
return __builtin_riscv_sha256sig0(__x);
77+
}
78+
79+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
80+
__riscv_sha256sig1(uint32_t __x) {
81+
return __builtin_riscv_sha256sig1(__x);
82+
}
83+
84+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
85+
__riscv_sha256sum0(uint32_t __x) {
86+
return __builtin_riscv_sha256sum0(__x);
87+
}
88+
89+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
90+
__riscv_sha256sum1(uint32_t __x) {
91+
return __builtin_riscv_sha256sum1(__x);
92+
}
93+
94+
#if __riscv_xlen == 32
95+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
96+
__riscv_sha512sig0h(uint32_t __x, uint32_t __y) {
97+
return __builtin_riscv_sha512sig0h(__x, __y);
98+
}
99+
100+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
101+
__riscv_sha512sig0l(uint32_t __x, uint32_t __y) {
102+
return __builtin_riscv_sha512sig0l(__x, __y);
103+
}
104+
105+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
106+
__riscv_sha512sig1h(uint32_t __x, uint32_t __y) {
107+
return __builtin_riscv_sha512sig1h(__x, __y);
108+
}
109+
110+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
111+
__riscv_sha512sig1l(uint32_t __x, uint32_t __y) {
112+
return __builtin_riscv_sha512sig1l(__x, __y);
113+
}
114+
115+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
116+
__riscv_sha512sum0l(uint32_t __x, uint32_t __y) {
117+
return __builtin_riscv_sha512sum0l(__x, __y);
118+
}
119+
120+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
121+
__riscv_sha512sum0r(uint32_t __x, uint32_t __y) {
122+
return __builtin_riscv_sha512sum0r(__x, __y);
123+
}
124+
125+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
126+
__riscv_sha512sum1l(uint32_t __x, uint32_t __y) {
127+
return __builtin_riscv_sha512sum1l(__x, __y);
128+
}
129+
130+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
131+
__riscv_sha512sum1r(uint32_t __x, uint32_t __y) {
132+
return __builtin_riscv_sha512sum1r(__x, __y);
133+
}
134+
#endif
135+
136+
#if __riscv_xlen == 64
137+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
138+
__riscv_sha512sig0(uint64_t __x) {
139+
return __builtin_riscv_sha512sig0(__x);
140+
}
141+
142+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
143+
__riscv_sha512sig1(uint64_t __x) {
144+
return __builtin_riscv_sha512sig1(__x);
145+
}
146+
147+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
148+
__riscv_sha512sum0(uint64_t __x) {
149+
return __builtin_riscv_sha512sum0(__x);
150+
}
151+
152+
static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
153+
__riscv_sha512sum1(uint64_t __x) {
154+
return __builtin_riscv_sha512sum1(__x);
155+
}
156+
#endif
157+
#endif // defined(__riscv_zknh)
158+
159+
#if defined(__riscv_zksh)
160+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
161+
__riscv_sm3p0(uint32_t __x) {
162+
return __builtin_riscv_sm3p0(__x);
163+
}
164+
165+
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
166+
__riscv_sm3p1(uint32_t __x) {
167+
return __builtin_riscv_sm3p1(__x);
168+
}
169+
#endif // defined(__riscv_zksh)
170+
171+
#if defined(__riscv_zksed)
172+
#define __riscv_sm4ed(x, y, bs) __builtin_riscv_sm4ed(x, y, bs);
173+
#define __riscv_sm4ks(x, y, bs) __builtin_riscv_sm4ks(x, y, bs);
174+
#endif // defined(__riscv_zksh)
175+
176+
#if defined(__cplusplus)
177+
}
178+
#endif
179+
180+
#endif

0 commit comments

Comments
 (0)