clang 23.0.0git
CIRGenBuiltinRISCV.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This contains code to emit RISC-V Builtin calls as CIR or a function call
10// to be later resolved.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CIRGenFunction.h"
16
17using namespace clang;
18using namespace clang::CIRGen;
19
20std::optional<mlir::Value>
21CIRGenFunction::emitRISCVBuiltinExpr(unsigned builtinID, const CallExpr *e) {
22 if (builtinID == Builtin::BI__builtin_cpu_supports ||
23 builtinID == Builtin::BI__builtin_cpu_init ||
24 builtinID == Builtin::BI__builtin_cpu_is) {
25 cgm.errorNYI(e->getSourceRange(),
26 std::string("unimplemented RISC-V builtin call: ") +
27 getContext().BuiltinInfo.getName(builtinID));
28 return mlir::Value{};
29 }
30
31 StringRef intrinsicName;
32 mlir::Type returnType;
34
35 // `iceArguments` is a bitmap indicating whether the argument at the i-th bit
36 // is required to be a constant integer expression.
37 unsigned iceArguments = 0;
39 getContext().GetBuiltinType(builtinID, error, &iceArguments);
40 assert(error == ASTContext::GE_None && "Should not codegen an error");
41 for (auto [idx, arg] : llvm::enumerate(e->arguments()))
42 ops.push_back(emitScalarOrConstFoldImmArg(iceArguments, idx, arg));
43
44 switch (builtinID) {
45 default:
46 llvm_unreachable("unexpected builtin ID");
47
48 // Zbb
49 case RISCV::BI__builtin_riscv_orc_b_32:
50 case RISCV::BI__builtin_riscv_orc_b_64:
51 // Zbc
52 case RISCV::BI__builtin_riscv_clmul_32:
53 case RISCV::BI__builtin_riscv_clmul_64:
54 case RISCV::BI__builtin_riscv_clmulh_32:
55 case RISCV::BI__builtin_riscv_clmulh_64:
56 case RISCV::BI__builtin_riscv_clmulr_32:
57 case RISCV::BI__builtin_riscv_clmulr_64:
58 // Zbkx
59 case RISCV::BI__builtin_riscv_xperm4_32:
60 case RISCV::BI__builtin_riscv_xperm4_64:
61 case RISCV::BI__builtin_riscv_xperm8_32:
62 case RISCV::BI__builtin_riscv_xperm8_64:
63 // Zbkb
64 case RISCV::BI__builtin_riscv_brev8_32:
65 case RISCV::BI__builtin_riscv_brev8_64:
66 case RISCV::BI__builtin_riscv_zip_32:
67 case RISCV::BI__builtin_riscv_unzip_32:
68 // Zknh
69 case RISCV::BI__builtin_riscv_sha256sig0:
70 case RISCV::BI__builtin_riscv_sha256sig1:
71 case RISCV::BI__builtin_riscv_sha256sum0:
72 case RISCV::BI__builtin_riscv_sha256sum1:
73 // Zksed
74 case RISCV::BI__builtin_riscv_sm4ks:
75 case RISCV::BI__builtin_riscv_sm4ed:
76 // Zksh
77 case RISCV::BI__builtin_riscv_sm3p0:
78 case RISCV::BI__builtin_riscv_sm3p1:
79 // Zbb
80 case RISCV::BI__builtin_riscv_clz_32:
81 case RISCV::BI__builtin_riscv_clz_64:
82 case RISCV::BI__builtin_riscv_ctz_32:
83 case RISCV::BI__builtin_riscv_ctz_64:
84 // Zihintntl
85 case RISCV::BI__builtin_riscv_ntl_load:
86 case RISCV::BI__builtin_riscv_ntl_store: {
87 cgm.errorNYI(e->getSourceRange(),
88 std::string("unimplemented RISC-V builtin call: ") +
89 getContext().BuiltinInfo.getName(builtinID));
90 return mlir::Value{};
91 }
92
93 // Zihintpause
94 case RISCV::BI__builtin_riscv_pause: {
95 intrinsicName = "riscv.pause";
96 returnType = builder.getVoidTy();
97 break;
98 }
99
100 // XCValu
101 case RISCV::BI__builtin_riscv_cv_alu_addN:
102 case RISCV::BI__builtin_riscv_cv_alu_addRN:
103 case RISCV::BI__builtin_riscv_cv_alu_adduN:
104 case RISCV::BI__builtin_riscv_cv_alu_adduRN:
105 case RISCV::BI__builtin_riscv_cv_alu_clip:
106 case RISCV::BI__builtin_riscv_cv_alu_clipu:
107 case RISCV::BI__builtin_riscv_cv_alu_extbs:
108 case RISCV::BI__builtin_riscv_cv_alu_extbz:
109 case RISCV::BI__builtin_riscv_cv_alu_exths:
110 case RISCV::BI__builtin_riscv_cv_alu_exthz:
111 case RISCV::BI__builtin_riscv_cv_alu_sle:
112 case RISCV::BI__builtin_riscv_cv_alu_sleu:
113 case RISCV::BI__builtin_riscv_cv_alu_subN:
114 case RISCV::BI__builtin_riscv_cv_alu_subRN:
115 case RISCV::BI__builtin_riscv_cv_alu_subuN:
116 case RISCV::BI__builtin_riscv_cv_alu_subuRN:
117 // XAndesPerf
118 case RISCV::BI__builtin_riscv_nds_ffb_32:
119 case RISCV::BI__builtin_riscv_nds_ffb_64:
120 case RISCV::BI__builtin_riscv_nds_ffzmism_32:
121 case RISCV::BI__builtin_riscv_nds_ffzmism_64:
122 case RISCV::BI__builtin_riscv_nds_ffmism_32:
123 case RISCV::BI__builtin_riscv_nds_ffmism_64:
124 case RISCV::BI__builtin_riscv_nds_flmism_32:
125 case RISCV::BI__builtin_riscv_nds_flmism_64:
126 // XAndesBFHCvt
127 case RISCV::BI__builtin_riscv_nds_fcvt_s_bf16:
128 case RISCV::BI__builtin_riscv_nds_fcvt_bf16_s: {
129 cgm.errorNYI(e->getSourceRange(),
130 std::string("unimplemented RISC-V builtin call: ") +
131 getContext().BuiltinInfo.getName(builtinID));
132 return mlir::Value{};
133 }
134
135 // TODO: Handle vector builtins in tablegen.
136 }
137
138 mlir::Location loc = getLoc(e->getSourceRange());
139 return builder.emitIntrinsicCallOp(loc, intrinsicName, returnType, ops);
140}
Enumerates target-specific builtins in their own namespaces within namespace clang.
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.
@ GE_None
No error.
mlir::Location getLoc(clang::SourceLocation srcLoc)
Helpers to convert Clang's SourceLocation to a MLIR Location.
std::optional< mlir::Value > emitRISCVBuiltinExpr(unsigned builtinID, const CallExpr *expr)
clang::ASTContext & getContext() const
mlir::Value emitScalarOrConstFoldImmArg(unsigned iceArguments, unsigned idx, const Expr *argExpr)
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2946
arg_range arguments()
Definition Expr.h:3198
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
The JSON file list parser is used to communicate input to InstallAPI.