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;
41 for (
auto [idx, arg] : llvm::enumerate(e->
arguments()))
46 llvm_unreachable(
"unexpected builtin ID");
49 case RISCV::BI__builtin_riscv_orc_b_32:
50 case RISCV::BI__builtin_riscv_orc_b_64: {
51 intrinsicName =
"riscv.orc.b";
56 case RISCV::BI__builtin_riscv_clmul_32:
57 case RISCV::BI__builtin_riscv_clmul_64: {
58 intrinsicName =
"clmul";
61 case RISCV::BI__builtin_riscv_clmulh_32:
62 case RISCV::BI__builtin_riscv_clmulh_64: {
63 intrinsicName =
"riscv.clmulh";
66 case RISCV::BI__builtin_riscv_clmulr_32:
67 case RISCV::BI__builtin_riscv_clmulr_64: {
68 intrinsicName =
"riscv.clmulr";
73 case RISCV::BI__builtin_riscv_xperm4_32:
74 case RISCV::BI__builtin_riscv_xperm4_64: {
75 intrinsicName =
"riscv.xperm4";
78 case RISCV::BI__builtin_riscv_xperm8_32:
79 case RISCV::BI__builtin_riscv_xperm8_64: {
80 intrinsicName =
"riscv.xperm8";
84 case RISCV::BI__builtin_riscv_brev8_32:
85 case RISCV::BI__builtin_riscv_brev8_64: {
86 intrinsicName =
"riscv.brev8";
89 case RISCV::BI__builtin_riscv_zip_32: {
90 intrinsicName =
"riscv.zip";
93 case RISCV::BI__builtin_riscv_unzip_32: {
94 intrinsicName =
"riscv.unzip";
98 case RISCV::BI__builtin_riscv_sha256sig0: {
99 intrinsicName =
"riscv.sha256sig0";
102 case RISCV::BI__builtin_riscv_sha256sig1: {
103 intrinsicName =
"riscv.sha256sig1";
106 case RISCV::BI__builtin_riscv_sha256sum0: {
107 intrinsicName =
"riscv.sha256sum0";
110 case RISCV::BI__builtin_riscv_sha256sum1: {
111 intrinsicName =
"riscv.sha256sum1";
115 case RISCV::BI__builtin_riscv_sm4ks: {
116 intrinsicName =
"riscv.sm4ks";
119 case RISCV::BI__builtin_riscv_sm4ed: {
120 intrinsicName =
"riscv.sm4ed";
124 case RISCV::BI__builtin_riscv_sm3p0: {
125 intrinsicName =
"riscv.sm3p0";
128 case RISCV::BI__builtin_riscv_sm3p1: {
129 intrinsicName =
"riscv.sm3p1";
133 case RISCV::BI__builtin_riscv_clz_32:
134 case RISCV::BI__builtin_riscv_clz_64: {
136 auto op = cir::BitClzOp::create(builder, loc, ops[0],
138 mlir::Value result = op.getResult();
139 if (result.getType() != returnType)
140 result = builder.createIntCast(result, returnType);
143 case RISCV::BI__builtin_riscv_ctz_32:
144 case RISCV::BI__builtin_riscv_ctz_64: {
146 auto op = cir::BitCtzOp::create(builder, loc, ops[0],
148 mlir::Value result = op.getResult();
149 if (result.getType() != returnType)
150 result = builder.createIntCast(result, returnType);
155 case RISCV::BI__builtin_riscv_ntl_load:
156 case RISCV::BI__builtin_riscv_ntl_store: {
158 std::string(
"unimplemented RISC-V builtin call: ") +
160 return mlir::Value{};
164 case RISCV::BI__builtin_riscv_pause: {
165 intrinsicName =
"riscv.pause";
166 returnType = builder.getVoidTy();
171 case RISCV::BI__builtin_riscv_cv_alu_addN: {
172 intrinsicName =
"riscv.cv.alu.addN";
175 case RISCV::BI__builtin_riscv_cv_alu_addRN: {
176 intrinsicName =
"riscv.cv.alu.addRN";
179 case RISCV::BI__builtin_riscv_cv_alu_adduN: {
180 intrinsicName =
"riscv.cv.alu.adduN";
183 case RISCV::BI__builtin_riscv_cv_alu_adduRN: {
184 intrinsicName =
"riscv.cv.alu.adduRN";
187 case RISCV::BI__builtin_riscv_cv_alu_clip: {
188 intrinsicName =
"riscv.cv.alu.clip";
191 case RISCV::BI__builtin_riscv_cv_alu_clipu: {
192 intrinsicName =
"riscv.cv.alu.clipu";
195 case RISCV::BI__builtin_riscv_cv_alu_extbs: {
196 mlir::Value result = builder.createIntCast(ops[0], builder.getSInt8Ty());
197 return builder.createIntCast(result, returnType);
199 case RISCV::BI__builtin_riscv_cv_alu_extbz: {
200 mlir::Value result = builder.createIntCast(ops[0], builder.getUInt8Ty());
201 return builder.createIntCast(result, returnType);
203 case RISCV::BI__builtin_riscv_cv_alu_exths: {
204 mlir::Value result = builder.createIntCast(ops[0], builder.getSInt16Ty());
205 return builder.createIntCast(result, returnType);
207 case RISCV::BI__builtin_riscv_cv_alu_exthz: {
208 mlir::Value result = builder.createIntCast(ops[0], builder.getUInt16Ty());
209 return builder.createIntCast(result, returnType);
211 case RISCV::BI__builtin_riscv_cv_alu_sle: {
214 builder.createCompare(loc, cir::CmpOpKind::le, ops[0], ops[1]);
215 return builder.createBoolToInt(result, returnType);
217 case RISCV::BI__builtin_riscv_cv_alu_sleu: {
220 builder.createCompare(loc, cir::CmpOpKind::le, ops[0], ops[1]);
221 return builder.createBoolToInt(result, returnType);
223 case RISCV::BI__builtin_riscv_cv_alu_subN: {
224 intrinsicName =
"riscv.cv.alu.subN";
227 case RISCV::BI__builtin_riscv_cv_alu_subRN: {
228 intrinsicName =
"riscv.cv.alu.subRN";
231 case RISCV::BI__builtin_riscv_cv_alu_subuN: {
232 intrinsicName =
"riscv.cv.alu.subuN";
235 case RISCV::BI__builtin_riscv_cv_alu_subuRN: {
236 intrinsicName =
"riscv.cv.alu.subuRN";
240 case RISCV::BI__builtin_riscv_nds_ffb_32:
241 case RISCV::BI__builtin_riscv_nds_ffb_64:
242 case RISCV::BI__builtin_riscv_nds_ffzmism_32:
243 case RISCV::BI__builtin_riscv_nds_ffzmism_64:
244 case RISCV::BI__builtin_riscv_nds_ffmism_32:
245 case RISCV::BI__builtin_riscv_nds_ffmism_64:
246 case RISCV::BI__builtin_riscv_nds_flmism_32:
247 case RISCV::BI__builtin_riscv_nds_flmism_64:
249 case RISCV::BI__builtin_riscv_nds_fcvt_s_bf16:
250 case RISCV::BI__builtin_riscv_nds_fcvt_bf16_s: {
252 std::string(
"unimplemented RISC-V builtin call: ") +
254 return mlir::Value{};
261 return builder.emitIntrinsicCallOp(loc, intrinsicName, returnType, ops);
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error, unsigned *IntegerConstantArgs=nullptr) const
Return the type for the specified builtin.