[clang] 1a3b14d - [RISCV] Add C intrinsics for scalar bitmanip and crypto

Craig Topper via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 24 16:17:41 PST 2023


Author: Craig Topper
Date: 2023-11-24T16:17:22-08:00
New Revision: 1a3b14d26152ab7e7352c8e7aa97ec880cdac82d

URL: https://github.com/llvm/llvm-project/commit/1a3b14d26152ab7e7352c8e7aa97ec880cdac82d
DIFF: https://github.com/llvm/llvm-project/commit/1a3b14d26152ab7e7352c8e7aa97ec880cdac82d.diff

LOG: [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 https://github.com/riscv-non-isa/riscv-c-api-doc/pull/44

Tests that previously used builtins directly now use the intrinsics.

Reviewed By: wangpc

Differential Revision: https://reviews.llvm.org/D155647

Added: 
    clang/lib/Headers/riscv_bitmanip.h
    clang/lib/Headers/riscv_crypto.h

Modified: 
    clang/lib/Headers/CMakeLists.txt
    clang/test/CodeGen/RISCV/rvb-intrinsics/zbkb.c
    clang/test/CodeGen/RISCV/rvb-intrinsics/zbkc.c
    clang/test/CodeGen/RISCV/rvb-intrinsics/zbkx.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknd.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zkne.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknh.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd-zkne.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zkne.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknh.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/zksed.c
    clang/test/CodeGen/RISCV/rvk-intrinsics/zksh.c
    llvm/docs/ReleaseNotes.rst

Removed: 
    


################################################################################
diff  --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt
index 8b1e2bc4afa4dcd..fdd54c05eedf825 100644
--- a/clang/lib/Headers/CMakeLists.txt
+++ b/clang/lib/Headers/CMakeLists.txt
@@ -116,6 +116,8 @@ set(ppc_htm_files
   )
 
 set(riscv_files
+  riscv_bitmanip.h
+  riscv_crypto.h
   riscv_ntlh.h
   sifive_vector.h
   )

diff  --git a/clang/lib/Headers/riscv_bitmanip.h b/clang/lib/Headers/riscv_bitmanip.h
new file mode 100644
index 000000000000000..1a81cc8618c9756
--- /dev/null
+++ b/clang/lib/Headers/riscv_bitmanip.h
@@ -0,0 +1,179 @@
+/*===---- riscv_bitmanip.h - RISC-V Zb* intrinsics --------------------------===
+ *
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __RISCV_BITMANIP_H
+#define __RISCV_BITMANIP_H
+
+#include <stdint.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#if defined(__riscv_zbb)
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_orc_b_32(uint32_t __x) {
+  return __builtin_riscv_orc_b_32(__x);
+}
+
+static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
+__riscv_clz_32(uint32_t __x) {
+  return __builtin_riscv_clz_32(__x);
+}
+
+static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
+__riscv_ctz_32(uint32_t __x) {
+  return __builtin_riscv_ctz_32(__x);
+}
+
+static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
+__riscv_cpop_32(uint32_t __x) {
+  return __builtin_riscv_cpop_32(__x);
+}
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_orc_b_64(uint64_t __x) {
+  return __builtin_riscv_orc_b_64(__x);
+}
+
+static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
+__riscv_clz_64(uint64_t __x) {
+  return __builtin_riscv_clz_64(__x);
+}
+
+static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
+__riscv_ctz_64(uint64_t __x) {
+  return __builtin_riscv_ctz_64(__x);
+}
+
+static __inline__ unsigned __attribute__((__always_inline__, __nodebug__))
+__riscv_cpop_64(uint64_t __x) {
+  return __builtin_riscv_cpop_64(__x);
+}
+#endif
+#endif // defined(__riscv_zbb)
+
+#if defined(__riscv_zbb) || defined(__riscv_zbkb)
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_rev8_32(uint32_t __x) {
+  return __builtin_bswap32(__x);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_rol_32(uint32_t __x, uint32_t __y) {
+  return __builtin_rotateleft32(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_ror_32(uint32_t __x, uint32_t __y) {
+  return __builtin_rotateright32(__x, __y);
+}
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_rev8_64(uint64_t __x) {
+  return __builtin_bswap64(__x);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_rol_64(uint64_t __x, uint32_t __y) {
+  return __builtin_rotateleft64(__x, __y);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_ror_64(uint64_t __x, uint32_t __y) {
+  return __builtin_rotateright64(__x, __y);
+}
+#endif
+#endif // defined(__riscv_zbb) || defined(__riscv_zbkb)
+
+#if defined(__riscv_zbkb)
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_brev8_32(uint32_t __x) {
+  return __builtin_riscv_brev8_32(__x);
+}
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_brev8_64(uint64_t __x) {
+  return __builtin_riscv_brev8_64(__x);
+}
+#endif
+
+#if __riscv_xlen == 32
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_unzip_32(uint32_t __x) {
+  return __builtin_riscv_unzip_32(__x);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_zip_32(uint32_t __x) {
+  return __builtin_riscv_zip_32(__x);
+}
+#endif
+#endif // defined(__riscv_zbkb)
+
+#if defined(__riscv_zbkc)
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_clmul_32(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_clmul_32(__x, __y);
+}
+
+#if __riscv_xlen == 32
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_clmulh_32(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_clmulh_32(__x, __y);
+}
+#endif
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_clmul_64(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_clmul_64(__x, __y);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_clmulh_64(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_clmulh_64(__x, __y);
+}
+#endif
+#endif // defined(__riscv_zbkc)
+
+#if defined(__riscv_zbkx)
+#if __riscv_xlen == 32
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_xperm4_32(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_xperm4_32(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_xperm8_32(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_xperm8_32(__x, __y);
+}
+#endif
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_xperm4_64(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_xperm4_64(__x, __y);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_xperm8_64(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_xperm8_64(__x, __y);
+}
+#endif
+#endif // defined(__riscv_zbkx)
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif

diff  --git a/clang/lib/Headers/riscv_crypto.h b/clang/lib/Headers/riscv_crypto.h
new file mode 100644
index 000000000000000..39ee0898af0ff05
--- /dev/null
+++ b/clang/lib/Headers/riscv_crypto.h
@@ -0,0 +1,180 @@
+/*===---- riscv_crypto.h - RISC-V Zk* intrinsics ---------------------------===
+ *
+ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+ * See https://llvm.org/LICENSE.txt for license information.
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __RISCV_CRYPTO_H
+#define __RISCV_CRYPTO_H
+
+#include <stdint.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#if defined(__riscv_zknd)
+#if __riscv_xlen == 32
+#define __riscv_aes32dsi(x, y, bs) __builtin_riscv_aes32dsi(x, y, bs)
+#define __riscv_aes32dsmi(x, y, bs) __builtin_riscv_aes32dsmi(x, y, bs)
+#endif
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_aes64ds(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_aes64ds(__x, __y);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_aes64dsm(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_aes64dsm(__x, __y);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_aes64im(uint64_t __x) {
+  return __builtin_riscv_aes64im(__x);
+}
+#endif
+#endif // defined(__riscv_zknd)
+
+#if defined(__riscv_zkne)
+#if __riscv_xlen == 32
+#define __riscv_aes32esi(x, y, bs) __builtin_riscv_aes32esi(x, y, bs)
+#define __riscv_aes32esmi(x, y, bs) __builtin_riscv_aes32esmi(x, y, bs)
+#endif
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_aes64es(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_aes64es(__x, __y);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_aes64esm(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_aes64esm(__x, __y);
+}
+#endif
+#endif // defined(__riscv_zknd)
+
+#if defined(__riscv_zknd) || defined(__riscv_zkne)
+#if __riscv_xlen == 64
+#define __riscv_aes64ks1i(x, rnum) __builtin_riscv_aes64ks1i(x, rnum)
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_aes64ks2(uint64_t __x, uint64_t __y) {
+  return __builtin_riscv_aes64ks2(__x, __y);
+}
+#endif
+#endif // defined(__riscv_zknd) || defined(__riscv_zkne)
+
+#if defined(__riscv_zknh)
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha256sig0(uint32_t __x) {
+  return __builtin_riscv_sha256sig0(__x);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha256sig1(uint32_t __x) {
+  return __builtin_riscv_sha256sig1(__x);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha256sum0(uint32_t __x) {
+  return __builtin_riscv_sha256sum0(__x);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha256sum1(uint32_t __x) {
+  return __builtin_riscv_sha256sum1(__x);
+}
+
+#if __riscv_xlen == 32
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sig0h(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sig0h(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sig0l(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sig0l(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sig1h(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sig1h(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sig1l(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sig1l(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sum0l(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sum0l(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sum0r(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sum0r(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sum1l(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sum1l(__x, __y);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sum1r(uint32_t __x, uint32_t __y) {
+  return __builtin_riscv_sha512sum1r(__x, __y);
+}
+#endif
+
+#if __riscv_xlen == 64
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sig0(uint64_t __x) {
+  return __builtin_riscv_sha512sig0(__x);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sig1(uint64_t __x) {
+  return __builtin_riscv_sha512sig1(__x);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sum0(uint64_t __x) {
+  return __builtin_riscv_sha512sum0(__x);
+}
+
+static __inline__ uint64_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sha512sum1(uint64_t __x) {
+  return __builtin_riscv_sha512sum1(__x);
+}
+#endif
+#endif // defined(__riscv_zknh)
+
+#if defined(__riscv_zksh)
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sm3p0(uint32_t __x) {
+  return __builtin_riscv_sm3p0(__x);
+}
+
+static __inline__ uint32_t __attribute__((__always_inline__, __nodebug__))
+__riscv_sm3p1(uint32_t __x) {
+  return __builtin_riscv_sm3p1(__x);
+}
+#endif // defined(__riscv_zksh)
+
+#if defined(__riscv_zksed)
+#define __riscv_sm4ed(x, y, bs) __builtin_riscv_sm4ed(x, y, bs);
+#define __riscv_sm4ks(x, y, bs) __builtin_riscv_sm4ks(x, y, bs);
+#endif // defined(__riscv_zksh)
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif

diff  --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkb.c b/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkb.c
index 9be7cc6a0fb7ea0..a27a543bd2ae691 100644
--- a/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkb.c
+++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkb.c
@@ -6,7 +6,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZBKB
 
-#include <stdint.h>
+#include <riscv_bitmanip.h>
 
 // RV32ZBKB-LABEL: @brev8_32(
 // RV32ZBKB-NEXT:  entry:
@@ -20,7 +20,7 @@
 //
 uint32_t brev8_32(uint32_t rs1)
 {
-  return __builtin_riscv_brev8_32(rs1);
+  return __riscv_brev8_32(rs1);
 }
 
 #if __riscv_xlen == 64
@@ -31,7 +31,7 @@ uint32_t brev8_32(uint32_t rs1)
 //
 uint64_t brev8_64(uint64_t rs1)
 {
-  return __builtin_riscv_brev8_64(rs1);
+  return __riscv_brev8_64(rs1);
 }
 #endif
 
@@ -43,7 +43,7 @@ uint64_t brev8_64(uint64_t rs1)
 //
 uint32_t zip(uint32_t rs1)
 {
-  return __builtin_riscv_zip_32(rs1);
+  return __riscv_zip_32(rs1);
 }
 
 // RV32ZBKB-LABEL: @unzip(
@@ -53,6 +53,6 @@ uint32_t zip(uint32_t rs1)
 //
 uint32_t unzip(uint32_t rs1)
 {
-  return __builtin_riscv_unzip_32(rs1);
+  return __riscv_unzip_32(rs1);
 }
 #endif

diff  --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkc.c b/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkc.c
index ca09f899f9af625..38d168d4f6334df 100644
--- a/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkc.c
+++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkc.c
@@ -6,7 +6,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZBKC
 
-#include <stdint.h>
+#include <riscv_bitmanip.h>
 
 #if __riscv_xlen == 64
 // RV64ZBKC-LABEL: @clmul_64(
@@ -15,7 +15,7 @@
 // RV64ZBKC-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t clmul_64(uint64_t a, uint64_t b) {
-  return __builtin_riscv_clmul_64(a, b);
+  return __riscv_clmul_64(a, b);
 }
 
 // RV64ZBKC-LABEL: @clmulh_64(
@@ -24,7 +24,7 @@ uint64_t clmul_64(uint64_t a, uint64_t b) {
 // RV64ZBKC-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t clmulh_64(uint64_t a, uint64_t b) {
-  return __builtin_riscv_clmulh_64(a, b);
+  return __riscv_clmulh_64(a, b);
 }
 #endif
 
@@ -39,7 +39,7 @@ uint64_t clmulh_64(uint64_t a, uint64_t b) {
 // RV64ZBKC-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t clmul_32(uint32_t a, uint32_t b) {
-  return __builtin_riscv_clmul_32(a, b);
+  return __riscv_clmul_32(a, b);
 }
 
 #if __riscv_xlen == 32
@@ -49,6 +49,6 @@ uint32_t clmul_32(uint32_t a, uint32_t b) {
 // RV32ZBKC-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t clmulh_32(uint32_t a, uint32_t b) {
-  return __builtin_riscv_clmulh_32(a, b);
+  return __riscv_clmulh_32(a, b);
 }
 #endif

diff  --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkx.c b/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkx.c
index 1eeb2cc8582c69f..9010a7947d4350d 100644
--- a/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkx.c
+++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/zbkx.c
@@ -6,7 +6,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZBKX
 
-#include <stdint.h>
+#include <riscv_bitmanip.h>
 
 #if __riscv_xlen == 32
 // RV32ZBKX-LABEL: @xperm8_32(
@@ -16,7 +16,7 @@
 //
 uint32_t xperm8_32(uint32_t rs1, uint32_t rs2)
 {
-  return __builtin_riscv_xperm8_32(rs1, rs2);
+  return __riscv_xperm8_32(rs1, rs2);
 }
 
 // RV32ZBKX-LABEL: @xperm4_32(
@@ -26,7 +26,7 @@ uint32_t xperm8_32(uint32_t rs1, uint32_t rs2)
 //
 uint32_t xperm4_32(uint32_t rs1, uint32_t rs2)
 {
-  return __builtin_riscv_xperm4_32(rs1, rs2);
+  return __riscv_xperm4_32(rs1, rs2);
 }
 #endif
 
@@ -38,7 +38,7 @@ uint32_t xperm4_32(uint32_t rs1, uint32_t rs2)
 //
 uint64_t xperm8_64(uint64_t rs1, uint64_t rs2)
 {
-  return __builtin_riscv_xperm8_64(rs1, rs2);
+  return __riscv_xperm8_64(rs1, rs2);
 }
 
 // RV64ZBKX-LABEL: @xperm4_64(
@@ -48,6 +48,6 @@ uint64_t xperm8_64(uint64_t rs1, uint64_t rs2)
 //
 uint64_t xperm4_64(uint64_t rs1, uint64_t rs2)
 {
-  return __builtin_riscv_xperm4_64(rs1, rs2);
+  return __riscv_xperm4_64(rs1, rs2);
 }
 #endif

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknd.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknd.c
index b2da68e8604a9e0..8b6e1f1673b694d 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknd.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknd.c
@@ -3,7 +3,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV32ZKND
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV32ZKND-LABEL: @aes32dsi(
 // RV32ZKND-NEXT:  entry:
@@ -11,7 +11,7 @@
 // RV32ZKND-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t aes32dsi(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_aes32dsi(rs1, rs2, 3);
+  return __riscv_aes32dsi(rs1, rs2, 3);
 }
 
 // RV32ZKND-LABEL: @aes32dsmi(
@@ -20,5 +20,5 @@ uint32_t aes32dsi(uint32_t rs1, uint32_t rs2) {
 // RV32ZKND-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t aes32dsmi(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_aes32dsmi(rs1, rs2, 3);
+  return __riscv_aes32dsmi(rs1, rs2, 3);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zkne.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zkne.c
index 8f906e094c724cb..578614e84f824fd 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zkne.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zkne.c
@@ -3,7 +3,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV32ZKNE
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV32ZKNE-LABEL: @aes32esi(
 // RV32ZKNE-NEXT:  entry:
@@ -11,7 +11,7 @@
 // RV32ZKNE-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t aes32esi(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_aes32esi(rs1, rs2, 3);
+  return __riscv_aes32esi(rs1, rs2, 3);
 }
 
 // RV32ZKNE-LABEL: @aes32esmi(
@@ -20,5 +20,5 @@ uint32_t aes32esi(uint32_t rs1, uint32_t rs2) {
 // RV32ZKNE-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t aes32esmi(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_aes32esmi(rs1, rs2, 3);
+  return __riscv_aes32esmi(rs1, rs2, 3);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknh.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknh.c
index 9bb320b093f3cb6..7f4740a06ce9db0 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknh.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv32-zknh.c
@@ -3,7 +3,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV32ZKNH
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV32ZKNH-LABEL: @sha256sig0(
 // RV32ZKNH-NEXT:  entry:
@@ -11,7 +11,7 @@
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sig0(uint32_t rs1) {
-  return __builtin_riscv_sha256sig0(rs1);
+  return __riscv_sha256sig0(rs1);
 }
 
 // RV32ZKNH-LABEL: @sha256sig1(
@@ -20,7 +20,7 @@ uint32_t sha256sig0(uint32_t rs1) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sig1(uint32_t rs1) {
-  return __builtin_riscv_sha256sig1(rs1);
+  return __riscv_sha256sig1(rs1);
 }
 
 // RV32ZKNH-LABEL: @sha256sum0(
@@ -29,7 +29,7 @@ uint32_t sha256sig1(uint32_t rs1) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sum0(uint32_t rs1) {
-  return __builtin_riscv_sha256sum0(rs1);
+  return __riscv_sha256sum0(rs1);
 }
 
 // RV32ZKNH-LABEL: @sha256sum1(
@@ -38,7 +38,7 @@ uint32_t sha256sum0(uint32_t rs1) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sum1(uint32_t rs1) {
-  return __builtin_riscv_sha256sum1(rs1);
+  return __riscv_sha256sum1(rs1);
 }
 
 // RV32ZKNH-LABEL: @sha512sig0h(
@@ -47,7 +47,7 @@ uint32_t sha256sum1(uint32_t rs1) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha512sig0h(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sha512sig0h(rs1, rs2);
+  return __riscv_sha512sig0h(rs1, rs2);
 }
 
 // RV32ZKNH-LABEL: @sha512sig0l(
@@ -56,7 +56,7 @@ uint32_t sha512sig0h(uint32_t rs1, uint32_t rs2) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha512sig0l(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sha512sig0l(rs1, rs2);
+  return __riscv_sha512sig0l(rs1, rs2);
 }
 
 // RV32ZKNH-LABEL: @sha512sig1h(
@@ -65,7 +65,7 @@ uint32_t sha512sig0l(uint32_t rs1, uint32_t rs2) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha512sig1h(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sha512sig1h(rs1, rs2);
+  return __riscv_sha512sig1h(rs1, rs2);
 }
 
 // RV32ZKNH-LABEL: @sha512sig1l(
@@ -74,7 +74,7 @@ uint32_t sha512sig1h(uint32_t rs1, uint32_t rs2) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha512sig1l(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sha512sig1l(rs1, rs2);
+  return __riscv_sha512sig1l(rs1, rs2);
 }
 
 // RV32ZKNH-LABEL: @sha512sum0r(
@@ -83,7 +83,7 @@ uint32_t sha512sig1l(uint32_t rs1, uint32_t rs2) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha512sum0r(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sha512sum0r(rs1, rs2);
+  return __riscv_sha512sum0r(rs1, rs2);
 }
 
 // RV32ZKNH-LABEL: @sha512sum1r(
@@ -92,5 +92,5 @@ uint32_t sha512sum0r(uint32_t rs1, uint32_t rs2) {
 // RV32ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha512sum1r(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sha512sum1r(rs1, rs2);
+  return __riscv_sha512sum1r(rs1, rs2);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd-zkne.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd-zkne.c
index a008ce36f1b7ba2..7f18e732ee41c92 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd-zkne.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd-zkne.c
@@ -6,7 +6,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZKND-ZKNE
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV64ZKND-ZKNE-LABEL: @aes64ks1i(
 // RV64ZKND-ZKNE-NEXT:  entry:
@@ -14,7 +14,7 @@
 // RV64ZKND-ZKNE-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t aes64ks1i(uint64_t rs1) {
-  return __builtin_riscv_aes64ks1i(rs1, 0);
+  return __riscv_aes64ks1i(rs1, 0);
 }
 
 // RV64ZKND-ZKNE-LABEL: @aes64ks2(
@@ -23,5 +23,5 @@ uint64_t aes64ks1i(uint64_t rs1) {
 // RV64ZKND-ZKNE-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t aes64ks2(uint64_t rs1, uint64_t rs2) {
-  return __builtin_riscv_aes64ks2(rs1, rs2);
+  return __riscv_aes64ks2(rs1, rs2);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd.c
index a42555fe9ac6a8f..40ac72169f669ca 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknd.c
@@ -3,7 +3,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZKND
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV64ZKND-LABEL: @aes64dsm(
 // RV64ZKND-NEXT:  entry:
@@ -11,7 +11,7 @@
 // RV64ZKND-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t aes64dsm(uint64_t rs1, uint64_t rs2) {
-  return __builtin_riscv_aes64dsm(rs1, rs2);
+  return __riscv_aes64dsm(rs1, rs2);
 }
 
 
@@ -21,7 +21,7 @@ uint64_t aes64dsm(uint64_t rs1, uint64_t rs2) {
 // RV64ZKND-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t aes64ds(uint64_t rs1, uint64_t rs2) {
-  return __builtin_riscv_aes64ds(rs1, rs2);
+  return __riscv_aes64ds(rs1, rs2);
 }
 
 
@@ -31,5 +31,5 @@ uint64_t aes64ds(uint64_t rs1, uint64_t rs2) {
 // RV64ZKND-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t aes64im(uint64_t rs1) {
-  return __builtin_riscv_aes64im(rs1);
+  return __riscv_aes64im(rs1);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zkne.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zkne.c
index 49f9de21f24dc5f..096b2b759aac7ee 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zkne.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zkne.c
@@ -3,7 +3,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZKNE
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV64ZKNE-LABEL: @aes64es(
 // RV64ZKNE-NEXT:  entry:
@@ -11,7 +11,7 @@
 // RV64ZKNE-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t aes64es(uint64_t rs1, uint64_t rs2) {
-  return __builtin_riscv_aes64es(rs1, rs2);
+  return __riscv_aes64es(rs1, rs2);
 }
 
 
@@ -21,5 +21,5 @@ uint64_t aes64es(uint64_t rs1, uint64_t rs2) {
 // RV64ZKNE-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t aes64esm(uint64_t rs1, uint64_t rs2) {
-  return __builtin_riscv_aes64esm(rs1, rs2);
+  return __riscv_aes64esm(rs1, rs2);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknh.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknh.c
index 83326a70591a3ae..a2ac4881854a68b 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknh.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/riscv64-zknh.c
@@ -3,7 +3,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZKNH
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV64ZKNH-LABEL: @sha512sig0(
 // RV64ZKNH-NEXT:  entry:
@@ -11,7 +11,7 @@
 // RV64ZKNH-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t sha512sig0(uint64_t rs1) {
-  return __builtin_riscv_sha512sig0(rs1);
+  return __riscv_sha512sig0(rs1);
 }
 
 
@@ -21,7 +21,7 @@ uint64_t sha512sig0(uint64_t rs1) {
 // RV64ZKNH-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t sha512sig1(uint64_t rs1) {
-  return __builtin_riscv_sha512sig1(rs1);
+  return __riscv_sha512sig1(rs1);
 }
 
 
@@ -31,7 +31,7 @@ uint64_t sha512sig1(uint64_t rs1) {
 // RV64ZKNH-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t sha512sum0(uint64_t rs1) {
-  return __builtin_riscv_sha512sum0(rs1);
+  return __riscv_sha512sum0(rs1);
 }
 
 
@@ -41,7 +41,7 @@ uint64_t sha512sum0(uint64_t rs1) {
 // RV64ZKNH-NEXT:    ret i64 [[TMP0]]
 //
 uint64_t sha512sum1(uint64_t rs1) {
-  return __builtin_riscv_sha512sum1(rs1);
+  return __riscv_sha512sum1(rs1);
 }
 
 
@@ -51,7 +51,7 @@ uint64_t sha512sum1(uint64_t rs1) {
 // RV64ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sig0(uint32_t rs1) {
-  return __builtin_riscv_sha256sig0(rs1);
+  return __riscv_sha256sig0(rs1);
 }
 
 // RV64ZKNH-LABEL: @sha256sig1(
@@ -60,7 +60,7 @@ uint32_t sha256sig0(uint32_t rs1) {
 // RV64ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sig1(uint32_t rs1) {
-  return __builtin_riscv_sha256sig1(rs1);
+  return __riscv_sha256sig1(rs1);
 }
 
 
@@ -70,7 +70,7 @@ uint32_t sha256sig1(uint32_t rs1) {
 // RV64ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sum0(uint32_t rs1) {
-  return __builtin_riscv_sha256sum0(rs1);
+  return __riscv_sha256sum0(rs1);
 }
 
 // RV64ZKNH-LABEL: @sha256sum1(
@@ -79,5 +79,5 @@ uint32_t sha256sum0(uint32_t rs1) {
 // RV64ZKNH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sha256sum1(uint32_t rs1) {
-  return __builtin_riscv_sha256sum1(rs1);
+  return __riscv_sha256sum1(rs1);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/zksed.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/zksed.c
index 40651f5cc4cedf4..bce650c88005202 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/zksed.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/zksed.c
@@ -6,7 +6,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZKSED
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV32ZKSED-LABEL: @sm4ks(
 // RV32ZKSED-NEXT:  entry:
@@ -19,7 +19,7 @@
 // RV64ZKSED-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sm4ks(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sm4ks(rs1, rs2, 0);
+  return __riscv_sm4ks(rs1, rs2, 0);
 }
 
 // RV32ZKSED-LABEL: @sm4ed(
@@ -33,5 +33,5 @@ uint32_t sm4ks(uint32_t rs1, uint32_t rs2) {
 // RV64ZKSED-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sm4ed(uint32_t rs1, uint32_t rs2) {
-  return __builtin_riscv_sm4ed(rs1, rs2, 0);
+  return __riscv_sm4ed(rs1, rs2, 0);
 }

diff  --git a/clang/test/CodeGen/RISCV/rvk-intrinsics/zksh.c b/clang/test/CodeGen/RISCV/rvk-intrinsics/zksh.c
index 3df0f5dca0ba6c4..edc602e9902fb68 100644
--- a/clang/test/CodeGen/RISCV/rvk-intrinsics/zksh.c
+++ b/clang/test/CodeGen/RISCV/rvk-intrinsics/zksh.c
@@ -6,7 +6,7 @@
 // RUN:     -disable-O0-optnone | opt -S -passes=mem2reg \
 // RUN:     | FileCheck %s  -check-prefix=RV64ZKSH
 
-#include <stdint.h>
+#include <riscv_crypto.h>
 
 // RV32ZKSH-LABEL: @sm3p0(
 // RV32ZKSH-NEXT:  entry:
@@ -19,7 +19,7 @@
 // RV64ZKSH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sm3p0(uint32_t rs1) {
-  return __builtin_riscv_sm3p0(rs1);
+  return __riscv_sm3p0(rs1);
 }
 
 
@@ -34,5 +34,5 @@ uint32_t sm3p0(uint32_t rs1) {
 // RV64ZKSH-NEXT:    ret i32 [[TMP0]]
 //
 uint32_t sm3p1(uint32_t rs1) {
-  return __builtin_riscv_sm3p1(rs1);
+  return __riscv_sm3p1(rs1);
 }

diff  --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 507cdd229885095..2c663932f8f8c2f 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -130,6 +130,7 @@ Changes to the RISC-V Backend
 
 * The Zfa extension version was upgraded to 1.0 and is no longer experimental.
 * Zihintntl extension version was upgraded to 1.0 and is no longer experimental.
+* Intrinsics were added for Zk*, Zbb, and Zbc. See https://github.com/riscv-non-isa/riscv-c-api-doc/blob/master/riscv-c-api.md#scalar-bit-manipulation-extension-intrinsics
 
 Changes to the WebAssembly Backend
 ----------------------------------


        


More information about the cfe-commits mailing list