871 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
873 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
880 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
889 const bool isQuad = neonType.
isQuad();
898 cir::VectorType vTy =
getNeonType(&cgf, neonType, hasLegalHalfType,
899 false, allowBFloatArgsAndRet);
900 cir::VectorType ty = vTy;
905 case NEON::BI__builtin_neon_splat_lane_v:
906 case NEON::BI__builtin_neon_splat_laneq_v:
907 case NEON::BI__builtin_neon_splatq_lane_v:
908 case NEON::BI__builtin_neon_splatq_laneq_v: {
909 uint64_t numElements = vTy.getSize();
910 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
912 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
917 case NEON::BI__builtin_neon_vpadd_v:
918 case NEON::BI__builtin_neon_vpaddq_v:
919 case NEON::BI__builtin_neon_vabs_v:
920 case NEON::BI__builtin_neon_vabsq_v:
922 std::string(
"unimplemented AArch64 builtin call: ") +
924 return mlir::Value{};
925 case NEON::BI__builtin_neon_vadd_v:
926 case NEON::BI__builtin_neon_vaddq_v: {
927 unsigned numBytes = (builtinID == NEON::BI__builtin_neon_vaddq_v) ? 16 : 8;
928 cir::VectorType byteTy =
935 case NEON::BI__builtin_neon_vaddhn_v: {
938 cir::VectorType srcTy =
948 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
950 loc, wideEltTy, wideEltTy.getWidth() / 2);
951 mlir::Value shiftVec =
959 case NEON::BI__builtin_neon_vsubhn_v: {
962 cir::VectorType srcTy =
972 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
974 loc, wideEltTy, wideEltTy.getWidth() / 2);
975 mlir::Value shiftVec =
983 case NEON::BI__builtin_neon_vcale_v:
984 case NEON::BI__builtin_neon_vcaleq_v:
985 case NEON::BI__builtin_neon_vcalt_v:
986 case NEON::BI__builtin_neon_vcaltq_v:
987 case NEON::BI__builtin_neon_vcage_v:
988 case NEON::BI__builtin_neon_vcageq_v:
989 case NEON::BI__builtin_neon_vcagt_v:
990 case NEON::BI__builtin_neon_vcagtq_v:
992 std::string(
"unimplemented AArch64 builtin call: ") +
994 return mlir::Value{};
995 case NEON::BI__builtin_neon_vceqz_v:
996 case NEON::BI__builtin_neon_vceqzq_v:
998 vTy, cir::CmpOpKind::eq);
999 case NEON::BI__builtin_neon_vcgez_v:
1000 case NEON::BI__builtin_neon_vcgezq_v:
1001 case NEON::BI__builtin_neon_vclez_v:
1002 case NEON::BI__builtin_neon_vclezq_v:
1003 case NEON::BI__builtin_neon_vcgtz_v:
1004 case NEON::BI__builtin_neon_vcgtzq_v:
1005 case NEON::BI__builtin_neon_vcltz_v:
1006 case NEON::BI__builtin_neon_vcltzq_v:
1007 case NEON::BI__builtin_neon_vclz_v:
1008 case NEON::BI__builtin_neon_vclzq_v:
1010 std::string(
"unimplemented AArch64 builtin call: ") +
1012 return mlir::Value{};
1013 case NEON::BI__builtin_neon_vcvt_f32_v:
1014 case NEON::BI__builtin_neon_vcvtq_f32_v: {
1020 case NEON::BI__builtin_neon_vcvt_f16_s16:
1021 case NEON::BI__builtin_neon_vcvt_f16_u16:
1022 case NEON::BI__builtin_neon_vcvtq_f16_s16:
1023 case NEON::BI__builtin_neon_vcvtq_f16_u16:
1024 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
1025 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
1026 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
1027 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
1029 std::string(
"unimplemented AArch64 builtin call: ") +
1031 return mlir::Value{};
1032 case NEON::BI__builtin_neon_vcvt_n_f32_v:
1033 case NEON::BI__builtin_neon_vcvt_n_f64_v:
1034 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
1035 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
1037 mlir::Type cstIntTy = cgf.
sInt32Ty;
1038 llvm::StringRef llvmIntrName =
1040 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1042 {vTy, cstIntTy}, ops, llvmIntrName,
1045 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
1046 case NEON::BI__builtin_neon_vcvt_n_s32_v:
1047 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
1048 case NEON::BI__builtin_neon_vcvt_n_u32_v:
1049 case NEON::BI__builtin_neon_vcvt_n_s64_v:
1050 case NEON::BI__builtin_neon_vcvt_n_u64_v:
1051 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
1052 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
1053 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
1054 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
1055 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
1056 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
1058 mlir::Type cstIntTy = cgf.
sInt32Ty;
1060 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1063 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
1067 case NEON::BI__builtin_neon_vcvt_s32_v:
1068 case NEON::BI__builtin_neon_vcvt_u32_v:
1069 case NEON::BI__builtin_neon_vcvt_s64_v:
1070 case NEON::BI__builtin_neon_vcvt_u64_v:
1071 case NEON::BI__builtin_neon_vcvt_s16_f16:
1072 case NEON::BI__builtin_neon_vcvt_u16_f16:
1073 case NEON::BI__builtin_neon_vcvtq_s32_v:
1074 case NEON::BI__builtin_neon_vcvtq_u32_v:
1075 case NEON::BI__builtin_neon_vcvtq_s64_v:
1076 case NEON::BI__builtin_neon_vcvtq_u64_v:
1077 case NEON::BI__builtin_neon_vcvtq_s16_f16:
1078 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
1088 llvm::StringRef llvmIntrName = usgn ?
"fptoui.sat" :
"fptosi.sat";
1090 {ty}, ops, llvmIntrName, vTy, loc);
1092 case NEON::BI__builtin_neon_vcvta_s16_f16:
1093 case NEON::BI__builtin_neon_vcvta_s32_v:
1094 case NEON::BI__builtin_neon_vcvta_s64_v:
1095 case NEON::BI__builtin_neon_vcvta_u16_f16:
1096 case NEON::BI__builtin_neon_vcvta_u32_v:
1097 case NEON::BI__builtin_neon_vcvta_u64_v:
1098 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
1099 case NEON::BI__builtin_neon_vcvtaq_s32_v:
1100 case NEON::BI__builtin_neon_vcvtaq_s64_v:
1101 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
1102 case NEON::BI__builtin_neon_vcvtaq_u32_v:
1103 case NEON::BI__builtin_neon_vcvtaq_u64_v:
1104 case NEON::BI__builtin_neon_vcvtn_s16_f16:
1105 case NEON::BI__builtin_neon_vcvtn_s32_v:
1106 case NEON::BI__builtin_neon_vcvtn_s64_v:
1107 case NEON::BI__builtin_neon_vcvtn_u16_f16:
1108 case NEON::BI__builtin_neon_vcvtn_u32_v:
1109 case NEON::BI__builtin_neon_vcvtn_u64_v:
1110 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
1111 case NEON::BI__builtin_neon_vcvtnq_s32_v:
1112 case NEON::BI__builtin_neon_vcvtnq_s64_v:
1113 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
1114 case NEON::BI__builtin_neon_vcvtnq_u32_v:
1115 case NEON::BI__builtin_neon_vcvtnq_u64_v:
1116 case NEON::BI__builtin_neon_vcvtp_s16_f16:
1117 case NEON::BI__builtin_neon_vcvtp_s32_v:
1118 case NEON::BI__builtin_neon_vcvtp_s64_v:
1119 case NEON::BI__builtin_neon_vcvtp_u16_f16:
1120 case NEON::BI__builtin_neon_vcvtp_u32_v:
1121 case NEON::BI__builtin_neon_vcvtp_u64_v:
1122 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
1123 case NEON::BI__builtin_neon_vcvtpq_s32_v:
1124 case NEON::BI__builtin_neon_vcvtpq_s64_v:
1125 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
1126 case NEON::BI__builtin_neon_vcvtpq_u32_v:
1127 case NEON::BI__builtin_neon_vcvtpq_u64_v:
1128 case NEON::BI__builtin_neon_vcvtm_s16_f16:
1129 case NEON::BI__builtin_neon_vcvtm_s32_v:
1130 case NEON::BI__builtin_neon_vcvtm_s64_v:
1131 case NEON::BI__builtin_neon_vcvtm_u16_f16:
1132 case NEON::BI__builtin_neon_vcvtm_u32_v:
1133 case NEON::BI__builtin_neon_vcvtm_u64_v:
1134 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
1135 case NEON::BI__builtin_neon_vcvtmq_s32_v:
1136 case NEON::BI__builtin_neon_vcvtmq_s64_v:
1137 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
1138 case NEON::BI__builtin_neon_vcvtmq_u32_v:
1139 case NEON::BI__builtin_neon_vcvtmq_u64_v:
1141 std::string(
"unimplemented AArch64 builtin call: ") +
1143 return mlir::Value{};
1144 case NEON::BI__builtin_neon_vcvtx_f32_v: {
1146 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1147 auto v2f64 = cir::VectorType::get(cgf.
cgm.
doubleTy, 2);
1148 auto v2f32 = cir::VectorType::get(cgf.
cgm.
floatTy, 2);
1150 {v2f64}, ops, llvmIntrName,
1153 case NEON::BI__builtin_neon_vext_v:
1154 case NEON::BI__builtin_neon_vextq_v:
1156 std::string(
"unimplemented AArch64 builtin call: ") +
1158 return mlir::Value{};
1159 case NEON::BI__builtin_neon_vfma_v:
1160 case NEON::BI__builtin_neon_vfmaq_v: {
1169 fmaOps, std::nullopt, ty, loc);
1171 case NEON::BI__builtin_neon_vld1_x2_v:
1172 case NEON::BI__builtin_neon_vld1q_x2_v:
1173 case NEON::BI__builtin_neon_vld1_x3_v:
1174 case NEON::BI__builtin_neon_vld1q_x3_v:
1175 case NEON::BI__builtin_neon_vld1_x4_v:
1176 case NEON::BI__builtin_neon_vld1q_x4_v:
1179 case NEON::BI__builtin_neon_vld1_v:
1180 case NEON::BI__builtin_neon_vld1q_v:
1181 case NEON::BI__builtin_neon_vld2_v:
1182 case NEON::BI__builtin_neon_vld2q_v:
1183 case NEON::BI__builtin_neon_vld3_v:
1184 case NEON::BI__builtin_neon_vld3q_v:
1185 case NEON::BI__builtin_neon_vld4_v:
1186 case NEON::BI__builtin_neon_vld4q_v:
1187 case NEON::BI__builtin_neon_vld2_dup_v:
1188 case NEON::BI__builtin_neon_vld2q_dup_v:
1189 case NEON::BI__builtin_neon_vld3_dup_v:
1190 case NEON::BI__builtin_neon_vld3q_dup_v:
1191 case NEON::BI__builtin_neon_vld4_dup_v:
1192 case NEON::BI__builtin_neon_vld4q_dup_v:
1193 case NEON::BI__builtin_neon_vld1_dup_v:
1194 case NEON::BI__builtin_neon_vld1q_dup_v:
1195 case NEON::BI__builtin_neon_vld2_lane_v:
1196 case NEON::BI__builtin_neon_vld2q_lane_v:
1197 case NEON::BI__builtin_neon_vld3_lane_v:
1198 case NEON::BI__builtin_neon_vld3q_lane_v:
1199 case NEON::BI__builtin_neon_vld4_lane_v:
1200 case NEON::BI__builtin_neon_vld4q_lane_v:
1202 std::string(
"Reached code-path for ARM builtin call ") +
1204 "(ARM builtins are not supported ATM)");
1205 return mlir::Value{};
1206 case NEON::BI__builtin_neon_vmovl_v: {
1207 cir::VectorType dTy =
1213 case NEON::BI__builtin_neon_vmovn_v:
1214 case NEON::BI__builtin_neon_vmull_v:
1215 case NEON::BI__builtin_neon_vpadal_v:
1216 case NEON::BI__builtin_neon_vpadalq_v:
1218 std::string(
"Reached code-path for ARM builtin call ") +
1220 "(ARM builtins are not supported ATM)");
1221 return mlir::Value{};
1222 case NEON::BI__builtin_neon_vpaddl_v:
1223 case NEON::BI__builtin_neon_vpaddlq_v: {
1224 llvm::StringRef llvmIntrName =
1226 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1228 {getNeonPairwiseWidenInputType(vTy, usgn)},
1232 case NEON::BI__builtin_neon_vqdmlal_v:
1233 case NEON::BI__builtin_neon_vqdmlsl_v:
1234 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
1235 case NEON::BI__builtin_neon_vqdmulh_lane_v:
1236 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
1237 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
1238 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
1239 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
1240 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
1241 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
1243 std::string(
"unimplemented AArch64 builtin call: ") +
1245 return mlir::Value{};
1246 case NEON::BI__builtin_neon_vqshl_n_v:
1247 case NEON::BI__builtin_neon_vqshlq_n_v: {
1248 llvm::StringRef intrName =
1249 usgn ?
"aarch64.neon.uqshl" :
"aarch64.neon.sqshl";
1254 case NEON::BI__builtin_neon_vqshlu_n_v:
1255 case NEON::BI__builtin_neon_vqshluq_n_v:
1257 "aarch64.neon.sqshlu", ty, loc,
1260 case NEON::BI__builtin_neon_vrecpe_v:
1261 case NEON::BI__builtin_neon_vrecpeq_v:
1262 case NEON::BI__builtin_neon_vrsqrte_v:
1263 case NEON::BI__builtin_neon_vrsqrteq_v:
1265 std::string(
"unimplemented AArch64 builtin call: ") +
1267 return mlir::Value{};
1268 case NEON::BI__builtin_neon_vrndi_v:
1269 case NEON::BI__builtin_neon_vrndiq_v:
1272 ops, std::nullopt, ty, loc);
1273 case NEON::BI__builtin_neon_vrshr_n_v:
1274 case NEON::BI__builtin_neon_vrshrq_n_v: {
1275 llvm::StringRef intrName =
1276 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
1279 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
1280 intrName, ty, loc,
false,
1284 case NEON::BI__builtin_neon_vsha512hq_u64:
1285 case NEON::BI__builtin_neon_vsha512h2q_u64:
1286 case NEON::BI__builtin_neon_vsha512su0q_u64:
1287 case NEON::BI__builtin_neon_vsha512su1q_u64:
1289 std::string(
"unimplemented AArch64 builtin call: ") +
1291 return mlir::Value{};
1292 case NEON::BI__builtin_neon_vshl_n_v:
1293 case NEON::BI__builtin_neon_vshlq_n_v:
1296 case NEON::BI__builtin_neon_vshll_n_v: {
1298 cir::VectorType narrowVecTy =
1302 mlir::Value src = builder.
createBitcast(ops[0], narrowVecTy);
1307 case NEON::BI__builtin_neon_vshrn_n_v: {
1309 cir::VectorType wideVecTy =
1318 case NEON::BI__builtin_neon_vshr_n_v:
1319 case NEON::BI__builtin_neon_vshrq_n_v:
1321 case NEON::BI__builtin_neon_vst1_v:
1322 case NEON::BI__builtin_neon_vst1q_v:
1323 case NEON::BI__builtin_neon_vst2_v:
1324 case NEON::BI__builtin_neon_vst2q_v:
1325 case NEON::BI__builtin_neon_vst3_v:
1326 case NEON::BI__builtin_neon_vst3q_v:
1327 case NEON::BI__builtin_neon_vst4_v:
1328 case NEON::BI__builtin_neon_vst4q_v:
1329 case NEON::BI__builtin_neon_vst2_lane_v:
1330 case NEON::BI__builtin_neon_vst2q_lane_v:
1331 case NEON::BI__builtin_neon_vst3_lane_v:
1332 case NEON::BI__builtin_neon_vst3q_lane_v:
1333 case NEON::BI__builtin_neon_vst4_lane_v:
1334 case NEON::BI__builtin_neon_vst4q_lane_v:
1335 case NEON::BI__builtin_neon_vsm3partw1q_u32:
1336 case NEON::BI__builtin_neon_vsm3partw2q_u32:
1337 case NEON::BI__builtin_neon_vsm3ss1q_u32:
1338 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
1339 case NEON::BI__builtin_neon_vsm4eq_u32:
1340 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
1341 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
1342 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
1343 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
1345 std::string(
"unimplemented AArch64 builtin call: ") +
1347 return mlir::Value{};
1348 case NEON::BI__builtin_neon_vst1_x2_v:
1349 case NEON::BI__builtin_neon_vst1q_x2_v:
1350 case NEON::BI__builtin_neon_vst1_x3_v:
1351 case NEON::BI__builtin_neon_vst1q_x3_v:
1352 case NEON::BI__builtin_neon_vst1_x4_v:
1353 case NEON::BI__builtin_neon_vst1q_x4_v: {
1356 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
1360 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1364 case NEON::BI__builtin_neon_vtrn_v:
1365 case NEON::BI__builtin_neon_vtrnq_v:
1366 case NEON::BI__builtin_neon_vtst_v:
1367 case NEON::BI__builtin_neon_vtstq_v:
1368 case NEON::BI__builtin_neon_vuzp_v:
1369 case NEON::BI__builtin_neon_vuzpq_v:
1370 case NEON::BI__builtin_neon_vxarq_u64:
1371 case NEON::BI__builtin_neon_vzip_v:
1372 case NEON::BI__builtin_neon_vzipq_v:
1373 case NEON::BI__builtin_neon_vdot_s32:
1374 case NEON::BI__builtin_neon_vdot_u32:
1375 case NEON::BI__builtin_neon_vdotq_s32:
1376 case NEON::BI__builtin_neon_vdotq_u32:
1377 case NEON::BI__builtin_neon_vfmlal_low_f16:
1378 case NEON::BI__builtin_neon_vfmlalq_low_f16:
1379 case NEON::BI__builtin_neon_vfmlsl_low_f16:
1380 case NEON::BI__builtin_neon_vfmlslq_low_f16:
1381 case NEON::BI__builtin_neon_vfmlal_high_f16:
1382 case NEON::BI__builtin_neon_vfmlalq_high_f16:
1383 case NEON::BI__builtin_neon_vfmlsl_high_f16:
1384 case NEON::BI__builtin_neon_vfmlslq_high_f16:
1385 case NEON::BI__builtin_neon_vmmlaq_s32:
1386 case NEON::BI__builtin_neon_vmmlaq_u32:
1388 std::string(
"unimplemented AArch64 builtin call: ") +
1390 return mlir::Value{};
1391 case NEON::BI__builtin_neon_vmul_v:
1392 case NEON::BI__builtin_neon_vmulq_v:
1395 case NEON::BI__builtin_neon_vusmmlaq_s32:
1396 case NEON::BI__builtin_neon_vusdot_s32:
1397 case NEON::BI__builtin_neon_vusdotq_s32:
1398 case NEON::BI__builtin_neon_vbfdot_f32:
1399 case NEON::BI__builtin_neon_vbfdotq_f32:
1400 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
1402 std::string(
"unimplemented AArch64 builtin call: ") +
1404 return mlir::Value{};
1410 switch (builtinID) {
1413 std::string(
"unimplemented AArch64 builtin call: ") +
1416 case NEON::BI__builtin_neon_vrnd32x_f32:
1417 case NEON::BI__builtin_neon_vrnd32xq_f32:
1418 case NEON::BI__builtin_neon_vrnd32x_f64:
1419 case NEON::BI__builtin_neon_vrnd32xq_f64:
1420 case NEON::BI__builtin_neon_vrnd32z_f32:
1421 case NEON::BI__builtin_neon_vrnd32zq_f32:
1422 case NEON::BI__builtin_neon_vrnd32z_f64:
1423 case NEON::BI__builtin_neon_vrnd32zq_f64:
1424 case NEON::BI__builtin_neon_vrnd64x_f32:
1425 case NEON::BI__builtin_neon_vrnd64xq_f32:
1426 case NEON::BI__builtin_neon_vrnd64x_f64:
1427 case NEON::BI__builtin_neon_vrnd64xq_f64:
1428 case NEON::BI__builtin_neon_vrnd64z_f32:
1429 case NEON::BI__builtin_neon_vrnd64zq_f32:
1430 case NEON::BI__builtin_neon_vrnd64z_f64:
1431 case NEON::BI__builtin_neon_vrnd64zq_f64: {
1433 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1434 mlir::Value result =
1436 llvmIntrName, vTy, loc);
1440 case NEON::BI__builtin_neon_vhadd_v:
1441 case NEON::BI__builtin_neon_vhaddq_v:
1442 case NEON::BI__builtin_neon_vhsub_v:
1443 case NEON::BI__builtin_neon_vhsubq_v:
1444 case NEON::BI__builtin_neon_vqadd_v:
1445 case NEON::BI__builtin_neon_vqaddq_v:
1446 case NEON::BI__builtin_neon_vrhadd_v:
1447 case NEON::BI__builtin_neon_vrhaddq_v:
1448 case NEON::BI__builtin_neon_vqsub_v:
1449 case NEON::BI__builtin_neon_vqsubq_v:
1450 case NEON::BI__builtin_neon_vshl_v:
1451 case NEON::BI__builtin_neon_vshlq_v:
1452 case NEON::BI__builtin_neon_vraddhn_v:
1453 case NEON::BI__builtin_neon_vrsubhn_v:
1454 case NEON::BI__builtin_neon_vqshl_v:
1455 case NEON::BI__builtin_neon_vqshlq_v: {
1458 unsigned intrinsic =
1459 ((modifier &
UnsignedAlts) && !usgn) ? altLLVMIntrinsic : llvmIntrinsic;
1460 llvm::StringRef llvmIntrName =
1463 cir::VectorType argTy =
1466 mlir::Value result =
1468 {argTy, argTy}, ops, llvmIntrName,
1950 NEON::BI__builtin_neon_vabd_f16,
1951 NEON::BI__builtin_neon_vabd_v,
1954 NEON::BI__builtin_neon_vabdq_f16,
1955 NEON::BI__builtin_neon_vabdq_v,
1958 NEON::BI__builtin_neon_vabs_f16,
1959 NEON::BI__builtin_neon_vabs_v,
1962 NEON::BI__builtin_neon_vabsq_f16,
1963 NEON::BI__builtin_neon_vabsq_v,
1966 NEON::BI__builtin_neon_vcage_f16,
1967 NEON::BI__builtin_neon_vcage_v,
1970 NEON::BI__builtin_neon_vcageq_f16,
1971 NEON::BI__builtin_neon_vcageq_v,
1974 NEON::BI__builtin_neon_vcagt_f16,
1975 NEON::BI__builtin_neon_vcagt_v,
1978 NEON::BI__builtin_neon_vcagtq_f16,
1979 NEON::BI__builtin_neon_vcagtq_v,
1982 NEON::BI__builtin_neon_vcale_f16,
1983 NEON::BI__builtin_neon_vcale_v,
1986 NEON::BI__builtin_neon_vcaleq_f16,
1987 NEON::BI__builtin_neon_vcaleq_v,
1990 NEON::BI__builtin_neon_vcalt_f16,
1991 NEON::BI__builtin_neon_vcalt_v,
1994 NEON::BI__builtin_neon_vcaltq_f16,
1995 NEON::BI__builtin_neon_vcaltq_v,
1998 NEON::BI__builtin_neon_vceqz_f16,
1999 NEON::BI__builtin_neon_vceqz_v,
2002 NEON::BI__builtin_neon_vceqzq_f16,
2003 NEON::BI__builtin_neon_vceqzq_v,
2006 NEON::BI__builtin_neon_vcgez_f16,
2007 NEON::BI__builtin_neon_vcgez_v,
2010 NEON::BI__builtin_neon_vcgezq_f16,
2011 NEON::BI__builtin_neon_vcgezq_v,
2014 NEON::BI__builtin_neon_vcgtz_f16,
2015 NEON::BI__builtin_neon_vcgtz_v,
2018 NEON::BI__builtin_neon_vcgtzq_f16,
2019 NEON::BI__builtin_neon_vcgtzq_v,
2022 NEON::BI__builtin_neon_vclez_f16,
2023 NEON::BI__builtin_neon_vclez_v,
2026 NEON::BI__builtin_neon_vclezq_f16,
2027 NEON::BI__builtin_neon_vclezq_v,
2030 NEON::BI__builtin_neon_vcltz_f16,
2031 NEON::BI__builtin_neon_vcltz_v,
2034 NEON::BI__builtin_neon_vcltzq_f16,
2035 NEON::BI__builtin_neon_vcltzq_v,
2038 NEON::BI__builtin_neon_vfma_f16,
2039 NEON::BI__builtin_neon_vfma_v,
2042 NEON::BI__builtin_neon_vfma_lane_f16,
2043 NEON::BI__builtin_neon_vfma_lane_v,
2046 NEON::BI__builtin_neon_vfma_laneq_f16,
2047 NEON::BI__builtin_neon_vfma_laneq_v,
2050 NEON::BI__builtin_neon_vfmaq_f16,
2051 NEON::BI__builtin_neon_vfmaq_v,
2054 NEON::BI__builtin_neon_vfmaq_lane_f16,
2055 NEON::BI__builtin_neon_vfmaq_lane_v,
2058 NEON::BI__builtin_neon_vfmaq_laneq_f16,
2059 NEON::BI__builtin_neon_vfmaq_laneq_v,
2062 NEON::BI__builtin_neon_vmax_f16,
2063 NEON::BI__builtin_neon_vmax_v,
2066 NEON::BI__builtin_neon_vmaxnm_f16,
2067 NEON::BI__builtin_neon_vmaxnm_v,
2070 NEON::BI__builtin_neon_vmaxnmq_f16,
2071 NEON::BI__builtin_neon_vmaxnmq_v,
2074 NEON::BI__builtin_neon_vmaxq_f16,
2075 NEON::BI__builtin_neon_vmaxq_v,
2078 NEON::BI__builtin_neon_vmin_f16,
2079 NEON::BI__builtin_neon_vmin_v,
2082 NEON::BI__builtin_neon_vminnm_f16,
2083 NEON::BI__builtin_neon_vminnm_v,
2086 NEON::BI__builtin_neon_vminnmq_f16,
2087 NEON::BI__builtin_neon_vminnmq_v,
2090 NEON::BI__builtin_neon_vminq_f16,
2091 NEON::BI__builtin_neon_vminq_v,
2094 NEON::BI__builtin_neon_vmulx_f16,
2095 NEON::BI__builtin_neon_vmulx_v,
2098 NEON::BI__builtin_neon_vmulxq_f16,
2099 NEON::BI__builtin_neon_vmulxq_v,
2102 NEON::BI__builtin_neon_vpadd_f16,
2103 NEON::BI__builtin_neon_vpadd_v,
2106 NEON::BI__builtin_neon_vpaddq_f16,
2107 NEON::BI__builtin_neon_vpaddq_v,
2110 NEON::BI__builtin_neon_vpmax_f16,
2111 NEON::BI__builtin_neon_vpmax_v,
2114 NEON::BI__builtin_neon_vpmaxnm_f16,
2115 NEON::BI__builtin_neon_vpmaxnm_v,
2118 NEON::BI__builtin_neon_vpmaxnmq_f16,
2119 NEON::BI__builtin_neon_vpmaxnmq_v,
2122 NEON::BI__builtin_neon_vpmaxq_f16,
2123 NEON::BI__builtin_neon_vpmaxq_v,
2126 NEON::BI__builtin_neon_vpmin_f16,
2127 NEON::BI__builtin_neon_vpmin_v,
2130 NEON::BI__builtin_neon_vpminnm_f16,
2131 NEON::BI__builtin_neon_vpminnm_v,
2134 NEON::BI__builtin_neon_vpminnmq_f16,
2135 NEON::BI__builtin_neon_vpminnmq_v,
2138 NEON::BI__builtin_neon_vpminq_f16,
2139 NEON::BI__builtin_neon_vpminq_v,
2142 NEON::BI__builtin_neon_vrecpe_f16,
2143 NEON::BI__builtin_neon_vrecpe_v,
2146 NEON::BI__builtin_neon_vrecpeq_f16,
2147 NEON::BI__builtin_neon_vrecpeq_v,
2150 NEON::BI__builtin_neon_vrecps_f16,
2151 NEON::BI__builtin_neon_vrecps_v,
2154 NEON::BI__builtin_neon_vrecpsq_f16,
2155 NEON::BI__builtin_neon_vrecpsq_v,
2158 NEON::BI__builtin_neon_vrnd_f16,
2159 NEON::BI__builtin_neon_vrnd_v,
2162 NEON::BI__builtin_neon_vrnda_f16,
2163 NEON::BI__builtin_neon_vrnda_v,
2166 NEON::BI__builtin_neon_vrndaq_f16,
2167 NEON::BI__builtin_neon_vrndaq_v,
2170 NEON::BI__builtin_neon_vrndi_f16,
2171 NEON::BI__builtin_neon_vrndi_v,
2174 NEON::BI__builtin_neon_vrndiq_f16,
2175 NEON::BI__builtin_neon_vrndiq_v,
2178 NEON::BI__builtin_neon_vrndm_f16,
2179 NEON::BI__builtin_neon_vrndm_v,
2182 NEON::BI__builtin_neon_vrndmq_f16,
2183 NEON::BI__builtin_neon_vrndmq_v,
2186 NEON::BI__builtin_neon_vrndn_f16,
2187 NEON::BI__builtin_neon_vrndn_v,
2190 NEON::BI__builtin_neon_vrndnq_f16,
2191 NEON::BI__builtin_neon_vrndnq_v,
2194 NEON::BI__builtin_neon_vrndp_f16,
2195 NEON::BI__builtin_neon_vrndp_v,
2198 NEON::BI__builtin_neon_vrndpq_f16,
2199 NEON::BI__builtin_neon_vrndpq_v,
2202 NEON::BI__builtin_neon_vrndq_f16,
2203 NEON::BI__builtin_neon_vrndq_v,
2206 NEON::BI__builtin_neon_vrndx_f16,
2207 NEON::BI__builtin_neon_vrndx_v,
2210 NEON::BI__builtin_neon_vrndxq_f16,
2211 NEON::BI__builtin_neon_vrndxq_v,
2214 NEON::BI__builtin_neon_vrsqrte_f16,
2215 NEON::BI__builtin_neon_vrsqrte_v,
2218 NEON::BI__builtin_neon_vrsqrteq_f16,
2219 NEON::BI__builtin_neon_vrsqrteq_v,
2222 NEON::BI__builtin_neon_vrsqrts_f16,
2223 NEON::BI__builtin_neon_vrsqrts_v,
2226 NEON::BI__builtin_neon_vrsqrtsq_f16,
2227 NEON::BI__builtin_neon_vrsqrtsq_v,
2230 NEON::BI__builtin_neon_vsqrt_f16,
2231 NEON::BI__builtin_neon_vsqrt_v,
2234 NEON::BI__builtin_neon_vsqrtq_f16,
2235 NEON::BI__builtin_neon_vsqrtq_v,
2240 {NEON::BI__builtin_neon_vldap1_lane_u64,
2241 NEON::BI__builtin_neon_vldap1_lane_s64},
2242 {NEON::BI__builtin_neon_vldap1_lane_f64,
2243 NEON::BI__builtin_neon_vldap1_lane_s64},
2244 {NEON::BI__builtin_neon_vldap1_lane_p64,
2245 NEON::BI__builtin_neon_vldap1_lane_s64},
2246 {NEON::BI__builtin_neon_vldap1q_lane_u64,
2247 NEON::BI__builtin_neon_vldap1q_lane_s64},
2248 {NEON::BI__builtin_neon_vldap1q_lane_f64,
2249 NEON::BI__builtin_neon_vldap1q_lane_s64},
2250 {NEON::BI__builtin_neon_vldap1q_lane_p64,
2251 NEON::BI__builtin_neon_vldap1q_lane_s64},
2252 {NEON::BI__builtin_neon_vstl1_lane_u64,
2253 NEON::BI__builtin_neon_vstl1_lane_s64},
2254 {NEON::BI__builtin_neon_vstl1_lane_f64,
2255 NEON::BI__builtin_neon_vstl1_lane_s64},
2256 {NEON::BI__builtin_neon_vstl1_lane_p64,
2257 NEON::BI__builtin_neon_vstl1_lane_s64},
2258 {NEON::BI__builtin_neon_vstl1q_lane_u64,
2259 NEON::BI__builtin_neon_vstl1q_lane_s64},
2260 {NEON::BI__builtin_neon_vstl1q_lane_f64,
2261 NEON::BI__builtin_neon_vstl1q_lane_s64},
2262 {NEON::BI__builtin_neon_vstl1q_lane_p64,
2263 NEON::BI__builtin_neon_vstl1q_lane_s64},
2269 llvm::Triple::ArchType arch) {
2278 if (builtinID == Builtin::BI__builtin_cpu_supports) {
2279 cgm.errorNYI(
expr->getSourceRange(),
2280 std::string(
"unimplemented AArch64 builtin call: ") +
2281 getContext().BuiltinInfo.getName(builtinID));
2282 return mlir::Value{};
2285 switch (builtinID) {
2288 case clang::AArch64::BI__builtin_arm_nop:
2289 case clang::AArch64::BI__builtin_arm_yield:
2290 case clang::AArch64::BI__yield:
2291 case clang::AArch64::BI__builtin_arm_wfe:
2292 case clang::AArch64::BI__wfe:
2293 case clang::AArch64::BI__builtin_arm_wfi:
2294 case clang::AArch64::BI__wfi:
2295 case clang::AArch64::BI__builtin_arm_sev:
2296 case clang::AArch64::BI__sev:
2297 case clang::AArch64::BI__builtin_arm_sevl:
2298 case clang::AArch64::BI__sevl:
2299 cgm.errorNYI(
expr->getSourceRange(),
2300 std::string(
"unimplemented AArch64 builtin call: ") +
2301 getContext().BuiltinInfo.getName(builtinID));
2302 return mlir::Value{};
2305 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
2306 cgm.errorNYI(
expr->getSourceRange(),
2307 std::string(
"unimplemented AArch64 builtin call: ") +
2308 getContext().BuiltinInfo.getName(builtinID));
2309 return mlir::Value{};
2312 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
2313 cgm.errorNYI(
expr->getSourceRange(),
2314 std::string(
"unimplemented AArch64 builtin call: ") +
2315 getContext().BuiltinInfo.getName(builtinID));
2316 return mlir::Value{};
2319 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
2320 cgm.errorNYI(
expr->getSourceRange(),
2321 std::string(
"unimplemented AArch64 builtin call: ") +
2322 getContext().BuiltinInfo.getName(builtinID));
2323 return mlir::Value{};
2325 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
2326 cgm.errorNYI(
expr->getSourceRange(),
2327 std::string(
"unimplemented AArch64 builtin call: ") +
2328 getContext().BuiltinInfo.getName(builtinID));
2329 return mlir::Value{};
2332 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
2333 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
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_cls) {
2341 cgm.errorNYI(
expr->getSourceRange(),
2342 std::string(
"unimplemented AArch64 builtin call: ") +
2343 getContext().BuiltinInfo.getName(builtinID));
2344 return mlir::Value{};
2346 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
2347 cgm.errorNYI(
expr->getSourceRange(),
2348 std::string(
"unimplemented AArch64 builtin call: ") +
2349 getContext().BuiltinInfo.getName(builtinID));
2350 return mlir::Value{};
2353 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
2354 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
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_rint64zf ||
2362 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
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_rint32xf ||
2370 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
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_rint64xf ||
2378 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
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_jcvt) {
2386 cgm.errorNYI(
expr->getSourceRange(),
2387 std::string(
"unimplemented AArch64 builtin call: ") +
2388 getContext().BuiltinInfo.getName(builtinID));
2389 return mlir::Value{};
2392 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
2393 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
2394 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
2395 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2396 cgm.errorNYI(
expr->getSourceRange(),
2397 std::string(
"unimplemented AArch64 builtin call: ") +
2398 getContext().BuiltinInfo.getName(builtinID));
2399 return mlir::Value{};
2402 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2403 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
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__clear_cache) {
2411 cgm.errorNYI(
expr->getSourceRange(),
2412 std::string(
"unimplemented AArch64 builtin call: ") +
2413 getContext().BuiltinInfo.getName(builtinID));
2414 return mlir::Value{};
2417 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2418 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2420 cgm.errorNYI(
expr->getSourceRange(),
2421 std::string(
"unimplemented AArch64 builtin call: ") +
2422 getContext().BuiltinInfo.getName(builtinID));
2423 return mlir::Value{};
2425 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2426 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2427 cgm.errorNYI(
expr->getSourceRange(),
2428 std::string(
"unimplemented AArch64 builtin call: ") +
2429 getContext().BuiltinInfo.getName(builtinID));
2430 return mlir::Value{};
2433 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2434 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
2436 cgm.errorNYI(
expr->getSourceRange(),
2437 std::string(
"unimplemented AArch64 builtin call: ") +
2438 getContext().BuiltinInfo.getName(builtinID));
2439 return mlir::Value{};
2442 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2443 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__getReg ||
2451 builtinID == clang::AArch64::BI__setReg ||
2452 builtinID == clang::AArch64::BI__getRegFp ||
2453 builtinID == clang::AArch64::BI__setRegFp) {
2454 cgm.errorNYI(
expr->getSourceRange(),
2455 std::string(
"unimplemented AArch64 builtin call: ") +
2456 getContext().BuiltinInfo.getName(builtinID));
2457 return mlir::Value{};
2460 if (builtinID == clang::AArch64::BI__break) {
2461 cgm.errorNYI(
expr->getSourceRange(),
2462 std::string(
"unimplemented AArch64 builtin call: ") +
2463 getContext().BuiltinInfo.getName(builtinID));
2464 return mlir::Value{};
2467 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2468 cgm.errorNYI(
expr->getSourceRange(),
2469 std::string(
"unimplemented AArch64 builtin call: ") +
2470 getContext().BuiltinInfo.getName(builtinID));
2471 return mlir::Value{};
2474 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2475 cgm.errorNYI(
expr->getSourceRange(),
2476 std::string(
"unimplemented AArch64 builtin call: ") +
2477 getContext().BuiltinInfo.getName(builtinID));
2478 return mlir::Value{};
2482 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2483 switch (builtinID) {
2484 case clang::AArch64::BI__builtin_arm_crc32b:
2485 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2487 case clang::AArch64::BI__builtin_arm_crc32cb:
2488 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2490 case clang::AArch64::BI__builtin_arm_crc32h:
2491 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2493 case clang::AArch64::BI__builtin_arm_crc32ch:
2494 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2496 case clang::AArch64::BI__builtin_arm_crc32w:
2497 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2499 case clang::AArch64::BI__builtin_arm_crc32cw:
2500 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2502 case clang::AArch64::BI__builtin_arm_crc32d:
2503 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2505 case clang::AArch64::BI__builtin_arm_crc32cd:
2506 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2510 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2511 cgm.errorNYI(
expr->getSourceRange(),
2512 std::string(
"unimplemented AArch64 builtin call: ") +
2513 getContext().BuiltinInfo.getName(builtinID));
2514 return mlir::Value{};
2518 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2519 cgm.errorNYI(
expr->getSourceRange(),
2520 std::string(
"unimplemented AArch64 builtin call: ") +
2521 getContext().BuiltinInfo.getName(builtinID));
2522 return mlir::Value{};
2526 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2527 switch (builtinID) {
2528 case clang::AArch64::BI__builtin_arm_irg:
2529 mteIntrinsicID = Intrinsic::aarch64_irg;
2531 case clang::AArch64::BI__builtin_arm_addg:
2532 mteIntrinsicID = Intrinsic::aarch64_addg;
2534 case clang::AArch64::BI__builtin_arm_gmi:
2535 mteIntrinsicID = Intrinsic::aarch64_gmi;
2537 case clang::AArch64::BI__builtin_arm_ldg:
2538 mteIntrinsicID = Intrinsic::aarch64_ldg;
2540 case clang::AArch64::BI__builtin_arm_stg:
2541 mteIntrinsicID = Intrinsic::aarch64_stg;
2543 case clang::AArch64::BI__builtin_arm_subp:
2544 mteIntrinsicID = Intrinsic::aarch64_subp;
2548 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
2549 cgm.errorNYI(
expr->getSourceRange(),
2550 std::string(
"unimplemented AArch64 builtin call: ") +
2551 getContext().BuiltinInfo.getName(builtinID));
2552 return mlir::Value{};
2555 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
2556 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2557 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2558 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2559 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2560 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2561 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2562 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2563 cgm.errorNYI(
expr->getSourceRange(),
2564 std::string(
"unimplemented AArch64 builtin call: ") +
2565 getContext().BuiltinInfo.getName(builtinID));
2566 return mlir::Value{};
2569 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2570 builtinID == clang::AArch64::BI_WriteStatusReg ||
2571 builtinID == clang::AArch64::BI__sys) {
2572 cgm.errorNYI(
expr->getSourceRange(),
2573 std::string(
"unimplemented AArch64 builtin call: ") +
2574 getContext().BuiltinInfo.getName(builtinID));
2575 return mlir::Value{};
2578 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
2579 cgm.errorNYI(
expr->getSourceRange(),
2580 std::string(
"unimplemented AArch64 builtin call: ") +
2581 getContext().BuiltinInfo.getName(builtinID));
2582 return mlir::Value{};
2585 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2586 cgm.errorNYI(
expr->getSourceRange(),
2587 std::string(
"unimplemented AArch64 builtin call: ") +
2588 getContext().BuiltinInfo.getName(builtinID));
2589 return mlir::Value{};
2592 if (builtinID == clang::AArch64::BI__mulh ||
2593 builtinID == clang::AArch64::BI__umulh) {
2594 cgm.errorNYI(
expr->getSourceRange(),
2595 std::string(
"unimplemented AArch64 builtin call: ") +
2596 getContext().BuiltinInfo.getName(builtinID));
2597 return mlir::Value{};
2600 if (builtinID == AArch64::BI__writex18byte ||
2601 builtinID == AArch64::BI__writex18word ||
2602 builtinID == AArch64::BI__writex18dword ||
2603 builtinID == AArch64::BI__writex18qword) {
2604 cgm.errorNYI(
expr->getSourceRange(),
2605 std::string(
"unimplemented AArch64 builtin call: ") +
2606 getContext().BuiltinInfo.getName(builtinID));
2607 return mlir::Value{};
2610 if (builtinID == AArch64::BI__readx18byte ||
2611 builtinID == AArch64::BI__readx18word ||
2612 builtinID == AArch64::BI__readx18dword ||
2613 builtinID == AArch64::BI__readx18qword) {
2614 cgm.errorNYI(
expr->getSourceRange(),
2615 std::string(
"unimplemented AArch64 builtin call: ") +
2616 getContext().BuiltinInfo.getName(builtinID));
2617 return mlir::Value{};
2620 if (builtinID == AArch64::BI__addx18byte ||
2621 builtinID == AArch64::BI__addx18word ||
2622 builtinID == AArch64::BI__addx18dword ||
2623 builtinID == AArch64::BI__addx18qword ||
2624 builtinID == AArch64::BI__incx18byte ||
2625 builtinID == AArch64::BI__incx18word ||
2626 builtinID == AArch64::BI__incx18dword ||
2627 builtinID == AArch64::BI__incx18qword) {
2628 cgm.errorNYI(
expr->getSourceRange(),
2629 std::string(
"unimplemented AArch64 builtin call: ") +
2630 getContext().BuiltinInfo.getName(builtinID));
2631 return mlir::Value{};
2634 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2635 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2636 builtinID == AArch64::BI_CopyInt32FromFloat ||
2637 builtinID == AArch64::BI_CopyInt64FromDouble) {
2638 cgm.errorNYI(
expr->getSourceRange(),
2639 std::string(
"unimplemented AArch64 builtin call: ") +
2640 getContext().BuiltinInfo.getName(builtinID));
2641 return mlir::Value{};
2644 if (builtinID == AArch64::BI_CountLeadingOnes ||
2645 builtinID == AArch64::BI_CountLeadingOnes64 ||
2646 builtinID == AArch64::BI_CountLeadingZeros ||
2647 builtinID == AArch64::BI_CountLeadingZeros64) {
2648 cgm.errorNYI(
expr->getSourceRange(),
2649 std::string(
"unimplemented AArch64 builtin call: ") +
2650 getContext().BuiltinInfo.getName(builtinID));
2651 return mlir::Value{};
2654 if (builtinID == AArch64::BI_CountLeadingSigns ||
2655 builtinID == AArch64::BI_CountLeadingSigns64) {
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_CountOneBits ||
2663 builtinID == AArch64::BI_CountOneBits64 ||
2664 builtinID == AArch64::BI_CountTrailingZeros ||
2665 builtinID == AArch64::BI_CountTrailingZeros64) {
2666 cgm.errorNYI(
expr->getSourceRange(),
2667 std::string(
"unimplemented AArch64 builtin call: ") +
2668 getContext().BuiltinInfo.getName(builtinID));
2669 return mlir::Value{};
2672 if (builtinID == AArch64::BI__prefetch ||
2673 builtinID == AArch64::BI__prefetch2) {
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__hlt) {
2681 cgm.errorNYI(
expr->getSourceRange(),
2682 std::string(
"unimplemented AArch64 builtin call: ") +
2683 getContext().BuiltinInfo.getName(builtinID));
2684 return mlir::Value{};
2687 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2688 cgm.errorNYI(
expr->getSourceRange(),
2689 std::string(
"unimplemented AArch64 builtin call: ") +
2690 getContext().BuiltinInfo.getName(builtinID));
2691 return mlir::Value{};
2702 return p.first == builtinID;
2705 builtinID = it->second;
2710 unsigned iceArguments = 0;
2725 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2726 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2728 switch (builtinID) {
2729 case NEON::BI__builtin_neon_vld1_v:
2730 case NEON::BI__builtin_neon_vld1q_v:
2731 case NEON::BI__builtin_neon_vld1_dup_v:
2732 case NEON::BI__builtin_neon_vld1q_dup_v:
2733 case NEON::BI__builtin_neon_vld1_lane_v:
2734 case NEON::BI__builtin_neon_vld1q_lane_v:
2735 case NEON::BI__builtin_neon_vst1_v:
2736 case NEON::BI__builtin_neon_vst1q_v:
2737 case NEON::BI__builtin_neon_vst1_lane_v:
2738 case NEON::BI__builtin_neon_vst1q_lane_v:
2739 case NEON::BI__builtin_neon_vstrq_p128:
2740 case NEON::BI__builtin_neon_vst2_v:
2741 case NEON::BI__builtin_neon_vst2q_v:
2742 case NEON::BI__builtin_neon_vst2_lane_v:
2743 case NEON::BI__builtin_neon_vst2q_lane_v:
2744 case NEON::BI__builtin_neon_vst3_v:
2745 case NEON::BI__builtin_neon_vst3q_v:
2746 case NEON::BI__builtin_neon_vst3_lane_v:
2747 case NEON::BI__builtin_neon_vst3q_lane_v:
2748 case NEON::BI__builtin_neon_vst4_v:
2749 case NEON::BI__builtin_neon_vst4q_v:
2750 case NEON::BI__builtin_neon_vst4_lane_v:
2751 case NEON::BI__builtin_neon_vst4q_lane_v:
2757 case NEON::BI__builtin_neon_vldap1_lane_s64:
2758 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2759 case NEON::BI__builtin_neon_vstl1_lane_s64:
2760 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2762 expr->getSourceRange(),
2763 std::string(
"unimplemented AArch64 builtin argument handling ") +
2764 getContext().BuiltinInfo.getName(builtinID));
2785 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2789 if (std::optional<llvm::APSInt> result =
2793 bool usgn =
type.isUnsigned();
2795 mlir::Location loc =
getLoc(
expr->getExprLoc());
2809 switch (builtinID) {
2812 case NEON::BI__builtin_neon_vabsh_f16: {
2813 mlir::Type halfTy = builder.getFp16Ty();
2815 std::nullopt, halfTy, loc);
2817 case NEON::BI__builtin_neon_vaddq_p128: {
2818 cir::VectorType byteTy = cir::VectorType::get(builder.getUInt8Ty(), 16);
2819 ops[0] = builder.createBitcast(ops[0], byteTy);
2820 ops[1] = builder.createBitcast(ops[1], byteTy);
2821 mlir::Value result = builder.createXor(loc, ops[0], ops[1]);
2824 case NEON::BI__builtin_neon_vldrq_p128:
2825 cgm.errorNYI(
expr->getSourceRange(),
2826 std::string(
"unimplemented AArch64 builtin call: ") +
2827 getContext().BuiltinInfo.getName(builtinID));
2828 return mlir::Value{};
2829 case NEON::BI__builtin_neon_vstrq_p128: {
2830 builder.createStore(loc, ops[1], ptrOp0);
2833 case NEON::BI__builtin_neon_vcvts_f32_u32:
2834 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2835 case NEON::BI__builtin_neon_vcvts_f32_s32:
2836 case NEON::BI__builtin_neon_vcvtd_f64_s64: {
2837 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0],
2840 case NEON::BI__builtin_neon_vcvth_f16_u16:
2841 case NEON::BI__builtin_neon_vcvth_f16_u32:
2842 case NEON::BI__builtin_neon_vcvth_f16_u64:
2843 case NEON::BI__builtin_neon_vcvth_f16_s16:
2844 case NEON::BI__builtin_neon_vcvth_f16_s32:
2845 case NEON::BI__builtin_neon_vcvth_f16_s64:
2846 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2847 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2848 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2849 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2850 case NEON::BI__builtin_neon_vcvth_u16_f16:
2851 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2852 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2853 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2854 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2855 case NEON::BI__builtin_neon_vcvth_s16_f16:
2856 case NEON::BI__builtin_neon_vcaleh_f16:
2857 case NEON::BI__builtin_neon_vcalth_f16:
2858 case NEON::BI__builtin_neon_vcageh_f16:
2859 case NEON::BI__builtin_neon_vcagth_f16:
2860 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2861 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2862 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2863 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2864 case NEON::BI__builtin_neon_vpaddd_s64:
2865 case NEON::BI__builtin_neon_vpaddd_f64:
2866 case NEON::BI__builtin_neon_vpadds_f32:
2867 cgm.errorNYI(
expr->getSourceRange(),
2868 std::string(
"unimplemented AArch64 builtin call: ") +
2869 getContext().BuiltinInfo.getName(builtinID));
2870 return mlir::Value{};
2871 case NEON::BI__builtin_neon_vceqzd_s64:
2872 case NEON::BI__builtin_neon_vceqzd_f64:
2873 case NEON::BI__builtin_neon_vceqzs_f32:
2874 case NEON::BI__builtin_neon_vceqzh_f16:
2876 *
this, builder, loc, ops[0],
2878 case NEON::BI__builtin_neon_vcgezd_s64:
2879 case NEON::BI__builtin_neon_vcgezd_f64:
2880 case NEON::BI__builtin_neon_vcgezs_f32:
2881 case NEON::BI__builtin_neon_vcgezh_f16:
2882 case NEON::BI__builtin_neon_vclezd_s64:
2883 case NEON::BI__builtin_neon_vclezd_f64:
2884 case NEON::BI__builtin_neon_vclezs_f32:
2885 case NEON::BI__builtin_neon_vclezh_f16:
2886 case NEON::BI__builtin_neon_vcgtzd_s64:
2887 case NEON::BI__builtin_neon_vcgtzd_f64:
2888 case NEON::BI__builtin_neon_vcgtzs_f32:
2889 case NEON::BI__builtin_neon_vcgtzh_f16:
2890 case NEON::BI__builtin_neon_vcltzd_s64:
2891 case NEON::BI__builtin_neon_vcltzd_f64:
2892 case NEON::BI__builtin_neon_vcltzs_f32:
2893 case NEON::BI__builtin_neon_vcltzh_f16:
2894 case NEON::BI__builtin_neon_vceqzd_u64: {
2896 *
this, builder, loc, ops[0],
2899 case NEON::BI__builtin_neon_vceqd_f64:
2900 case NEON::BI__builtin_neon_vcled_f64:
2901 case NEON::BI__builtin_neon_vcltd_f64:
2902 case NEON::BI__builtin_neon_vcged_f64:
2903 case NEON::BI__builtin_neon_vcgtd_f64:
2904 case NEON::BI__builtin_neon_vceqs_f32:
2905 case NEON::BI__builtin_neon_vcles_f32:
2906 case NEON::BI__builtin_neon_vclts_f32:
2907 case NEON::BI__builtin_neon_vcges_f32:
2908 case NEON::BI__builtin_neon_vcgts_f32:
2909 case NEON::BI__builtin_neon_vceqh_f16:
2910 case NEON::BI__builtin_neon_vcleh_f16:
2911 case NEON::BI__builtin_neon_vclth_f16:
2912 case NEON::BI__builtin_neon_vcgeh_f16:
2913 case NEON::BI__builtin_neon_vcgth_f16:
2914 case NEON::BI__builtin_neon_vceqd_s64:
2915 case NEON::BI__builtin_neon_vceqd_u64:
2916 case NEON::BI__builtin_neon_vcgtd_s64:
2917 case NEON::BI__builtin_neon_vcgtd_u64:
2918 case NEON::BI__builtin_neon_vcltd_s64:
2919 case NEON::BI__builtin_neon_vcltd_u64:
2920 case NEON::BI__builtin_neon_vcged_u64:
2921 case NEON::BI__builtin_neon_vcged_s64:
2922 case NEON::BI__builtin_neon_vcled_u64:
2923 case NEON::BI__builtin_neon_vcled_s64:
2924 cgm.errorNYI(
expr->getSourceRange(),
2925 std::string(
"unimplemented AArch64 builtin call: ") +
2926 getContext().BuiltinInfo.getName(builtinID));
2927 return mlir::Value{};
2928 case NEON::BI__builtin_neon_vnegd_s64: {
2929 return builder.createNeg(loc, ops[0]);
2931 case NEON::BI__builtin_neon_vnegh_f16: {
2932 return builder.createFNeg(loc, ops[0]);
2934 case NEON::BI__builtin_neon_vtstd_s64:
2935 case NEON::BI__builtin_neon_vtstd_u64:
2936 cgm.errorNYI(
expr->getSourceRange(),
2937 std::string(
"unimplemented AArch64 builtin call: ") +
2938 getContext().BuiltinInfo.getName(builtinID));
2939 return mlir::Value{};
2940 case NEON::BI__builtin_neon_vset_lane_i8:
2941 case NEON::BI__builtin_neon_vset_lane_i16:
2942 case NEON::BI__builtin_neon_vset_lane_i32:
2943 case NEON::BI__builtin_neon_vset_lane_i64:
2944 case NEON::BI__builtin_neon_vset_lane_bf16:
2945 case NEON::BI__builtin_neon_vset_lane_f32:
2946 case NEON::BI__builtin_neon_vsetq_lane_i8:
2947 case NEON::BI__builtin_neon_vsetq_lane_i16:
2948 case NEON::BI__builtin_neon_vsetq_lane_i32:
2949 case NEON::BI__builtin_neon_vsetq_lane_i64:
2950 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2951 case NEON::BI__builtin_neon_vsetq_lane_f32:
2952 case NEON::BI__builtin_neon_vset_lane_f64:
2953 case NEON::BI__builtin_neon_vset_lane_mf8:
2954 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2955 case NEON::BI__builtin_neon_vsetq_lane_f64:
2956 return cir::VecInsertOp::create(builder, loc, ops[1], ops[0], ops[2]);
2957 case NEON::BI__builtin_neon_vget_lane_i8:
2958 case NEON::BI__builtin_neon_vdupb_lane_i8:
2959 case NEON::BI__builtin_neon_vgetq_lane_i8:
2960 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2961 case NEON::BI__builtin_neon_vget_lane_mf8:
2962 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2963 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2964 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2965 case NEON::BI__builtin_neon_vget_lane_i16:
2966 case NEON::BI__builtin_neon_vduph_lane_i16:
2967 case NEON::BI__builtin_neon_vgetq_lane_i16:
2968 case NEON::BI__builtin_neon_vduph_laneq_i16:
2969 case NEON::BI__builtin_neon_vget_lane_i32:
2970 case NEON::BI__builtin_neon_vdups_lane_i32:
2971 case NEON::BI__builtin_neon_vdups_lane_f32:
2972 case NEON::BI__builtin_neon_vgetq_lane_i32:
2973 case NEON::BI__builtin_neon_vdups_laneq_i32:
2974 case NEON::BI__builtin_neon_vget_lane_i64:
2975 case NEON::BI__builtin_neon_vdupd_lane_i64:
2976 case NEON::BI__builtin_neon_vdupd_lane_f64:
2977 case NEON::BI__builtin_neon_vgetq_lane_i64:
2978 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2979 case NEON::BI__builtin_neon_vget_lane_f32:
2980 case NEON::BI__builtin_neon_vget_lane_f64:
2981 case NEON::BI__builtin_neon_vgetq_lane_f32:
2982 case NEON::BI__builtin_neon_vdups_laneq_f32:
2983 case NEON::BI__builtin_neon_vgetq_lane_f64:
2984 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2985 return cir::VecExtractOp::create(builder, loc, ops[0],
2987 case NEON::BI__builtin_neon_vaddh_f16:
2988 return builder.createFAdd(loc, ops[0], ops[1]);
2989 case NEON::BI__builtin_neon_vsubh_f16:
2990 return builder.createFSub(loc, ops[0], ops[1]);
2991 case NEON::BI__builtin_neon_vmulh_f16:
2992 return builder.createFMul(loc, ops[0], ops[1]);
2993 case NEON::BI__builtin_neon_vdivh_f16:
2994 return builder.createFDiv(loc, ops[0], ops[1]);
2995 case NEON::BI__builtin_neon_vfmah_f16: {
2997 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3000 std::nullopt, ty, loc);
3002 case NEON::BI__builtin_neon_vfmsh_f16: {
3004 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3005 ops[0] = builder.createFNeg(loc, ops[0]);
3008 std::nullopt, ty, loc);
3010 case NEON::BI__builtin_neon_vaddd_s64:
3011 case NEON::BI__builtin_neon_vaddd_u64:
3012 return builder.createAdd(loc, ops[0], ops[1]);
3013 case NEON::BI__builtin_neon_vsubd_s64:
3014 case NEON::BI__builtin_neon_vsubd_u64:
3015 return builder.createSub(loc, ops[0], ops[1]);
3016 case NEON::BI__builtin_neon_vqdmlalh_s16:
3017 case NEON::BI__builtin_neon_vqdmlslh_s16:
3018 cgm.errorNYI(
expr->getSourceRange(),
3019 std::string(
"unimplemented AArch64 builtin call: ") +
3020 getContext().BuiltinInfo.getName(builtinID));
3021 return mlir::Value{};
3022 case NEON::BI__builtin_neon_vqshlud_n_s64: {
3023 cir::IntType int64Type = builder.getSInt64Ty();
3029 case NEON::BI__builtin_neon_vqshld_n_u64:
3030 case NEON::BI__builtin_neon_vqshld_n_s64: {
3031 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
3032 ? builder.getUInt64Ty()
3033 : builder.getSInt64Ty();
3034 llvm::StringRef intrinsicName =
3035 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
3036 :
"aarch64.neon.sqshl";
3041 case NEON::BI__builtin_neon_vrshrd_n_u64:
3042 case NEON::BI__builtin_neon_vrshrd_n_s64: {
3043 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
3044 ?
"aarch64.neon.srshl"
3045 :
"aarch64.neon.urshl";
3046 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
3047 ? builder.getUInt64Ty()
3048 : builder.getSInt64Ty();
3052 ops[1] = builder.getSInt64(sv, loc);
3053 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
3054 intrName, int64Ty, loc);
3056 case NEON::BI__builtin_neon_vrsrad_n_u64:
3057 case NEON::BI__builtin_neon_vrsrad_n_s64: {
3058 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
3059 ? builder.getUInt64Ty()
3060 : builder.getSInt64Ty();
3061 ops[2] = builder.createNeg(loc, ops[2]);
3062 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
3063 ?
"aarch64.neon.urshl"
3064 :
"aarch64.neon.srshl";
3067 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
3068 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
3069 return builder.createAdd(loc, ops[0],
3070 builder.createBitcast(ops[1], int64Type));
3072 case NEON::BI__builtin_neon_vshld_n_s64:
3073 case NEON::BI__builtin_neon_vshld_n_u64: {
3075 std::optional<llvm::APSInt> amt =
3077 assert(amt &&
"Expected argument to be a constant");
3078 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
3080 case NEON::BI__builtin_neon_vshrd_n_s64: {
3081 std::optional<llvm::APSInt> amt =
3083 assert(amt &&
"Expected argument to be a constant");
3084 return builder.createShiftRight(
3085 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
3087 case NEON::BI__builtin_neon_vshrd_n_u64: {
3088 std::optional<llvm::APSInt> amt =
3090 assert(amt &&
"Expected argument to be a constant");
3091 uint64_t shiftAmt = amt->getZExtValue();
3094 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
3095 return builder.createShiftRight(loc, ops[0], shiftAmt);
3097 case NEON::BI__builtin_neon_vsrad_n_s64: {
3098 std::optional<llvm::APSInt> amt =
3100 assert(amt &&
"Expected argument to be a constant");
3102 std::min(
static_cast<uint64_t
>(63), amt->getZExtValue());
3103 mlir::Value shifted =
3104 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
3105 return builder.createAdd(loc, ops[0], shifted);
3107 case NEON::BI__builtin_neon_vsrad_n_u64: {
3108 std::optional<llvm::APSInt> amt =
3110 assert(amt &&
"Expected argument to be a constant");
3111 uint64_t shiftAmt = amt->getZExtValue();
3115 mlir::Value shifted =
3116 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
3117 return builder.createAdd(loc, ops[0], shifted);
3119 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
3120 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
3121 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
3122 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
3123 case NEON::BI__builtin_neon_vqdmlals_s32:
3124 case NEON::BI__builtin_neon_vqdmlsls_s32:
3125 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
3126 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
3127 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
3128 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
3129 cgm.errorNYI(
expr->getSourceRange(),
3130 std::string(
"unimplemented AArch64 builtin call: ") +
3131 getContext().BuiltinInfo.getName(builtinID));
3132 return mlir::Value{};
3134 case NEON::BI__builtin_neon_vget_lane_bf16:
3135 case NEON::BI__builtin_neon_vduph_lane_bf16:
3136 case NEON::BI__builtin_neon_vduph_lane_f16:
3137 case NEON::BI__builtin_neon_vgetq_lane_bf16:
3138 case NEON::BI__builtin_neon_vduph_laneq_bf16:
3139 case NEON::BI__builtin_neon_vduph_laneq_f16: {
3140 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
3142 case NEON::BI__builtin_neon_vcvt_bf16_f32:
3143 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
3144 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
3145 cgm.errorNYI(
expr->getSourceRange(),
3146 std::string(
"unimplemented AArch64 builtin call: ") +
3147 getContext().BuiltinInfo.getName(builtinID));
3148 return mlir::Value{};
3149 case NEON::BI__builtin_neon_vcvt_f16_f32: {
3150 auto v4f32 = cir::VectorType::get(
cgm.floatTy, 4);
3151 auto v4f16 = cir::VectorType::get(
cgm.fP16Ty, 4);
3152 return builder.createFloatingCast(builder.createBitcast(ops[0], v4f32),
3155 case NEON::BI__builtin_neon_vcvt_f32_f16: {
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], v4f16),
3161 case clang::AArch64::BI_InterlockedAdd:
3162 case clang::AArch64::BI_InterlockedAdd_acq:
3163 case clang::AArch64::BI_InterlockedAdd_rel:
3164 case clang::AArch64::BI_InterlockedAdd_nf:
3165 case clang::AArch64::BI_InterlockedAdd64:
3166 case clang::AArch64::BI_InterlockedAdd64_acq:
3167 case clang::AArch64::BI_InterlockedAdd64_rel:
3168 case clang::AArch64::BI_InterlockedAdd64_nf:
3169 cgm.errorNYI(
expr->getSourceRange(),
3170 std::string(
"unimplemented AArch64 builtin call: ") +
3171 getContext().BuiltinInfo.getName(builtinID));
3172 return mlir::Value{};
3179 llvm::StringRef intrName;
3181 switch (builtinID) {
3183 return std::nullopt;
3184 case NEON::BI__builtin_neon_vbsl_v:
3185 case NEON::BI__builtin_neon_vbslq_v: {
3188 ops[0] = builder.createBitcast(ops[0], bitTy);
3189 ops[1] = builder.createBitcast(ops[1], bitTy);
3190 ops[2] = builder.createBitcast(ops[2], bitTy);
3192 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
3193 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
3194 ops[0] = builder.createOr(loc, ops[1], ops[2]);
3195 return builder.createBitcast(ops[0], ty);
3197 case NEON::BI__builtin_neon_vfma_lane_v:
3198 case NEON::BI__builtin_neon_vfmaq_lane_v: {
3199 mlir::Value addend = builder.createBitcast(ops[0], ty);
3200 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3204 cir::VectorType sourceTy = cir::VectorType::get(
3205 ty.getElementType(), builtinID == NEON::BI__builtin_neon_vfmaq_lane_v
3208 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3209 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3213 std::nullopt, ty, loc);
3215 case NEON::BI__builtin_neon_vfma_laneq_v: {
3217 if (ty.getElementType() ==
cgm.doubleTy) {
3218 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
3219 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
3222 cir::VectorType sourceTy = cir::VectorType::get(
cgm.doubleTy, 2);
3223 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3224 laneSource = builder.createExtractElement(
3230 return builder.createBitcast(
3232 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3233 std::nullopt,
cgm.doubleTy, loc),
3237 mlir::Value addend = builder.createBitcast(ops[0], ty);
3238 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3241 cir::VectorType sourceTy =
3242 cir::VectorType::get(ty.getElementType(), ty.getSize() * 2);
3243 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3244 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3248 std::nullopt, ty, loc);
3250 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
3251 mlir::Value addend = builder.createBitcast(ops[0], ty);
3252 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3253 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
3254 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3258 std::nullopt, ty, loc);
3260 case NEON::BI__builtin_neon_vfmah_lane_f16:
3261 case NEON::BI__builtin_neon_vfmas_lane_f32:
3262 case NEON::BI__builtin_neon_vfmah_laneq_f16:
3263 case NEON::BI__builtin_neon_vfmas_laneq_f32: {
3265 mlir::Value laneSource = builder.createExtractElement(
3271 std::nullopt, ty, loc);
3273 case NEON::BI__builtin_neon_vfmad_lane_f64:
3274 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
3277 mlir::Value laneSource = builder.createExtractElement(
3282 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3283 std::nullopt,
cgm.doubleTy, loc);
3285 case NEON::BI__builtin_neon_vmull_v: {
3286 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
3288 intrName =
"aarch64.neon.pmull";
3289 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3291 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
3293 case NEON::BI__builtin_neon_vmax_v:
3294 case NEON::BI__builtin_neon_vmaxq_v:
3295 intrName = usgn ?
"umax" :
"smax";
3296 if (cir::isFPOrVectorOfFPType(ty))
3297 intrName =
"aarch64.neon.fmax";
3299 case NEON::BI__builtin_neon_vmaxh_f16: {
3300 auto halfTy = builder.getFp16Ty();
3301 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmax", halfTy, ops);
3303 case NEON::BI__builtin_neon_vmin_v:
3304 case NEON::BI__builtin_neon_vminq_v:
3305 intrName = usgn ?
"umin" :
"smin";
3306 if (cir::isFPOrVectorOfFPType(ty))
3307 intrName =
"aarch64.neon.fmin";
3309 case NEON::BI__builtin_neon_vminh_f16: {
3310 auto halfTy = builder.getFp16Ty();
3311 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmin", halfTy, ops);
3313 case NEON::BI__builtin_neon_vabd_v:
3314 case NEON::BI__builtin_neon_vabdq_v:
3315 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
3316 if (cir::isFPOrVectorOfFPType(ty))
3317 intrName =
"aarch64.neon.fabd";
3319 case NEON::BI__builtin_neon_vpadal_v:
3320 case NEON::BI__builtin_neon_vpadalq_v: {
3321 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
3323 mlir::Value pairwiseSum =
3325 inputs, intrName, ty, loc);
3326 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
3327 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
3329 case NEON::BI__builtin_neon_vpmin_v:
3330 case NEON::BI__builtin_neon_vpminq_v:
3331 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
3332 if (cir::isFPOrVectorOfFPType(ty))
3333 intrName =
"aarch64.neon.fminp";
3335 case NEON::BI__builtin_neon_vpmax_v:
3336 case NEON::BI__builtin_neon_vpmaxq_v:
3337 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
3338 if (cir::isFPOrVectorOfFPType(ty))
3339 intrName =
"aarch64.neon.fmaxp";
3341 case NEON::BI__builtin_neon_vminnm_v:
3342 case NEON::BI__builtin_neon_vminnmq_v:
3343 intrName =
"aarch64.neon.fminnm";
3345 case NEON::BI__builtin_neon_vminnmh_f16: {
3346 auto halfTy = builder.getFp16Ty();
3347 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fminnm", halfTy, ops);
3349 case NEON::BI__builtin_neon_vmaxnm_v:
3350 case NEON::BI__builtin_neon_vmaxnmq_v:
3351 intrName =
"aarch64.neon.fmaxnm";
3353 case NEON::BI__builtin_neon_vmaxnmh_f16: {
3354 auto halfTy = builder.getFp16Ty();
3355 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmaxnm", halfTy, ops);
3357 case NEON::BI__builtin_neon_vrecpss_f32:
3358 case NEON::BI__builtin_neon_vrecpsd_f64:
3359 cgm.errorNYI(
expr->getSourceRange(),
3360 std::string(
"unimplemented AArch64 builtin call: ") +
3361 getContext().BuiltinInfo.getName(builtinID));
3362 return mlir::Value{};
3363 case NEON::BI__builtin_neon_vrecpsh_f16: {
3364 auto halfTy = builder.getFp16Ty();
3365 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.frecps", halfTy, ops);
3367 case NEON::BI__builtin_neon_vqshrun_n_v: {
3368 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3371 "aarch64.neon.sqshrun", ty, loc);
3373 case NEON::BI__builtin_neon_vqrshrun_n_v: {
3374 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3377 "aarch64.neon.sqrshrun", ty, loc);
3379 case NEON::BI__builtin_neon_vqshrn_n_v: {
3380 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3382 llvm::StringRef intrName =
3383 usgn ?
"aarch64.neon.uqshrn" :
"aarch64.neon.sqshrn";
3387 case NEON::BI__builtin_neon_vrshrn_n_v:
3388 cgm.errorNYI(
expr->getSourceRange(),
3389 std::string(
"unimplemented AArch64 builtin call: ") +
3390 getContext().BuiltinInfo.getName(builtinID));
3391 return mlir::Value{};
3392 case NEON::BI__builtin_neon_vqrshrn_n_v: {
3393 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3395 llvm::StringRef intrName =
3396 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
3400 case NEON::BI__builtin_neon_vrndah_f16: {
3402 mlir::Type halfTy = builder.getFp16Ty();
3404 std::nullopt, halfTy, loc);
3406 case NEON::BI__builtin_neon_vrnda_v:
3407 case NEON::BI__builtin_neon_vrndaq_v:
3411 case NEON::BI__builtin_neon_vrndih_f16: {
3413 mlir::Type halfTy = builder.getFp16Ty();
3415 std::nullopt, halfTy, loc);
3417 case NEON::BI__builtin_neon_vrndmh_f16: {
3419 mlir::Type halfTy = builder.getFp16Ty();
3421 std::nullopt, halfTy, loc);
3423 case NEON::BI__builtin_neon_vrndm_v:
3424 case NEON::BI__builtin_neon_vrndmq_v:
3428 case NEON::BI__builtin_neon_vrndnh_f16: {
3430 mlir::Type halfTy = builder.getFp16Ty();
3432 std::nullopt, halfTy, loc);
3434 case NEON::BI__builtin_neon_vrndn_v:
3435 case NEON::BI__builtin_neon_vrndnq_v:
3438 std::nullopt, ty, loc);
3439 case NEON::BI__builtin_neon_vrndns_f32: {
3441 mlir::Type
floatTy = builder.getSingleTy();
3445 case NEON::BI__builtin_neon_vrndph_f16: {
3447 mlir::Type halfTy = builder.getFp16Ty();
3449 std::nullopt, halfTy, loc);
3451 case NEON::BI__builtin_neon_vrndp_v:
3452 case NEON::BI__builtin_neon_vrndpq_v:
3456 case NEON::BI__builtin_neon_vrndxh_f16: {
3458 mlir::Type halfTy = builder.getFp16Ty();
3460 std::nullopt, halfTy, loc);
3462 case NEON::BI__builtin_neon_vrndx_v:
3463 case NEON::BI__builtin_neon_vrndxq_v:
3467 case NEON::BI__builtin_neon_vrndh_f16: {
3469 mlir::Type halfTy = builder.getFp16Ty();
3471 std::nullopt, halfTy, loc);
3473 case NEON::BI__builtin_neon_vrnd_v:
3474 case NEON::BI__builtin_neon_vrndq_v:
3478 case NEON::BI__builtin_neon_vcvt_f64_v:
3479 case NEON::BI__builtin_neon_vcvtq_f64_v:
3480 ops[0] = builder.createBitcast(ops[0], ty);
3483 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
3484 case NEON::BI__builtin_neon_vcvt_f64_f32: {
3485 auto v2f32 = cir::VectorType::get(
cgm.floatTy, 2);
3486 auto v2f64 = cir::VectorType::get(
cgm.doubleTy, 2);
3487 return builder.createFloatingCast(builder.createBitcast(ops[0], v2f32),
3490 case NEON::BI__builtin_neon_vcvt_f32_f64: {
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], v2f64),
3496 case NEON::BI__builtin_neon_vcvt_s32_v:
3497 case NEON::BI__builtin_neon_vcvt_u32_v:
3498 case NEON::BI__builtin_neon_vcvt_s64_v:
3499 case NEON::BI__builtin_neon_vcvt_u64_v:
3500 case NEON::BI__builtin_neon_vcvt_s16_f16:
3501 case NEON::BI__builtin_neon_vcvt_u16_f16:
3502 case NEON::BI__builtin_neon_vcvtq_s32_v:
3503 case NEON::BI__builtin_neon_vcvtq_u32_v:
3504 case NEON::BI__builtin_neon_vcvtq_s64_v:
3505 case NEON::BI__builtin_neon_vcvtq_u64_v:
3506 case NEON::BI__builtin_neon_vcvtq_s16_f16:
3507 case NEON::BI__builtin_neon_vcvtq_u16_f16:
3509 case NEON::BI__builtin_neon_vcvta_s16_f16:
3510 case NEON::BI__builtin_neon_vcvta_u16_f16:
3511 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
3512 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
3513 cgm.errorNYI(
expr->getSourceRange(),
3514 std::string(
"unimplemented AArch64 builtin call: ") +
3515 getContext().BuiltinInfo.getName(builtinID));
3516 return mlir::Value{};
3517 case NEON::BI__builtin_neon_vcvta_s32_v:
3518 case NEON::BI__builtin_neon_vcvtaq_s32_v:
3519 case NEON::BI__builtin_neon_vcvta_u32_v:
3520 case NEON::BI__builtin_neon_vcvtaq_u32_v:
3521 case NEON::BI__builtin_neon_vcvta_s64_v:
3522 case NEON::BI__builtin_neon_vcvtaq_s64_v:
3523 case NEON::BI__builtin_neon_vcvta_u64_v:
3524 case NEON::BI__builtin_neon_vcvtaq_u64_v: {
3526 llvm::StringRef intrName =
3527 usgn ?
"aarch64.neon.fcvtau" :
"aarch64.neon.fcvtas";
3531 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3532 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3533 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3534 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3535 cgm.errorNYI(
expr->getSourceRange(),
3536 std::string(
"unimplemented AArch64 builtin call: ") +
3537 getContext().BuiltinInfo.getName(builtinID));
3538 return mlir::Value{};
3539 case NEON::BI__builtin_neon_vcvtm_s32_v:
3540 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3541 case NEON::BI__builtin_neon_vcvtm_u32_v:
3542 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3543 case NEON::BI__builtin_neon_vcvtm_s64_v:
3544 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3545 case NEON::BI__builtin_neon_vcvtm_u64_v:
3546 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
3548 llvm::StringRef intrName =
3549 usgn ?
"aarch64.neon.fcvtmu" :
"aarch64.neon.fcvtms";
3553 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3554 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3555 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3556 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3557 cgm.errorNYI(
expr->getSourceRange(),
3558 std::string(
"unimplemented AArch64 builtin call: ") +
3559 getContext().BuiltinInfo.getName(builtinID));
3560 return mlir::Value{};
3562 case NEON::BI__builtin_neon_vcvtn_s32_v:
3563 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3564 case NEON::BI__builtin_neon_vcvtn_u32_v:
3565 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3566 case NEON::BI__builtin_neon_vcvtn_s64_v:
3567 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3568 case NEON::BI__builtin_neon_vcvtn_u64_v:
3569 case NEON::BI__builtin_neon_vcvtnq_u64_v: {
3571 llvm::StringRef intrName =
3572 usgn ?
"aarch64.neon.fcvtnu" :
"aarch64.neon.fcvtns";
3576 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3577 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3578 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3579 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3580 cgm.errorNYI(
expr->getSourceRange(),
3581 std::string(
"unimplemented AArch64 builtin call: ") +
3582 getContext().BuiltinInfo.getName(builtinID));
3583 return mlir::Value{};
3584 case NEON::BI__builtin_neon_vcvtp_s32_v:
3585 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3586 case NEON::BI__builtin_neon_vcvtp_u32_v:
3587 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3588 case NEON::BI__builtin_neon_vcvtp_s64_v:
3589 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3590 case NEON::BI__builtin_neon_vcvtp_u64_v:
3591 case NEON::BI__builtin_neon_vcvtpq_u64_v: {
3593 llvm::StringRef intrName =
3594 usgn ?
"aarch64.neon.fcvtpu" :
"aarch64.neon.fcvtps";
3598 case NEON::BI__builtin_neon_vmulx_v:
3599 case NEON::BI__builtin_neon_vmulxq_v:
3600 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3601 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3602 case NEON::BI__builtin_neon_vmul_lane_v:
3603 case NEON::BI__builtin_neon_vmul_laneq_v:
3604 case NEON::BI__builtin_neon_vpmaxnm_v:
3605 case NEON::BI__builtin_neon_vpmaxnmq_v:
3606 cgm.errorNYI(
expr->getSourceRange(),
3607 std::string(
"unimplemented AArch64 builtin call: ") +
3608 getContext().BuiltinInfo.getName(builtinID));
3609 return mlir::Value{};
3610 case NEON::BI__builtin_neon_vpminnm_v:
3611 case NEON::BI__builtin_neon_vpminnmq_v:
3612 intrName =
"aarch64.neon.fminnmp";
3614 case NEON::BI__builtin_neon_vsqrth_f16: {
3615 mlir::Type halfTy = builder.getFp16Ty();
3617 std::nullopt, halfTy, loc);
3619 case NEON::BI__builtin_neon_vsqrt_v:
3620 case NEON::BI__builtin_neon_vsqrtq_v:
3623 case NEON::BI__builtin_neon_vrbit_v:
3624 case NEON::BI__builtin_neon_vrbitq_v:
3625 case NEON::BI__builtin_neon_vmaxv_f16:
3626 case NEON::BI__builtin_neon_vmaxvq_f16:
3627 case NEON::BI__builtin_neon_vminv_f16:
3628 case NEON::BI__builtin_neon_vminvq_f16:
3629 case NEON::BI__builtin_neon_vmaxnmv_f16:
3630 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3631 case NEON::BI__builtin_neon_vminnmv_f16:
3632 case NEON::BI__builtin_neon_vminnmvq_f16:
3633 case NEON::BI__builtin_neon_vmul_n_f64:
3634 cgm.errorNYI(
expr->getSourceRange(),
3635 std::string(
"unimplemented AArch64 builtin call: ") +
3636 getContext().BuiltinInfo.getName(builtinID));
3637 return mlir::Value{};
3638 case NEON::BI__builtin_neon_vaddlv_u8:
3639 case NEON::BI__builtin_neon_vaddlvq_u8:
3640 case NEON::BI__builtin_neon_vaddlv_u16:
3641 case NEON::BI__builtin_neon_vaddlvq_u16:
3642 case NEON::BI__builtin_neon_vaddlv_s8:
3643 case NEON::BI__builtin_neon_vaddlvq_s8:
3644 case NEON::BI__builtin_neon_vaddlv_s16:
3645 case NEON::BI__builtin_neon_vaddlvq_s16: {
3648 auto eltTy = mlir::cast<cir::IntType>(
3649 mlir::cast<cir::VectorType>(argTy).getElementType());
3654 bool needsTrunc = eltTy.getWidth() == 8;
3655 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3656 mlir::Type intrRetTy = userRetTy;
3658 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3659 mlir::Value result =
3662 result = builder.createIntCast(result, userRetTy);
3665 case NEON::BI__builtin_neon_vsri_n_v:
3666 case NEON::BI__builtin_neon_vsriq_n_v: {
3668 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3669 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3670 "aarch64.neon.vsri", ty, loc);
3672 case NEON::BI__builtin_neon_vsli_n_v:
3673 case NEON::BI__builtin_neon_vsliq_n_v: {
3675 intrName =
"aarch64.neon.vsli";
3683 case NEON::BI__builtin_neon_vsra_n_v:
3684 case NEON::BI__builtin_neon_vsraq_n_v: {
3685 ops[0] = builder.createBitcast(ops[0], ty);
3687 return builder.createAdd(loc, ops[0], ops[1]);
3689 case NEON::BI__builtin_neon_vrsra_n_v:
3690 case NEON::BI__builtin_neon_vrsraq_n_v: {
3691 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3694 cir::VectorType shiftAmtVecTy =
3697 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3701 ops[0] = builder.createBitcast(ops[0], ty);
3702 return builder.createAdd(loc, ops[0], tmp);
3704 case NEON::BI__builtin_neon_vld1_v:
3705 case NEON::BI__builtin_neon_vld1q_v:
3707 case NEON::BI__builtin_neon_vst1_v:
3708 case NEON::BI__builtin_neon_vst1q_v: {
3709 ops[1] = builder.createBitcast(ops[1], ty);
3710 builder.createStore(loc, ops[1], ptrOp0.
withElementType(builder, ty));
3713 case NEON::BI__builtin_neon_vld1_lane_v:
3714 case NEON::BI__builtin_neon_vld1q_lane_v: {
3715 ops[1] = builder.createBitcast(ops[1], ty);
3716 mlir::Value scalar = builder.createLoad(
3718 return cir::VecInsertOp::create(builder, loc, ops[1], scalar, ops[2]);
3720 case NEON::BI__builtin_neon_vld1_dup_v:
3721 case NEON::BI__builtin_neon_vld1q_dup_v: {
3722 mlir::Value scalar = builder.createLoad(
3724 return cir::VecSplatOp::create(builder, loc, ty, scalar);
3726 case NEON::BI__builtin_neon_vldap1_lane_s64:
3727 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3728 cgm.errorNYI(
expr->getSourceRange(),
3729 std::string(
"unimplemented AArch64 builtin call: ") +
3730 getContext().BuiltinInfo.getName(builtinID));
3731 return mlir::Value{};
3732 case NEON::BI__builtin_neon_vst1_lane_v:
3733 case NEON::BI__builtin_neon_vst1q_lane_v: {
3734 ops[1] = builder.createBitcast(ops[1], ty);
3735 mlir::Value scalar = builder.createExtractElement(
3737 builder.createStore(loc, scalar,
3741 case NEON::BI__builtin_neon_vstl1_lane_s64:
3742 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3743 cgm.errorNYI(
expr->getSourceRange(),
3744 std::string(
"unimplemented AArch64 builtin call: ") +
3745 getContext().BuiltinInfo.getName(builtinID));
3746 return mlir::Value{};
3747 case NEON::BI__builtin_neon_vld2_v:
3748 case NEON::BI__builtin_neon_vld2q_v:
3751 case NEON::BI__builtin_neon_vld3_v:
3752 case NEON::BI__builtin_neon_vld3q_v:
3755 case NEON::BI__builtin_neon_vld4_v:
3756 case NEON::BI__builtin_neon_vld4q_v:
3759 case NEON::BI__builtin_neon_vld2_dup_v:
3760 case NEON::BI__builtin_neon_vld2q_dup_v:
3763 case NEON::BI__builtin_neon_vld3_dup_v:
3764 case NEON::BI__builtin_neon_vld3q_dup_v:
3767 case NEON::BI__builtin_neon_vld4_dup_v:
3768 case NEON::BI__builtin_neon_vld4q_dup_v:
3771 case NEON::BI__builtin_neon_vld2_lane_v:
3772 case NEON::BI__builtin_neon_vld2q_lane_v:
3774 *
this, ops, llvm::Intrinsic::aarch64_neon_ld2lane, ty, 2, loc);
3775 case NEON::BI__builtin_neon_vld3_lane_v:
3776 case NEON::BI__builtin_neon_vld3q_lane_v:
3778 *
this, ops, llvm::Intrinsic::aarch64_neon_ld3lane, ty, 3, loc);
3779 case NEON::BI__builtin_neon_vld4_lane_v:
3780 case NEON::BI__builtin_neon_vld4q_lane_v:
3782 *
this, ops, llvm::Intrinsic::aarch64_neon_ld4lane, ty, 4, loc);
3783 case NEON::BI__builtin_neon_vst2_v:
3784 case NEON::BI__builtin_neon_vst2q_v: {
3787 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3792 case NEON::BI__builtin_neon_vst2_lane_v:
3793 case NEON::BI__builtin_neon_vst2q_lane_v: {
3794 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3795 ops[2] = builder.createIntCast(ops[2],
sInt64Ty);
3797 builder.getVoidPtrTy()};
3798 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st2lane",
3801 case NEON::BI__builtin_neon_vst3_v:
3802 case NEON::BI__builtin_neon_vst3q_v: {
3803 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3805 builder.getVoidPtrTy()};
3809 case NEON::BI__builtin_neon_vst3_lane_v:
3810 case NEON::BI__builtin_neon_vst3q_lane_v: {
3811 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3812 ops[3] = builder.createIntCast(ops[3],
sInt64Ty);
3814 builder.getVoidPtrTy()};
3815 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st3lane",
3818 case NEON::BI__builtin_neon_vst4_v:
3819 case NEON::BI__builtin_neon_vst4q_v: {
3820 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3822 builder.getVoidPtrTy()};
3826 case NEON::BI__builtin_neon_vst4_lane_v:
3827 case NEON::BI__builtin_neon_vst4q_lane_v: {
3828 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3829 ops[4] = builder.createIntCast(ops[4],
sInt64Ty);
3831 ty, ty, ty, ty,
sInt64Ty, builder.getVoidPtrTy()};
3832 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st4lane",
3835 case NEON::BI__builtin_neon_vtrn_v:
3836 case NEON::BI__builtin_neon_vtrnq_v: {
3837 ops[1] = builder.createBitcast(ops[1], ty);
3838 ops[2] = builder.createBitcast(ops[2], ty);
3840 mlir::Value baseAddr =
3841 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3844 for (
unsigned vi = 0; vi != 2; ++vi) {
3846 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3847 indices.push_back(i + vi);
3848 indices.push_back(i + e + vi);
3850 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3851 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3852 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3853 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3857 case NEON::BI__builtin_neon_vuzp_v:
3858 case NEON::BI__builtin_neon_vuzpq_v: {
3859 ops[1] = builder.createBitcast(ops[1], ty);
3860 ops[2] = builder.createBitcast(ops[2], ty);
3862 mlir::Value baseAddr =
3863 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3865 for (
unsigned vi = 0; vi != 2; ++vi) {
3867 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3868 indices.push_back(2 * i + vi);
3870 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3871 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3872 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3873 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3877 case NEON::BI__builtin_neon_vzip_v:
3878 case NEON::BI__builtin_neon_vzipq_v: {
3879 ops[1] = builder.createBitcast(ops[1], ty);
3880 ops[2] = builder.createBitcast(ops[2], ty);
3882 mlir::Value baseAddr =
3883 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3885 for (
unsigned vi = 0; vi != 2; ++vi) {
3887 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3888 indices.push_back((i + vi * e) >> 1);
3889 indices.push_back(((i + vi * e) >> 1) + e);
3891 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3892 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3893 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3894 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3898 case NEON::BI__builtin_neon_vqtbl1q_v:
3899 case NEON::BI__builtin_neon_vqtbl2q_v:
3900 case NEON::BI__builtin_neon_vqtbl3q_v:
3901 case NEON::BI__builtin_neon_vqtbl4q_v:
3902 case NEON::BI__builtin_neon_vqtbx1q_v:
3903 case NEON::BI__builtin_neon_vqtbx2q_v:
3904 case NEON::BI__builtin_neon_vqtbx3q_v:
3905 case NEON::BI__builtin_neon_vqtbx4q_v:
3906 cgm.errorNYI(
expr->getSourceRange(),
3907 std::string(
"unimplemented AArch64 builtin call: ") +
3908 getContext().BuiltinInfo.getName(builtinID));
3909 return mlir::Value{};
3910 case NEON::BI__builtin_neon_vsqadd_v:
3911 case NEON::BI__builtin_neon_vsqaddq_v:
3912 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.usqadd", ty,
3914 case NEON::BI__builtin_neon_vuqadd_v:
3915 case NEON::BI__builtin_neon_vuqaddq_v:
3916 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.suqadd", ty,
3918 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3919 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3920 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3921 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3922 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3923 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3924 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3925 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3926 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3927 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3928 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3929 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3930 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3931 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3932 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3933 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3934 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3935 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3936 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3937 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3938 case NEON::BI__builtin_neon_vluti2_lane_f16:
3939 case NEON::BI__builtin_neon_vluti2_lane_p16:
3940 case NEON::BI__builtin_neon_vluti2_lane_p8:
3941 case NEON::BI__builtin_neon_vluti2_lane_s16:
3942 case NEON::BI__builtin_neon_vluti2_lane_s8:
3943 case NEON::BI__builtin_neon_vluti2_lane_u16:
3944 case NEON::BI__builtin_neon_vluti2_lane_u8:
3945 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3946 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3947 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3948 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3949 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3950 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3951 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3952 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3953 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3954 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3955 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3956 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3957 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3958 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3959 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3960 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3961 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3962 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3963 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3964 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3965 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3966 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3967 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3968 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3969 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3970 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3971 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3972 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3973 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3974 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3975 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3976 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3977 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3978 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3979 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3980 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3981 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3982 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3983 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3984 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3985 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3986 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3987 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3988 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3989 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3990 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3991 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3992 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3993 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3994 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3995 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3996 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
3997 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
3998 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
3999 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
4000 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
4001 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
4002 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
4003 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
4004 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
4005 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
4006 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
4007 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
4008 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
4009 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
4010 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
4011 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
4012 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
4013 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
4014 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
4015 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
4016 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
4017 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
4018 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
4019 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
4020 case NEON::BI__builtin_neon_vamin_f16:
4021 case NEON::BI__builtin_neon_vaminq_f16:
4022 case NEON::BI__builtin_neon_vamin_f32:
4023 case NEON::BI__builtin_neon_vaminq_f32:
4024 case NEON::BI__builtin_neon_vaminq_f64:
4025 case NEON::BI__builtin_neon_vamax_f16:
4026 case NEON::BI__builtin_neon_vamaxq_f16:
4027 case NEON::BI__builtin_neon_vamax_f32:
4028 case NEON::BI__builtin_neon_vamaxq_f32:
4029 case NEON::BI__builtin_neon_vamaxq_f64:
4030 case NEON::BI__builtin_neon_vscale_f16:
4031 case NEON::BI__builtin_neon_vscaleq_f16:
4032 case NEON::BI__builtin_neon_vscale_f32:
4033 case NEON::BI__builtin_neon_vscaleq_f32:
4034 case NEON::BI__builtin_neon_vscaleq_f64:
4035 cgm.errorNYI(
expr->getSourceRange(),
4036 std::string(
"unimplemented AArch64 builtin call: ") +
4037 getContext().BuiltinInfo.getName(builtinID));
4038 return mlir::Value{};