Skip to content

Commit 1dc715a

Browse files
authored
[Clang][RISCV] Add missing support for __riscv_clmulr_32/64 in riscv_bitmanip.h (#76289)
This patch adds support for `__riscv_clmulr_32/64` in `riscv_bitmanip.h`. It also fixes the extension requirements of `clmul/clmulh`.
1 parent d26791b commit 1dc715a

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

clang/lib/Headers/riscv_bitmanip.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,23 @@ __riscv_zip_32(uint32_t __x) {
120120
#endif
121121
#endif // defined(__riscv_zbkb)
122122

123-
#if defined(__riscv_zbkc)
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)
124140
static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
125141
__riscv_clmul_32(uint32_t __x, uint32_t __y) {
126142
return __builtin_riscv_clmul_32(__x, __y);
@@ -144,7 +160,7 @@ __riscv_clmulh_64(uint64_t __x, uint64_t __y) {
144160
return __builtin_riscv_clmulh_64(__x, __y);
145161
}
146162
#endif
147-
#endif // defined(__riscv_zbkc)
163+
#endif // defined(__riscv_zbkc) || defined(__riscv_zbc)
148164

149165
#if defined(__riscv_zbkx)
150166
#if __riscv_xlen == 32

clang/test/CodeGen/RISCV/rvb-intrinsics/zbc.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// RUN: -disable-O0-optnone | opt -S -passes=mem2reg \
77
// RUN: | FileCheck %s -check-prefix=RV64ZBC
88

9-
#include <stdint.h>
9+
#include <riscv_bitmanip.h>
1010

1111
#if __riscv_xlen == 64
1212
// RV64ZBC-LABEL: @clmul_64(
@@ -15,7 +15,7 @@
1515
// RV64ZBC-NEXT: ret i64 [[TMP0]]
1616
//
1717
uint64_t clmul_64(uint64_t a, uint64_t b) {
18-
return __builtin_riscv_clmul_64(a, b);
18+
return __riscv_clmul_64(a, b);
1919
}
2020

2121
// RV64ZBC-LABEL: @clmulh_64(
@@ -24,7 +24,7 @@ uint64_t clmul_64(uint64_t a, uint64_t b) {
2424
// RV64ZBC-NEXT: ret i64 [[TMP0]]
2525
//
2626
uint64_t clmulh_64(uint64_t a, uint64_t b) {
27-
return __builtin_riscv_clmulh_64(a, b);
27+
return __riscv_clmulh_64(a, b);
2828
}
2929

3030
// RV64ZBC-LABEL: @clmulr_64(
@@ -33,7 +33,7 @@ uint64_t clmulh_64(uint64_t a, uint64_t b) {
3333
// RV64ZBC-NEXT: ret i64 [[TMP0]]
3434
//
3535
uint64_t clmulr_64(uint64_t a, uint64_t b) {
36-
return __builtin_riscv_clmulr_64(a, b);
36+
return __riscv_clmulr_64(a, b);
3737
}
3838
#endif
3939

@@ -48,7 +48,7 @@ uint64_t clmulr_64(uint64_t a, uint64_t b) {
4848
// RV64ZBC-NEXT: ret i32 [[TMP0]]
4949
//
5050
uint32_t clmul_32(uint32_t a, uint32_t b) {
51-
return __builtin_riscv_clmul_32(a, b);
51+
return __riscv_clmul_32(a, b);
5252
}
5353

5454
#if __riscv_xlen == 32
@@ -58,7 +58,7 @@ uint32_t clmul_32(uint32_t a, uint32_t b) {
5858
// RV32ZBC-NEXT: ret i32 [[TMP0]]
5959
//
6060
uint32_t clmulh_32(uint32_t a, uint32_t b) {
61-
return __builtin_riscv_clmulh_32(a, b);
61+
return __riscv_clmulh_32(a, b);
6262
}
6363

6464
// RV32ZBC-LABEL: @clmulr_32(
@@ -67,6 +67,6 @@ uint32_t clmulh_32(uint32_t a, uint32_t b) {
6767
// RV32ZBC-NEXT: ret i32 [[TMP0]]
6868
//
6969
uint32_t clmulr_32(uint32_t a, uint32_t b) {
70-
return __builtin_riscv_clmulr_32(a, b);
70+
return __riscv_clmulr_32(a, b);
7171
}
7272
#endif

0 commit comments

Comments
 (0)