LevyHsu created this revision.
LevyHsu added reviewers: craig.topper, jrtc27, kito-cheng.
LevyHsu added projects: clang, LLVM.
Herald added subscribers: vkmr, frasercrmck, evandro, luismarques, apazos,
sameer.abuasal, usaxena95, s.egerton, Jim, benna, psnobl, kadircet, jocewei,
PkmX, arphaman, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones,
zzheng, shiva0217, niosHD, sabuasal, simoncook, johnrusso, rbar, asb, mgorny.
LevyHsu requested review of this revision.
Herald added a subscriber: cfe-commits.
Herald added a project: clang-tools-extra.
Implementation for RISC-V Zbb extension intrinsic.
Head files are included in the second patch in case the name needs to be
changed.
RV32 / 64:
orc.b
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D99319
Files:
clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp
clang-tools-extra/clangd/index/CanonicalIncludes.cpp
clang/lib/Headers/CMakeLists.txt
clang/lib/Headers/riscv_zbb_intrin.h
clang/lib/Headers/rvintrin.h
clang/lib/Sema/SemaChecking.cpp
clang/test/Headers/rvintrin.c
Index: clang/test/Headers/rvintrin.c
===================================================================
--- /dev/null
+++ clang/test/Headers/rvintrin.c
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -triple riscv32 -fsyntax-only \
+// RUN: -target-feature +experimental-zbb %s
+// RUN: %clang_cc1 -triple riscv64 -fsyntax-only \
+// RUN: -target-feature +experimental-zbb %s
+
+#include <rvintrin.h>
Index: clang/lib/Sema/SemaChecking.cpp
===================================================================
--- clang/lib/Sema/SemaChecking.cpp
+++ clang/lib/Sema/SemaChecking.cpp
@@ -3395,13 +3395,28 @@
CallExpr *TheCall) {
// CodeGenFunction can also detect this, but this gives a better error
// message.
+ bool miss_feature_error = false;
+ SmallVector<StringRef> ReqFeatures;
StringRef Features = Context.BuiltinInfo.getRequiredFeatures(BuiltinID);
- if (Features.find("experimental-v") != StringRef::npos &&
- !TI.hasFeature("experimental-v"))
- return Diag(TheCall->getBeginLoc(), diag::err_riscvv_builtin_requires_v)
- << TheCall->getSourceRange();
-
- return false;
+ StringRef(Features).split(ReqFeatures, ',');
+
+ // Check if each required feature is included in TargetInfo
+ for (size_t i = 0; i < ReqFeatures.size(); i++) {
+ if (!TI.hasFeature(ReqFeatures[i])) {
+
+ // Make message like "experimental-zbr" to "Zbr"
+ ReqFeatures[i].consume_front("experimental-");
+ std::string FeatureStr = ReqFeatures[i].str();
+ FeatureStr[0] = std::toupper(FeatureStr[0]);
+
+ // Error message
+ miss_feature_error = true;
+ Diag(TheCall->getBeginLoc(), diag::err_riscv_builtin_requires_extension)
+ << TheCall->getSourceRange() << StringRef(FeatureStr);
+ }
+ }
+
+ return miss_feature_error;
}
bool Sema::CheckSystemZBuiltinFunctionCall(unsigned BuiltinID,
Index: clang/lib/Headers/rvintrin.h
===================================================================
--- /dev/null
+++ clang/lib/Headers/rvintrin.h
@@ -0,0 +1,28 @@
+/* ===-------- 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
+
+// Long is 32 bit on riscv32 and 64 bit on riscv64 according to calling
+// convention.
+#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_zbb)
+#include "riscv_zbb_intrin.h"
+#endif
+
+#undef __DEFAULT_FN_ATTRS
+#undef uint_xlen_t
+#undef int_xlen_t
+#endif // __RVINTRIN_H
Index: clang/lib/Headers/riscv_zbb_intrin.h
===================================================================
--- /dev/null
+++ clang/lib/Headers/riscv_zbb_intrin.h
@@ -0,0 +1,26 @@
+/* ===-------- riscv_zbb_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 __RISCV_ZBB_INTRIN_H
+#define __RISCV_ZBB_INTRIN_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+// Zbb
+static __inline__ int_xlen_t __DEFAULT_FN_ATTRS _rv_orc_b(int_xlen_t rs1) {
+ return __builtin_riscv_orc_b(rs1);
+}
+
+#if defined(__cplusplus)
+}
+#endif // if defined(__cplusplus)
+
+#endif // __RISCV_ZBB_INTRIN_H
Index: clang/lib/Headers/CMakeLists.txt
===================================================================
--- clang/lib/Headers/CMakeLists.txt
+++ clang/lib/Headers/CMakeLists.txt
@@ -97,6 +97,8 @@
ptwriteintrin.h
rdseedintrin.h
rtmintrin.h
+ rvintrin.h
+ riscv_zbb_intrin.h
serializeintrin.h
sgxintrin.h
s390intrin.h
Index: clang-tools-extra/clangd/index/CanonicalIncludes.cpp
===================================================================
--- clang-tools-extra/clangd/index/CanonicalIncludes.cpp
+++ clang-tools-extra/clangd/index/CanonicalIncludes.cpp
@@ -152,6 +152,8 @@
{"include/prfchwintrin.h", "<x86intrin.h>"},
{"include/rdseedintrin.h", "<x86intrin.h>"},
{"include/rtmintrin.h", "<immintrin.h>"},
+ {"include/rvintrin.h", "<rvintrin.h>"},
+ {"include/riscv_zbb_intrin.h", "<riscv_zbb_intrin.h>"},
{"include/shaintrin.h", "<immintrin.h>"},
{"include/smmintrin.h", "<smmintrin.h>"},
{"include/stdalign.h", "<cstdalign>"},
Index: clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp
===================================================================
--- clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp
+++ clang-tools-extra/clang-include-fixer/find-all-symbols/STLPostfixHeaderMap.cpp
@@ -57,6 +57,8 @@
{"include/prfchwintrin.h$", "<x86intrin.h>"},
{"include/rdseedintrin.h$", "<x86intrin.h>"},
{"include/rtmintrin.h$", "<immintrin.h>"},
+ {"include/rvintrin.h$", "<rvintrin.h>"},
+ {"include/riscv_zbb_intrin.h$", "<riscv_zbb_intrin.h>"},
{"include/shaintrin.h$", "<immintrin.h>"},
{"include/smmintrin.h$", "<smmintrin.h>"},
{"include/stdalign.h$", "<cstdalign>"},
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits