22 if (builtinID == Builtin::BI__builtin_cpu_supports ||
23 builtinID == Builtin::BI__builtin_cpu_init ||
24 builtinID == Builtin::BI__builtin_cpu_is) {
26 std::string(
"unimplemented RISC-V builtin call: ") +
31 StringRef intrinsicName;
37 unsigned iceArguments = 0;
42 if (builtinID == RISCV::BI__builtin_riscv_ntl_load)
43 iceArguments |= (1 << 1);
44 if (builtinID == RISCV::BI__builtin_riscv_ntl_store)
45 iceArguments |= (1 << 2);
47 for (
auto [idx, arg] : llvm::enumerate(e->
arguments()))
52 llvm_unreachable(
"unexpected builtin ID");
55 case RISCV::BI__builtin_riscv_orc_b_32:
56 case RISCV::BI__builtin_riscv_orc_b_64: {
57 intrinsicName =
"riscv.orc.b";
62 case RISCV::BI__builtin_riscv_clmul_32:
63 case RISCV::BI__builtin_riscv_clmul_64: {
64 intrinsicName =
"clmul";
67 case RISCV::BI__builtin_riscv_clmulh_32:
68 case RISCV::BI__builtin_riscv_clmulh_64: {
69 intrinsicName =
"riscv.clmulh";
72 case RISCV::BI__builtin_riscv_clmulr_32:
73 case RISCV::BI__builtin_riscv_clmulr_64: {
74 intrinsicName =
"riscv.clmulr";
79 case RISCV::BI__builtin_riscv_xperm4_32:
80 case RISCV::BI__builtin_riscv_xperm4_64: {
81 intrinsicName =
"riscv.xperm4";
84 case RISCV::BI__builtin_riscv_xperm8_32:
85 case RISCV::BI__builtin_riscv_xperm8_64: {
86 intrinsicName =
"riscv.xperm8";
90 case RISCV::BI__builtin_riscv_brev8_32:
91 case RISCV::BI__builtin_riscv_brev8_64: {
92 intrinsicName =
"riscv.brev8";
95 case RISCV::BI__builtin_riscv_zip_32: {
96 intrinsicName =
"riscv.zip";
99 case RISCV::BI__builtin_riscv_unzip_32: {
100 intrinsicName =
"riscv.unzip";
104 case RISCV::BI__builtin_riscv_aes32dsi:
105 case RISCV::BI__builtin_riscv_aes32dsmi:
106 case RISCV::BI__builtin_riscv_aes64ds:
107 case RISCV::BI__builtin_riscv_aes64dsm:
108 case RISCV::BI__builtin_riscv_aes64im:
110 case RISCV::BI__builtin_riscv_aes64ks1i:
111 case RISCV::BI__builtin_riscv_aes64ks2:
113 case RISCV::BI__builtin_riscv_aes32esi:
114 case RISCV::BI__builtin_riscv_aes32esmi:
115 case RISCV::BI__builtin_riscv_aes64es:
116 case RISCV::BI__builtin_riscv_aes64esm: {
118 std::string(
"unimplemented RISC-V builtin call: ") +
120 return mlir::Value{};
122 case RISCV::BI__builtin_riscv_sha256sig0: {
123 intrinsicName =
"riscv.sha256sig0";
126 case RISCV::BI__builtin_riscv_sha256sig1: {
127 intrinsicName =
"riscv.sha256sig1";
130 case RISCV::BI__builtin_riscv_sha256sum0: {
131 intrinsicName =
"riscv.sha256sum0";
134 case RISCV::BI__builtin_riscv_sha256sum1: {
135 intrinsicName =
"riscv.sha256sum1";
138 case RISCV::BI__builtin_riscv_sha512sig0h:
139 case RISCV::BI__builtin_riscv_sha512sig0l:
140 case RISCV::BI__builtin_riscv_sha512sig1h:
141 case RISCV::BI__builtin_riscv_sha512sig1l:
142 case RISCV::BI__builtin_riscv_sha512sum0r:
143 case RISCV::BI__builtin_riscv_sha512sum1r:
144 case RISCV::BI__builtin_riscv_sha512sig0:
145 case RISCV::BI__builtin_riscv_sha512sig1:
146 case RISCV::BI__builtin_riscv_sha512sum0:
147 case RISCV::BI__builtin_riscv_sha512sum1: {
149 std::string(
"unimplemented RISC-V builtin call: ") +
151 return mlir::Value{};
154 case RISCV::BI__builtin_riscv_sm4ks: {
155 intrinsicName =
"riscv.sm4ks";
158 case RISCV::BI__builtin_riscv_sm4ed: {
159 intrinsicName =
"riscv.sm4ed";
163 case RISCV::BI__builtin_riscv_sm3p0: {
164 intrinsicName =
"riscv.sm3p0";
167 case RISCV::BI__builtin_riscv_sm3p1: {
168 intrinsicName =
"riscv.sm3p1";
172 case RISCV::BI__builtin_riscv_clz_32:
173 case RISCV::BI__builtin_riscv_clz_64: {
175 auto op = cir::BitClzOp::create(builder, loc, ops[0],
177 mlir::Value result = op.getResult();
178 if (result.getType() != returnType)
179 result = builder.createIntCast(result, returnType);
182 case RISCV::BI__builtin_riscv_ctz_32:
183 case RISCV::BI__builtin_riscv_ctz_64: {
185 auto op = cir::BitCtzOp::create(builder, loc, ops[0],
187 mlir::Value result = op.getResult();
188 if (result.getType() != returnType)
189 result = builder.createIntCast(result, returnType);
194 case RISCV::BI__builtin_riscv_ntl_load:
195 case RISCV::BI__builtin_riscv_ntl_store: {
196 unsigned domainVal = 5;
197 unsigned domainArgNo =
198 builtinID == RISCV::BI__builtin_riscv_ntl_load ? 1 : 2;
200 const std::optional<llvm::APSInt> result =
202 assert(result &&
"Expected NTLH domain argument to be a constant");
203 domainVal = result->getZExtValue();
207 mlir::Attribute domainAttr = builder.getI32IntegerAttr(domainVal);
210 if (builtinID == RISCV::BI__builtin_riscv_ntl_load) {
211 auto load = builder.createLoad(loc, addr,
false,
213 load->setAttr(
"cir.riscv_nontemporal_domain", domainAttr);
214 return load.getResult();
218 auto store = builder.createStore(loc, val, addr,
false,
220 store->setAttr(
"cir.riscv_nontemporal_domain", domainAttr);
221 return mlir::Value{};
225 case RISCV::BI__builtin_riscv_pause: {
226 intrinsicName =
"riscv.pause";
227 returnType = builder.getVoidTy();
232 case RISCV::BI__builtin_riscv_cv_alu_addN: {
233 intrinsicName =
"riscv.cv.alu.addN";
236 case RISCV::BI__builtin_riscv_cv_alu_addRN: {
237 intrinsicName =
"riscv.cv.alu.addRN";
240 case RISCV::BI__builtin_riscv_cv_alu_adduN: {
241 intrinsicName =
"riscv.cv.alu.adduN";
244 case RISCV::BI__builtin_riscv_cv_alu_adduRN: {
245 intrinsicName =
"riscv.cv.alu.adduRN";
248 case RISCV::BI__builtin_riscv_cv_alu_clip: {
249 intrinsicName =
"riscv.cv.alu.clip";
252 case RISCV::BI__builtin_riscv_cv_alu_clipu: {
253 intrinsicName =
"riscv.cv.alu.clipu";
256 case RISCV::BI__builtin_riscv_cv_alu_extbs: {
257 mlir::Value result = builder.createIntCast(ops[0], builder.getSInt8Ty());
258 return builder.createIntCast(result, returnType);
260 case RISCV::BI__builtin_riscv_cv_alu_extbz: {
261 mlir::Value result = builder.createIntCast(ops[0], builder.getUInt8Ty());
262 return builder.createIntCast(result, returnType);
264 case RISCV::BI__builtin_riscv_cv_alu_exths: {
265 mlir::Value result = builder.createIntCast(ops[0], builder.getSInt16Ty());
266 return builder.createIntCast(result, returnType);
268 case RISCV::BI__builtin_riscv_cv_alu_exthz: {
269 mlir::Value result = builder.createIntCast(ops[0], builder.getUInt16Ty());
270 return builder.createIntCast(result, returnType);
272 case RISCV::BI__builtin_riscv_cv_alu_sle: {
275 builder.createCompare(loc, cir::CmpOpKind::le, ops[0], ops[1]);
276 return builder.createBoolToInt(result, returnType);
278 case RISCV::BI__builtin_riscv_cv_alu_sleu: {
281 builder.createCompare(loc, cir::CmpOpKind::le, ops[0], ops[1]);
282 return builder.createBoolToInt(result, returnType);
284 case RISCV::BI__builtin_riscv_cv_alu_subN: {
285 intrinsicName =
"riscv.cv.alu.subN";
288 case RISCV::BI__builtin_riscv_cv_alu_subRN: {
289 intrinsicName =
"riscv.cv.alu.subRN";
292 case RISCV::BI__builtin_riscv_cv_alu_subuN: {
293 intrinsicName =
"riscv.cv.alu.subuN";
296 case RISCV::BI__builtin_riscv_cv_alu_subuRN: {
297 intrinsicName =
"riscv.cv.alu.subuRN";
301 case RISCV::BI__builtin_riscv_nds_ffb_32:
302 case RISCV::BI__builtin_riscv_nds_ffb_64:
303 case RISCV::BI__builtin_riscv_nds_ffzmism_32:
304 case RISCV::BI__builtin_riscv_nds_ffzmism_64:
305 case RISCV::BI__builtin_riscv_nds_ffmism_32:
306 case RISCV::BI__builtin_riscv_nds_ffmism_64:
307 case RISCV::BI__builtin_riscv_nds_flmism_32:
308 case RISCV::BI__builtin_riscv_nds_flmism_64:
310 case RISCV::BI__builtin_riscv_nds_fcvt_s_bf16:
311 case RISCV::BI__builtin_riscv_nds_fcvt_bf16_s: {
313 std::string(
"unimplemented RISC-V builtin call: ") +
315 return mlir::Value{};
319 case RISCV::BI__builtin_riscv_mips_pause:
320 case RISCV::BI__builtin_riscv_mips_ehb:
321 case RISCV::BI__builtin_riscv_mips_ihb: {
323 std::string(
"unimplemented RISC-V builtin call: ") +
325 return mlir::Value{};
332 return builder.emitIntrinsicCallOp(loc, intrinsicName, returnType, ops);