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 intrinsicName =
"riscv.aes32dsi";
108 case RISCV::BI__builtin_riscv_aes32dsmi: {
109 intrinsicName =
"riscv.aes32dsmi";
112 case RISCV::BI__builtin_riscv_aes64ds: {
113 intrinsicName =
"riscv.aes64ds";
116 case RISCV::BI__builtin_riscv_aes64dsm: {
117 intrinsicName =
"riscv.aes64dsm";
120 case RISCV::BI__builtin_riscv_aes64im: {
121 intrinsicName =
"riscv.aes64im";
125 case RISCV::BI__builtin_riscv_aes64ks1i:
126 case RISCV::BI__builtin_riscv_aes64ks2:
128 case RISCV::BI__builtin_riscv_aes32esi:
129 case RISCV::BI__builtin_riscv_aes32esmi:
130 case RISCV::BI__builtin_riscv_aes64es:
131 case RISCV::BI__builtin_riscv_aes64esm: {
133 std::string(
"unimplemented RISC-V builtin call: ") +
135 return mlir::Value{};
137 case RISCV::BI__builtin_riscv_sha256sig0: {
138 intrinsicName =
"riscv.sha256sig0";
141 case RISCV::BI__builtin_riscv_sha256sig1: {
142 intrinsicName =
"riscv.sha256sig1";
145 case RISCV::BI__builtin_riscv_sha256sum0: {
146 intrinsicName =
"riscv.sha256sum0";
149 case RISCV::BI__builtin_riscv_sha256sum1: {
150 intrinsicName =
"riscv.sha256sum1";
153 case RISCV::BI__builtin_riscv_sha512sig0h:
154 case RISCV::BI__builtin_riscv_sha512sig0l:
155 case RISCV::BI__builtin_riscv_sha512sig1h:
156 case RISCV::BI__builtin_riscv_sha512sig1l:
157 case RISCV::BI__builtin_riscv_sha512sum0r:
158 case RISCV::BI__builtin_riscv_sha512sum1r:
159 case RISCV::BI__builtin_riscv_sha512sig0:
160 case RISCV::BI__builtin_riscv_sha512sig1:
161 case RISCV::BI__builtin_riscv_sha512sum0:
162 case RISCV::BI__builtin_riscv_sha512sum1: {
164 std::string(
"unimplemented RISC-V builtin call: ") +
166 return mlir::Value{};
169 case RISCV::BI__builtin_riscv_sm4ks: {
170 intrinsicName =
"riscv.sm4ks";
173 case RISCV::BI__builtin_riscv_sm4ed: {
174 intrinsicName =
"riscv.sm4ed";
178 case RISCV::BI__builtin_riscv_sm3p0: {
179 intrinsicName =
"riscv.sm3p0";
182 case RISCV::BI__builtin_riscv_sm3p1: {
183 intrinsicName =
"riscv.sm3p1";
187 case RISCV::BI__builtin_riscv_clz_32:
188 case RISCV::BI__builtin_riscv_clz_64: {
190 auto op = cir::BitClzOp::create(builder, loc, ops[0],
192 mlir::Value result = op.getResult();
193 if (result.getType() != returnType)
194 result = builder.createIntCast(result, returnType);
197 case RISCV::BI__builtin_riscv_ctz_32:
198 case RISCV::BI__builtin_riscv_ctz_64: {
200 auto op = cir::BitCtzOp::create(builder, loc, ops[0],
202 mlir::Value result = op.getResult();
203 if (result.getType() != returnType)
204 result = builder.createIntCast(result, returnType);
209 case RISCV::BI__builtin_riscv_ntl_load:
210 case RISCV::BI__builtin_riscv_ntl_store: {
211 unsigned domainVal = 5;
212 unsigned domainArgNo =
213 builtinID == RISCV::BI__builtin_riscv_ntl_load ? 1 : 2;
215 const std::optional<llvm::APSInt> result =
217 assert(result &&
"Expected NTLH domain argument to be a constant");
218 domainVal = result->getZExtValue();
222 mlir::Attribute domainAttr = builder.getI32IntegerAttr(domainVal);
225 if (builtinID == RISCV::BI__builtin_riscv_ntl_load) {
226 auto load = builder.createLoad(loc, addr,
false,
228 load->setAttr(
"cir.riscv_nontemporal_domain", domainAttr);
229 return load.getResult();
233 auto store = builder.createStore(loc, val, addr,
false,
235 store->setAttr(
"cir.riscv_nontemporal_domain", domainAttr);
236 return mlir::Value{};
240 case RISCV::BI__builtin_riscv_pause: {
241 intrinsicName =
"riscv.pause";
242 returnType = builder.getVoidTy();
247 case RISCV::BI__builtin_riscv_cv_alu_addN: {
248 intrinsicName =
"riscv.cv.alu.addN";
251 case RISCV::BI__builtin_riscv_cv_alu_addRN: {
252 intrinsicName =
"riscv.cv.alu.addRN";
255 case RISCV::BI__builtin_riscv_cv_alu_adduN: {
256 intrinsicName =
"riscv.cv.alu.adduN";
259 case RISCV::BI__builtin_riscv_cv_alu_adduRN: {
260 intrinsicName =
"riscv.cv.alu.adduRN";
263 case RISCV::BI__builtin_riscv_cv_alu_clip: {
264 intrinsicName =
"riscv.cv.alu.clip";
267 case RISCV::BI__builtin_riscv_cv_alu_clipu: {
268 intrinsicName =
"riscv.cv.alu.clipu";
271 case RISCV::BI__builtin_riscv_cv_alu_extbs: {
272 mlir::Value result = builder.createIntCast(ops[0], builder.getSInt8Ty());
273 return builder.createIntCast(result, returnType);
275 case RISCV::BI__builtin_riscv_cv_alu_extbz: {
276 mlir::Value result = builder.createIntCast(ops[0], builder.getUInt8Ty());
277 return builder.createIntCast(result, returnType);
279 case RISCV::BI__builtin_riscv_cv_alu_exths: {
280 mlir::Value result = builder.createIntCast(ops[0], builder.getSInt16Ty());
281 return builder.createIntCast(result, returnType);
283 case RISCV::BI__builtin_riscv_cv_alu_exthz: {
284 mlir::Value result = builder.createIntCast(ops[0], builder.getUInt16Ty());
285 return builder.createIntCast(result, returnType);
287 case RISCV::BI__builtin_riscv_cv_alu_sle: {
290 builder.createCompare(loc, cir::CmpOpKind::le, ops[0], ops[1]);
291 return builder.createBoolToInt(result, returnType);
293 case RISCV::BI__builtin_riscv_cv_alu_sleu: {
296 builder.createCompare(loc, cir::CmpOpKind::le, ops[0], ops[1]);
297 return builder.createBoolToInt(result, returnType);
299 case RISCV::BI__builtin_riscv_cv_alu_subN: {
300 intrinsicName =
"riscv.cv.alu.subN";
303 case RISCV::BI__builtin_riscv_cv_alu_subRN: {
304 intrinsicName =
"riscv.cv.alu.subRN";
307 case RISCV::BI__builtin_riscv_cv_alu_subuN: {
308 intrinsicName =
"riscv.cv.alu.subuN";
311 case RISCV::BI__builtin_riscv_cv_alu_subuRN: {
312 intrinsicName =
"riscv.cv.alu.subuRN";
316 case RISCV::BI__builtin_riscv_nds_ffb_32:
317 case RISCV::BI__builtin_riscv_nds_ffb_64: {
318 intrinsicName =
"riscv.nds.ffb";
321 case RISCV::BI__builtin_riscv_nds_ffzmism_32:
322 case RISCV::BI__builtin_riscv_nds_ffzmism_64: {
323 intrinsicName =
"riscv.nds.ffzmism";
326 case RISCV::BI__builtin_riscv_nds_ffmism_32:
327 case RISCV::BI__builtin_riscv_nds_ffmism_64: {
328 intrinsicName =
"riscv.nds.ffmism";
331 case RISCV::BI__builtin_riscv_nds_flmism_32:
332 case RISCV::BI__builtin_riscv_nds_flmism_64: {
333 intrinsicName =
"riscv.nds.flmism";
337 case RISCV::BI__builtin_riscv_nds_fcvt_s_bf16:
338 case RISCV::BI__builtin_riscv_nds_fcvt_bf16_s: {
340 std::string(
"unimplemented RISC-V builtin call: ") +
342 return mlir::Value{};
346 case RISCV::BI__builtin_riscv_mips_pause:
347 case RISCV::BI__builtin_riscv_mips_ehb:
348 case RISCV::BI__builtin_riscv_mips_ihb: {
350 std::string(
"unimplemented RISC-V builtin call: ") +
352 return mlir::Value{};
359 return builder.emitIntrinsicCallOp(loc, intrinsicName, returnType, ops);