[clang] Cir riscv builtin zbkb (PR #195401)
Jianjian Guan via cfe-commits
cfe-commits at lists.llvm.org
Fri May 1 18:58:58 PDT 2026
https://github.com/jacquesguan created https://github.com/llvm/llvm-project/pull/195401
Include 4 builtins: __builtin_riscv_brev8_32, __builtin_riscv_brev8_64, __builtin_riscv_zip_32, __builtin_riscv_unzip_32.
>From ce3d63298acd2201c5921fbff98d7666b6bf020b Mon Sep 17 00:00:00 2001
From: Jianjian GUAN <jacquesguan at me.com>
Date: Fri, 1 May 2026 14:36:43 +0800
Subject: [PATCH] [CIR][RISCV] Support zbkb builtin codegen
Include 4 builtins: __builtin_riscv_brev8_32, __builtin_riscv_brev8_64,
__builtin_riscv_zip_32, __builtin_riscv_unzip_32.
---
clang/lib/CIR/CodeGen/CIRGenBuiltinRISCV.cpp | 15 ++++-
.../CIR/CodeGenBuiltins/RISCV/riscv-zbkb.c | 62 +++++++++++++++++++
2 files changed, 74 insertions(+), 3 deletions(-)
create mode 100644 clang/test/CIR/CodeGenBuiltins/RISCV/riscv-zbkb.c
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinRISCV.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinRISCV.cpp
index be861fe1eb90e..bbd1cd8d04401 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinRISCV.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinRISCV.cpp
@@ -82,9 +82,18 @@ CIRGenFunction::emitRISCVBuiltinExpr(unsigned builtinID, const CallExpr *e) {
}
// Zbkb
case RISCV::BI__builtin_riscv_brev8_32:
- case RISCV::BI__builtin_riscv_brev8_64:
- case RISCV::BI__builtin_riscv_zip_32:
- case RISCV::BI__builtin_riscv_unzip_32:
+ case RISCV::BI__builtin_riscv_brev8_64: {
+ intrinsicName = "riscv.brev8";
+ break;
+ }
+ case RISCV::BI__builtin_riscv_zip_32: {
+ intrinsicName = "riscv.zip";
+ break;
+ }
+ case RISCV::BI__builtin_riscv_unzip_32: {
+ intrinsicName = "riscv.unzip";
+ break;
+ }
// Zknh
case RISCV::BI__builtin_riscv_sha256sig0:
case RISCV::BI__builtin_riscv_sha256sig1:
diff --git a/clang/test/CIR/CodeGenBuiltins/RISCV/riscv-zbkb.c b/clang/test/CIR/CodeGenBuiltins/RISCV/riscv-zbkb.c
new file mode 100644
index 0000000000000..64736cc0a7b57
--- /dev/null
+++ b/clang/test/CIR/CodeGenBuiltins/RISCV/riscv-zbkb.c
@@ -0,0 +1,62 @@
+// RUN: %clang_cc1 -triple riscv32 -target-feature +zbkb -fclangir -emit-cir %s -o - | FileCheck %s --check-prefixes=CIR,CIR32
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zbkb -fclangir -emit-cir %s -o - | FileCheck %s --check-prefixes=CIR,CIR64
+// RUN: %clang_cc1 -triple riscv32 -target-feature +zbkb -fclangir -emit-llvm %s -o - | FileCheck %s --check-prefixes=LLVM,LLVM32
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zbkb -fclangir -emit-llvm %s -o - | FileCheck %s --check-prefixes=LLVM,LLVM64
+// RUN: %clang_cc1 -triple riscv32 -target-feature +zbkb -emit-llvm %s -o - | FileCheck %s --check-prefixes=OGCG,OGCG32
+// RUN: %clang_cc1 -triple riscv64 -target-feature +zbkb -emit-llvm %s -o - | FileCheck %s --check-prefixes=OGCG,OGCG64
+
+// CIR-LABEL: cir.func{{.*}} @test_builtin_brev8_32(
+// CIR: {{%.*}} = cir.call_llvm_intrinsic "riscv.brev8" {{%.*}} : (!u32i) -> !u32i
+// CIR: cir.return
+// LLVM-LABEL: @test_builtin_brev8_32(
+// LLVM: call i32 @llvm.riscv.brev8.i32(i32 {{%.*}})
+// LLVM: ret i32
+// OGCG-LABEL: @test_builtin_brev8_32(
+// OGCG: call i32 @llvm.riscv.brev8.i32(i32 {{%.*}})
+// OGCG: ret i32
+unsigned int test_builtin_brev8_32(unsigned int a) {
+ return __builtin_riscv_brev8_32(a);
+}
+
+#if __riscv_xlen == 32
+// CIR32-LABEL: cir.func{{.*}} @test_builtin_zip_32(
+// CIR32: {{%.*}} = cir.call_llvm_intrinsic "riscv.zip" {{%.*}} : (!u32i) -> !u32i
+// CIR32: cir.return
+// LLVM32-LABEL: @test_builtin_zip_32(
+// LLVM32: call i32 @llvm.riscv.zip.i32(i32 {{%.*}})
+// LLVM32: ret i32
+// OGCG32-LABEL: @test_builtin_zip_32(
+// OGCG32: call i32 @llvm.riscv.zip.i32(i32 {{%.*}})
+// OGCG32: ret i32
+unsigned int test_builtin_zip_32(unsigned int a) {
+ return __builtin_riscv_zip_32(a);
+}
+
+// CIR32-LABEL: cir.func{{.*}} @test_builtin_unzip_32(
+// CIR32: {{%.*}} = cir.call_llvm_intrinsic "riscv.unzip" {{%.*}} : (!u32i) -> !u32i
+// CIR32: cir.return
+// LLVM32-LABEL: @test_builtin_unzip_32(
+// LLVM32: call i32 @llvm.riscv.unzip.i32(i32 {{%.*}})
+// LLVM32: ret i32
+// OGCG32-LABEL: @test_builtin_unzip_32(
+// OGCG32: call i32 @llvm.riscv.unzip.i32(i32 {{%.*}})
+// OGCG32: ret i32
+unsigned int test_builtin_unzip_32(unsigned int a) {
+ return __builtin_riscv_unzip_32(a);
+}
+#endif
+
+#if __riscv_xlen == 64
+// CIR64-LABEL: cir.func{{.*}} @test_builtin_brev8_64(
+// CIR64: {{%.*}} = cir.call_llvm_intrinsic "riscv.brev8" {{%.*}} : (!u64i) -> !u64i
+// CIR64: cir.return
+// LLVM64-LABEL: @test_builtin_brev8_64(
+// LLVM64: call i64 @llvm.riscv.brev8.i64(i64 {{%.*}})
+// LLVM64: ret i64
+// OGCG64-LABEL: @test_builtin_brev8_64(
+// OGCG64: call i64 @llvm.riscv.brev8.i64(i64 {{%.*}})
+// OGCG64: ret i64
+unsigned long long test_builtin_brev8_64(unsigned long long a) {
+ return __builtin_riscv_brev8_64(a);
+}
+#endif
More information about the cfe-commits
mailing list