-
Notifications
You must be signed in to change notification settings - Fork 12.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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
- Loading branch information
Showing
16 changed files
with
419 additions
and
57 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
Oops, something went wrong.