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.getFixedSize();
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::getFixed(cgf.
cgm.
doubleTy, 2);
1148 auto v2f32 = cir::VectorType::getFixed(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,
1949 NEON::BI__builtin_neon_vabd_f16,
1950 NEON::BI__builtin_neon_vabd_v,
1953 NEON::BI__builtin_neon_vabdq_f16,
1954 NEON::BI__builtin_neon_vabdq_v,
1957 NEON::BI__builtin_neon_vabs_f16,
1958 NEON::BI__builtin_neon_vabs_v,
1961 NEON::BI__builtin_neon_vabsq_f16,
1962 NEON::BI__builtin_neon_vabsq_v,
1965 NEON::BI__builtin_neon_vcage_f16,
1966 NEON::BI__builtin_neon_vcage_v,
1969 NEON::BI__builtin_neon_vcageq_f16,
1970 NEON::BI__builtin_neon_vcageq_v,
1973 NEON::BI__builtin_neon_vcagt_f16,
1974 NEON::BI__builtin_neon_vcagt_v,
1977 NEON::BI__builtin_neon_vcagtq_f16,
1978 NEON::BI__builtin_neon_vcagtq_v,
1981 NEON::BI__builtin_neon_vcale_f16,
1982 NEON::BI__builtin_neon_vcale_v,
1985 NEON::BI__builtin_neon_vcaleq_f16,
1986 NEON::BI__builtin_neon_vcaleq_v,
1989 NEON::BI__builtin_neon_vcalt_f16,
1990 NEON::BI__builtin_neon_vcalt_v,
1993 NEON::BI__builtin_neon_vcaltq_f16,
1994 NEON::BI__builtin_neon_vcaltq_v,
1997 NEON::BI__builtin_neon_vceqz_f16,
1998 NEON::BI__builtin_neon_vceqz_v,
2001 NEON::BI__builtin_neon_vceqzq_f16,
2002 NEON::BI__builtin_neon_vceqzq_v,
2005 NEON::BI__builtin_neon_vcgez_f16,
2006 NEON::BI__builtin_neon_vcgez_v,
2009 NEON::BI__builtin_neon_vcgezq_f16,
2010 NEON::BI__builtin_neon_vcgezq_v,
2013 NEON::BI__builtin_neon_vcgtz_f16,
2014 NEON::BI__builtin_neon_vcgtz_v,
2017 NEON::BI__builtin_neon_vcgtzq_f16,
2018 NEON::BI__builtin_neon_vcgtzq_v,
2021 NEON::BI__builtin_neon_vclez_f16,
2022 NEON::BI__builtin_neon_vclez_v,
2025 NEON::BI__builtin_neon_vclezq_f16,
2026 NEON::BI__builtin_neon_vclezq_v,
2029 NEON::BI__builtin_neon_vcltz_f16,
2030 NEON::BI__builtin_neon_vcltz_v,
2033 NEON::BI__builtin_neon_vcltzq_f16,
2034 NEON::BI__builtin_neon_vcltzq_v,
2037 NEON::BI__builtin_neon_vfma_f16,
2038 NEON::BI__builtin_neon_vfma_v,
2041 NEON::BI__builtin_neon_vfma_lane_f16,
2042 NEON::BI__builtin_neon_vfma_lane_v,
2045 NEON::BI__builtin_neon_vfma_laneq_f16,
2046 NEON::BI__builtin_neon_vfma_laneq_v,
2049 NEON::BI__builtin_neon_vfmaq_f16,
2050 NEON::BI__builtin_neon_vfmaq_v,
2053 NEON::BI__builtin_neon_vfmaq_lane_f16,
2054 NEON::BI__builtin_neon_vfmaq_lane_v,
2057 NEON::BI__builtin_neon_vfmaq_laneq_f16,
2058 NEON::BI__builtin_neon_vfmaq_laneq_v,
2061 NEON::BI__builtin_neon_vmax_f16,
2062 NEON::BI__builtin_neon_vmax_v,
2065 NEON::BI__builtin_neon_vmaxnm_f16,
2066 NEON::BI__builtin_neon_vmaxnm_v,
2069 NEON::BI__builtin_neon_vmaxnmq_f16,
2070 NEON::BI__builtin_neon_vmaxnmq_v,
2073 NEON::BI__builtin_neon_vmaxq_f16,
2074 NEON::BI__builtin_neon_vmaxq_v,
2077 NEON::BI__builtin_neon_vmin_f16,
2078 NEON::BI__builtin_neon_vmin_v,
2081 NEON::BI__builtin_neon_vminnm_f16,
2082 NEON::BI__builtin_neon_vminnm_v,
2085 NEON::BI__builtin_neon_vminnmq_f16,
2086 NEON::BI__builtin_neon_vminnmq_v,
2089 NEON::BI__builtin_neon_vminq_f16,
2090 NEON::BI__builtin_neon_vminq_v,
2093 NEON::BI__builtin_neon_vmulx_f16,
2094 NEON::BI__builtin_neon_vmulx_v,
2097 NEON::BI__builtin_neon_vmulxq_f16,
2098 NEON::BI__builtin_neon_vmulxq_v,
2101 NEON::BI__builtin_neon_vpadd_f16,
2102 NEON::BI__builtin_neon_vpadd_v,
2105 NEON::BI__builtin_neon_vpaddq_f16,
2106 NEON::BI__builtin_neon_vpaddq_v,
2109 NEON::BI__builtin_neon_vpmax_f16,
2110 NEON::BI__builtin_neon_vpmax_v,
2113 NEON::BI__builtin_neon_vpmaxnm_f16,
2114 NEON::BI__builtin_neon_vpmaxnm_v,
2117 NEON::BI__builtin_neon_vpmaxnmq_f16,
2118 NEON::BI__builtin_neon_vpmaxnmq_v,
2121 NEON::BI__builtin_neon_vpmaxq_f16,
2122 NEON::BI__builtin_neon_vpmaxq_v,
2125 NEON::BI__builtin_neon_vpmin_f16,
2126 NEON::BI__builtin_neon_vpmin_v,
2129 NEON::BI__builtin_neon_vpminnm_f16,
2130 NEON::BI__builtin_neon_vpminnm_v,
2133 NEON::BI__builtin_neon_vpminnmq_f16,
2134 NEON::BI__builtin_neon_vpminnmq_v,
2137 NEON::BI__builtin_neon_vpminq_f16,
2138 NEON::BI__builtin_neon_vpminq_v,
2141 NEON::BI__builtin_neon_vrecpe_f16,
2142 NEON::BI__builtin_neon_vrecpe_v,
2145 NEON::BI__builtin_neon_vrecpeq_f16,
2146 NEON::BI__builtin_neon_vrecpeq_v,
2149 NEON::BI__builtin_neon_vrecps_f16,
2150 NEON::BI__builtin_neon_vrecps_v,
2153 NEON::BI__builtin_neon_vrecpsq_f16,
2154 NEON::BI__builtin_neon_vrecpsq_v,
2157 NEON::BI__builtin_neon_vrnd_f16,
2158 NEON::BI__builtin_neon_vrnd_v,
2161 NEON::BI__builtin_neon_vrnda_f16,
2162 NEON::BI__builtin_neon_vrnda_v,
2165 NEON::BI__builtin_neon_vrndaq_f16,
2166 NEON::BI__builtin_neon_vrndaq_v,
2169 NEON::BI__builtin_neon_vrndi_f16,
2170 NEON::BI__builtin_neon_vrndi_v,
2173 NEON::BI__builtin_neon_vrndiq_f16,
2174 NEON::BI__builtin_neon_vrndiq_v,
2177 NEON::BI__builtin_neon_vrndm_f16,
2178 NEON::BI__builtin_neon_vrndm_v,
2181 NEON::BI__builtin_neon_vrndmq_f16,
2182 NEON::BI__builtin_neon_vrndmq_v,
2185 NEON::BI__builtin_neon_vrndn_f16,
2186 NEON::BI__builtin_neon_vrndn_v,
2189 NEON::BI__builtin_neon_vrndnq_f16,
2190 NEON::BI__builtin_neon_vrndnq_v,
2193 NEON::BI__builtin_neon_vrndp_f16,
2194 NEON::BI__builtin_neon_vrndp_v,
2197 NEON::BI__builtin_neon_vrndpq_f16,
2198 NEON::BI__builtin_neon_vrndpq_v,
2201 NEON::BI__builtin_neon_vrndq_f16,
2202 NEON::BI__builtin_neon_vrndq_v,
2205 NEON::BI__builtin_neon_vrndx_f16,
2206 NEON::BI__builtin_neon_vrndx_v,
2209 NEON::BI__builtin_neon_vrndxq_f16,
2210 NEON::BI__builtin_neon_vrndxq_v,
2213 NEON::BI__builtin_neon_vrsqrte_f16,
2214 NEON::BI__builtin_neon_vrsqrte_v,
2217 NEON::BI__builtin_neon_vrsqrteq_f16,
2218 NEON::BI__builtin_neon_vrsqrteq_v,
2221 NEON::BI__builtin_neon_vrsqrts_f16,
2222 NEON::BI__builtin_neon_vrsqrts_v,
2225 NEON::BI__builtin_neon_vrsqrtsq_f16,
2226 NEON::BI__builtin_neon_vrsqrtsq_v,
2229 NEON::BI__builtin_neon_vsqrt_f16,
2230 NEON::BI__builtin_neon_vsqrt_v,
2233 NEON::BI__builtin_neon_vsqrtq_f16,
2234 NEON::BI__builtin_neon_vsqrtq_v,
2239 {NEON::BI__builtin_neon_vldap1_lane_u64,
2240 NEON::BI__builtin_neon_vldap1_lane_s64},
2241 {NEON::BI__builtin_neon_vldap1_lane_f64,
2242 NEON::BI__builtin_neon_vldap1_lane_s64},
2243 {NEON::BI__builtin_neon_vldap1_lane_p64,
2244 NEON::BI__builtin_neon_vldap1_lane_s64},
2245 {NEON::BI__builtin_neon_vldap1q_lane_u64,
2246 NEON::BI__builtin_neon_vldap1q_lane_s64},
2247 {NEON::BI__builtin_neon_vldap1q_lane_f64,
2248 NEON::BI__builtin_neon_vldap1q_lane_s64},
2249 {NEON::BI__builtin_neon_vldap1q_lane_p64,
2250 NEON::BI__builtin_neon_vldap1q_lane_s64},
2251 {NEON::BI__builtin_neon_vstl1_lane_u64,
2252 NEON::BI__builtin_neon_vstl1_lane_s64},
2253 {NEON::BI__builtin_neon_vstl1_lane_f64,
2254 NEON::BI__builtin_neon_vstl1_lane_s64},
2255 {NEON::BI__builtin_neon_vstl1_lane_p64,
2256 NEON::BI__builtin_neon_vstl1_lane_s64},
2257 {NEON::BI__builtin_neon_vstl1q_lane_u64,
2258 NEON::BI__builtin_neon_vstl1q_lane_s64},
2259 {NEON::BI__builtin_neon_vstl1q_lane_f64,
2260 NEON::BI__builtin_neon_vstl1q_lane_s64},
2261 {NEON::BI__builtin_neon_vstl1q_lane_p64,
2262 NEON::BI__builtin_neon_vstl1q_lane_s64},
2268 llvm::Triple::ArchType arch) {
2277 if (builtinID == Builtin::BI__builtin_cpu_supports) {
2278 cgm.errorNYI(
expr->getSourceRange(),
2279 std::string(
"unimplemented AArch64 builtin call: ") +
2280 getContext().BuiltinInfo.getName(builtinID));
2281 return mlir::Value{};
2284 switch (builtinID) {
2287 case clang::AArch64::BI__builtin_arm_nop:
2288 case clang::AArch64::BI__builtin_arm_yield:
2289 case clang::AArch64::BI__yield:
2290 case clang::AArch64::BI__builtin_arm_wfe:
2291 case clang::AArch64::BI__wfe:
2292 case clang::AArch64::BI__builtin_arm_wfi:
2293 case clang::AArch64::BI__wfi:
2294 case clang::AArch64::BI__builtin_arm_sev:
2295 case clang::AArch64::BI__sev:
2296 case clang::AArch64::BI__builtin_arm_sevl:
2297 case clang::AArch64::BI__sevl:
2298 cgm.errorNYI(
expr->getSourceRange(),
2299 std::string(
"unimplemented AArch64 builtin call: ") +
2300 getContext().BuiltinInfo.getName(builtinID));
2301 return mlir::Value{};
2304 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
2305 cgm.errorNYI(
expr->getSourceRange(),
2306 std::string(
"unimplemented AArch64 builtin call: ") +
2307 getContext().BuiltinInfo.getName(builtinID));
2308 return mlir::Value{};
2311 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
2312 cgm.errorNYI(
expr->getSourceRange(),
2313 std::string(
"unimplemented AArch64 builtin call: ") +
2314 getContext().BuiltinInfo.getName(builtinID));
2315 return mlir::Value{};
2318 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
2319 cgm.errorNYI(
expr->getSourceRange(),
2320 std::string(
"unimplemented AArch64 builtin call: ") +
2321 getContext().BuiltinInfo.getName(builtinID));
2322 return mlir::Value{};
2324 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
2325 cgm.errorNYI(
expr->getSourceRange(),
2326 std::string(
"unimplemented AArch64 builtin call: ") +
2327 getContext().BuiltinInfo.getName(builtinID));
2328 return mlir::Value{};
2331 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
2332 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
2333 cgm.errorNYI(
expr->getSourceRange(),
2334 std::string(
"unimplemented AArch64 builtin call: ") +
2335 getContext().BuiltinInfo.getName(builtinID));
2336 return mlir::Value{};
2339 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
2340 cgm.errorNYI(
expr->getSourceRange(),
2341 std::string(
"unimplemented AArch64 builtin call: ") +
2342 getContext().BuiltinInfo.getName(builtinID));
2343 return mlir::Value{};
2345 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
2346 cgm.errorNYI(
expr->getSourceRange(),
2347 std::string(
"unimplemented AArch64 builtin call: ") +
2348 getContext().BuiltinInfo.getName(builtinID));
2349 return mlir::Value{};
2352 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
2353 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
2354 cgm.errorNYI(
expr->getSourceRange(),
2355 std::string(
"unimplemented AArch64 builtin call: ") +
2356 getContext().BuiltinInfo.getName(builtinID));
2357 return mlir::Value{};
2360 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
2361 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
2362 cgm.errorNYI(
expr->getSourceRange(),
2363 std::string(
"unimplemented AArch64 builtin call: ") +
2364 getContext().BuiltinInfo.getName(builtinID));
2365 return mlir::Value{};
2368 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
2369 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
2370 cgm.errorNYI(
expr->getSourceRange(),
2371 std::string(
"unimplemented AArch64 builtin call: ") +
2372 getContext().BuiltinInfo.getName(builtinID));
2373 return mlir::Value{};
2376 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
2377 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
2378 cgm.errorNYI(
expr->getSourceRange(),
2379 std::string(
"unimplemented AArch64 builtin call: ") +
2380 getContext().BuiltinInfo.getName(builtinID));
2381 return mlir::Value{};
2384 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
2385 cgm.errorNYI(
expr->getSourceRange(),
2386 std::string(
"unimplemented AArch64 builtin call: ") +
2387 getContext().BuiltinInfo.getName(builtinID));
2388 return mlir::Value{};
2391 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
2392 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
2393 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
2394 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2395 cgm.errorNYI(
expr->getSourceRange(),
2396 std::string(
"unimplemented AArch64 builtin call: ") +
2397 getContext().BuiltinInfo.getName(builtinID));
2398 return mlir::Value{};
2401 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2402 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
2403 cgm.errorNYI(
expr->getSourceRange(),
2404 std::string(
"unimplemented AArch64 builtin call: ") +
2405 getContext().BuiltinInfo.getName(builtinID));
2406 return mlir::Value{};
2409 if (builtinID == clang::AArch64::BI__clear_cache) {
2410 cgm.errorNYI(
expr->getSourceRange(),
2411 std::string(
"unimplemented AArch64 builtin call: ") +
2412 getContext().BuiltinInfo.getName(builtinID));
2413 return mlir::Value{};
2416 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2417 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2419 cgm.errorNYI(
expr->getSourceRange(),
2420 std::string(
"unimplemented AArch64 builtin call: ") +
2421 getContext().BuiltinInfo.getName(builtinID));
2422 return mlir::Value{};
2424 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2425 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2426 cgm.errorNYI(
expr->getSourceRange(),
2427 std::string(
"unimplemented AArch64 builtin call: ") +
2428 getContext().BuiltinInfo.getName(builtinID));
2429 return mlir::Value{};
2432 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2433 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
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) {
2443 cgm.errorNYI(
expr->getSourceRange(),
2444 std::string(
"unimplemented AArch64 builtin call: ") +
2445 getContext().BuiltinInfo.getName(builtinID));
2446 return mlir::Value{};
2449 if (builtinID == clang::AArch64::BI__getReg ||
2450 builtinID == clang::AArch64::BI__setReg ||
2451 builtinID == clang::AArch64::BI__getRegFp ||
2452 builtinID == clang::AArch64::BI__setRegFp) {
2453 cgm.errorNYI(
expr->getSourceRange(),
2454 std::string(
"unimplemented AArch64 builtin call: ") +
2455 getContext().BuiltinInfo.getName(builtinID));
2456 return mlir::Value{};
2459 if (builtinID == clang::AArch64::BI__break) {
2460 cgm.errorNYI(
expr->getSourceRange(),
2461 std::string(
"unimplemented AArch64 builtin call: ") +
2462 getContext().BuiltinInfo.getName(builtinID));
2463 return mlir::Value{};
2466 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2467 cgm.errorNYI(
expr->getSourceRange(),
2468 std::string(
"unimplemented AArch64 builtin call: ") +
2469 getContext().BuiltinInfo.getName(builtinID));
2470 return mlir::Value{};
2473 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2474 cgm.errorNYI(
expr->getSourceRange(),
2475 std::string(
"unimplemented AArch64 builtin call: ") +
2476 getContext().BuiltinInfo.getName(builtinID));
2477 return mlir::Value{};
2481 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2482 switch (builtinID) {
2483 case clang::AArch64::BI__builtin_arm_crc32b:
2484 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2486 case clang::AArch64::BI__builtin_arm_crc32cb:
2487 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2489 case clang::AArch64::BI__builtin_arm_crc32h:
2490 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2492 case clang::AArch64::BI__builtin_arm_crc32ch:
2493 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2495 case clang::AArch64::BI__builtin_arm_crc32w:
2496 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2498 case clang::AArch64::BI__builtin_arm_crc32cw:
2499 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2501 case clang::AArch64::BI__builtin_arm_crc32d:
2502 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2504 case clang::AArch64::BI__builtin_arm_crc32cd:
2505 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2509 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2510 cgm.errorNYI(
expr->getSourceRange(),
2511 std::string(
"unimplemented AArch64 builtin call: ") +
2512 getContext().BuiltinInfo.getName(builtinID));
2513 return mlir::Value{};
2517 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2518 cgm.errorNYI(
expr->getSourceRange(),
2519 std::string(
"unimplemented AArch64 builtin call: ") +
2520 getContext().BuiltinInfo.getName(builtinID));
2521 return mlir::Value{};
2525 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2526 switch (builtinID) {
2527 case clang::AArch64::BI__builtin_arm_irg:
2528 mteIntrinsicID = Intrinsic::aarch64_irg;
2530 case clang::AArch64::BI__builtin_arm_addg:
2531 mteIntrinsicID = Intrinsic::aarch64_addg;
2533 case clang::AArch64::BI__builtin_arm_gmi:
2534 mteIntrinsicID = Intrinsic::aarch64_gmi;
2536 case clang::AArch64::BI__builtin_arm_ldg:
2537 mteIntrinsicID = Intrinsic::aarch64_ldg;
2539 case clang::AArch64::BI__builtin_arm_stg:
2540 mteIntrinsicID = Intrinsic::aarch64_stg;
2542 case clang::AArch64::BI__builtin_arm_subp:
2543 mteIntrinsicID = Intrinsic::aarch64_subp;
2547 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
2548 cgm.errorNYI(
expr->getSourceRange(),
2549 std::string(
"unimplemented AArch64 builtin call: ") +
2550 getContext().BuiltinInfo.getName(builtinID));
2551 return mlir::Value{};
2554 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
2555 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2556 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2557 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2558 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2559 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2560 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2561 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2562 cgm.errorNYI(
expr->getSourceRange(),
2563 std::string(
"unimplemented AArch64 builtin call: ") +
2564 getContext().BuiltinInfo.getName(builtinID));
2565 return mlir::Value{};
2568 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2569 builtinID == clang::AArch64::BI_WriteStatusReg ||
2570 builtinID == clang::AArch64::BI__sys) {
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_AddressOfReturnAddress) {
2578 cgm.errorNYI(
expr->getSourceRange(),
2579 std::string(
"unimplemented AArch64 builtin call: ") +
2580 getContext().BuiltinInfo.getName(builtinID));
2581 return mlir::Value{};
2584 if (builtinID == clang::AArch64::BI__builtin_sponentry) {
2585 cgm.errorNYI(
expr->getSourceRange(),
2586 std::string(
"unimplemented AArch64 builtin call: ") +
2587 getContext().BuiltinInfo.getName(builtinID));
2588 return mlir::Value{};
2591 if (builtinID == clang::AArch64::BI__mulh ||
2592 builtinID == clang::AArch64::BI__umulh) {
2593 cgm.errorNYI(
expr->getSourceRange(),
2594 std::string(
"unimplemented AArch64 builtin call: ") +
2595 getContext().BuiltinInfo.getName(builtinID));
2596 return mlir::Value{};
2599 if (builtinID == AArch64::BI__writex18byte ||
2600 builtinID == AArch64::BI__writex18word ||
2601 builtinID == AArch64::BI__writex18dword ||
2602 builtinID == AArch64::BI__writex18qword) {
2603 cgm.errorNYI(
expr->getSourceRange(),
2604 std::string(
"unimplemented AArch64 builtin call: ") +
2605 getContext().BuiltinInfo.getName(builtinID));
2606 return mlir::Value{};
2609 if (builtinID == AArch64::BI__readx18byte ||
2610 builtinID == AArch64::BI__readx18word ||
2611 builtinID == AArch64::BI__readx18dword ||
2612 builtinID == AArch64::BI__readx18qword) {
2613 cgm.errorNYI(
expr->getSourceRange(),
2614 std::string(
"unimplemented AArch64 builtin call: ") +
2615 getContext().BuiltinInfo.getName(builtinID));
2616 return mlir::Value{};
2619 if (builtinID == AArch64::BI__addx18byte ||
2620 builtinID == AArch64::BI__addx18word ||
2621 builtinID == AArch64::BI__addx18dword ||
2622 builtinID == AArch64::BI__addx18qword ||
2623 builtinID == AArch64::BI__incx18byte ||
2624 builtinID == AArch64::BI__incx18word ||
2625 builtinID == AArch64::BI__incx18dword ||
2626 builtinID == AArch64::BI__incx18qword) {
2627 cgm.errorNYI(
expr->getSourceRange(),
2628 std::string(
"unimplemented AArch64 builtin call: ") +
2629 getContext().BuiltinInfo.getName(builtinID));
2630 return mlir::Value{};
2633 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2634 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2635 builtinID == AArch64::BI_CopyInt32FromFloat ||
2636 builtinID == AArch64::BI_CopyInt64FromDouble) {
2637 cgm.errorNYI(
expr->getSourceRange(),
2638 std::string(
"unimplemented AArch64 builtin call: ") +
2639 getContext().BuiltinInfo.getName(builtinID));
2640 return mlir::Value{};
2643 if (builtinID == AArch64::BI_CountLeadingOnes ||
2644 builtinID == AArch64::BI_CountLeadingOnes64 ||
2645 builtinID == AArch64::BI_CountLeadingZeros ||
2646 builtinID == AArch64::BI_CountLeadingZeros64) {
2647 cgm.errorNYI(
expr->getSourceRange(),
2648 std::string(
"unimplemented AArch64 builtin call: ") +
2649 getContext().BuiltinInfo.getName(builtinID));
2650 return mlir::Value{};
2653 if (builtinID == AArch64::BI_CountLeadingSigns ||
2654 builtinID == AArch64::BI_CountLeadingSigns64) {
2655 cgm.errorNYI(
expr->getSourceRange(),
2656 std::string(
"unimplemented AArch64 builtin call: ") +
2657 getContext().BuiltinInfo.getName(builtinID));
2658 return mlir::Value{};
2661 if (builtinID == AArch64::BI_CountOneBits ||
2662 builtinID == AArch64::BI_CountOneBits64 ||
2663 builtinID == AArch64::BI_CountTrailingZeros ||
2664 builtinID == AArch64::BI_CountTrailingZeros64) {
2665 cgm.errorNYI(
expr->getSourceRange(),
2666 std::string(
"unimplemented AArch64 builtin call: ") +
2667 getContext().BuiltinInfo.getName(builtinID));
2668 return mlir::Value{};
2671 if (builtinID == AArch64::BI__prefetch ||
2672 builtinID == AArch64::BI__prefetch2) {
2673 cgm.errorNYI(
expr->getSourceRange(),
2674 std::string(
"unimplemented AArch64 builtin call: ") +
2675 getContext().BuiltinInfo.getName(builtinID));
2676 return mlir::Value{};
2679 if (builtinID == AArch64::BI__hlt) {
2680 cgm.errorNYI(
expr->getSourceRange(),
2681 std::string(
"unimplemented AArch64 builtin call: ") +
2682 getContext().BuiltinInfo.getName(builtinID));
2683 return mlir::Value{};
2686 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2687 cgm.errorNYI(
expr->getSourceRange(),
2688 std::string(
"unimplemented AArch64 builtin call: ") +
2689 getContext().BuiltinInfo.getName(builtinID));
2690 return mlir::Value{};
2701 return p.first == builtinID;
2704 builtinID = it->second;
2709 unsigned iceArguments = 0;
2724 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2725 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2727 switch (builtinID) {
2728 case NEON::BI__builtin_neon_vld1_v:
2729 case NEON::BI__builtin_neon_vld1q_v:
2730 case NEON::BI__builtin_neon_vld1_dup_v:
2731 case NEON::BI__builtin_neon_vld1q_dup_v:
2732 case NEON::BI__builtin_neon_vld1_lane_v:
2733 case NEON::BI__builtin_neon_vld1q_lane_v:
2734 case NEON::BI__builtin_neon_vst1_v:
2735 case NEON::BI__builtin_neon_vst1q_v:
2736 case NEON::BI__builtin_neon_vst1_lane_v:
2737 case NEON::BI__builtin_neon_vst1q_lane_v:
2738 case NEON::BI__builtin_neon_vstrq_p128:
2739 case NEON::BI__builtin_neon_vst2_v:
2740 case NEON::BI__builtin_neon_vst2q_v:
2741 case NEON::BI__builtin_neon_vst2_lane_v:
2742 case NEON::BI__builtin_neon_vst2q_lane_v:
2743 case NEON::BI__builtin_neon_vst3_v:
2744 case NEON::BI__builtin_neon_vst3q_v:
2745 case NEON::BI__builtin_neon_vst3_lane_v:
2746 case NEON::BI__builtin_neon_vst3q_lane_v:
2747 case NEON::BI__builtin_neon_vst4_v:
2748 case NEON::BI__builtin_neon_vst4q_v:
2749 case NEON::BI__builtin_neon_vst4_lane_v:
2750 case NEON::BI__builtin_neon_vst4q_lane_v:
2756 case NEON::BI__builtin_neon_vldap1_lane_s64:
2757 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2758 case NEON::BI__builtin_neon_vstl1_lane_s64:
2759 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2761 expr->getSourceRange(),
2762 std::string(
"unimplemented AArch64 builtin argument handling ") +
2763 getContext().BuiltinInfo.getName(builtinID));
2784 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2788 if (std::optional<llvm::APSInt> result =
2792 bool usgn =
type.isUnsigned();
2794 mlir::Location loc =
getLoc(
expr->getExprLoc());
2808 switch (builtinID) {
2811 case NEON::BI__builtin_neon_vabsh_f16: {
2812 mlir::Type halfTy = builder.getFp16Ty();
2814 std::nullopt, halfTy, loc);
2816 case NEON::BI__builtin_neon_vaddq_p128: {
2817 cir::VectorType byteTy =
2818 cir::VectorType::getFixed(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::getFixed(
cgm.floatTy, 4);
3151 auto v4f16 = cir::VectorType::getFixed(
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::getFixed(
cgm.floatTy, 4);
3157 auto v4f16 = cir::VectorType::getFixed(
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::getFixed(
3205 ty.getElementType(), builtinID == NEON::BI__builtin_neon_vfmaq_lane_v
3206 ? ty.getFixedSize() / 2
3207 : ty.getFixedSize());
3208 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3210 emitNeonSplat(builder, loc, laneSource, ops[3], ty.getFixedSize());
3214 std::nullopt, ty, loc);
3216 case NEON::BI__builtin_neon_vfma_laneq_v: {
3218 if (ty.getElementType() ==
cgm.doubleTy) {
3219 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
3220 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
3223 cir::VectorType sourceTy = cir::VectorType::getFixed(
cgm.doubleTy, 2);
3224 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3225 laneSource = builder.createExtractElement(
3231 return builder.createBitcast(
3233 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3234 std::nullopt,
cgm.doubleTy, loc),
3238 mlir::Value addend = builder.createBitcast(ops[0], ty);
3239 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3242 cir::VectorType sourceTy =
3243 cir::VectorType::getFixed(ty.getElementType(), ty.getFixedSize() * 2);
3244 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3246 emitNeonSplat(builder, loc, laneSource, ops[3], ty.getFixedSize());
3250 std::nullopt, ty, loc);
3252 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
3253 mlir::Value addend = builder.createBitcast(ops[0], ty);
3254 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3255 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
3257 emitNeonSplat(builder, loc, laneSource, ops[3], ty.getFixedSize());
3261 std::nullopt, ty, loc);
3263 case NEON::BI__builtin_neon_vfmah_lane_f16:
3264 case NEON::BI__builtin_neon_vfmas_lane_f32:
3265 case NEON::BI__builtin_neon_vfmah_laneq_f16:
3266 case NEON::BI__builtin_neon_vfmas_laneq_f32: {
3268 mlir::Value laneSource = builder.createExtractElement(
3274 std::nullopt, ty, loc);
3276 case NEON::BI__builtin_neon_vfmad_lane_f64:
3277 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
3280 mlir::Value laneSource = builder.createExtractElement(
3285 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3286 std::nullopt,
cgm.doubleTy, loc);
3288 case NEON::BI__builtin_neon_vmull_v: {
3289 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
3291 intrName =
"aarch64.neon.pmull";
3292 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3294 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
3296 case NEON::BI__builtin_neon_vmax_v:
3297 case NEON::BI__builtin_neon_vmaxq_v:
3298 intrName = usgn ?
"umax" :
"smax";
3299 if (cir::isFPOrVectorOfFPType(ty))
3300 intrName =
"aarch64.neon.fmax";
3302 case NEON::BI__builtin_neon_vmaxh_f16: {
3303 auto halfTy = builder.getFp16Ty();
3304 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmax", halfTy, ops);
3306 case NEON::BI__builtin_neon_vmin_v:
3307 case NEON::BI__builtin_neon_vminq_v:
3308 intrName = usgn ?
"umin" :
"smin";
3309 if (cir::isFPOrVectorOfFPType(ty))
3310 intrName =
"aarch64.neon.fmin";
3312 case NEON::BI__builtin_neon_vminh_f16: {
3313 auto halfTy = builder.getFp16Ty();
3314 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmin", halfTy, ops);
3316 case NEON::BI__builtin_neon_vabd_v:
3317 case NEON::BI__builtin_neon_vabdq_v:
3318 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
3319 if (cir::isFPOrVectorOfFPType(ty))
3320 intrName =
"aarch64.neon.fabd";
3322 case NEON::BI__builtin_neon_vpadal_v:
3323 case NEON::BI__builtin_neon_vpadalq_v: {
3324 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
3326 mlir::Value pairwiseSum =
3328 inputs, intrName, ty, loc);
3329 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
3330 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
3332 case NEON::BI__builtin_neon_vpmin_v:
3333 case NEON::BI__builtin_neon_vpminq_v:
3334 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
3335 if (cir::isFPOrVectorOfFPType(ty))
3336 intrName =
"aarch64.neon.fminp";
3338 case NEON::BI__builtin_neon_vpmax_v:
3339 case NEON::BI__builtin_neon_vpmaxq_v:
3340 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
3341 if (cir::isFPOrVectorOfFPType(ty))
3342 intrName =
"aarch64.neon.fmaxp";
3344 case NEON::BI__builtin_neon_vminnm_v:
3345 case NEON::BI__builtin_neon_vminnmq_v:
3346 intrName =
"aarch64.neon.fminnm";
3348 case NEON::BI__builtin_neon_vminnmh_f16: {
3349 auto halfTy = builder.getFp16Ty();
3350 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fminnm", halfTy, ops);
3352 case NEON::BI__builtin_neon_vmaxnm_v:
3353 case NEON::BI__builtin_neon_vmaxnmq_v:
3354 intrName =
"aarch64.neon.fmaxnm";
3356 case NEON::BI__builtin_neon_vmaxnmh_f16: {
3357 auto halfTy = builder.getFp16Ty();
3358 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmaxnm", halfTy, ops);
3360 case NEON::BI__builtin_neon_vrecpss_f32:
3361 case NEON::BI__builtin_neon_vrecpsd_f64:
3362 cgm.errorNYI(
expr->getSourceRange(),
3363 std::string(
"unimplemented AArch64 builtin call: ") +
3364 getContext().BuiltinInfo.getName(builtinID));
3365 return mlir::Value{};
3366 case NEON::BI__builtin_neon_vrecpsh_f16: {
3367 auto halfTy = builder.getFp16Ty();
3368 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.frecps", halfTy, ops);
3370 case NEON::BI__builtin_neon_vqshrun_n_v: {
3371 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3374 "aarch64.neon.sqshrun", ty, loc);
3376 case NEON::BI__builtin_neon_vqrshrun_n_v: {
3377 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3380 "aarch64.neon.sqrshrun", ty, loc);
3382 case NEON::BI__builtin_neon_vqshrn_n_v: {
3383 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3385 llvm::StringRef intrName =
3386 usgn ?
"aarch64.neon.uqshrn" :
"aarch64.neon.sqshrn";
3390 case NEON::BI__builtin_neon_vrshrn_n_v:
3391 cgm.errorNYI(
expr->getSourceRange(),
3392 std::string(
"unimplemented AArch64 builtin call: ") +
3393 getContext().BuiltinInfo.getName(builtinID));
3394 return mlir::Value{};
3395 case NEON::BI__builtin_neon_vqrshrn_n_v: {
3396 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3398 llvm::StringRef intrName =
3399 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
3403 case NEON::BI__builtin_neon_vrndah_f16: {
3405 mlir::Type halfTy = builder.getFp16Ty();
3407 std::nullopt, halfTy, loc);
3409 case NEON::BI__builtin_neon_vrnda_v:
3410 case NEON::BI__builtin_neon_vrndaq_v:
3414 case NEON::BI__builtin_neon_vrndih_f16: {
3416 mlir::Type halfTy = builder.getFp16Ty();
3418 std::nullopt, halfTy, loc);
3420 case NEON::BI__builtin_neon_vrndmh_f16: {
3422 mlir::Type halfTy = builder.getFp16Ty();
3424 std::nullopt, halfTy, loc);
3426 case NEON::BI__builtin_neon_vrndm_v:
3427 case NEON::BI__builtin_neon_vrndmq_v:
3431 case NEON::BI__builtin_neon_vrndnh_f16: {
3433 mlir::Type halfTy = builder.getFp16Ty();
3435 std::nullopt, halfTy, loc);
3437 case NEON::BI__builtin_neon_vrndn_v:
3438 case NEON::BI__builtin_neon_vrndnq_v:
3441 std::nullopt, ty, loc);
3442 case NEON::BI__builtin_neon_vrndns_f32: {
3444 mlir::Type
floatTy = builder.getSingleTy();
3448 case NEON::BI__builtin_neon_vrndph_f16: {
3450 mlir::Type halfTy = builder.getFp16Ty();
3452 std::nullopt, halfTy, loc);
3454 case NEON::BI__builtin_neon_vrndp_v:
3455 case NEON::BI__builtin_neon_vrndpq_v:
3459 case NEON::BI__builtin_neon_vrndxh_f16: {
3461 mlir::Type halfTy = builder.getFp16Ty();
3463 std::nullopt, halfTy, loc);
3465 case NEON::BI__builtin_neon_vrndx_v:
3466 case NEON::BI__builtin_neon_vrndxq_v:
3470 case NEON::BI__builtin_neon_vrndh_f16: {
3472 mlir::Type halfTy = builder.getFp16Ty();
3474 std::nullopt, halfTy, loc);
3476 case NEON::BI__builtin_neon_vrnd_v:
3477 case NEON::BI__builtin_neon_vrndq_v:
3481 case NEON::BI__builtin_neon_vcvt_f64_v:
3482 case NEON::BI__builtin_neon_vcvtq_f64_v:
3483 ops[0] = builder.createBitcast(ops[0], ty);
3486 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
3487 case NEON::BI__builtin_neon_vcvt_f64_f32: {
3488 auto v2f32 = cir::VectorType::getFixed(
cgm.floatTy, 2);
3489 auto v2f64 = cir::VectorType::getFixed(
cgm.doubleTy, 2);
3490 return builder.createFloatingCast(builder.createBitcast(ops[0], v2f32),
3493 case NEON::BI__builtin_neon_vcvt_f32_f64: {
3494 auto v2f32 = cir::VectorType::getFixed(
cgm.floatTy, 2);
3495 auto v2f64 = cir::VectorType::getFixed(
cgm.doubleTy, 2);
3496 return builder.createFloatingCast(builder.createBitcast(ops[0], v2f64),
3499 case NEON::BI__builtin_neon_vcvt_s32_v:
3500 case NEON::BI__builtin_neon_vcvt_u32_v:
3501 case NEON::BI__builtin_neon_vcvt_s64_v:
3502 case NEON::BI__builtin_neon_vcvt_u64_v:
3503 case NEON::BI__builtin_neon_vcvt_s16_f16:
3504 case NEON::BI__builtin_neon_vcvt_u16_f16:
3505 case NEON::BI__builtin_neon_vcvtq_s32_v:
3506 case NEON::BI__builtin_neon_vcvtq_u32_v:
3507 case NEON::BI__builtin_neon_vcvtq_s64_v:
3508 case NEON::BI__builtin_neon_vcvtq_u64_v:
3509 case NEON::BI__builtin_neon_vcvtq_s16_f16:
3510 case NEON::BI__builtin_neon_vcvtq_u16_f16:
3512 case NEON::BI__builtin_neon_vcvta_s16_f16:
3513 case NEON::BI__builtin_neon_vcvta_u16_f16:
3514 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
3515 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
3516 cgm.errorNYI(
expr->getSourceRange(),
3517 std::string(
"unimplemented AArch64 builtin call: ") +
3518 getContext().BuiltinInfo.getName(builtinID));
3519 return mlir::Value{};
3520 case NEON::BI__builtin_neon_vcvta_s32_v:
3521 case NEON::BI__builtin_neon_vcvtaq_s32_v:
3522 case NEON::BI__builtin_neon_vcvta_u32_v:
3523 case NEON::BI__builtin_neon_vcvtaq_u32_v:
3524 case NEON::BI__builtin_neon_vcvta_s64_v:
3525 case NEON::BI__builtin_neon_vcvtaq_s64_v:
3526 case NEON::BI__builtin_neon_vcvta_u64_v:
3527 case NEON::BI__builtin_neon_vcvtaq_u64_v: {
3529 llvm::StringRef intrName =
3530 usgn ?
"aarch64.neon.fcvtau" :
"aarch64.neon.fcvtas";
3534 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3535 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3536 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3537 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3538 cgm.errorNYI(
expr->getSourceRange(),
3539 std::string(
"unimplemented AArch64 builtin call: ") +
3540 getContext().BuiltinInfo.getName(builtinID));
3541 return mlir::Value{};
3542 case NEON::BI__builtin_neon_vcvtm_s32_v:
3543 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3544 case NEON::BI__builtin_neon_vcvtm_u32_v:
3545 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3546 case NEON::BI__builtin_neon_vcvtm_s64_v:
3547 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3548 case NEON::BI__builtin_neon_vcvtm_u64_v:
3549 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
3551 llvm::StringRef intrName =
3552 usgn ?
"aarch64.neon.fcvtmu" :
"aarch64.neon.fcvtms";
3556 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3557 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3558 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3559 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3560 cgm.errorNYI(
expr->getSourceRange(),
3561 std::string(
"unimplemented AArch64 builtin call: ") +
3562 getContext().BuiltinInfo.getName(builtinID));
3563 return mlir::Value{};
3565 case NEON::BI__builtin_neon_vcvtn_s32_v:
3566 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3567 case NEON::BI__builtin_neon_vcvtn_u32_v:
3568 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3569 case NEON::BI__builtin_neon_vcvtn_s64_v:
3570 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3571 case NEON::BI__builtin_neon_vcvtn_u64_v:
3572 case NEON::BI__builtin_neon_vcvtnq_u64_v: {
3574 llvm::StringRef intrName =
3575 usgn ?
"aarch64.neon.fcvtnu" :
"aarch64.neon.fcvtns";
3579 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3580 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3581 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3582 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3583 cgm.errorNYI(
expr->getSourceRange(),
3584 std::string(
"unimplemented AArch64 builtin call: ") +
3585 getContext().BuiltinInfo.getName(builtinID));
3586 return mlir::Value{};
3587 case NEON::BI__builtin_neon_vcvtp_s32_v:
3588 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3589 case NEON::BI__builtin_neon_vcvtp_u32_v:
3590 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3591 case NEON::BI__builtin_neon_vcvtp_s64_v:
3592 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3593 case NEON::BI__builtin_neon_vcvtp_u64_v:
3594 case NEON::BI__builtin_neon_vcvtpq_u64_v: {
3596 llvm::StringRef intrName =
3597 usgn ?
"aarch64.neon.fcvtpu" :
"aarch64.neon.fcvtps";
3601 case NEON::BI__builtin_neon_vmulx_v:
3602 case NEON::BI__builtin_neon_vmulxq_v:
3603 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3604 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3605 case NEON::BI__builtin_neon_vmul_lane_v:
3606 case NEON::BI__builtin_neon_vmul_laneq_v:
3607 case NEON::BI__builtin_neon_vpmaxnm_v:
3608 case NEON::BI__builtin_neon_vpmaxnmq_v:
3609 cgm.errorNYI(
expr->getSourceRange(),
3610 std::string(
"unimplemented AArch64 builtin call: ") +
3611 getContext().BuiltinInfo.getName(builtinID));
3612 return mlir::Value{};
3613 case NEON::BI__builtin_neon_vpminnm_v:
3614 case NEON::BI__builtin_neon_vpminnmq_v:
3615 intrName =
"aarch64.neon.fminnmp";
3617 case NEON::BI__builtin_neon_vsqrth_f16: {
3618 mlir::Type halfTy = builder.getFp16Ty();
3620 std::nullopt, halfTy, loc);
3622 case NEON::BI__builtin_neon_vsqrt_v:
3623 case NEON::BI__builtin_neon_vsqrtq_v:
3626 case NEON::BI__builtin_neon_vrbit_v:
3627 case NEON::BI__builtin_neon_vrbitq_v:
3628 case NEON::BI__builtin_neon_vmaxv_f16:
3629 case NEON::BI__builtin_neon_vmaxvq_f16:
3630 case NEON::BI__builtin_neon_vminv_f16:
3631 case NEON::BI__builtin_neon_vminvq_f16:
3632 case NEON::BI__builtin_neon_vmaxnmv_f16:
3633 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3634 case NEON::BI__builtin_neon_vminnmv_f16:
3635 case NEON::BI__builtin_neon_vminnmvq_f16:
3636 case NEON::BI__builtin_neon_vmul_n_f64:
3637 cgm.errorNYI(
expr->getSourceRange(),
3638 std::string(
"unimplemented AArch64 builtin call: ") +
3639 getContext().BuiltinInfo.getName(builtinID));
3640 return mlir::Value{};
3641 case NEON::BI__builtin_neon_vaddlv_u8:
3642 case NEON::BI__builtin_neon_vaddlvq_u8:
3643 case NEON::BI__builtin_neon_vaddlv_u16:
3644 case NEON::BI__builtin_neon_vaddlvq_u16:
3645 case NEON::BI__builtin_neon_vaddlv_s8:
3646 case NEON::BI__builtin_neon_vaddlvq_s8:
3647 case NEON::BI__builtin_neon_vaddlv_s16:
3648 case NEON::BI__builtin_neon_vaddlvq_s16: {
3651 auto eltTy = mlir::cast<cir::IntType>(
3652 mlir::cast<cir::VectorType>(argTy).getElementType());
3657 bool needsTrunc = eltTy.getWidth() == 8;
3658 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3659 mlir::Type intrRetTy = userRetTy;
3661 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3662 mlir::Value result =
3665 result = builder.createIntCast(result, userRetTy);
3668 case NEON::BI__builtin_neon_vsri_n_v:
3669 case NEON::BI__builtin_neon_vsriq_n_v: {
3671 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3672 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3673 "aarch64.neon.vsri", ty, loc);
3675 case NEON::BI__builtin_neon_vsli_n_v:
3676 case NEON::BI__builtin_neon_vsliq_n_v: {
3678 intrName =
"aarch64.neon.vsli";
3686 case NEON::BI__builtin_neon_vsra_n_v:
3687 case NEON::BI__builtin_neon_vsraq_n_v: {
3688 ops[0] = builder.createBitcast(ops[0], ty);
3690 return builder.createAdd(loc, ops[0], ops[1]);
3692 case NEON::BI__builtin_neon_vrsra_n_v:
3693 case NEON::BI__builtin_neon_vrsraq_n_v: {
3694 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3697 cir::VectorType shiftAmtVecTy =
3700 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3704 ops[0] = builder.createBitcast(ops[0], ty);
3705 return builder.createAdd(loc, ops[0], tmp);
3707 case NEON::BI__builtin_neon_vld1_v:
3708 case NEON::BI__builtin_neon_vld1q_v:
3710 case NEON::BI__builtin_neon_vst1_v:
3711 case NEON::BI__builtin_neon_vst1q_v: {
3712 ops[1] = builder.createBitcast(ops[1], ty);
3713 builder.createStore(loc, ops[1], ptrOp0.
withElementType(builder, ty));
3716 case NEON::BI__builtin_neon_vld1_lane_v:
3717 case NEON::BI__builtin_neon_vld1q_lane_v: {
3718 ops[1] = builder.createBitcast(ops[1], ty);
3719 mlir::Value scalar = builder.createLoad(
3721 return cir::VecInsertOp::create(builder, loc, ops[1], scalar, ops[2]);
3723 case NEON::BI__builtin_neon_vld1_dup_v:
3724 case NEON::BI__builtin_neon_vld1q_dup_v: {
3725 mlir::Value scalar = builder.createLoad(
3727 return cir::VecSplatOp::create(builder, loc, ty, scalar);
3729 case NEON::BI__builtin_neon_vldap1_lane_s64:
3730 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3731 cgm.errorNYI(
expr->getSourceRange(),
3732 std::string(
"unimplemented AArch64 builtin call: ") +
3733 getContext().BuiltinInfo.getName(builtinID));
3734 return mlir::Value{};
3735 case NEON::BI__builtin_neon_vst1_lane_v:
3736 case NEON::BI__builtin_neon_vst1q_lane_v: {
3737 ops[1] = builder.createBitcast(ops[1], ty);
3738 mlir::Value scalar = builder.createExtractElement(
3740 builder.createStore(loc, scalar,
3744 case NEON::BI__builtin_neon_vstl1_lane_s64:
3745 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3746 cgm.errorNYI(
expr->getSourceRange(),
3747 std::string(
"unimplemented AArch64 builtin call: ") +
3748 getContext().BuiltinInfo.getName(builtinID));
3749 return mlir::Value{};
3750 case NEON::BI__builtin_neon_vld2_v:
3751 case NEON::BI__builtin_neon_vld2q_v:
3754 case NEON::BI__builtin_neon_vld3_v:
3755 case NEON::BI__builtin_neon_vld3q_v:
3758 case NEON::BI__builtin_neon_vld4_v:
3759 case NEON::BI__builtin_neon_vld4q_v:
3762 case NEON::BI__builtin_neon_vld2_dup_v:
3763 case NEON::BI__builtin_neon_vld2q_dup_v:
3766 case NEON::BI__builtin_neon_vld3_dup_v:
3767 case NEON::BI__builtin_neon_vld3q_dup_v:
3770 case NEON::BI__builtin_neon_vld4_dup_v:
3771 case NEON::BI__builtin_neon_vld4q_dup_v:
3774 case NEON::BI__builtin_neon_vld2_lane_v:
3775 case NEON::BI__builtin_neon_vld2q_lane_v:
3777 *
this, ops, llvm::Intrinsic::aarch64_neon_ld2lane, ty, 2, loc);
3778 case NEON::BI__builtin_neon_vld3_lane_v:
3779 case NEON::BI__builtin_neon_vld3q_lane_v:
3781 *
this, ops, llvm::Intrinsic::aarch64_neon_ld3lane, ty, 3, loc);
3782 case NEON::BI__builtin_neon_vld4_lane_v:
3783 case NEON::BI__builtin_neon_vld4q_lane_v:
3785 *
this, ops, llvm::Intrinsic::aarch64_neon_ld4lane, ty, 4, loc);
3786 case NEON::BI__builtin_neon_vst2_v:
3787 case NEON::BI__builtin_neon_vst2q_v: {
3790 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3795 case NEON::BI__builtin_neon_vst2_lane_v:
3796 case NEON::BI__builtin_neon_vst2q_lane_v: {
3797 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3798 ops[2] = builder.createIntCast(ops[2],
sInt64Ty);
3800 builder.getVoidPtrTy()};
3801 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st2lane",
3804 case NEON::BI__builtin_neon_vst3_v:
3805 case NEON::BI__builtin_neon_vst3q_v: {
3806 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3808 builder.getVoidPtrTy()};
3812 case NEON::BI__builtin_neon_vst3_lane_v:
3813 case NEON::BI__builtin_neon_vst3q_lane_v: {
3814 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3815 ops[3] = builder.createIntCast(ops[3],
sInt64Ty);
3817 builder.getVoidPtrTy()};
3818 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st3lane",
3821 case NEON::BI__builtin_neon_vst4_v:
3822 case NEON::BI__builtin_neon_vst4q_v: {
3823 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3825 builder.getVoidPtrTy()};
3829 case NEON::BI__builtin_neon_vst4_lane_v:
3830 case NEON::BI__builtin_neon_vst4q_lane_v: {
3831 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3832 ops[4] = builder.createIntCast(ops[4],
sInt64Ty);
3834 ty, ty, ty, ty,
sInt64Ty, builder.getVoidPtrTy()};
3835 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st4lane",
3838 case NEON::BI__builtin_neon_vtrn_v:
3839 case NEON::BI__builtin_neon_vtrnq_v: {
3840 ops[1] = builder.createBitcast(ops[1], ty);
3841 ops[2] = builder.createBitcast(ops[2], ty);
3843 mlir::Value baseAddr =
3844 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3847 for (
unsigned vi = 0; vi != 2; ++vi) {
3849 for (
unsigned i = 0, e = ty.getFixedSize(); i != e; i += 2) {
3850 indices.push_back(i + vi);
3851 indices.push_back(i + e + vi);
3853 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3854 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3855 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3856 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3860 case NEON::BI__builtin_neon_vuzp_v:
3861 case NEON::BI__builtin_neon_vuzpq_v: {
3862 ops[1] = builder.createBitcast(ops[1], ty);
3863 ops[2] = builder.createBitcast(ops[2], ty);
3865 mlir::Value baseAddr =
3866 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3868 for (
unsigned vi = 0; vi != 2; ++vi) {
3870 for (
unsigned i = 0, e = ty.getFixedSize(); i != e; ++i) {
3871 indices.push_back(2 * i + vi);
3873 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3874 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3875 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3876 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3880 case NEON::BI__builtin_neon_vzip_v:
3881 case NEON::BI__builtin_neon_vzipq_v: {
3882 ops[1] = builder.createBitcast(ops[1], ty);
3883 ops[2] = builder.createBitcast(ops[2], ty);
3885 mlir::Value baseAddr =
3886 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3888 for (
unsigned vi = 0; vi != 2; ++vi) {
3890 for (
unsigned i = 0, e = ty.getFixedSize(); i != e; i += 2) {
3891 indices.push_back((i + vi * e) >> 1);
3892 indices.push_back(((i + vi * e) >> 1) + e);
3894 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3895 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3896 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3897 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3901 case NEON::BI__builtin_neon_vqtbl1q_v:
3902 case NEON::BI__builtin_neon_vqtbl2q_v:
3903 case NEON::BI__builtin_neon_vqtbl3q_v:
3904 case NEON::BI__builtin_neon_vqtbl4q_v:
3905 case NEON::BI__builtin_neon_vqtbx1q_v:
3906 case NEON::BI__builtin_neon_vqtbx2q_v:
3907 case NEON::BI__builtin_neon_vqtbx3q_v:
3908 case NEON::BI__builtin_neon_vqtbx4q_v:
3909 cgm.errorNYI(
expr->getSourceRange(),
3910 std::string(
"unimplemented AArch64 builtin call: ") +
3911 getContext().BuiltinInfo.getName(builtinID));
3912 return mlir::Value{};
3913 case NEON::BI__builtin_neon_vsqadd_v:
3914 case NEON::BI__builtin_neon_vsqaddq_v:
3915 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.usqadd", ty,
3917 case NEON::BI__builtin_neon_vuqadd_v:
3918 case NEON::BI__builtin_neon_vuqaddq_v:
3919 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.suqadd", ty,
3921 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3922 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3923 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3924 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3925 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3926 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3927 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3928 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3929 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3930 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3931 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3932 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3933 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3934 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3935 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3936 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3937 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3938 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3939 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3940 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3941 case NEON::BI__builtin_neon_vluti2_lane_f16:
3942 case NEON::BI__builtin_neon_vluti2_lane_p16:
3943 case NEON::BI__builtin_neon_vluti2_lane_p8:
3944 case NEON::BI__builtin_neon_vluti2_lane_s16:
3945 case NEON::BI__builtin_neon_vluti2_lane_s8:
3946 case NEON::BI__builtin_neon_vluti2_lane_u16:
3947 case NEON::BI__builtin_neon_vluti2_lane_u8:
3948 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3949 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3950 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3951 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3952 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3953 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3954 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3955 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3956 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3957 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3958 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3959 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3960 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3961 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3962 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3963 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3964 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3965 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3966 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3967 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3968 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3969 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3970 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3971 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3972 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3973 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3974 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3975 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3976 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3977 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3978 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3979 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3980 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3981 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3982 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3983 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3984 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3985 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3986 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3987 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3988 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3989 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3990 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3991 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3992 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3993 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3994 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3995 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3996 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3997 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3998 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3999 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
4000 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
4001 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
4002 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
4003 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
4004 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
4005 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
4006 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
4007 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
4008 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
4009 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
4010 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
4011 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
4012 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
4013 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
4014 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
4015 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
4016 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
4017 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
4018 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
4019 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
4020 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
4021 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
4022 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
4023 case NEON::BI__builtin_neon_vamin_f16:
4024 case NEON::BI__builtin_neon_vaminq_f16:
4025 case NEON::BI__builtin_neon_vamin_f32:
4026 case NEON::BI__builtin_neon_vaminq_f32:
4027 case NEON::BI__builtin_neon_vaminq_f64:
4028 case NEON::BI__builtin_neon_vamax_f16:
4029 case NEON::BI__builtin_neon_vamaxq_f16:
4030 case NEON::BI__builtin_neon_vamax_f32:
4031 case NEON::BI__builtin_neon_vamaxq_f32:
4032 case NEON::BI__builtin_neon_vamaxq_f64:
4033 case NEON::BI__builtin_neon_vscale_f16:
4034 case NEON::BI__builtin_neon_vscaleq_f16:
4035 case NEON::BI__builtin_neon_vscale_f32:
4036 case NEON::BI__builtin_neon_vscaleq_f32:
4037 case NEON::BI__builtin_neon_vscaleq_f64:
4038 cgm.errorNYI(
expr->getSourceRange(),
4039 std::string(
"unimplemented AArch64 builtin call: ") +
4040 getContext().BuiltinInfo.getName(builtinID));
4041 return mlir::Value{};