diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,9 @@ /clang/utils/analyzer/projects/*/RefScanBuildResults # automodapi puts generated documentation files here. /lldb/docs/python_api/ + +_build/ + +llvm/tools/clang + +utils/ diff --git a/clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp b/clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp --- a/clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp +++ b/clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp @@ -57,6 +57,8 @@ {"include/prfchwintrin.h$", ""}, {"include/rdseedintrin.h$", ""}, {"include/rtmintrin.h$", ""}, + {"include/rvintrin.h$", ""}, + {"include/riscv_zbp_intrin.h$", ""}, {"include/shaintrin.h$", ""}, {"include/smmintrin.h$", ""}, {"include/stdalign.h$", ""}, diff --git a/clang-tools-extra/clangd/index/CanonicalIncludes.cpp b/clang-tools-extra/clangd/index/CanonicalIncludes.cpp --- a/clang-tools-extra/clangd/index/CanonicalIncludes.cpp +++ b/clang-tools-extra/clangd/index/CanonicalIncludes.cpp @@ -152,6 +152,8 @@ {"include/prfchwintrin.h", ""}, {"include/rdseedintrin.h", ""}, {"include/rtmintrin.h", ""}, + {"include/rvintrin.h", ""}, + {"include/riscv_zbp_intrin.h", ""}, {"include/shaintrin.h", ""}, {"include/smmintrin.h", ""}, {"include/stdalign.h", ""}, diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -97,6 +97,8 @@ ptwriteintrin.h rdseedintrin.h rtmintrin.h + rvintrin.h + riscv_zbp_intrin.h serializeintrin.h sgxintrin.h s390intrin.h diff --git a/clang/lib/Headers/riscv_zbp_intrin.h b/clang/lib/Headers/riscv_zbp_intrin.h new file mode 100644 --- /dev/null +++ b/clang/lib/Headers/riscv_zbp_intrin.h @@ -0,0 +1,79 @@ +/*===------------------------ riscv_zbp_intrin.h ---------------------------=== + * + * 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 __RVINTRIN_H +#error "Never use directly; include instead." +#endif + +#ifndef __RISCV_ZBP_INTRIN_H +#define __RISCV_ZBP_INTRIN_H + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +// Zbp +static __inline__ int32_t __DEFAULT_FN_ATTRS _rv_grev_32(int32_t rs1, int32_t rs2) { + return __builtin_riscv_grev_32(rs1, rs2); +} + +static __inline__ int32_t __DEFAULT_FN_ATTRS _rv_gorc_32(int32_t rs1, int32_t rs2) { + return __builtin_riscv_gorc_32(rs1, rs2); +} + +static __inline__ int32_t __DEFAULT_FN_ATTRS _rv_shfl_32(int32_t rs1, int32_t rs2) { + return __builtin_riscv_shfl_32(rs1, rs2); +} + +static __inline__ int32_t __DEFAULT_FN_ATTRS _rv_unshfl_32(int32_t rs1, int32_t rs2) { + return __builtin_riscv_unshfl_32(rs1, rs2); +} + +static __inline__ int_xlen_t __DEFAULT_FN_ATTRS _rv_xperm_n(int_xlen_t rs1, int_xlen_t rs2) { + return __builtin_riscv_xperm_n(rs1, rs2); +} + +static __inline__ int_xlen_t __DEFAULT_FN_ATTRS _rv_xperm_b(int_xlen_t rs1, int_xlen_t rs2) { + return __builtin_riscv_xperm_b(rs1, rs2); +} + +static __inline__ int_xlen_t __DEFAULT_FN_ATTRS _rv_xperm_h(int_xlen_t rs1, int_xlen_t rs2) { + return __builtin_riscv_xperm_h(rs1, rs2); +} + +// RV64 ONLY +#if __riscv_xlen == 64 +static __inline__ int64_t __DEFAULT_FN_ATTRS _rv_grev_64(int64_t rs1, int64_t rs2) { + return __builtin_riscv_grev_64(rs1, rs2); +} + +static __inline__ int64_t __DEFAULT_FN_ATTRS _rv_gorc_64(int64_t rs1, int64_t rs2) { + return __builtin_riscv_gorc_64(rs1, rs2); +} + +static __inline__ int64_t __DEFAULT_FN_ATTRS _rv_shfl_64(int64_t rs1, int64_t rs2) { + return __builtin_riscv_shfl_64(rs1, rs2); +} + +static __inline__ int64_t __DEFAULT_FN_ATTRS _rv_unshfl_64(int64_t rs1, int64_t rs2) { + return __builtin_riscv_unshfl_64(rs1, rs2); +} + +static __inline__ int64_t __DEFAULT_FN_ATTRS _rv_xperm_w(int64_t rs1, int64_t rs2) { + return __builtin_riscv_xperm_w(rs1, rs2); +} +#endif // if __riscv_xlen == 64 + +#if defined(__cplusplus) +} +#endif // if defined(__cplusplus) + +#endif // __RISCV_ZBP_INTRIN_H diff --git a/clang/lib/Headers/rvintrin.h b/clang/lib/Headers/rvintrin.h new file mode 100644 --- /dev/null +++ b/clang/lib/Headers/rvintrin.h @@ -0,0 +1,26 @@ +/*===-------------------------- rvintrin.h ---------------------------------=== + * + * 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 __RVINTRIN_H +#define __RVINTRIN_H + +#define int_xlen_t long +#define uint_xlen_t unsigned int_xlen_t + +#define __DEFAULT_FN_ATTRS \ + __attribute__((__always_inline__, __artificial__, __nodebug__)) + +#if defined(__riscv_zbp) +#include "riscv_zbp_intrin.h" +#endif + +#undef __DEFAULT_FN_ATTRS +#undef uint_xlen_t +#undef int_xlen_t +#endif // __RVINTRIN_H diff --git a/clang/test/CodeGen/RISCV/rvb-intrinsics/rvintrin.c b/clang/test/CodeGen/RISCV/rvb-intrinsics/rvintrin.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/RISCV/rvb-intrinsics/rvintrin.c @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -triple riscv32 -fsyntax-only \ +// RUN: -target-feature +experimental-zbp %s +// RUN: %clang_cc1 -triple riscv64 -fsyntax-only \ +// RUN: -target-feature +experimental-zbp %s + +#include \ No newline at end of file