893 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
895 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
902 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
911 const bool isQuad = neonType.
isQuad();
920 cir::VectorType vTy =
getNeonType(&cgf, neonType, hasLegalHalfType,
921 false, allowBFloatArgsAndRet);
922 cir::VectorType ty = vTy;
927 case NEON::BI__builtin_neon_splat_lane_v:
928 case NEON::BI__builtin_neon_splat_laneq_v:
929 case NEON::BI__builtin_neon_splatq_lane_v:
930 case NEON::BI__builtin_neon_splatq_laneq_v: {
931 uint64_t numElements = vTy.getSize();
932 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
934 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
939 case NEON::BI__builtin_neon_vpadd_v:
940 case NEON::BI__builtin_neon_vpaddq_v:
941 case NEON::BI__builtin_neon_vabs_v:
942 case NEON::BI__builtin_neon_vabsq_v:
944 std::string(
"unimplemented AArch64 builtin call: ") +
946 return mlir::Value{};
947 case NEON::BI__builtin_neon_vadd_v:
948 case NEON::BI__builtin_neon_vaddq_v: {
949 unsigned numBytes = (builtinID == NEON::BI__builtin_neon_vaddq_v) ? 16 : 8;
950 cir::VectorType byteTy =
957 case NEON::BI__builtin_neon_vaddhn_v: {
960 cir::VectorType srcTy =
970 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
972 loc, wideEltTy, wideEltTy.getWidth() / 2);
973 mlir::Value shiftVec =
981 case NEON::BI__builtin_neon_vsubhn_v: {
984 cir::VectorType srcTy =
994 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
996 loc, wideEltTy, wideEltTy.getWidth() / 2);
997 mlir::Value shiftVec =
1005 case NEON::BI__builtin_neon_vcale_v:
1006 case NEON::BI__builtin_neon_vcaleq_v:
1007 case NEON::BI__builtin_neon_vcalt_v:
1008 case NEON::BI__builtin_neon_vcaltq_v:
1009 case NEON::BI__builtin_neon_vcage_v:
1010 case NEON::BI__builtin_neon_vcageq_v:
1011 case NEON::BI__builtin_neon_vcagt_v:
1012 case NEON::BI__builtin_neon_vcagtq_v:
1014 std::string(
"unimplemented AArch64 builtin call: ") +
1016 return mlir::Value{};
1017 case NEON::BI__builtin_neon_vceqz_v:
1018 case NEON::BI__builtin_neon_vceqzq_v:
1020 vTy, cir::CmpOpKind::eq);
1021 case NEON::BI__builtin_neon_vcgez_v:
1022 case NEON::BI__builtin_neon_vcgezq_v:
1023 case NEON::BI__builtin_neon_vclez_v:
1024 case NEON::BI__builtin_neon_vclezq_v:
1025 case NEON::BI__builtin_neon_vcgtz_v:
1026 case NEON::BI__builtin_neon_vcgtzq_v:
1027 case NEON::BI__builtin_neon_vcltz_v:
1028 case NEON::BI__builtin_neon_vcltzq_v:
1029 case NEON::BI__builtin_neon_vclz_v:
1030 case NEON::BI__builtin_neon_vclzq_v:
1032 std::string(
"unimplemented AArch64 builtin call: ") +
1034 return mlir::Value{};
1035 case NEON::BI__builtin_neon_vcvt_f32_v:
1036 case NEON::BI__builtin_neon_vcvtq_f32_v: {
1042 case NEON::BI__builtin_neon_vcvt_f16_s16:
1043 case NEON::BI__builtin_neon_vcvt_f16_u16:
1044 case NEON::BI__builtin_neon_vcvtq_f16_s16:
1045 case NEON::BI__builtin_neon_vcvtq_f16_u16:
1046 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
1047 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
1048 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
1049 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
1051 std::string(
"unimplemented AArch64 builtin call: ") +
1053 return mlir::Value{};
1054 case NEON::BI__builtin_neon_vcvt_n_f32_v:
1055 case NEON::BI__builtin_neon_vcvt_n_f64_v:
1056 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
1057 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
1059 mlir::Type cstIntTy = cgf.
sInt32Ty;
1060 llvm::StringRef llvmIntrName =
1062 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1064 {vTy, cstIntTy}, ops, llvmIntrName,
1067 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
1068 case NEON::BI__builtin_neon_vcvt_n_s32_v:
1069 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
1070 case NEON::BI__builtin_neon_vcvt_n_u32_v:
1071 case NEON::BI__builtin_neon_vcvt_n_s64_v:
1072 case NEON::BI__builtin_neon_vcvt_n_u64_v:
1073 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
1074 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
1075 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
1076 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
1077 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
1078 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
1080 mlir::Type cstIntTy = cgf.
sInt32Ty;
1082 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1085 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
1089 case NEON::BI__builtin_neon_vcvt_s32_v:
1090 case NEON::BI__builtin_neon_vcvt_u32_v:
1091 case NEON::BI__builtin_neon_vcvt_s64_v:
1092 case NEON::BI__builtin_neon_vcvt_u64_v:
1093 case NEON::BI__builtin_neon_vcvt_s16_f16:
1094 case NEON::BI__builtin_neon_vcvt_u16_f16:
1095 case NEON::BI__builtin_neon_vcvtq_s32_v:
1096 case NEON::BI__builtin_neon_vcvtq_u32_v:
1097 case NEON::BI__builtin_neon_vcvtq_s64_v:
1098 case NEON::BI__builtin_neon_vcvtq_u64_v:
1099 case NEON::BI__builtin_neon_vcvtq_s16_f16:
1100 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
1110 llvm::StringRef llvmIntrName = usgn ?
"fptoui.sat" :
"fptosi.sat";
1112 {ty}, ops, llvmIntrName, vTy, loc);
1114 case NEON::BI__builtin_neon_vcvta_s16_f16:
1115 case NEON::BI__builtin_neon_vcvta_s32_v:
1116 case NEON::BI__builtin_neon_vcvta_s64_v:
1117 case NEON::BI__builtin_neon_vcvta_u16_f16:
1118 case NEON::BI__builtin_neon_vcvta_u32_v:
1119 case NEON::BI__builtin_neon_vcvta_u64_v:
1120 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
1121 case NEON::BI__builtin_neon_vcvtaq_s32_v:
1122 case NEON::BI__builtin_neon_vcvtaq_s64_v:
1123 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
1124 case NEON::BI__builtin_neon_vcvtaq_u32_v:
1125 case NEON::BI__builtin_neon_vcvtaq_u64_v:
1126 case NEON::BI__builtin_neon_vcvtn_s16_f16:
1127 case NEON::BI__builtin_neon_vcvtn_s32_v:
1128 case NEON::BI__builtin_neon_vcvtn_s64_v:
1129 case NEON::BI__builtin_neon_vcvtn_u16_f16:
1130 case NEON::BI__builtin_neon_vcvtn_u32_v:
1131 case NEON::BI__builtin_neon_vcvtn_u64_v:
1132 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
1133 case NEON::BI__builtin_neon_vcvtnq_s32_v:
1134 case NEON::BI__builtin_neon_vcvtnq_s64_v:
1135 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
1136 case NEON::BI__builtin_neon_vcvtnq_u32_v:
1137 case NEON::BI__builtin_neon_vcvtnq_u64_v:
1138 case NEON::BI__builtin_neon_vcvtp_s16_f16:
1139 case NEON::BI__builtin_neon_vcvtp_s32_v:
1140 case NEON::BI__builtin_neon_vcvtp_s64_v:
1141 case NEON::BI__builtin_neon_vcvtp_u16_f16:
1142 case NEON::BI__builtin_neon_vcvtp_u32_v:
1143 case NEON::BI__builtin_neon_vcvtp_u64_v:
1144 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
1145 case NEON::BI__builtin_neon_vcvtpq_s32_v:
1146 case NEON::BI__builtin_neon_vcvtpq_s64_v:
1147 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
1148 case NEON::BI__builtin_neon_vcvtpq_u32_v:
1149 case NEON::BI__builtin_neon_vcvtpq_u64_v:
1150 case NEON::BI__builtin_neon_vcvtm_s16_f16:
1151 case NEON::BI__builtin_neon_vcvtm_s32_v:
1152 case NEON::BI__builtin_neon_vcvtm_s64_v:
1153 case NEON::BI__builtin_neon_vcvtm_u16_f16:
1154 case NEON::BI__builtin_neon_vcvtm_u32_v:
1155 case NEON::BI__builtin_neon_vcvtm_u64_v:
1156 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
1157 case NEON::BI__builtin_neon_vcvtmq_s32_v:
1158 case NEON::BI__builtin_neon_vcvtmq_s64_v:
1159 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
1160 case NEON::BI__builtin_neon_vcvtmq_u32_v:
1161 case NEON::BI__builtin_neon_vcvtmq_u64_v:
1163 std::string(
"unimplemented AArch64 builtin call: ") +
1165 return mlir::Value{};
1166 case NEON::BI__builtin_neon_vcvtx_f32_v: {
1168 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1169 auto v2f64 = cir::VectorType::get(cgf.
cgm.
doubleTy, 2);
1170 auto v2f32 = cir::VectorType::get(cgf.
cgm.
floatTy, 2);
1172 {v2f64}, ops, llvmIntrName,
1175 case NEON::BI__builtin_neon_vext_v:
1176 case NEON::BI__builtin_neon_vextq_v:
1178 std::string(
"unimplemented AArch64 builtin call: ") +
1180 return mlir::Value{};
1181 case NEON::BI__builtin_neon_vfma_v:
1182 case NEON::BI__builtin_neon_vfmaq_v: {
1191 fmaOps, std::nullopt, ty, loc);
1193 case NEON::BI__builtin_neon_vld1_x2_v:
1194 case NEON::BI__builtin_neon_vld1q_x2_v:
1195 case NEON::BI__builtin_neon_vld1_x3_v:
1196 case NEON::BI__builtin_neon_vld1q_x3_v:
1197 case NEON::BI__builtin_neon_vld1_x4_v:
1198 case NEON::BI__builtin_neon_vld1q_x4_v:
1201 case NEON::BI__builtin_neon_vld1_v:
1202 case NEON::BI__builtin_neon_vld1q_v:
1203 case NEON::BI__builtin_neon_vld2_v:
1204 case NEON::BI__builtin_neon_vld2q_v:
1205 case NEON::BI__builtin_neon_vld3_v:
1206 case NEON::BI__builtin_neon_vld3q_v:
1207 case NEON::BI__builtin_neon_vld4_v:
1208 case NEON::BI__builtin_neon_vld4q_v:
1209 case NEON::BI__builtin_neon_vld2_dup_v:
1210 case NEON::BI__builtin_neon_vld2q_dup_v:
1211 case NEON::BI__builtin_neon_vld3_dup_v:
1212 case NEON::BI__builtin_neon_vld3q_dup_v:
1213 case NEON::BI__builtin_neon_vld4_dup_v:
1214 case NEON::BI__builtin_neon_vld4q_dup_v:
1215 case NEON::BI__builtin_neon_vld1_dup_v:
1216 case NEON::BI__builtin_neon_vld1q_dup_v:
1217 case NEON::BI__builtin_neon_vld2_lane_v:
1218 case NEON::BI__builtin_neon_vld2q_lane_v:
1219 case NEON::BI__builtin_neon_vld3_lane_v:
1220 case NEON::BI__builtin_neon_vld3q_lane_v:
1221 case NEON::BI__builtin_neon_vld4_lane_v:
1222 case NEON::BI__builtin_neon_vld4q_lane_v:
1224 std::string(
"Reached code-path for ARM builtin call ") +
1226 "(ARM builtins are not supported ATM)");
1227 return mlir::Value{};
1228 case NEON::BI__builtin_neon_vmovl_v: {
1229 cir::VectorType dTy =
1235 case NEON::BI__builtin_neon_vmovn_v:
1236 case NEON::BI__builtin_neon_vmull_v:
1237 case NEON::BI__builtin_neon_vpadal_v:
1238 case NEON::BI__builtin_neon_vpadalq_v:
1240 std::string(
"Reached code-path for ARM builtin call ") +
1242 "(ARM builtins are not supported ATM)");
1243 return mlir::Value{};
1244 case NEON::BI__builtin_neon_vpaddl_v:
1245 case NEON::BI__builtin_neon_vpaddlq_v: {
1246 llvm::StringRef llvmIntrName =
1248 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1250 {getNeonPairwiseWidenInputType(vTy, usgn)},
1254 case NEON::BI__builtin_neon_vqdmlal_v:
1255 case NEON::BI__builtin_neon_vqdmlsl_v:
1256 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
1257 case NEON::BI__builtin_neon_vqdmulh_lane_v:
1258 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
1259 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
1260 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
1261 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
1262 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
1263 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
1265 std::string(
"unimplemented AArch64 builtin call: ") +
1267 return mlir::Value{};
1268 case NEON::BI__builtin_neon_vqshl_n_v:
1269 case NEON::BI__builtin_neon_vqshlq_n_v: {
1270 llvm::StringRef intrName =
1271 usgn ?
"aarch64.neon.uqshl" :
"aarch64.neon.sqshl";
1276 case NEON::BI__builtin_neon_vqshlu_n_v:
1277 case NEON::BI__builtin_neon_vqshluq_n_v:
1279 "aarch64.neon.sqshlu", ty, loc,
1282 case NEON::BI__builtin_neon_vrecpe_v:
1283 case NEON::BI__builtin_neon_vrecpeq_v:
1284 case NEON::BI__builtin_neon_vrsqrte_v:
1285 case NEON::BI__builtin_neon_vrsqrteq_v:
1287 std::string(
"unimplemented AArch64 builtin call: ") +
1289 return mlir::Value{};
1290 case NEON::BI__builtin_neon_vrndi_v:
1291 case NEON::BI__builtin_neon_vrndiq_v:
1294 ops, std::nullopt, ty, loc);
1295 case NEON::BI__builtin_neon_vrshr_n_v:
1296 case NEON::BI__builtin_neon_vrshrq_n_v: {
1297 llvm::StringRef intrName =
1298 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
1301 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
1302 intrName, ty, loc,
false,
1306 case NEON::BI__builtin_neon_vsha512hq_u64:
1307 case NEON::BI__builtin_neon_vsha512h2q_u64:
1308 case NEON::BI__builtin_neon_vsha512su0q_u64:
1309 case NEON::BI__builtin_neon_vsha512su1q_u64:
1311 std::string(
"unimplemented AArch64 builtin call: ") +
1313 return mlir::Value{};
1314 case NEON::BI__builtin_neon_vshl_n_v:
1315 case NEON::BI__builtin_neon_vshlq_n_v:
1318 case NEON::BI__builtin_neon_vshll_n_v: {
1320 cir::VectorType narrowVecTy =
1324 mlir::Value src = builder.
createBitcast(ops[0], narrowVecTy);
1329 case NEON::BI__builtin_neon_vshrn_n_v:
1331 std::string(
"unimplemented AArch64 builtin call: ") +
1333 return mlir::Value{};
1334 case NEON::BI__builtin_neon_vshr_n_v:
1335 case NEON::BI__builtin_neon_vshrq_n_v:
1337 case NEON::BI__builtin_neon_vst1_v:
1338 case NEON::BI__builtin_neon_vst1q_v:
1339 case NEON::BI__builtin_neon_vst2_v:
1340 case NEON::BI__builtin_neon_vst2q_v:
1341 case NEON::BI__builtin_neon_vst3_v:
1342 case NEON::BI__builtin_neon_vst3q_v:
1343 case NEON::BI__builtin_neon_vst4_v:
1344 case NEON::BI__builtin_neon_vst4q_v:
1345 case NEON::BI__builtin_neon_vst2_lane_v:
1346 case NEON::BI__builtin_neon_vst2q_lane_v:
1347 case NEON::BI__builtin_neon_vst3_lane_v:
1348 case NEON::BI__builtin_neon_vst3q_lane_v:
1349 case NEON::BI__builtin_neon_vst4_lane_v:
1350 case NEON::BI__builtin_neon_vst4q_lane_v:
1351 case NEON::BI__builtin_neon_vsm3partw1q_u32:
1352 case NEON::BI__builtin_neon_vsm3partw2q_u32:
1353 case NEON::BI__builtin_neon_vsm3ss1q_u32:
1354 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
1355 case NEON::BI__builtin_neon_vsm4eq_u32:
1356 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
1357 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
1358 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
1359 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
1361 std::string(
"unimplemented AArch64 builtin call: ") +
1363 return mlir::Value{};
1364 case NEON::BI__builtin_neon_vst1_x2_v:
1365 case NEON::BI__builtin_neon_vst1q_x2_v:
1366 case NEON::BI__builtin_neon_vst1_x3_v:
1367 case NEON::BI__builtin_neon_vst1q_x3_v:
1368 case NEON::BI__builtin_neon_vst1_x4_v:
1369 case NEON::BI__builtin_neon_vst1q_x4_v: {
1372 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
1376 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1380 case NEON::BI__builtin_neon_vtrn_v:
1381 case NEON::BI__builtin_neon_vtrnq_v:
1382 case NEON::BI__builtin_neon_vtst_v:
1383 case NEON::BI__builtin_neon_vtstq_v:
1384 case NEON::BI__builtin_neon_vuzp_v:
1385 case NEON::BI__builtin_neon_vuzpq_v:
1386 case NEON::BI__builtin_neon_vxarq_u64:
1387 case NEON::BI__builtin_neon_vzip_v:
1388 case NEON::BI__builtin_neon_vzipq_v:
1389 case NEON::BI__builtin_neon_vdot_s32:
1390 case NEON::BI__builtin_neon_vdot_u32:
1391 case NEON::BI__builtin_neon_vdotq_s32:
1392 case NEON::BI__builtin_neon_vdotq_u32:
1393 case NEON::BI__builtin_neon_vfmlal_low_f16:
1394 case NEON::BI__builtin_neon_vfmlalq_low_f16:
1395 case NEON::BI__builtin_neon_vfmlsl_low_f16:
1396 case NEON::BI__builtin_neon_vfmlslq_low_f16:
1397 case NEON::BI__builtin_neon_vfmlal_high_f16:
1398 case NEON::BI__builtin_neon_vfmlalq_high_f16:
1399 case NEON::BI__builtin_neon_vfmlsl_high_f16:
1400 case NEON::BI__builtin_neon_vfmlslq_high_f16:
1401 case NEON::BI__builtin_neon_vmmlaq_s32:
1402 case NEON::BI__builtin_neon_vmmlaq_u32:
1404 std::string(
"unimplemented AArch64 builtin call: ") +
1406 return mlir::Value{};
1407 case NEON::BI__builtin_neon_vmul_v:
1408 case NEON::BI__builtin_neon_vmulq_v:
1411 case NEON::BI__builtin_neon_vusmmlaq_s32:
1412 case NEON::BI__builtin_neon_vusdot_s32:
1413 case NEON::BI__builtin_neon_vusdotq_s32:
1414 case NEON::BI__builtin_neon_vbfdot_f32:
1415 case NEON::BI__builtin_neon_vbfdotq_f32:
1416 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
1418 std::string(
"unimplemented AArch64 builtin call: ") +
1420 return mlir::Value{};
1426 switch (builtinID) {
1429 std::string(
"unimplemented AArch64 builtin call: ") +
1432 case NEON::BI__builtin_neon_vrnd32x_f32:
1433 case NEON::BI__builtin_neon_vrnd32xq_f32:
1434 case NEON::BI__builtin_neon_vrnd32x_f64:
1435 case NEON::BI__builtin_neon_vrnd32xq_f64:
1436 case NEON::BI__builtin_neon_vrnd32z_f32:
1437 case NEON::BI__builtin_neon_vrnd32zq_f32:
1438 case NEON::BI__builtin_neon_vrnd32z_f64:
1439 case NEON::BI__builtin_neon_vrnd32zq_f64:
1440 case NEON::BI__builtin_neon_vrnd64x_f32:
1441 case NEON::BI__builtin_neon_vrnd64xq_f32:
1442 case NEON::BI__builtin_neon_vrnd64x_f64:
1443 case NEON::BI__builtin_neon_vrnd64xq_f64:
1444 case NEON::BI__builtin_neon_vrnd64z_f32:
1445 case NEON::BI__builtin_neon_vrnd64zq_f32:
1446 case NEON::BI__builtin_neon_vrnd64z_f64:
1447 case NEON::BI__builtin_neon_vrnd64zq_f64: {
1449 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1450 mlir::Value result =
1452 llvmIntrName, vTy, loc);
1456 case NEON::BI__builtin_neon_vhadd_v:
1457 case NEON::BI__builtin_neon_vhaddq_v:
1458 case NEON::BI__builtin_neon_vhsub_v:
1459 case NEON::BI__builtin_neon_vhsubq_v:
1460 case NEON::BI__builtin_neon_vqadd_v:
1461 case NEON::BI__builtin_neon_vqaddq_v:
1462 case NEON::BI__builtin_neon_vrhadd_v:
1463 case NEON::BI__builtin_neon_vrhaddq_v:
1464 case NEON::BI__builtin_neon_vqsub_v:
1465 case NEON::BI__builtin_neon_vqsubq_v:
1466 case NEON::BI__builtin_neon_vshl_v:
1467 case NEON::BI__builtin_neon_vshlq_v:
1468 case NEON::BI__builtin_neon_vraddhn_v:
1469 case NEON::BI__builtin_neon_vrsubhn_v:
1470 case NEON::BI__builtin_neon_vqshl_v:
1471 case NEON::BI__builtin_neon_vqshlq_v: {
1474 unsigned intrinsic =
1475 ((modifier &
UnsignedAlts) && !usgn) ? altLLVMIntrinsic : llvmIntrinsic;
1476 llvm::StringRef llvmIntrName =
1479 cir::VectorType argTy =
1482 mlir::Value result =
1484 {argTy, argTy}, ops, llvmIntrName,
1958 NEON::BI__builtin_neon_vabd_f16,
1959 NEON::BI__builtin_neon_vabd_v,
1962 NEON::BI__builtin_neon_vabdq_f16,
1963 NEON::BI__builtin_neon_vabdq_v,
1966 NEON::BI__builtin_neon_vabs_f16,
1967 NEON::BI__builtin_neon_vabs_v,
1970 NEON::BI__builtin_neon_vabsq_f16,
1971 NEON::BI__builtin_neon_vabsq_v,
1974 NEON::BI__builtin_neon_vcage_f16,
1975 NEON::BI__builtin_neon_vcage_v,
1978 NEON::BI__builtin_neon_vcageq_f16,
1979 NEON::BI__builtin_neon_vcageq_v,
1982 NEON::BI__builtin_neon_vcagt_f16,
1983 NEON::BI__builtin_neon_vcagt_v,
1986 NEON::BI__builtin_neon_vcagtq_f16,
1987 NEON::BI__builtin_neon_vcagtq_v,
1990 NEON::BI__builtin_neon_vcale_f16,
1991 NEON::BI__builtin_neon_vcale_v,
1994 NEON::BI__builtin_neon_vcaleq_f16,
1995 NEON::BI__builtin_neon_vcaleq_v,
1998 NEON::BI__builtin_neon_vcalt_f16,
1999 NEON::BI__builtin_neon_vcalt_v,
2002 NEON::BI__builtin_neon_vcaltq_f16,
2003 NEON::BI__builtin_neon_vcaltq_v,
2006 NEON::BI__builtin_neon_vceqz_f16,
2007 NEON::BI__builtin_neon_vceqz_v,
2010 NEON::BI__builtin_neon_vceqzq_f16,
2011 NEON::BI__builtin_neon_vceqzq_v,
2014 NEON::BI__builtin_neon_vcgez_f16,
2015 NEON::BI__builtin_neon_vcgez_v,
2018 NEON::BI__builtin_neon_vcgezq_f16,
2019 NEON::BI__builtin_neon_vcgezq_v,
2022 NEON::BI__builtin_neon_vcgtz_f16,
2023 NEON::BI__builtin_neon_vcgtz_v,
2026 NEON::BI__builtin_neon_vcgtzq_f16,
2027 NEON::BI__builtin_neon_vcgtzq_v,
2030 NEON::BI__builtin_neon_vclez_f16,
2031 NEON::BI__builtin_neon_vclez_v,
2034 NEON::BI__builtin_neon_vclezq_f16,
2035 NEON::BI__builtin_neon_vclezq_v,
2038 NEON::BI__builtin_neon_vcltz_f16,
2039 NEON::BI__builtin_neon_vcltz_v,
2042 NEON::BI__builtin_neon_vcltzq_f16,
2043 NEON::BI__builtin_neon_vcltzq_v,
2046 NEON::BI__builtin_neon_vfma_f16,
2047 NEON::BI__builtin_neon_vfma_v,
2050 NEON::BI__builtin_neon_vfma_lane_f16,
2051 NEON::BI__builtin_neon_vfma_lane_v,
2054 NEON::BI__builtin_neon_vfma_laneq_f16,
2055 NEON::BI__builtin_neon_vfma_laneq_v,
2058 NEON::BI__builtin_neon_vfmaq_f16,
2059 NEON::BI__builtin_neon_vfmaq_v,
2062 NEON::BI__builtin_neon_vfmaq_lane_f16,
2063 NEON::BI__builtin_neon_vfmaq_lane_v,
2066 NEON::BI__builtin_neon_vfmaq_laneq_f16,
2067 NEON::BI__builtin_neon_vfmaq_laneq_v,
2070 NEON::BI__builtin_neon_vmax_f16,
2071 NEON::BI__builtin_neon_vmax_v,
2074 NEON::BI__builtin_neon_vmaxnm_f16,
2075 NEON::BI__builtin_neon_vmaxnm_v,
2078 NEON::BI__builtin_neon_vmaxnmq_f16,
2079 NEON::BI__builtin_neon_vmaxnmq_v,
2082 NEON::BI__builtin_neon_vmaxq_f16,
2083 NEON::BI__builtin_neon_vmaxq_v,
2086 NEON::BI__builtin_neon_vmin_f16,
2087 NEON::BI__builtin_neon_vmin_v,
2090 NEON::BI__builtin_neon_vminnm_f16,
2091 NEON::BI__builtin_neon_vminnm_v,
2094 NEON::BI__builtin_neon_vminnmq_f16,
2095 NEON::BI__builtin_neon_vminnmq_v,
2098 NEON::BI__builtin_neon_vminq_f16,
2099 NEON::BI__builtin_neon_vminq_v,
2102 NEON::BI__builtin_neon_vmulx_f16,
2103 NEON::BI__builtin_neon_vmulx_v,
2106 NEON::BI__builtin_neon_vmulxq_f16,
2107 NEON::BI__builtin_neon_vmulxq_v,
2110 NEON::BI__builtin_neon_vpadd_f16,
2111 NEON::BI__builtin_neon_vpadd_v,
2114 NEON::BI__builtin_neon_vpaddq_f16,
2115 NEON::BI__builtin_neon_vpaddq_v,
2118 NEON::BI__builtin_neon_vpmax_f16,
2119 NEON::BI__builtin_neon_vpmax_v,
2122 NEON::BI__builtin_neon_vpmaxnm_f16,
2123 NEON::BI__builtin_neon_vpmaxnm_v,
2126 NEON::BI__builtin_neon_vpmaxnmq_f16,
2127 NEON::BI__builtin_neon_vpmaxnmq_v,
2130 NEON::BI__builtin_neon_vpmaxq_f16,
2131 NEON::BI__builtin_neon_vpmaxq_v,
2134 NEON::BI__builtin_neon_vpmin_f16,
2135 NEON::BI__builtin_neon_vpmin_v,
2138 NEON::BI__builtin_neon_vpminnm_f16,
2139 NEON::BI__builtin_neon_vpminnm_v,
2142 NEON::BI__builtin_neon_vpminnmq_f16,
2143 NEON::BI__builtin_neon_vpminnmq_v,
2146 NEON::BI__builtin_neon_vpminq_f16,
2147 NEON::BI__builtin_neon_vpminq_v,
2150 NEON::BI__builtin_neon_vrecpe_f16,
2151 NEON::BI__builtin_neon_vrecpe_v,
2154 NEON::BI__builtin_neon_vrecpeq_f16,
2155 NEON::BI__builtin_neon_vrecpeq_v,
2158 NEON::BI__builtin_neon_vrecps_f16,
2159 NEON::BI__builtin_neon_vrecps_v,
2162 NEON::BI__builtin_neon_vrecpsq_f16,
2163 NEON::BI__builtin_neon_vrecpsq_v,
2166 NEON::BI__builtin_neon_vrnd_f16,
2167 NEON::BI__builtin_neon_vrnd_v,
2170 NEON::BI__builtin_neon_vrnda_f16,
2171 NEON::BI__builtin_neon_vrnda_v,
2174 NEON::BI__builtin_neon_vrndaq_f16,
2175 NEON::BI__builtin_neon_vrndaq_v,
2178 NEON::BI__builtin_neon_vrndi_f16,
2179 NEON::BI__builtin_neon_vrndi_v,
2182 NEON::BI__builtin_neon_vrndiq_f16,
2183 NEON::BI__builtin_neon_vrndiq_v,
2186 NEON::BI__builtin_neon_vrndm_f16,
2187 NEON::BI__builtin_neon_vrndm_v,
2190 NEON::BI__builtin_neon_vrndmq_f16,
2191 NEON::BI__builtin_neon_vrndmq_v,
2194 NEON::BI__builtin_neon_vrndn_f16,
2195 NEON::BI__builtin_neon_vrndn_v,
2198 NEON::BI__builtin_neon_vrndnq_f16,
2199 NEON::BI__builtin_neon_vrndnq_v,
2202 NEON::BI__builtin_neon_vrndp_f16,
2203 NEON::BI__builtin_neon_vrndp_v,
2206 NEON::BI__builtin_neon_vrndpq_f16,
2207 NEON::BI__builtin_neon_vrndpq_v,
2210 NEON::BI__builtin_neon_vrndq_f16,
2211 NEON::BI__builtin_neon_vrndq_v,
2214 NEON::BI__builtin_neon_vrndx_f16,
2215 NEON::BI__builtin_neon_vrndx_v,
2218 NEON::BI__builtin_neon_vrndxq_f16,
2219 NEON::BI__builtin_neon_vrndxq_v,
2222 NEON::BI__builtin_neon_vrsqrte_f16,
2223 NEON::BI__builtin_neon_vrsqrte_v,
2226 NEON::BI__builtin_neon_vrsqrteq_f16,
2227 NEON::BI__builtin_neon_vrsqrteq_v,
2230 NEON::BI__builtin_neon_vrsqrts_f16,
2231 NEON::BI__builtin_neon_vrsqrts_v,
2234 NEON::BI__builtin_neon_vrsqrtsq_f16,
2235 NEON::BI__builtin_neon_vrsqrtsq_v,
2238 NEON::BI__builtin_neon_vsqrt_f16,
2239 NEON::BI__builtin_neon_vsqrt_v,
2242 NEON::BI__builtin_neon_vsqrtq_f16,
2243 NEON::BI__builtin_neon_vsqrtq_v,
2248 {NEON::BI__builtin_neon_vldap1_lane_u64,
2249 NEON::BI__builtin_neon_vldap1_lane_s64},
2250 {NEON::BI__builtin_neon_vldap1_lane_f64,
2251 NEON::BI__builtin_neon_vldap1_lane_s64},
2252 {NEON::BI__builtin_neon_vldap1_lane_p64,
2253 NEON::BI__builtin_neon_vldap1_lane_s64},
2254 {NEON::BI__builtin_neon_vldap1q_lane_u64,
2255 NEON::BI__builtin_neon_vldap1q_lane_s64},
2256 {NEON::BI__builtin_neon_vldap1q_lane_f64,
2257 NEON::BI__builtin_neon_vldap1q_lane_s64},
2258 {NEON::BI__builtin_neon_vldap1q_lane_p64,
2259 NEON::BI__builtin_neon_vldap1q_lane_s64},
2260 {NEON::BI__builtin_neon_vstl1_lane_u64,
2261 NEON::BI__builtin_neon_vstl1_lane_s64},
2262 {NEON::BI__builtin_neon_vstl1_lane_f64,
2263 NEON::BI__builtin_neon_vstl1_lane_s64},
2264 {NEON::BI__builtin_neon_vstl1_lane_p64,
2265 NEON::BI__builtin_neon_vstl1_lane_s64},
2266 {NEON::BI__builtin_neon_vstl1q_lane_u64,
2267 NEON::BI__builtin_neon_vstl1q_lane_s64},
2268 {NEON::BI__builtin_neon_vstl1q_lane_f64,
2269 NEON::BI__builtin_neon_vstl1q_lane_s64},
2270 {NEON::BI__builtin_neon_vstl1q_lane_p64,
2271 NEON::BI__builtin_neon_vstl1q_lane_s64},
2277 llvm::Triple::ArchType arch) {
2286 if (builtinID == Builtin::BI__builtin_cpu_supports) {
2287 cgm.errorNYI(
expr->getSourceRange(),
2288 std::string(
"unimplemented AArch64 builtin call: ") +
2289 getContext().BuiltinInfo.getName(builtinID));
2290 return mlir::Value{};
2293 switch (builtinID) {
2296 case clang::AArch64::BI__builtin_arm_nop:
2297 case clang::AArch64::BI__builtin_arm_yield:
2298 case clang::AArch64::BI__yield:
2299 case clang::AArch64::BI__builtin_arm_wfe:
2300 case clang::AArch64::BI__wfe:
2301 case clang::AArch64::BI__builtin_arm_wfi:
2302 case clang::AArch64::BI__wfi:
2303 case clang::AArch64::BI__builtin_arm_sev:
2304 case clang::AArch64::BI__sev:
2305 case clang::AArch64::BI__builtin_arm_sevl:
2306 case clang::AArch64::BI__sevl:
2307 cgm.errorNYI(
expr->getSourceRange(),
2308 std::string(
"unimplemented AArch64 builtin call: ") +
2309 getContext().BuiltinInfo.getName(builtinID));
2310 return mlir::Value{};
2313 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
2314 cgm.errorNYI(
expr->getSourceRange(),
2315 std::string(
"unimplemented AArch64 builtin call: ") +
2316 getContext().BuiltinInfo.getName(builtinID));
2317 return mlir::Value{};
2320 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
2321 cgm.errorNYI(
expr->getSourceRange(),
2322 std::string(
"unimplemented AArch64 builtin call: ") +
2323 getContext().BuiltinInfo.getName(builtinID));
2324 return mlir::Value{};
2327 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
2328 cgm.errorNYI(
expr->getSourceRange(),
2329 std::string(
"unimplemented AArch64 builtin call: ") +
2330 getContext().BuiltinInfo.getName(builtinID));
2331 return mlir::Value{};
2333 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
2334 cgm.errorNYI(
expr->getSourceRange(),
2335 std::string(
"unimplemented AArch64 builtin call: ") +
2336 getContext().BuiltinInfo.getName(builtinID));
2337 return mlir::Value{};
2340 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
2341 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
2342 cgm.errorNYI(
expr->getSourceRange(),
2343 std::string(
"unimplemented AArch64 builtin call: ") +
2344 getContext().BuiltinInfo.getName(builtinID));
2345 return mlir::Value{};
2348 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
2349 cgm.errorNYI(
expr->getSourceRange(),
2350 std::string(
"unimplemented AArch64 builtin call: ") +
2351 getContext().BuiltinInfo.getName(builtinID));
2352 return mlir::Value{};
2354 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
2355 cgm.errorNYI(
expr->getSourceRange(),
2356 std::string(
"unimplemented AArch64 builtin call: ") +
2357 getContext().BuiltinInfo.getName(builtinID));
2358 return mlir::Value{};
2361 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
2362 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
2363 cgm.errorNYI(
expr->getSourceRange(),
2364 std::string(
"unimplemented AArch64 builtin call: ") +
2365 getContext().BuiltinInfo.getName(builtinID));
2366 return mlir::Value{};
2369 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
2370 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
2371 cgm.errorNYI(
expr->getSourceRange(),
2372 std::string(
"unimplemented AArch64 builtin call: ") +
2373 getContext().BuiltinInfo.getName(builtinID));
2374 return mlir::Value{};
2377 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
2378 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
2379 cgm.errorNYI(
expr->getSourceRange(),
2380 std::string(
"unimplemented AArch64 builtin call: ") +
2381 getContext().BuiltinInfo.getName(builtinID));
2382 return mlir::Value{};
2385 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
2386 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
2387 cgm.errorNYI(
expr->getSourceRange(),
2388 std::string(
"unimplemented AArch64 builtin call: ") +
2389 getContext().BuiltinInfo.getName(builtinID));
2390 return mlir::Value{};
2393 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
2394 cgm.errorNYI(
expr->getSourceRange(),
2395 std::string(
"unimplemented AArch64 builtin call: ") +
2396 getContext().BuiltinInfo.getName(builtinID));
2397 return mlir::Value{};
2400 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
2401 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
2402 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
2403 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2404 cgm.errorNYI(
expr->getSourceRange(),
2405 std::string(
"unimplemented AArch64 builtin call: ") +
2406 getContext().BuiltinInfo.getName(builtinID));
2407 return mlir::Value{};
2410 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2411 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
2412 cgm.errorNYI(
expr->getSourceRange(),
2413 std::string(
"unimplemented AArch64 builtin call: ") +
2414 getContext().BuiltinInfo.getName(builtinID));
2415 return mlir::Value{};
2418 if (builtinID == clang::AArch64::BI__clear_cache) {
2419 cgm.errorNYI(
expr->getSourceRange(),
2420 std::string(
"unimplemented AArch64 builtin call: ") +
2421 getContext().BuiltinInfo.getName(builtinID));
2422 return mlir::Value{};
2425 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2426 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2428 cgm.errorNYI(
expr->getSourceRange(),
2429 std::string(
"unimplemented AArch64 builtin call: ") +
2430 getContext().BuiltinInfo.getName(builtinID));
2431 return mlir::Value{};
2433 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2434 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2435 cgm.errorNYI(
expr->getSourceRange(),
2436 std::string(
"unimplemented AArch64 builtin call: ") +
2437 getContext().BuiltinInfo.getName(builtinID));
2438 return mlir::Value{};
2441 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2442 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
2444 cgm.errorNYI(
expr->getSourceRange(),
2445 std::string(
"unimplemented AArch64 builtin call: ") +
2446 getContext().BuiltinInfo.getName(builtinID));
2447 return mlir::Value{};
2450 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2451 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
2452 cgm.errorNYI(
expr->getSourceRange(),
2453 std::string(
"unimplemented AArch64 builtin call: ") +
2454 getContext().BuiltinInfo.getName(builtinID));
2455 return mlir::Value{};
2458 if (builtinID == clang::AArch64::BI__getReg ||
2459 builtinID == clang::AArch64::BI__setReg ||
2460 builtinID == clang::AArch64::BI__getRegFp ||
2461 builtinID == clang::AArch64::BI__setRegFp) {
2462 cgm.errorNYI(
expr->getSourceRange(),
2463 std::string(
"unimplemented AArch64 builtin call: ") +
2464 getContext().BuiltinInfo.getName(builtinID));
2465 return mlir::Value{};
2468 if (builtinID == clang::AArch64::BI__break) {
2469 cgm.errorNYI(
expr->getSourceRange(),
2470 std::string(
"unimplemented AArch64 builtin call: ") +
2471 getContext().BuiltinInfo.getName(builtinID));
2472 return mlir::Value{};
2475 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2476 cgm.errorNYI(
expr->getSourceRange(),
2477 std::string(
"unimplemented AArch64 builtin call: ") +
2478 getContext().BuiltinInfo.getName(builtinID));
2479 return mlir::Value{};
2482 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2483 cgm.errorNYI(
expr->getSourceRange(),
2484 std::string(
"unimplemented AArch64 builtin call: ") +
2485 getContext().BuiltinInfo.getName(builtinID));
2486 return mlir::Value{};
2490 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2491 switch (builtinID) {
2492 case clang::AArch64::BI__builtin_arm_crc32b:
2493 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2495 case clang::AArch64::BI__builtin_arm_crc32cb:
2496 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2498 case clang::AArch64::BI__builtin_arm_crc32h:
2499 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2501 case clang::AArch64::BI__builtin_arm_crc32ch:
2502 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2504 case clang::AArch64::BI__builtin_arm_crc32w:
2505 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2507 case clang::AArch64::BI__builtin_arm_crc32cw:
2508 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2510 case clang::AArch64::BI__builtin_arm_crc32d:
2511 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2513 case clang::AArch64::BI__builtin_arm_crc32cd:
2514 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2518 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2519 cgm.errorNYI(
expr->getSourceRange(),
2520 std::string(
"unimplemented AArch64 builtin call: ") +
2521 getContext().BuiltinInfo.getName(builtinID));
2522 return mlir::Value{};
2526 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2527 cgm.errorNYI(
expr->getSourceRange(),
2528 std::string(
"unimplemented AArch64 builtin call: ") +
2529 getContext().BuiltinInfo.getName(builtinID));
2530 return mlir::Value{};
2534 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2535 switch (builtinID) {
2536 case clang::AArch64::BI__builtin_arm_irg:
2537 mteIntrinsicID = Intrinsic::aarch64_irg;
2539 case clang::AArch64::BI__builtin_arm_addg:
2540 mteIntrinsicID = Intrinsic::aarch64_addg;
2542 case clang::AArch64::BI__builtin_arm_gmi:
2543 mteIntrinsicID = Intrinsic::aarch64_gmi;
2545 case clang::AArch64::BI__builtin_arm_ldg:
2546 mteIntrinsicID = Intrinsic::aarch64_ldg;
2548 case clang::AArch64::BI__builtin_arm_stg:
2549 mteIntrinsicID = Intrinsic::aarch64_stg;
2551 case clang::AArch64::BI__builtin_arm_subp:
2552 mteIntrinsicID = Intrinsic::aarch64_subp;
2556 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
2557 cgm.errorNYI(
expr->getSourceRange(),
2558 std::string(
"unimplemented AArch64 builtin call: ") +
2559 getContext().BuiltinInfo.getName(builtinID));
2560 return mlir::Value{};
2563 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
2564 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2565 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2566 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2567 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2568 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2569 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2570 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2571 cgm.errorNYI(
expr->getSourceRange(),
2572 std::string(
"unimplemented AArch64 builtin call: ") +
2573 getContext().BuiltinInfo.getName(builtinID));
2574 return mlir::Value{};
2577 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2578 builtinID == clang::AArch64::BI_WriteStatusReg ||
2579 builtinID == clang::AArch64::BI__sys) {
2580 cgm.errorNYI(
expr->getSourceRange(),
2581 std::string(
"unimplemented AArch64 builtin call: ") +
2582 getContext().BuiltinInfo.getName(builtinID));
2583 return mlir::Value{};
2586 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
2587 cgm.errorNYI(
expr->getSourceRange(),
2588 std::string(
"unimplemented AArch64 builtin call: ") +
2589 getContext().BuiltinInfo.getName(builtinID));
2590 return mlir::Value{};
2593 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2594 cgm.errorNYI(
expr->getSourceRange(),
2595 std::string(
"unimplemented AArch64 builtin call: ") +
2596 getContext().BuiltinInfo.getName(builtinID));
2597 return mlir::Value{};
2600 if (builtinID == clang::AArch64::BI__mulh ||
2601 builtinID == clang::AArch64::BI__umulh) {
2602 cgm.errorNYI(
expr->getSourceRange(),
2603 std::string(
"unimplemented AArch64 builtin call: ") +
2604 getContext().BuiltinInfo.getName(builtinID));
2605 return mlir::Value{};
2608 if (builtinID == AArch64::BI__writex18byte ||
2609 builtinID == AArch64::BI__writex18word ||
2610 builtinID == AArch64::BI__writex18dword ||
2611 builtinID == AArch64::BI__writex18qword) {
2612 cgm.errorNYI(
expr->getSourceRange(),
2613 std::string(
"unimplemented AArch64 builtin call: ") +
2614 getContext().BuiltinInfo.getName(builtinID));
2615 return mlir::Value{};
2618 if (builtinID == AArch64::BI__readx18byte ||
2619 builtinID == AArch64::BI__readx18word ||
2620 builtinID == AArch64::BI__readx18dword ||
2621 builtinID == AArch64::BI__readx18qword) {
2622 cgm.errorNYI(
expr->getSourceRange(),
2623 std::string(
"unimplemented AArch64 builtin call: ") +
2624 getContext().BuiltinInfo.getName(builtinID));
2625 return mlir::Value{};
2628 if (builtinID == AArch64::BI__addx18byte ||
2629 builtinID == AArch64::BI__addx18word ||
2630 builtinID == AArch64::BI__addx18dword ||
2631 builtinID == AArch64::BI__addx18qword ||
2632 builtinID == AArch64::BI__incx18byte ||
2633 builtinID == AArch64::BI__incx18word ||
2634 builtinID == AArch64::BI__incx18dword ||
2635 builtinID == AArch64::BI__incx18qword) {
2636 cgm.errorNYI(
expr->getSourceRange(),
2637 std::string(
"unimplemented AArch64 builtin call: ") +
2638 getContext().BuiltinInfo.getName(builtinID));
2639 return mlir::Value{};
2642 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2643 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2644 builtinID == AArch64::BI_CopyInt32FromFloat ||
2645 builtinID == AArch64::BI_CopyInt64FromDouble) {
2646 cgm.errorNYI(
expr->getSourceRange(),
2647 std::string(
"unimplemented AArch64 builtin call: ") +
2648 getContext().BuiltinInfo.getName(builtinID));
2649 return mlir::Value{};
2652 if (builtinID == AArch64::BI_CountLeadingOnes ||
2653 builtinID == AArch64::BI_CountLeadingOnes64 ||
2654 builtinID == AArch64::BI_CountLeadingZeros ||
2655 builtinID == AArch64::BI_CountLeadingZeros64) {
2656 cgm.errorNYI(
expr->getSourceRange(),
2657 std::string(
"unimplemented AArch64 builtin call: ") +
2658 getContext().BuiltinInfo.getName(builtinID));
2659 return mlir::Value{};
2662 if (builtinID == AArch64::BI_CountLeadingSigns ||
2663 builtinID == AArch64::BI_CountLeadingSigns64) {
2664 cgm.errorNYI(
expr->getSourceRange(),
2665 std::string(
"unimplemented AArch64 builtin call: ") +
2666 getContext().BuiltinInfo.getName(builtinID));
2667 return mlir::Value{};
2670 if (builtinID == AArch64::BI_CountOneBits ||
2671 builtinID == AArch64::BI_CountOneBits64 ||
2672 builtinID == AArch64::BI_CountTrailingZeros ||
2673 builtinID == AArch64::BI_CountTrailingZeros64) {
2674 cgm.errorNYI(
expr->getSourceRange(),
2675 std::string(
"unimplemented AArch64 builtin call: ") +
2676 getContext().BuiltinInfo.getName(builtinID));
2677 return mlir::Value{};
2680 if (builtinID == AArch64::BI__prefetch ||
2681 builtinID == AArch64::BI__prefetch2) {
2682 cgm.errorNYI(
expr->getSourceRange(),
2683 std::string(
"unimplemented AArch64 builtin call: ") +
2684 getContext().BuiltinInfo.getName(builtinID));
2685 return mlir::Value{};
2688 if (builtinID == AArch64::BI__hlt) {
2689 cgm.errorNYI(
expr->getSourceRange(),
2690 std::string(
"unimplemented AArch64 builtin call: ") +
2691 getContext().BuiltinInfo.getName(builtinID));
2692 return mlir::Value{};
2695 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2696 cgm.errorNYI(
expr->getSourceRange(),
2697 std::string(
"unimplemented AArch64 builtin call: ") +
2698 getContext().BuiltinInfo.getName(builtinID));
2699 return mlir::Value{};
2708 return p.first == builtinID;
2711 builtinID = it->second;
2716 unsigned iceArguments = 0;
2731 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2732 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2734 switch (builtinID) {
2735 case NEON::BI__builtin_neon_vld1_v:
2736 case NEON::BI__builtin_neon_vld1q_v:
2737 case NEON::BI__builtin_neon_vld1_dup_v:
2738 case NEON::BI__builtin_neon_vld1q_dup_v:
2739 case NEON::BI__builtin_neon_vld1_lane_v:
2740 case NEON::BI__builtin_neon_vld1q_lane_v:
2741 case NEON::BI__builtin_neon_vst1_v:
2742 case NEON::BI__builtin_neon_vst1q_v:
2743 case NEON::BI__builtin_neon_vst1_lane_v:
2744 case NEON::BI__builtin_neon_vst1q_lane_v:
2745 case NEON::BI__builtin_neon_vstrq_p128:
2746 case NEON::BI__builtin_neon_vst2_v:
2747 case NEON::BI__builtin_neon_vst2q_v:
2748 case NEON::BI__builtin_neon_vst2_lane_v:
2749 case NEON::BI__builtin_neon_vst2q_lane_v:
2750 case NEON::BI__builtin_neon_vst3_v:
2751 case NEON::BI__builtin_neon_vst3q_v:
2752 case NEON::BI__builtin_neon_vst3_lane_v:
2753 case NEON::BI__builtin_neon_vst3q_lane_v:
2754 case NEON::BI__builtin_neon_vst4_v:
2755 case NEON::BI__builtin_neon_vst4q_v:
2756 case NEON::BI__builtin_neon_vst4_lane_v:
2757 case NEON::BI__builtin_neon_vst4q_lane_v:
2763 case NEON::BI__builtin_neon_vldap1_lane_s64:
2764 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2765 case NEON::BI__builtin_neon_vstl1_lane_s64:
2766 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2768 expr->getSourceRange(),
2769 std::string(
"unimplemented AArch64 builtin argument handling ") +
2770 getContext().BuiltinInfo.getName(builtinID));
2791 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2795 if (std::optional<llvm::APSInt> result =
2799 bool usgn =
type.isUnsigned();
2801 mlir::Location loc =
getLoc(
expr->getExprLoc());
2815 switch (builtinID) {
2818 case NEON::BI__builtin_neon_vabsh_f16: {
2819 mlir::Type halfTy = builder.getFp16Ty();
2821 std::nullopt, halfTy, loc);
2823 case NEON::BI__builtin_neon_vaddq_p128: {
2824 cir::VectorType byteTy = cir::VectorType::get(builder.getUInt8Ty(), 16);
2825 ops[0] = builder.createBitcast(ops[0], byteTy);
2826 ops[1] = builder.createBitcast(ops[1], byteTy);
2827 mlir::Value result = builder.createXor(loc, ops[0], ops[1]);
2830 case NEON::BI__builtin_neon_vldrq_p128:
2831 cgm.errorNYI(
expr->getSourceRange(),
2832 std::string(
"unimplemented AArch64 builtin call: ") +
2833 getContext().BuiltinInfo.getName(builtinID));
2834 return mlir::Value{};
2835 case NEON::BI__builtin_neon_vstrq_p128: {
2836 builder.createStore(loc, ops[1], ptrOp0);
2839 case NEON::BI__builtin_neon_vcvts_f32_u32:
2840 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2841 case NEON::BI__builtin_neon_vcvts_f32_s32:
2842 case NEON::BI__builtin_neon_vcvtd_f64_s64: {
2843 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0],
2846 case NEON::BI__builtin_neon_vcvth_f16_u16:
2847 case NEON::BI__builtin_neon_vcvth_f16_u32:
2848 case NEON::BI__builtin_neon_vcvth_f16_u64:
2849 case NEON::BI__builtin_neon_vcvth_f16_s16:
2850 case NEON::BI__builtin_neon_vcvth_f16_s32:
2851 case NEON::BI__builtin_neon_vcvth_f16_s64:
2852 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2853 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2854 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2855 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2856 case NEON::BI__builtin_neon_vcvth_u16_f16:
2857 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2858 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2859 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2860 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2861 case NEON::BI__builtin_neon_vcvth_s16_f16:
2862 case NEON::BI__builtin_neon_vcaleh_f16:
2863 case NEON::BI__builtin_neon_vcalth_f16:
2864 case NEON::BI__builtin_neon_vcageh_f16:
2865 case NEON::BI__builtin_neon_vcagth_f16:
2866 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2867 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2868 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2869 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2870 case NEON::BI__builtin_neon_vpaddd_s64:
2871 case NEON::BI__builtin_neon_vpaddd_f64:
2872 case NEON::BI__builtin_neon_vpadds_f32:
2873 cgm.errorNYI(
expr->getSourceRange(),
2874 std::string(
"unimplemented AArch64 builtin call: ") +
2875 getContext().BuiltinInfo.getName(builtinID));
2876 return mlir::Value{};
2877 case NEON::BI__builtin_neon_vceqzd_s64:
2878 case NEON::BI__builtin_neon_vceqzd_f64:
2879 case NEON::BI__builtin_neon_vceqzs_f32:
2880 case NEON::BI__builtin_neon_vceqzh_f16:
2882 *
this, builder, loc, ops[0],
2884 case NEON::BI__builtin_neon_vcgezd_s64:
2885 case NEON::BI__builtin_neon_vcgezd_f64:
2886 case NEON::BI__builtin_neon_vcgezs_f32:
2887 case NEON::BI__builtin_neon_vcgezh_f16:
2888 case NEON::BI__builtin_neon_vclezd_s64:
2889 case NEON::BI__builtin_neon_vclezd_f64:
2890 case NEON::BI__builtin_neon_vclezs_f32:
2891 case NEON::BI__builtin_neon_vclezh_f16:
2892 case NEON::BI__builtin_neon_vcgtzd_s64:
2893 case NEON::BI__builtin_neon_vcgtzd_f64:
2894 case NEON::BI__builtin_neon_vcgtzs_f32:
2895 case NEON::BI__builtin_neon_vcgtzh_f16:
2896 case NEON::BI__builtin_neon_vcltzd_s64:
2897 case NEON::BI__builtin_neon_vcltzd_f64:
2898 case NEON::BI__builtin_neon_vcltzs_f32:
2899 case NEON::BI__builtin_neon_vcltzh_f16:
2900 case NEON::BI__builtin_neon_vceqzd_u64: {
2902 *
this, builder, loc, ops[0],
2905 case NEON::BI__builtin_neon_vceqd_f64:
2906 case NEON::BI__builtin_neon_vcled_f64:
2907 case NEON::BI__builtin_neon_vcltd_f64:
2908 case NEON::BI__builtin_neon_vcged_f64:
2909 case NEON::BI__builtin_neon_vcgtd_f64:
2910 case NEON::BI__builtin_neon_vceqs_f32:
2911 case NEON::BI__builtin_neon_vcles_f32:
2912 case NEON::BI__builtin_neon_vclts_f32:
2913 case NEON::BI__builtin_neon_vcges_f32:
2914 case NEON::BI__builtin_neon_vcgts_f32:
2915 case NEON::BI__builtin_neon_vceqh_f16:
2916 case NEON::BI__builtin_neon_vcleh_f16:
2917 case NEON::BI__builtin_neon_vclth_f16:
2918 case NEON::BI__builtin_neon_vcgeh_f16:
2919 case NEON::BI__builtin_neon_vcgth_f16:
2920 case NEON::BI__builtin_neon_vceqd_s64:
2921 case NEON::BI__builtin_neon_vceqd_u64:
2922 case NEON::BI__builtin_neon_vcgtd_s64:
2923 case NEON::BI__builtin_neon_vcgtd_u64:
2924 case NEON::BI__builtin_neon_vcltd_s64:
2925 case NEON::BI__builtin_neon_vcltd_u64:
2926 case NEON::BI__builtin_neon_vcged_u64:
2927 case NEON::BI__builtin_neon_vcged_s64:
2928 case NEON::BI__builtin_neon_vcled_u64:
2929 case NEON::BI__builtin_neon_vcled_s64:
2930 cgm.errorNYI(
expr->getSourceRange(),
2931 std::string(
"unimplemented AArch64 builtin call: ") +
2932 getContext().BuiltinInfo.getName(builtinID));
2933 return mlir::Value{};
2934 case NEON::BI__builtin_neon_vnegd_s64: {
2935 return builder.createNeg(loc, ops[0]);
2937 case NEON::BI__builtin_neon_vnegh_f16: {
2938 return builder.createFNeg(loc, ops[0]);
2940 case NEON::BI__builtin_neon_vtstd_s64:
2941 case NEON::BI__builtin_neon_vtstd_u64:
2942 cgm.errorNYI(
expr->getSourceRange(),
2943 std::string(
"unimplemented AArch64 builtin call: ") +
2944 getContext().BuiltinInfo.getName(builtinID));
2945 return mlir::Value{};
2946 case NEON::BI__builtin_neon_vset_lane_i8:
2947 case NEON::BI__builtin_neon_vset_lane_i16:
2948 case NEON::BI__builtin_neon_vset_lane_i32:
2949 case NEON::BI__builtin_neon_vset_lane_i64:
2950 case NEON::BI__builtin_neon_vset_lane_bf16:
2951 case NEON::BI__builtin_neon_vset_lane_f32:
2952 case NEON::BI__builtin_neon_vsetq_lane_i8:
2953 case NEON::BI__builtin_neon_vsetq_lane_i16:
2954 case NEON::BI__builtin_neon_vsetq_lane_i32:
2955 case NEON::BI__builtin_neon_vsetq_lane_i64:
2956 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2957 case NEON::BI__builtin_neon_vsetq_lane_f32:
2958 case NEON::BI__builtin_neon_vset_lane_f64:
2959 case NEON::BI__builtin_neon_vset_lane_mf8:
2960 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2961 case NEON::BI__builtin_neon_vsetq_lane_f64:
2962 return cir::VecInsertOp::create(builder, loc, ops[1], ops[0], ops[2]);
2963 case NEON::BI__builtin_neon_vget_lane_i8:
2964 case NEON::BI__builtin_neon_vdupb_lane_i8:
2965 case NEON::BI__builtin_neon_vgetq_lane_i8:
2966 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2967 case NEON::BI__builtin_neon_vget_lane_mf8:
2968 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2969 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2970 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2971 case NEON::BI__builtin_neon_vget_lane_i16:
2972 case NEON::BI__builtin_neon_vduph_lane_i16:
2973 case NEON::BI__builtin_neon_vgetq_lane_i16:
2974 case NEON::BI__builtin_neon_vduph_laneq_i16:
2975 case NEON::BI__builtin_neon_vget_lane_i32:
2976 case NEON::BI__builtin_neon_vdups_lane_i32:
2977 case NEON::BI__builtin_neon_vdups_lane_f32:
2978 case NEON::BI__builtin_neon_vgetq_lane_i32:
2979 case NEON::BI__builtin_neon_vdups_laneq_i32:
2980 case NEON::BI__builtin_neon_vget_lane_i64:
2981 case NEON::BI__builtin_neon_vdupd_lane_i64:
2982 case NEON::BI__builtin_neon_vdupd_lane_f64:
2983 case NEON::BI__builtin_neon_vgetq_lane_i64:
2984 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2985 case NEON::BI__builtin_neon_vget_lane_f32:
2986 case NEON::BI__builtin_neon_vget_lane_f64:
2987 case NEON::BI__builtin_neon_vgetq_lane_f32:
2988 case NEON::BI__builtin_neon_vdups_laneq_f32:
2989 case NEON::BI__builtin_neon_vgetq_lane_f64:
2990 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2991 return cir::VecExtractOp::create(builder, loc, ops[0],
2993 case NEON::BI__builtin_neon_vaddh_f16:
2994 return builder.createFAdd(loc, ops[0], ops[1]);
2995 case NEON::BI__builtin_neon_vsubh_f16:
2996 return builder.createFSub(loc, ops[0], ops[1]);
2997 case NEON::BI__builtin_neon_vmulh_f16:
2998 return builder.createFMul(loc, ops[0], ops[1]);
2999 case NEON::BI__builtin_neon_vdivh_f16:
3000 return builder.createFDiv(loc, ops[0], ops[1]);
3001 case NEON::BI__builtin_neon_vfmah_f16: {
3003 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3006 std::nullopt, ty, loc);
3008 case NEON::BI__builtin_neon_vfmsh_f16: {
3010 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3011 ops[0] = builder.createFNeg(loc, ops[0]);
3014 std::nullopt, ty, loc);
3016 case NEON::BI__builtin_neon_vaddd_s64:
3017 case NEON::BI__builtin_neon_vaddd_u64:
3018 return builder.createAdd(loc, ops[0], ops[1]);
3019 case NEON::BI__builtin_neon_vsubd_s64:
3020 case NEON::BI__builtin_neon_vsubd_u64:
3021 return builder.createSub(loc, ops[0], ops[1]);
3022 case NEON::BI__builtin_neon_vqdmlalh_s16:
3023 case NEON::BI__builtin_neon_vqdmlslh_s16:
3024 cgm.errorNYI(
expr->getSourceRange(),
3025 std::string(
"unimplemented AArch64 builtin call: ") +
3026 getContext().BuiltinInfo.getName(builtinID));
3027 return mlir::Value{};
3028 case NEON::BI__builtin_neon_vqshlud_n_s64: {
3029 cir::IntType int64Type = builder.getSInt64Ty();
3035 case NEON::BI__builtin_neon_vqshld_n_u64:
3036 case NEON::BI__builtin_neon_vqshld_n_s64: {
3037 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
3038 ? builder.getUInt64Ty()
3039 : builder.getSInt64Ty();
3040 llvm::StringRef intrinsicName =
3041 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
3042 :
"aarch64.neon.sqshl";
3047 case NEON::BI__builtin_neon_vrshrd_n_u64:
3048 case NEON::BI__builtin_neon_vrshrd_n_s64: {
3049 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
3050 ?
"aarch64.neon.srshl"
3051 :
"aarch64.neon.urshl";
3052 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
3053 ? builder.getUInt64Ty()
3054 : builder.getSInt64Ty();
3058 ops[1] = builder.getSInt64(sv, loc);
3059 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
3060 intrName, int64Ty, loc);
3062 case NEON::BI__builtin_neon_vrsrad_n_u64:
3063 case NEON::BI__builtin_neon_vrsrad_n_s64: {
3064 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
3065 ? builder.getUInt64Ty()
3066 : builder.getSInt64Ty();
3067 ops[2] = builder.createNeg(loc, ops[2]);
3068 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
3069 ?
"aarch64.neon.urshl"
3070 :
"aarch64.neon.srshl";
3073 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
3074 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
3075 return builder.createAdd(loc, ops[0],
3076 builder.createBitcast(ops[1], int64Type));
3078 case NEON::BI__builtin_neon_vshld_n_s64:
3079 case NEON::BI__builtin_neon_vshld_n_u64: {
3081 std::optional<llvm::APSInt> amt =
3083 assert(amt &&
"Expected argument to be a constant");
3084 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
3086 case NEON::BI__builtin_neon_vshrd_n_s64: {
3087 std::optional<llvm::APSInt> amt =
3089 assert(amt &&
"Expected argument to be a constant");
3090 return builder.createShiftRight(
3091 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
3093 case NEON::BI__builtin_neon_vshrd_n_u64: {
3094 std::optional<llvm::APSInt> amt =
3096 assert(amt &&
"Expected argument to be a constant");
3097 uint64_t shiftAmt = amt->getZExtValue();
3100 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
3101 return builder.createShiftRight(loc, ops[0], shiftAmt);
3103 case NEON::BI__builtin_neon_vsrad_n_s64: {
3104 std::optional<llvm::APSInt> amt =
3106 assert(amt &&
"Expected argument to be a constant");
3108 std::min(
static_cast<uint64_t
>(63), amt->getZExtValue());
3109 mlir::Value shifted =
3110 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
3111 return builder.createAdd(loc, ops[0], shifted);
3113 case NEON::BI__builtin_neon_vsrad_n_u64: {
3114 std::optional<llvm::APSInt> amt =
3116 assert(amt &&
"Expected argument to be a constant");
3117 uint64_t shiftAmt = amt->getZExtValue();
3121 mlir::Value shifted =
3122 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
3123 return builder.createAdd(loc, ops[0], shifted);
3125 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
3126 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
3127 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
3128 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
3129 case NEON::BI__builtin_neon_vqdmlals_s32:
3130 case NEON::BI__builtin_neon_vqdmlsls_s32:
3131 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
3132 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
3133 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
3134 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
3135 cgm.errorNYI(
expr->getSourceRange(),
3136 std::string(
"unimplemented AArch64 builtin call: ") +
3137 getContext().BuiltinInfo.getName(builtinID));
3138 return mlir::Value{};
3140 case NEON::BI__builtin_neon_vget_lane_bf16:
3141 case NEON::BI__builtin_neon_vduph_lane_bf16:
3142 case NEON::BI__builtin_neon_vduph_lane_f16:
3143 case NEON::BI__builtin_neon_vgetq_lane_bf16:
3144 case NEON::BI__builtin_neon_vduph_laneq_bf16:
3145 case NEON::BI__builtin_neon_vduph_laneq_f16: {
3146 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
3148 case NEON::BI__builtin_neon_vcvt_bf16_f32:
3149 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
3150 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
3151 cgm.errorNYI(
expr->getSourceRange(),
3152 std::string(
"unimplemented AArch64 builtin call: ") +
3153 getContext().BuiltinInfo.getName(builtinID));
3154 return mlir::Value{};
3155 case NEON::BI__builtin_neon_vcvt_f16_f32: {
3156 auto v4f32 = cir::VectorType::get(
cgm.floatTy, 4);
3157 auto v4f16 = cir::VectorType::get(
cgm.fP16Ty, 4);
3158 return builder.createFloatingCast(builder.createBitcast(ops[0], v4f32),
3161 case NEON::BI__builtin_neon_vcvt_f32_f16: {
3162 auto v4f32 = cir::VectorType::get(
cgm.floatTy, 4);
3163 auto v4f16 = cir::VectorType::get(
cgm.fP16Ty, 4);
3164 return builder.createFloatingCast(builder.createBitcast(ops[0], v4f16),
3167 case clang::AArch64::BI_InterlockedAdd:
3168 case clang::AArch64::BI_InterlockedAdd_acq:
3169 case clang::AArch64::BI_InterlockedAdd_rel:
3170 case clang::AArch64::BI_InterlockedAdd_nf:
3171 case clang::AArch64::BI_InterlockedAdd64:
3172 case clang::AArch64::BI_InterlockedAdd64_acq:
3173 case clang::AArch64::BI_InterlockedAdd64_rel:
3174 case clang::AArch64::BI_InterlockedAdd64_nf:
3175 cgm.errorNYI(
expr->getSourceRange(),
3176 std::string(
"unimplemented AArch64 builtin call: ") +
3177 getContext().BuiltinInfo.getName(builtinID));
3178 return mlir::Value{};
3185 llvm::StringRef intrName;
3187 switch (builtinID) {
3189 return std::nullopt;
3190 case NEON::BI__builtin_neon_vbsl_v:
3191 case NEON::BI__builtin_neon_vbslq_v: {
3194 ops[0] = builder.createBitcast(ops[0], bitTy);
3195 ops[1] = builder.createBitcast(ops[1], bitTy);
3196 ops[2] = builder.createBitcast(ops[2], bitTy);
3198 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
3199 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
3200 ops[0] = builder.createOr(loc, ops[1], ops[2]);
3201 return builder.createBitcast(ops[0], ty);
3203 case NEON::BI__builtin_neon_vfma_lane_v:
3204 case NEON::BI__builtin_neon_vfmaq_lane_v: {
3205 mlir::Value addend = builder.createBitcast(ops[0], ty);
3206 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3210 cir::VectorType sourceTy = cir::VectorType::get(
3211 ty.getElementType(), builtinID == NEON::BI__builtin_neon_vfmaq_lane_v
3214 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3215 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3219 std::nullopt, ty, loc);
3221 case NEON::BI__builtin_neon_vfma_laneq_v: {
3223 if (ty.getElementType() ==
cgm.doubleTy) {
3224 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
3225 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
3228 cir::VectorType sourceTy = cir::VectorType::get(
cgm.doubleTy, 2);
3229 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3230 laneSource = builder.createExtractElement(
3236 return builder.createBitcast(
3238 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3239 std::nullopt,
cgm.doubleTy, loc),
3243 mlir::Value addend = builder.createBitcast(ops[0], ty);
3244 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3247 cir::VectorType sourceTy =
3248 cir::VectorType::get(ty.getElementType(), ty.getSize() * 2);
3249 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3250 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3254 std::nullopt, ty, loc);
3256 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
3257 mlir::Value addend = builder.createBitcast(ops[0], ty);
3258 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3259 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
3260 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3264 std::nullopt, ty, loc);
3266 case NEON::BI__builtin_neon_vfmah_lane_f16:
3267 case NEON::BI__builtin_neon_vfmas_lane_f32:
3268 case NEON::BI__builtin_neon_vfmah_laneq_f16:
3269 case NEON::BI__builtin_neon_vfmas_laneq_f32: {
3271 mlir::Value laneSource = builder.createExtractElement(
3277 std::nullopt, ty, loc);
3279 case NEON::BI__builtin_neon_vfmad_lane_f64:
3280 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
3283 mlir::Value laneSource = builder.createExtractElement(
3288 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3289 std::nullopt,
cgm.doubleTy, loc);
3291 case NEON::BI__builtin_neon_vmull_v: {
3292 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
3294 intrName =
"aarch64.neon.pmull";
3295 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3297 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
3299 case NEON::BI__builtin_neon_vmax_v:
3300 case NEON::BI__builtin_neon_vmaxq_v:
3301 intrName = usgn ?
"umax" :
"smax";
3302 if (cir::isFPOrVectorOfFPType(ty))
3303 intrName =
"aarch64.neon.fmax";
3305 case NEON::BI__builtin_neon_vmaxh_f16: {
3306 auto halfTy = builder.getFp16Ty();
3307 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmax", halfTy, ops);
3309 case NEON::BI__builtin_neon_vmin_v:
3310 case NEON::BI__builtin_neon_vminq_v:
3311 intrName = usgn ?
"umin" :
"smin";
3312 if (cir::isFPOrVectorOfFPType(ty))
3313 intrName =
"aarch64.neon.fmin";
3315 case NEON::BI__builtin_neon_vminh_f16: {
3316 auto halfTy = builder.getFp16Ty();
3317 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmin", halfTy, ops);
3319 case NEON::BI__builtin_neon_vabd_v:
3320 case NEON::BI__builtin_neon_vabdq_v:
3321 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
3322 if (cir::isFPOrVectorOfFPType(ty))
3323 intrName =
"aarch64.neon.fabd";
3325 case NEON::BI__builtin_neon_vpadal_v:
3326 case NEON::BI__builtin_neon_vpadalq_v: {
3327 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
3329 mlir::Value pairwiseSum =
3331 inputs, intrName, ty, loc);
3332 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
3333 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
3335 case NEON::BI__builtin_neon_vpmin_v:
3336 case NEON::BI__builtin_neon_vpminq_v:
3337 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
3338 if (cir::isFPOrVectorOfFPType(ty))
3339 intrName =
"aarch64.neon.fminp";
3341 case NEON::BI__builtin_neon_vpmax_v:
3342 case NEON::BI__builtin_neon_vpmaxq_v:
3343 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
3344 if (cir::isFPOrVectorOfFPType(ty))
3345 intrName =
"aarch64.neon.fmaxp";
3347 case NEON::BI__builtin_neon_vminnm_v:
3348 case NEON::BI__builtin_neon_vminnmq_v:
3349 intrName =
"aarch64.neon.fminnm";
3351 case NEON::BI__builtin_neon_vminnmh_f16: {
3352 auto halfTy = builder.getFp16Ty();
3353 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fminnm", halfTy, ops);
3355 case NEON::BI__builtin_neon_vmaxnm_v:
3356 case NEON::BI__builtin_neon_vmaxnmq_v:
3357 intrName =
"aarch64.neon.fmaxnm";
3359 case NEON::BI__builtin_neon_vmaxnmh_f16: {
3360 auto halfTy = builder.getFp16Ty();
3361 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmaxnm", halfTy, ops);
3363 case NEON::BI__builtin_neon_vrecpss_f32:
3364 case NEON::BI__builtin_neon_vrecpsd_f64:
3365 cgm.errorNYI(
expr->getSourceRange(),
3366 std::string(
"unimplemented AArch64 builtin call: ") +
3367 getContext().BuiltinInfo.getName(builtinID));
3368 return mlir::Value{};
3369 case NEON::BI__builtin_neon_vrecpsh_f16: {
3370 auto halfTy = builder.getFp16Ty();
3371 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.frecps", halfTy, ops);
3373 case NEON::BI__builtin_neon_vqshrun_n_v: {
3374 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3377 "aarch64.neon.sqshrun", ty, loc);
3379 case NEON::BI__builtin_neon_vqrshrun_n_v: {
3380 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3383 "aarch64.neon.sqrshrun", ty, loc);
3385 case NEON::BI__builtin_neon_vqshrn_n_v: {
3386 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3388 llvm::StringRef intrName =
3389 usgn ?
"aarch64.neon.uqshrn" :
"aarch64.neon.sqshrn";
3393 case NEON::BI__builtin_neon_vrshrn_n_v:
3394 cgm.errorNYI(
expr->getSourceRange(),
3395 std::string(
"unimplemented AArch64 builtin call: ") +
3396 getContext().BuiltinInfo.getName(builtinID));
3397 return mlir::Value{};
3398 case NEON::BI__builtin_neon_vqrshrn_n_v: {
3399 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3401 llvm::StringRef intrName =
3402 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
3406 case NEON::BI__builtin_neon_vrndah_f16: {
3408 mlir::Type halfTy = builder.getFp16Ty();
3410 std::nullopt, halfTy, loc);
3412 case NEON::BI__builtin_neon_vrnda_v:
3413 case NEON::BI__builtin_neon_vrndaq_v:
3417 case NEON::BI__builtin_neon_vrndih_f16: {
3419 mlir::Type halfTy = builder.getFp16Ty();
3421 std::nullopt, halfTy, loc);
3423 case NEON::BI__builtin_neon_vrndmh_f16: {
3425 mlir::Type halfTy = builder.getFp16Ty();
3427 std::nullopt, halfTy, loc);
3429 case NEON::BI__builtin_neon_vrndm_v:
3430 case NEON::BI__builtin_neon_vrndmq_v:
3434 case NEON::BI__builtin_neon_vrndnh_f16: {
3436 mlir::Type halfTy = builder.getFp16Ty();
3438 std::nullopt, halfTy, loc);
3440 case NEON::BI__builtin_neon_vrndn_v:
3441 case NEON::BI__builtin_neon_vrndnq_v:
3444 std::nullopt, ty, loc);
3445 case NEON::BI__builtin_neon_vrndns_f32: {
3447 mlir::Type
floatTy = builder.getSingleTy();
3451 case NEON::BI__builtin_neon_vrndph_f16: {
3453 mlir::Type halfTy = builder.getFp16Ty();
3455 std::nullopt, halfTy, loc);
3457 case NEON::BI__builtin_neon_vrndp_v:
3458 case NEON::BI__builtin_neon_vrndpq_v:
3462 case NEON::BI__builtin_neon_vrndxh_f16: {
3464 mlir::Type halfTy = builder.getFp16Ty();
3466 std::nullopt, halfTy, loc);
3468 case NEON::BI__builtin_neon_vrndx_v:
3469 case NEON::BI__builtin_neon_vrndxq_v:
3473 case NEON::BI__builtin_neon_vrndh_f16: {
3475 mlir::Type halfTy = builder.getFp16Ty();
3477 std::nullopt, halfTy, loc);
3479 case NEON::BI__builtin_neon_vrnd_v:
3480 case NEON::BI__builtin_neon_vrndq_v:
3484 case NEON::BI__builtin_neon_vcvt_f64_v:
3485 case NEON::BI__builtin_neon_vcvtq_f64_v:
3486 ops[0] = builder.createBitcast(ops[0], ty);
3489 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
3490 case NEON::BI__builtin_neon_vcvt_f64_f32: {
3491 auto v2f32 = cir::VectorType::get(
cgm.floatTy, 2);
3492 auto v2f64 = cir::VectorType::get(
cgm.doubleTy, 2);
3493 return builder.createFloatingCast(builder.createBitcast(ops[0], v2f32),
3496 case NEON::BI__builtin_neon_vcvt_f32_f64: {
3497 auto v2f32 = cir::VectorType::get(
cgm.floatTy, 2);
3498 auto v2f64 = cir::VectorType::get(
cgm.doubleTy, 2);
3499 return builder.createFloatingCast(builder.createBitcast(ops[0], v2f64),
3502 case NEON::BI__builtin_neon_vcvt_s32_v:
3503 case NEON::BI__builtin_neon_vcvt_u32_v:
3504 case NEON::BI__builtin_neon_vcvt_s64_v:
3505 case NEON::BI__builtin_neon_vcvt_u64_v:
3506 case NEON::BI__builtin_neon_vcvt_s16_f16:
3507 case NEON::BI__builtin_neon_vcvt_u16_f16:
3508 case NEON::BI__builtin_neon_vcvtq_s32_v:
3509 case NEON::BI__builtin_neon_vcvtq_u32_v:
3510 case NEON::BI__builtin_neon_vcvtq_s64_v:
3511 case NEON::BI__builtin_neon_vcvtq_u64_v:
3512 case NEON::BI__builtin_neon_vcvtq_s16_f16:
3513 case NEON::BI__builtin_neon_vcvtq_u16_f16:
3515 case NEON::BI__builtin_neon_vcvta_s16_f16:
3516 case NEON::BI__builtin_neon_vcvta_u16_f16:
3517 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
3518 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
3519 cgm.errorNYI(
expr->getSourceRange(),
3520 std::string(
"unimplemented AArch64 builtin call: ") +
3521 getContext().BuiltinInfo.getName(builtinID));
3522 return mlir::Value{};
3523 case NEON::BI__builtin_neon_vcvta_s32_v:
3524 case NEON::BI__builtin_neon_vcvtaq_s32_v:
3525 case NEON::BI__builtin_neon_vcvta_u32_v:
3526 case NEON::BI__builtin_neon_vcvtaq_u32_v:
3527 case NEON::BI__builtin_neon_vcvta_s64_v:
3528 case NEON::BI__builtin_neon_vcvtaq_s64_v:
3529 case NEON::BI__builtin_neon_vcvta_u64_v:
3530 case NEON::BI__builtin_neon_vcvtaq_u64_v: {
3532 llvm::StringRef intrName =
3533 usgn ?
"aarch64.neon.fcvtau" :
"aarch64.neon.fcvtas";
3537 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3538 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3539 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3540 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3541 cgm.errorNYI(
expr->getSourceRange(),
3542 std::string(
"unimplemented AArch64 builtin call: ") +
3543 getContext().BuiltinInfo.getName(builtinID));
3544 return mlir::Value{};
3545 case NEON::BI__builtin_neon_vcvtm_s32_v:
3546 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3547 case NEON::BI__builtin_neon_vcvtm_u32_v:
3548 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3549 case NEON::BI__builtin_neon_vcvtm_s64_v:
3550 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3551 case NEON::BI__builtin_neon_vcvtm_u64_v:
3552 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
3554 llvm::StringRef intrName =
3555 usgn ?
"aarch64.neon.fcvtmu" :
"aarch64.neon.fcvtms";
3559 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3560 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3561 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3562 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3563 cgm.errorNYI(
expr->getSourceRange(),
3564 std::string(
"unimplemented AArch64 builtin call: ") +
3565 getContext().BuiltinInfo.getName(builtinID));
3566 return mlir::Value{};
3568 case NEON::BI__builtin_neon_vcvtn_s32_v:
3569 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3570 case NEON::BI__builtin_neon_vcvtn_u32_v:
3571 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3572 case NEON::BI__builtin_neon_vcvtn_s64_v:
3573 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3574 case NEON::BI__builtin_neon_vcvtn_u64_v:
3575 case NEON::BI__builtin_neon_vcvtnq_u64_v: {
3577 llvm::StringRef intrName =
3578 usgn ?
"aarch64.neon.fcvtnu" :
"aarch64.neon.fcvtns";
3582 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3583 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3584 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3585 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3586 cgm.errorNYI(
expr->getSourceRange(),
3587 std::string(
"unimplemented AArch64 builtin call: ") +
3588 getContext().BuiltinInfo.getName(builtinID));
3589 return mlir::Value{};
3590 case NEON::BI__builtin_neon_vcvtp_s32_v:
3591 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3592 case NEON::BI__builtin_neon_vcvtp_u32_v:
3593 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3594 case NEON::BI__builtin_neon_vcvtp_s64_v:
3595 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3596 case NEON::BI__builtin_neon_vcvtp_u64_v:
3597 case NEON::BI__builtin_neon_vcvtpq_u64_v: {
3599 llvm::StringRef intrName =
3600 usgn ?
"aarch64.neon.fcvtpu" :
"aarch64.neon.fcvtps";
3604 case NEON::BI__builtin_neon_vmulx_v:
3605 case NEON::BI__builtin_neon_vmulxq_v:
3606 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3607 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3608 case NEON::BI__builtin_neon_vmul_lane_v:
3609 case NEON::BI__builtin_neon_vmul_laneq_v:
3610 case NEON::BI__builtin_neon_vpmaxnm_v:
3611 case NEON::BI__builtin_neon_vpmaxnmq_v:
3612 cgm.errorNYI(
expr->getSourceRange(),
3613 std::string(
"unimplemented AArch64 builtin call: ") +
3614 getContext().BuiltinInfo.getName(builtinID));
3615 return mlir::Value{};
3616 case NEON::BI__builtin_neon_vpminnm_v:
3617 case NEON::BI__builtin_neon_vpminnmq_v:
3618 intrName =
"aarch64.neon.fminnmp";
3620 case NEON::BI__builtin_neon_vsqrth_f16: {
3621 mlir::Type halfTy = builder.getFp16Ty();
3623 std::nullopt, halfTy, loc);
3625 case NEON::BI__builtin_neon_vsqrt_v:
3626 case NEON::BI__builtin_neon_vsqrtq_v:
3630 case NEON::BI__builtin_neon_vrbit_v:
3631 case NEON::BI__builtin_neon_vrbitq_v:
3632 case NEON::BI__builtin_neon_vmaxv_f16:
3633 case NEON::BI__builtin_neon_vmaxvq_f16:
3634 case NEON::BI__builtin_neon_vminv_f16:
3635 case NEON::BI__builtin_neon_vminvq_f16:
3636 case NEON::BI__builtin_neon_vmaxnmv_f16:
3637 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3638 case NEON::BI__builtin_neon_vminnmv_f16:
3639 case NEON::BI__builtin_neon_vminnmvq_f16:
3640 case NEON::BI__builtin_neon_vmul_n_f64:
3641 cgm.errorNYI(
expr->getSourceRange(),
3642 std::string(
"unimplemented AArch64 builtin call: ") +
3643 getContext().BuiltinInfo.getName(builtinID));
3644 return mlir::Value{};
3645 case NEON::BI__builtin_neon_vaddlv_u8:
3646 case NEON::BI__builtin_neon_vaddlvq_u8:
3647 case NEON::BI__builtin_neon_vaddlv_u16:
3648 case NEON::BI__builtin_neon_vaddlvq_u16:
3649 case NEON::BI__builtin_neon_vaddlv_s8:
3650 case NEON::BI__builtin_neon_vaddlvq_s8:
3651 case NEON::BI__builtin_neon_vaddlv_s16:
3652 case NEON::BI__builtin_neon_vaddlvq_s16: {
3655 auto eltTy = mlir::cast<cir::IntType>(
3656 mlir::cast<cir::VectorType>(argTy).getElementType());
3661 bool needsTrunc = eltTy.getWidth() == 8;
3662 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3663 mlir::Type intrRetTy = userRetTy;
3665 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3666 mlir::Value result =
3669 result = builder.createIntCast(result, userRetTy);
3672 case NEON::BI__builtin_neon_vsri_n_v:
3673 case NEON::BI__builtin_neon_vsriq_n_v: {
3675 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3676 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3677 "aarch64.neon.vsri", ty, loc);
3679 case NEON::BI__builtin_neon_vsli_n_v:
3680 case NEON::BI__builtin_neon_vsliq_n_v: {
3682 intrName =
"aarch64.neon.vsli";
3690 case NEON::BI__builtin_neon_vsra_n_v:
3691 case NEON::BI__builtin_neon_vsraq_n_v: {
3692 ops[0] = builder.createBitcast(ops[0], ty);
3694 return builder.createAdd(loc, ops[0], ops[1]);
3696 case NEON::BI__builtin_neon_vrsra_n_v:
3697 case NEON::BI__builtin_neon_vrsraq_n_v: {
3698 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3701 cir::VectorType shiftAmtVecTy =
3704 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3708 ops[0] = builder.createBitcast(ops[0], ty);
3709 return builder.createAdd(loc, ops[0], tmp);
3711 case NEON::BI__builtin_neon_vld1_v:
3712 case NEON::BI__builtin_neon_vld1q_v:
3714 case NEON::BI__builtin_neon_vst1_v:
3715 case NEON::BI__builtin_neon_vst1q_v: {
3716 ops[1] = builder.createBitcast(ops[1], ty);
3717 builder.createStore(loc, ops[1], ptrOp0.
withElementType(builder, ty));
3720 case NEON::BI__builtin_neon_vld1_lane_v:
3721 case NEON::BI__builtin_neon_vld1q_lane_v: {
3722 ops[1] = builder.createBitcast(ops[1], ty);
3723 mlir::Value scalar = builder.createLoad(
3725 return cir::VecInsertOp::create(builder, loc, ops[1], scalar, ops[2]);
3727 case NEON::BI__builtin_neon_vld1_dup_v:
3728 case NEON::BI__builtin_neon_vld1q_dup_v: {
3729 mlir::Value scalar = builder.createLoad(
3731 return cir::VecSplatOp::create(builder, loc, ty, scalar);
3733 case NEON::BI__builtin_neon_vldap1_lane_s64:
3734 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3735 cgm.errorNYI(
expr->getSourceRange(),
3736 std::string(
"unimplemented AArch64 builtin call: ") +
3737 getContext().BuiltinInfo.getName(builtinID));
3738 return mlir::Value{};
3739 case NEON::BI__builtin_neon_vst1_lane_v:
3740 case NEON::BI__builtin_neon_vst1q_lane_v: {
3741 ops[1] = builder.createBitcast(ops[1], ty);
3742 mlir::Value scalar = builder.createExtractElement(
3744 builder.createStore(loc, scalar,
3748 case NEON::BI__builtin_neon_vstl1_lane_s64:
3749 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3750 cgm.errorNYI(
expr->getSourceRange(),
3751 std::string(
"unimplemented AArch64 builtin call: ") +
3752 getContext().BuiltinInfo.getName(builtinID));
3753 return mlir::Value{};
3754 case NEON::BI__builtin_neon_vld2_v:
3755 case NEON::BI__builtin_neon_vld2q_v:
3758 case NEON::BI__builtin_neon_vld3_v:
3759 case NEON::BI__builtin_neon_vld3q_v:
3762 case NEON::BI__builtin_neon_vld4_v:
3763 case NEON::BI__builtin_neon_vld4q_v:
3766 case NEON::BI__builtin_neon_vld2_dup_v:
3767 case NEON::BI__builtin_neon_vld2q_dup_v:
3770 case NEON::BI__builtin_neon_vld3_dup_v:
3771 case NEON::BI__builtin_neon_vld3q_dup_v:
3774 case NEON::BI__builtin_neon_vld4_dup_v:
3775 case NEON::BI__builtin_neon_vld4q_dup_v:
3778 case NEON::BI__builtin_neon_vld2_lane_v:
3779 case NEON::BI__builtin_neon_vld2q_lane_v:
3781 *
this, ops, llvm::Intrinsic::aarch64_neon_ld2lane, ty, 2, loc);
3782 case NEON::BI__builtin_neon_vld3_lane_v:
3783 case NEON::BI__builtin_neon_vld3q_lane_v:
3785 *
this, ops, llvm::Intrinsic::aarch64_neon_ld3lane, ty, 3, loc);
3786 case NEON::BI__builtin_neon_vld4_lane_v:
3787 case NEON::BI__builtin_neon_vld4q_lane_v:
3789 *
this, ops, llvm::Intrinsic::aarch64_neon_ld4lane, ty, 4, loc);
3790 case NEON::BI__builtin_neon_vst2_v:
3791 case NEON::BI__builtin_neon_vst2q_v: {
3794 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3799 case NEON::BI__builtin_neon_vst2_lane_v:
3800 case NEON::BI__builtin_neon_vst2q_lane_v: {
3801 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3802 ops[2] = builder.createIntCast(ops[2],
sInt64Ty);
3804 builder.getVoidPtrTy()};
3805 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st2lane",
3808 case NEON::BI__builtin_neon_vst3_v:
3809 case NEON::BI__builtin_neon_vst3q_v: {
3810 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3812 builder.getVoidPtrTy()};
3816 case NEON::BI__builtin_neon_vst3_lane_v:
3817 case NEON::BI__builtin_neon_vst3q_lane_v: {
3818 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3819 ops[3] = builder.createIntCast(ops[3],
sInt64Ty);
3821 builder.getVoidPtrTy()};
3822 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st3lane",
3825 case NEON::BI__builtin_neon_vst4_v:
3826 case NEON::BI__builtin_neon_vst4q_v: {
3827 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3829 builder.getVoidPtrTy()};
3833 case NEON::BI__builtin_neon_vst4_lane_v:
3834 case NEON::BI__builtin_neon_vst4q_lane_v: {
3835 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3836 ops[4] = builder.createIntCast(ops[4],
sInt64Ty);
3838 ty, ty, ty, ty,
sInt64Ty, builder.getVoidPtrTy()};
3839 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st4lane",
3842 case NEON::BI__builtin_neon_vtrn_v:
3843 case NEON::BI__builtin_neon_vtrnq_v: {
3844 ops[1] = builder.createBitcast(ops[1], ty);
3845 ops[2] = builder.createBitcast(ops[2], ty);
3847 mlir::Value baseAddr =
3848 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3851 for (
unsigned vi = 0; vi != 2; ++vi) {
3853 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3854 indices.push_back(i + vi);
3855 indices.push_back(i + e + vi);
3857 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3858 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3859 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3860 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3864 case NEON::BI__builtin_neon_vuzp_v:
3865 case NEON::BI__builtin_neon_vuzpq_v: {
3866 ops[1] = builder.createBitcast(ops[1], ty);
3867 ops[2] = builder.createBitcast(ops[2], ty);
3869 mlir::Value baseAddr =
3870 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3872 for (
unsigned vi = 0; vi != 2; ++vi) {
3874 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3875 indices.push_back(2 * i + vi);
3877 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3878 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3879 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3880 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3884 case NEON::BI__builtin_neon_vzip_v:
3885 case NEON::BI__builtin_neon_vzipq_v: {
3886 ops[1] = builder.createBitcast(ops[1], ty);
3887 ops[2] = builder.createBitcast(ops[2], ty);
3889 mlir::Value baseAddr =
3890 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3892 for (
unsigned vi = 0; vi != 2; ++vi) {
3894 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3895 indices.push_back((i + vi * e) >> 1);
3896 indices.push_back(((i + vi * e) >> 1) + e);
3898 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3899 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3900 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3901 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3905 case NEON::BI__builtin_neon_vqtbl1q_v:
3906 case NEON::BI__builtin_neon_vqtbl2q_v:
3907 case NEON::BI__builtin_neon_vqtbl3q_v:
3908 case NEON::BI__builtin_neon_vqtbl4q_v:
3909 case NEON::BI__builtin_neon_vqtbx1q_v:
3910 case NEON::BI__builtin_neon_vqtbx2q_v:
3911 case NEON::BI__builtin_neon_vqtbx3q_v:
3912 case NEON::BI__builtin_neon_vqtbx4q_v:
3913 cgm.errorNYI(
expr->getSourceRange(),
3914 std::string(
"unimplemented AArch64 builtin call: ") +
3915 getContext().BuiltinInfo.getName(builtinID));
3916 return mlir::Value{};
3917 case NEON::BI__builtin_neon_vsqadd_v:
3918 case NEON::BI__builtin_neon_vsqaddq_v:
3919 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.usqadd", ty,
3921 case NEON::BI__builtin_neon_vuqadd_v:
3922 case NEON::BI__builtin_neon_vuqaddq_v:
3923 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.suqadd", ty,
3925 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3926 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3927 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3928 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3929 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3930 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3931 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3932 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3933 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3934 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3935 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3936 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3937 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3938 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3939 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3940 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3941 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3942 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3943 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3944 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3945 case NEON::BI__builtin_neon_vluti2_lane_f16:
3946 case NEON::BI__builtin_neon_vluti2_lane_p16:
3947 case NEON::BI__builtin_neon_vluti2_lane_p8:
3948 case NEON::BI__builtin_neon_vluti2_lane_s16:
3949 case NEON::BI__builtin_neon_vluti2_lane_s8:
3950 case NEON::BI__builtin_neon_vluti2_lane_u16:
3951 case NEON::BI__builtin_neon_vluti2_lane_u8:
3952 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3953 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3954 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3955 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3956 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3957 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3958 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3959 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3960 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3961 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3962 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3963 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3964 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3965 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3966 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3967 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3968 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3969 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3970 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3971 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3972 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3973 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3974 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3975 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3976 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3977 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3978 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3979 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3980 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3981 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3982 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3983 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3984 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3985 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3986 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3987 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3988 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3989 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3990 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3991 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3992 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3993 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3994 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3995 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3996 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3997 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3998 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3999 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
4000 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
4001 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
4002 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
4003 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
4004 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
4005 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
4006 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
4007 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
4008 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
4009 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
4010 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
4011 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
4012 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
4013 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
4014 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
4015 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
4016 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
4017 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
4018 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
4019 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
4020 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
4021 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
4022 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
4023 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
4024 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
4025 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
4026 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
4027 case NEON::BI__builtin_neon_vamin_f16:
4028 case NEON::BI__builtin_neon_vaminq_f16:
4029 case NEON::BI__builtin_neon_vamin_f32:
4030 case NEON::BI__builtin_neon_vaminq_f32:
4031 case NEON::BI__builtin_neon_vaminq_f64:
4032 case NEON::BI__builtin_neon_vamax_f16:
4033 case NEON::BI__builtin_neon_vamaxq_f16:
4034 case NEON::BI__builtin_neon_vamax_f32:
4035 case NEON::BI__builtin_neon_vamaxq_f32:
4036 case NEON::BI__builtin_neon_vamaxq_f64:
4037 case NEON::BI__builtin_neon_vscale_f16:
4038 case NEON::BI__builtin_neon_vscaleq_f16:
4039 case NEON::BI__builtin_neon_vscale_f32:
4040 case NEON::BI__builtin_neon_vscaleq_f32:
4041 case NEON::BI__builtin_neon_vscaleq_f64:
4042 cgm.errorNYI(
expr->getSourceRange(),
4043 std::string(
"unimplemented AArch64 builtin call: ") +
4044 getContext().BuiltinInfo.getName(builtinID));
4045 return mlir::Value{};