830 unsigned altLLVMIntrinsic,
const char *nameHint,
unsigned modifier,
832 mlir::Location loc = cgf.
getLoc(
expr->getExprLoc());
839 std::optional<llvm::APSInt> neonTypeConst = arg->getIntegerConstantExpr(ctx);
848 const bool isQuad = neonType.
isQuad();
857 cir::VectorType vTy =
getNeonType(&cgf, neonType, hasLegalHalfType,
858 false, allowBFloatArgsAndRet);
859 cir::VectorType ty = vTy;
864 case NEON::BI__builtin_neon_splat_lane_v:
865 case NEON::BI__builtin_neon_splat_laneq_v:
866 case NEON::BI__builtin_neon_splatq_lane_v:
867 case NEON::BI__builtin_neon_splatq_laneq_v: {
868 uint64_t numElements = vTy.getSize();
869 if (builtinID == NEON::BI__builtin_neon_splatq_lane_v)
871 if (builtinID == NEON::BI__builtin_neon_splat_laneq_v)
876 case NEON::BI__builtin_neon_vpadd_v:
877 case NEON::BI__builtin_neon_vpaddq_v:
878 case NEON::BI__builtin_neon_vabs_v:
879 case NEON::BI__builtin_neon_vabsq_v:
881 std::string(
"unimplemented AArch64 builtin call: ") +
883 return mlir::Value{};
884 case NEON::BI__builtin_neon_vadd_v:
885 case NEON::BI__builtin_neon_vaddq_v: {
886 unsigned numBytes = (builtinID == NEON::BI__builtin_neon_vaddq_v) ? 16 : 8;
887 cir::VectorType byteTy =
894 case NEON::BI__builtin_neon_vaddhn_v: {
897 cir::VectorType srcTy =
907 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
909 loc, wideEltTy, wideEltTy.getWidth() / 2);
910 mlir::Value shiftVec =
918 case NEON::BI__builtin_neon_vsubhn_v: {
921 cir::VectorType srcTy =
931 auto wideEltTy = mlir::cast<cir::IntType>(srcTy.getElementType());
933 loc, wideEltTy, wideEltTy.getWidth() / 2);
934 mlir::Value shiftVec =
942 case NEON::BI__builtin_neon_vcale_v:
943 case NEON::BI__builtin_neon_vcaleq_v:
944 case NEON::BI__builtin_neon_vcalt_v:
945 case NEON::BI__builtin_neon_vcaltq_v:
946 case NEON::BI__builtin_neon_vcage_v:
947 case NEON::BI__builtin_neon_vcageq_v:
948 case NEON::BI__builtin_neon_vcagt_v:
949 case NEON::BI__builtin_neon_vcagtq_v:
951 std::string(
"unimplemented AArch64 builtin call: ") +
953 return mlir::Value{};
954 case NEON::BI__builtin_neon_vceqz_v:
955 case NEON::BI__builtin_neon_vceqzq_v:
957 vTy, cir::CmpOpKind::eq);
958 case NEON::BI__builtin_neon_vcgez_v:
959 case NEON::BI__builtin_neon_vcgezq_v:
960 case NEON::BI__builtin_neon_vclez_v:
961 case NEON::BI__builtin_neon_vclezq_v:
962 case NEON::BI__builtin_neon_vcgtz_v:
963 case NEON::BI__builtin_neon_vcgtzq_v:
964 case NEON::BI__builtin_neon_vcltz_v:
965 case NEON::BI__builtin_neon_vcltzq_v:
966 case NEON::BI__builtin_neon_vclz_v:
967 case NEON::BI__builtin_neon_vclzq_v:
969 std::string(
"unimplemented AArch64 builtin call: ") +
971 return mlir::Value{};
972 case NEON::BI__builtin_neon_vcvt_f32_v:
973 case NEON::BI__builtin_neon_vcvtq_f32_v: {
979 case NEON::BI__builtin_neon_vcvt_f16_s16:
980 case NEON::BI__builtin_neon_vcvt_f16_u16:
981 case NEON::BI__builtin_neon_vcvtq_f16_s16:
982 case NEON::BI__builtin_neon_vcvtq_f16_u16:
983 case NEON::BI__builtin_neon_vcvt_n_f16_s16:
984 case NEON::BI__builtin_neon_vcvt_n_f16_u16:
985 case NEON::BI__builtin_neon_vcvtq_n_f16_s16:
986 case NEON::BI__builtin_neon_vcvtq_n_f16_u16:
988 std::string(
"unimplemented AArch64 builtin call: ") +
990 return mlir::Value{};
991 case NEON::BI__builtin_neon_vcvt_n_f32_v:
992 case NEON::BI__builtin_neon_vcvt_n_f64_v:
993 case NEON::BI__builtin_neon_vcvtq_n_f32_v:
994 case NEON::BI__builtin_neon_vcvtq_n_f64_v: {
997 llvm::StringRef llvmIntrName =
999 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1001 {vTy, cstIntTy}, ops, llvmIntrName,
1004 case NEON::BI__builtin_neon_vcvt_n_s16_f16:
1005 case NEON::BI__builtin_neon_vcvt_n_s32_v:
1006 case NEON::BI__builtin_neon_vcvt_n_u16_f16:
1007 case NEON::BI__builtin_neon_vcvt_n_u32_v:
1008 case NEON::BI__builtin_neon_vcvt_n_s64_v:
1009 case NEON::BI__builtin_neon_vcvt_n_u64_v:
1010 case NEON::BI__builtin_neon_vcvtq_n_s16_f16:
1011 case NEON::BI__builtin_neon_vcvtq_n_s32_v:
1012 case NEON::BI__builtin_neon_vcvtq_n_u16_f16:
1013 case NEON::BI__builtin_neon_vcvtq_n_u32_v:
1014 case NEON::BI__builtin_neon_vcvtq_n_s64_v:
1015 case NEON::BI__builtin_neon_vcvtq_n_u64_v: {
1017 mlir::Type cstIntTy = cgf.
sInt32Ty;
1019 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1022 {getFloatNeonType(cgf, neonType), cstIntTy}, ops,
1026 case NEON::BI__builtin_neon_vcvt_s32_v:
1027 case NEON::BI__builtin_neon_vcvt_u32_v:
1028 case NEON::BI__builtin_neon_vcvt_s64_v:
1029 case NEON::BI__builtin_neon_vcvt_u64_v:
1030 case NEON::BI__builtin_neon_vcvt_s16_f16:
1031 case NEON::BI__builtin_neon_vcvt_u16_f16:
1032 case NEON::BI__builtin_neon_vcvtq_s32_v:
1033 case NEON::BI__builtin_neon_vcvtq_u32_v:
1034 case NEON::BI__builtin_neon_vcvtq_s64_v:
1035 case NEON::BI__builtin_neon_vcvtq_u64_v:
1036 case NEON::BI__builtin_neon_vcvtq_s16_f16:
1037 case NEON::BI__builtin_neon_vcvtq_u16_f16: {
1047 llvm::StringRef llvmIntrName = usgn ?
"fptoui.sat" :
"fptosi.sat";
1049 {ty}, ops, llvmIntrName, vTy, loc);
1051 case NEON::BI__builtin_neon_vcvta_s16_f16:
1052 case NEON::BI__builtin_neon_vcvta_s32_v:
1053 case NEON::BI__builtin_neon_vcvta_s64_v:
1054 case NEON::BI__builtin_neon_vcvta_u16_f16:
1055 case NEON::BI__builtin_neon_vcvta_u32_v:
1056 case NEON::BI__builtin_neon_vcvta_u64_v:
1057 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
1058 case NEON::BI__builtin_neon_vcvtaq_s32_v:
1059 case NEON::BI__builtin_neon_vcvtaq_s64_v:
1060 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
1061 case NEON::BI__builtin_neon_vcvtaq_u32_v:
1062 case NEON::BI__builtin_neon_vcvtaq_u64_v:
1063 case NEON::BI__builtin_neon_vcvtn_s16_f16:
1064 case NEON::BI__builtin_neon_vcvtn_s32_v:
1065 case NEON::BI__builtin_neon_vcvtn_s64_v:
1066 case NEON::BI__builtin_neon_vcvtn_u16_f16:
1067 case NEON::BI__builtin_neon_vcvtn_u32_v:
1068 case NEON::BI__builtin_neon_vcvtn_u64_v:
1069 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
1070 case NEON::BI__builtin_neon_vcvtnq_s32_v:
1071 case NEON::BI__builtin_neon_vcvtnq_s64_v:
1072 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
1073 case NEON::BI__builtin_neon_vcvtnq_u32_v:
1074 case NEON::BI__builtin_neon_vcvtnq_u64_v:
1075 case NEON::BI__builtin_neon_vcvtp_s16_f16:
1076 case NEON::BI__builtin_neon_vcvtp_s32_v:
1077 case NEON::BI__builtin_neon_vcvtp_s64_v:
1078 case NEON::BI__builtin_neon_vcvtp_u16_f16:
1079 case NEON::BI__builtin_neon_vcvtp_u32_v:
1080 case NEON::BI__builtin_neon_vcvtp_u64_v:
1081 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
1082 case NEON::BI__builtin_neon_vcvtpq_s32_v:
1083 case NEON::BI__builtin_neon_vcvtpq_s64_v:
1084 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
1085 case NEON::BI__builtin_neon_vcvtpq_u32_v:
1086 case NEON::BI__builtin_neon_vcvtpq_u64_v:
1087 case NEON::BI__builtin_neon_vcvtm_s16_f16:
1088 case NEON::BI__builtin_neon_vcvtm_s32_v:
1089 case NEON::BI__builtin_neon_vcvtm_s64_v:
1090 case NEON::BI__builtin_neon_vcvtm_u16_f16:
1091 case NEON::BI__builtin_neon_vcvtm_u32_v:
1092 case NEON::BI__builtin_neon_vcvtm_u64_v:
1093 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
1094 case NEON::BI__builtin_neon_vcvtmq_s32_v:
1095 case NEON::BI__builtin_neon_vcvtmq_s64_v:
1096 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
1097 case NEON::BI__builtin_neon_vcvtmq_u32_v:
1098 case NEON::BI__builtin_neon_vcvtmq_u64_v:
1100 std::string(
"unimplemented AArch64 builtin call: ") +
1102 return mlir::Value{};
1103 case NEON::BI__builtin_neon_vcvtx_f32_v: {
1105 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1106 auto v2f64 = cir::VectorType::get(cgf.
cgm.
doubleTy, 2);
1107 auto v2f32 = cir::VectorType::get(cgf.
cgm.
floatTy, 2);
1109 {v2f64}, ops, llvmIntrName,
1112 case NEON::BI__builtin_neon_vext_v:
1113 case NEON::BI__builtin_neon_vextq_v:
1115 std::string(
"unimplemented AArch64 builtin call: ") +
1117 return mlir::Value{};
1118 case NEON::BI__builtin_neon_vfma_v:
1119 case NEON::BI__builtin_neon_vfmaq_v: {
1128 fmaOps, std::nullopt, ty, loc);
1130 case NEON::BI__builtin_neon_vld1_x2_v:
1131 case NEON::BI__builtin_neon_vld1q_x2_v:
1132 case NEON::BI__builtin_neon_vld1_x3_v:
1133 case NEON::BI__builtin_neon_vld1q_x3_v:
1134 case NEON::BI__builtin_neon_vld1_x4_v:
1135 case NEON::BI__builtin_neon_vld1q_x4_v:
1138 case NEON::BI__builtin_neon_vld1_v:
1139 case NEON::BI__builtin_neon_vld1q_v:
1140 case NEON::BI__builtin_neon_vld2_v:
1141 case NEON::BI__builtin_neon_vld2q_v:
1142 case NEON::BI__builtin_neon_vld3_v:
1143 case NEON::BI__builtin_neon_vld3q_v:
1144 case NEON::BI__builtin_neon_vld4_v:
1145 case NEON::BI__builtin_neon_vld4q_v:
1146 case NEON::BI__builtin_neon_vld2_dup_v:
1147 case NEON::BI__builtin_neon_vld2q_dup_v:
1148 case NEON::BI__builtin_neon_vld3_dup_v:
1149 case NEON::BI__builtin_neon_vld3q_dup_v:
1150 case NEON::BI__builtin_neon_vld4_dup_v:
1151 case NEON::BI__builtin_neon_vld4q_dup_v:
1152 case NEON::BI__builtin_neon_vld1_dup_v:
1153 case NEON::BI__builtin_neon_vld1q_dup_v:
1154 case NEON::BI__builtin_neon_vld2_lane_v:
1155 case NEON::BI__builtin_neon_vld2q_lane_v:
1156 case NEON::BI__builtin_neon_vld3_lane_v:
1157 case NEON::BI__builtin_neon_vld3q_lane_v:
1158 case NEON::BI__builtin_neon_vld4_lane_v:
1159 case NEON::BI__builtin_neon_vld4q_lane_v:
1161 std::string(
"Reached code-path for ARM builtin call ") +
1163 "(ARM builtins are not supported ATM)");
1164 return mlir::Value{};
1165 case NEON::BI__builtin_neon_vmovl_v: {
1166 cir::VectorType dTy =
1172 case NEON::BI__builtin_neon_vmovn_v:
1173 case NEON::BI__builtin_neon_vmull_v:
1174 case NEON::BI__builtin_neon_vpadal_v:
1175 case NEON::BI__builtin_neon_vpadalq_v:
1177 std::string(
"Reached code-path for ARM builtin call ") +
1179 "(ARM builtins are not supported ATM)");
1180 return mlir::Value{};
1181 case NEON::BI__builtin_neon_vpaddl_v:
1182 case NEON::BI__builtin_neon_vpaddlq_v: {
1183 llvm::StringRef llvmIntrName =
1185 usgn ? llvmIntrinsic : altLLVMIntrinsic));
1187 {getNeonPairwiseWidenInputType(vTy, usgn)},
1191 case NEON::BI__builtin_neon_vqdmlal_v:
1192 case NEON::BI__builtin_neon_vqdmlsl_v:
1193 case NEON::BI__builtin_neon_vqdmulhq_lane_v:
1194 case NEON::BI__builtin_neon_vqdmulh_lane_v:
1195 case NEON::BI__builtin_neon_vqrdmulhq_lane_v:
1196 case NEON::BI__builtin_neon_vqrdmulh_lane_v:
1197 case NEON::BI__builtin_neon_vqdmulhq_laneq_v:
1198 case NEON::BI__builtin_neon_vqdmulh_laneq_v:
1199 case NEON::BI__builtin_neon_vqrdmulhq_laneq_v:
1200 case NEON::BI__builtin_neon_vqrdmulh_laneq_v:
1201 case NEON::BI__builtin_neon_vqshl_n_v:
1202 case NEON::BI__builtin_neon_vqshlq_n_v:
1203 case NEON::BI__builtin_neon_vqshlu_n_v:
1204 case NEON::BI__builtin_neon_vqshluq_n_v:
1205 case NEON::BI__builtin_neon_vrecpe_v:
1206 case NEON::BI__builtin_neon_vrecpeq_v:
1207 case NEON::BI__builtin_neon_vrsqrte_v:
1208 case NEON::BI__builtin_neon_vrsqrteq_v:
1210 std::string(
"unimplemented AArch64 builtin call: ") +
1212 return mlir::Value{};
1213 case NEON::BI__builtin_neon_vrndi_v:
1214 case NEON::BI__builtin_neon_vrndiq_v:
1217 ops, std::nullopt, ty, loc);
1218 case NEON::BI__builtin_neon_vrshr_n_v:
1219 case NEON::BI__builtin_neon_vrshrq_n_v: {
1220 llvm::StringRef intrName =
1221 usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
1224 {ty, usgn ? getSignChangedVectorType(cgf.getBuilder(), ty) : ty}, ops,
1225 intrName, ty, loc,
false,
1229 case NEON::BI__builtin_neon_vsha512hq_u64:
1230 case NEON::BI__builtin_neon_vsha512h2q_u64:
1231 case NEON::BI__builtin_neon_vsha512su0q_u64:
1232 case NEON::BI__builtin_neon_vsha512su1q_u64:
1234 std::string(
"unimplemented AArch64 builtin call: ") +
1236 return mlir::Value{};
1237 case NEON::BI__builtin_neon_vshl_n_v:
1238 case NEON::BI__builtin_neon_vshlq_n_v:
1241 case NEON::BI__builtin_neon_vshll_n_v: {
1243 cir::VectorType narrowVecTy =
1247 mlir::Value src = builder.
createBitcast(ops[0], narrowVecTy);
1252 case NEON::BI__builtin_neon_vshrn_n_v:
1254 std::string(
"unimplemented AArch64 builtin call: ") +
1256 return mlir::Value{};
1257 case NEON::BI__builtin_neon_vshr_n_v:
1258 case NEON::BI__builtin_neon_vshrq_n_v:
1260 case NEON::BI__builtin_neon_vst1_v:
1261 case NEON::BI__builtin_neon_vst1q_v:
1262 case NEON::BI__builtin_neon_vst2_v:
1263 case NEON::BI__builtin_neon_vst2q_v:
1264 case NEON::BI__builtin_neon_vst3_v:
1265 case NEON::BI__builtin_neon_vst3q_v:
1266 case NEON::BI__builtin_neon_vst4_v:
1267 case NEON::BI__builtin_neon_vst4q_v:
1268 case NEON::BI__builtin_neon_vst2_lane_v:
1269 case NEON::BI__builtin_neon_vst2q_lane_v:
1270 case NEON::BI__builtin_neon_vst3_lane_v:
1271 case NEON::BI__builtin_neon_vst3q_lane_v:
1272 case NEON::BI__builtin_neon_vst4_lane_v:
1273 case NEON::BI__builtin_neon_vst4q_lane_v:
1274 case NEON::BI__builtin_neon_vsm3partw1q_u32:
1275 case NEON::BI__builtin_neon_vsm3partw2q_u32:
1276 case NEON::BI__builtin_neon_vsm3ss1q_u32:
1277 case NEON::BI__builtin_neon_vsm4ekeyq_u32:
1278 case NEON::BI__builtin_neon_vsm4eq_u32:
1279 case NEON::BI__builtin_neon_vsm3tt1aq_u32:
1280 case NEON::BI__builtin_neon_vsm3tt1bq_u32:
1281 case NEON::BI__builtin_neon_vsm3tt2aq_u32:
1282 case NEON::BI__builtin_neon_vsm3tt2bq_u32:
1284 std::string(
"unimplemented AArch64 builtin call: ") +
1286 return mlir::Value{};
1287 case NEON::BI__builtin_neon_vst1_x2_v:
1288 case NEON::BI__builtin_neon_vst1q_x2_v:
1289 case NEON::BI__builtin_neon_vst1_x3_v:
1290 case NEON::BI__builtin_neon_vst1q_x3_v:
1291 case NEON::BI__builtin_neon_vst1_x4_v:
1292 case NEON::BI__builtin_neon_vst1q_x4_v: {
1295 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
1299 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1303 case NEON::BI__builtin_neon_vtrn_v:
1304 case NEON::BI__builtin_neon_vtrnq_v:
1305 case NEON::BI__builtin_neon_vtst_v:
1306 case NEON::BI__builtin_neon_vtstq_v:
1307 case NEON::BI__builtin_neon_vuzp_v:
1308 case NEON::BI__builtin_neon_vuzpq_v:
1309 case NEON::BI__builtin_neon_vxarq_u64:
1310 case NEON::BI__builtin_neon_vzip_v:
1311 case NEON::BI__builtin_neon_vzipq_v:
1312 case NEON::BI__builtin_neon_vdot_s32:
1313 case NEON::BI__builtin_neon_vdot_u32:
1314 case NEON::BI__builtin_neon_vdotq_s32:
1315 case NEON::BI__builtin_neon_vdotq_u32:
1316 case NEON::BI__builtin_neon_vfmlal_low_f16:
1317 case NEON::BI__builtin_neon_vfmlalq_low_f16:
1318 case NEON::BI__builtin_neon_vfmlsl_low_f16:
1319 case NEON::BI__builtin_neon_vfmlslq_low_f16:
1320 case NEON::BI__builtin_neon_vfmlal_high_f16:
1321 case NEON::BI__builtin_neon_vfmlalq_high_f16:
1322 case NEON::BI__builtin_neon_vfmlsl_high_f16:
1323 case NEON::BI__builtin_neon_vfmlslq_high_f16:
1324 case NEON::BI__builtin_neon_vmmlaq_s32:
1325 case NEON::BI__builtin_neon_vmmlaq_u32:
1327 std::string(
"unimplemented AArch64 builtin call: ") +
1329 return mlir::Value{};
1330 case NEON::BI__builtin_neon_vmul_v:
1331 case NEON::BI__builtin_neon_vmulq_v:
1334 case NEON::BI__builtin_neon_vusmmlaq_s32:
1335 case NEON::BI__builtin_neon_vusdot_s32:
1336 case NEON::BI__builtin_neon_vusdotq_s32:
1337 case NEON::BI__builtin_neon_vbfdot_f32:
1338 case NEON::BI__builtin_neon_vbfdotq_f32:
1339 case NEON::BI__builtin_neon___a32_vcvt_bf16_f32:
1341 std::string(
"unimplemented AArch64 builtin call: ") +
1343 return mlir::Value{};
1349 switch (builtinID) {
1352 std::string(
"unimplemented AArch64 builtin call: ") +
1355 case NEON::BI__builtin_neon_vrnd32x_f32:
1356 case NEON::BI__builtin_neon_vrnd32xq_f32:
1357 case NEON::BI__builtin_neon_vrnd32x_f64:
1358 case NEON::BI__builtin_neon_vrnd32xq_f64:
1359 case NEON::BI__builtin_neon_vrnd32z_f32:
1360 case NEON::BI__builtin_neon_vrnd32zq_f32:
1361 case NEON::BI__builtin_neon_vrnd32z_f64:
1362 case NEON::BI__builtin_neon_vrnd32zq_f64:
1363 case NEON::BI__builtin_neon_vrnd64x_f32:
1364 case NEON::BI__builtin_neon_vrnd64xq_f32:
1365 case NEON::BI__builtin_neon_vrnd64x_f64:
1366 case NEON::BI__builtin_neon_vrnd64xq_f64:
1367 case NEON::BI__builtin_neon_vrnd64z_f32:
1368 case NEON::BI__builtin_neon_vrnd64zq_f32:
1369 case NEON::BI__builtin_neon_vrnd64z_f64:
1370 case NEON::BI__builtin_neon_vrnd64zq_f64: {
1372 static_cast<llvm::Intrinsic::ID
>(llvmIntrinsic));
1373 mlir::Value result =
1375 llvmIntrName, vTy, loc);
1379 case NEON::BI__builtin_neon_vhadd_v:
1380 case NEON::BI__builtin_neon_vhaddq_v:
1381 case NEON::BI__builtin_neon_vhsub_v:
1382 case NEON::BI__builtin_neon_vhsubq_v:
1383 case NEON::BI__builtin_neon_vqadd_v:
1384 case NEON::BI__builtin_neon_vqaddq_v:
1385 case NEON::BI__builtin_neon_vrhadd_v:
1386 case NEON::BI__builtin_neon_vrhaddq_v:
1387 case NEON::BI__builtin_neon_vqsub_v:
1388 case NEON::BI__builtin_neon_vqsubq_v:
1389 case NEON::BI__builtin_neon_vshl_v:
1390 case NEON::BI__builtin_neon_vshlq_v:
1391 case NEON::BI__builtin_neon_vraddhn_v:
1392 case NEON::BI__builtin_neon_vrsubhn_v: {
1395 unsigned intrinsic =
1396 ((modifier &
UnsignedAlts) && !usgn) ? altLLVMIntrinsic : llvmIntrinsic;
1397 llvm::StringRef llvmIntrName =
1400 cir::VectorType argTy =
1403 mlir::Value result =
1405 {argTy, argTy}, ops, llvmIntrName,
1825 NEON::BI__builtin_neon_vabd_f16,
1826 NEON::BI__builtin_neon_vabd_v,
1829 NEON::BI__builtin_neon_vabdq_f16,
1830 NEON::BI__builtin_neon_vabdq_v,
1833 NEON::BI__builtin_neon_vabs_f16,
1834 NEON::BI__builtin_neon_vabs_v,
1837 NEON::BI__builtin_neon_vabsq_f16,
1838 NEON::BI__builtin_neon_vabsq_v,
1841 NEON::BI__builtin_neon_vcage_f16,
1842 NEON::BI__builtin_neon_vcage_v,
1845 NEON::BI__builtin_neon_vcageq_f16,
1846 NEON::BI__builtin_neon_vcageq_v,
1849 NEON::BI__builtin_neon_vcagt_f16,
1850 NEON::BI__builtin_neon_vcagt_v,
1853 NEON::BI__builtin_neon_vcagtq_f16,
1854 NEON::BI__builtin_neon_vcagtq_v,
1857 NEON::BI__builtin_neon_vcale_f16,
1858 NEON::BI__builtin_neon_vcale_v,
1861 NEON::BI__builtin_neon_vcaleq_f16,
1862 NEON::BI__builtin_neon_vcaleq_v,
1865 NEON::BI__builtin_neon_vcalt_f16,
1866 NEON::BI__builtin_neon_vcalt_v,
1869 NEON::BI__builtin_neon_vcaltq_f16,
1870 NEON::BI__builtin_neon_vcaltq_v,
1873 NEON::BI__builtin_neon_vceqz_f16,
1874 NEON::BI__builtin_neon_vceqz_v,
1877 NEON::BI__builtin_neon_vceqzq_f16,
1878 NEON::BI__builtin_neon_vceqzq_v,
1881 NEON::BI__builtin_neon_vcgez_f16,
1882 NEON::BI__builtin_neon_vcgez_v,
1885 NEON::BI__builtin_neon_vcgezq_f16,
1886 NEON::BI__builtin_neon_vcgezq_v,
1889 NEON::BI__builtin_neon_vcgtz_f16,
1890 NEON::BI__builtin_neon_vcgtz_v,
1893 NEON::BI__builtin_neon_vcgtzq_f16,
1894 NEON::BI__builtin_neon_vcgtzq_v,
1897 NEON::BI__builtin_neon_vclez_f16,
1898 NEON::BI__builtin_neon_vclez_v,
1901 NEON::BI__builtin_neon_vclezq_f16,
1902 NEON::BI__builtin_neon_vclezq_v,
1905 NEON::BI__builtin_neon_vcltz_f16,
1906 NEON::BI__builtin_neon_vcltz_v,
1909 NEON::BI__builtin_neon_vcltzq_f16,
1910 NEON::BI__builtin_neon_vcltzq_v,
1913 NEON::BI__builtin_neon_vfma_f16,
1914 NEON::BI__builtin_neon_vfma_v,
1917 NEON::BI__builtin_neon_vfma_lane_f16,
1918 NEON::BI__builtin_neon_vfma_lane_v,
1921 NEON::BI__builtin_neon_vfma_laneq_f16,
1922 NEON::BI__builtin_neon_vfma_laneq_v,
1925 NEON::BI__builtin_neon_vfmaq_f16,
1926 NEON::BI__builtin_neon_vfmaq_v,
1929 NEON::BI__builtin_neon_vfmaq_lane_f16,
1930 NEON::BI__builtin_neon_vfmaq_lane_v,
1933 NEON::BI__builtin_neon_vfmaq_laneq_f16,
1934 NEON::BI__builtin_neon_vfmaq_laneq_v,
1937 NEON::BI__builtin_neon_vmax_f16,
1938 NEON::BI__builtin_neon_vmax_v,
1941 NEON::BI__builtin_neon_vmaxnm_f16,
1942 NEON::BI__builtin_neon_vmaxnm_v,
1945 NEON::BI__builtin_neon_vmaxnmq_f16,
1946 NEON::BI__builtin_neon_vmaxnmq_v,
1949 NEON::BI__builtin_neon_vmaxq_f16,
1950 NEON::BI__builtin_neon_vmaxq_v,
1953 NEON::BI__builtin_neon_vmin_f16,
1954 NEON::BI__builtin_neon_vmin_v,
1957 NEON::BI__builtin_neon_vminnm_f16,
1958 NEON::BI__builtin_neon_vminnm_v,
1961 NEON::BI__builtin_neon_vminnmq_f16,
1962 NEON::BI__builtin_neon_vminnmq_v,
1965 NEON::BI__builtin_neon_vminq_f16,
1966 NEON::BI__builtin_neon_vminq_v,
1969 NEON::BI__builtin_neon_vmulx_f16,
1970 NEON::BI__builtin_neon_vmulx_v,
1973 NEON::BI__builtin_neon_vmulxq_f16,
1974 NEON::BI__builtin_neon_vmulxq_v,
1977 NEON::BI__builtin_neon_vpadd_f16,
1978 NEON::BI__builtin_neon_vpadd_v,
1981 NEON::BI__builtin_neon_vpaddq_f16,
1982 NEON::BI__builtin_neon_vpaddq_v,
1985 NEON::BI__builtin_neon_vpmax_f16,
1986 NEON::BI__builtin_neon_vpmax_v,
1989 NEON::BI__builtin_neon_vpmaxnm_f16,
1990 NEON::BI__builtin_neon_vpmaxnm_v,
1993 NEON::BI__builtin_neon_vpmaxnmq_f16,
1994 NEON::BI__builtin_neon_vpmaxnmq_v,
1997 NEON::BI__builtin_neon_vpmaxq_f16,
1998 NEON::BI__builtin_neon_vpmaxq_v,
2001 NEON::BI__builtin_neon_vpmin_f16,
2002 NEON::BI__builtin_neon_vpmin_v,
2005 NEON::BI__builtin_neon_vpminnm_f16,
2006 NEON::BI__builtin_neon_vpminnm_v,
2009 NEON::BI__builtin_neon_vpminnmq_f16,
2010 NEON::BI__builtin_neon_vpminnmq_v,
2013 NEON::BI__builtin_neon_vpminq_f16,
2014 NEON::BI__builtin_neon_vpminq_v,
2017 NEON::BI__builtin_neon_vrecpe_f16,
2018 NEON::BI__builtin_neon_vrecpe_v,
2021 NEON::BI__builtin_neon_vrecpeq_f16,
2022 NEON::BI__builtin_neon_vrecpeq_v,
2025 NEON::BI__builtin_neon_vrecps_f16,
2026 NEON::BI__builtin_neon_vrecps_v,
2029 NEON::BI__builtin_neon_vrecpsq_f16,
2030 NEON::BI__builtin_neon_vrecpsq_v,
2033 NEON::BI__builtin_neon_vrnd_f16,
2034 NEON::BI__builtin_neon_vrnd_v,
2037 NEON::BI__builtin_neon_vrnda_f16,
2038 NEON::BI__builtin_neon_vrnda_v,
2041 NEON::BI__builtin_neon_vrndaq_f16,
2042 NEON::BI__builtin_neon_vrndaq_v,
2045 NEON::BI__builtin_neon_vrndi_f16,
2046 NEON::BI__builtin_neon_vrndi_v,
2049 NEON::BI__builtin_neon_vrndiq_f16,
2050 NEON::BI__builtin_neon_vrndiq_v,
2053 NEON::BI__builtin_neon_vrndm_f16,
2054 NEON::BI__builtin_neon_vrndm_v,
2057 NEON::BI__builtin_neon_vrndmq_f16,
2058 NEON::BI__builtin_neon_vrndmq_v,
2061 NEON::BI__builtin_neon_vrndn_f16,
2062 NEON::BI__builtin_neon_vrndn_v,
2065 NEON::BI__builtin_neon_vrndnq_f16,
2066 NEON::BI__builtin_neon_vrndnq_v,
2069 NEON::BI__builtin_neon_vrndp_f16,
2070 NEON::BI__builtin_neon_vrndp_v,
2073 NEON::BI__builtin_neon_vrndpq_f16,
2074 NEON::BI__builtin_neon_vrndpq_v,
2077 NEON::BI__builtin_neon_vrndq_f16,
2078 NEON::BI__builtin_neon_vrndq_v,
2081 NEON::BI__builtin_neon_vrndx_f16,
2082 NEON::BI__builtin_neon_vrndx_v,
2085 NEON::BI__builtin_neon_vrndxq_f16,
2086 NEON::BI__builtin_neon_vrndxq_v,
2089 NEON::BI__builtin_neon_vrsqrte_f16,
2090 NEON::BI__builtin_neon_vrsqrte_v,
2093 NEON::BI__builtin_neon_vrsqrteq_f16,
2094 NEON::BI__builtin_neon_vrsqrteq_v,
2097 NEON::BI__builtin_neon_vrsqrts_f16,
2098 NEON::BI__builtin_neon_vrsqrts_v,
2101 NEON::BI__builtin_neon_vrsqrtsq_f16,
2102 NEON::BI__builtin_neon_vrsqrtsq_v,
2105 NEON::BI__builtin_neon_vsqrt_f16,
2106 NEON::BI__builtin_neon_vsqrt_v,
2109 NEON::BI__builtin_neon_vsqrtq_f16,
2110 NEON::BI__builtin_neon_vsqrtq_v,
2115 {NEON::BI__builtin_neon_vldap1_lane_u64,
2116 NEON::BI__builtin_neon_vldap1_lane_s64},
2117 {NEON::BI__builtin_neon_vldap1_lane_f64,
2118 NEON::BI__builtin_neon_vldap1_lane_s64},
2119 {NEON::BI__builtin_neon_vldap1_lane_p64,
2120 NEON::BI__builtin_neon_vldap1_lane_s64},
2121 {NEON::BI__builtin_neon_vldap1q_lane_u64,
2122 NEON::BI__builtin_neon_vldap1q_lane_s64},
2123 {NEON::BI__builtin_neon_vldap1q_lane_f64,
2124 NEON::BI__builtin_neon_vldap1q_lane_s64},
2125 {NEON::BI__builtin_neon_vldap1q_lane_p64,
2126 NEON::BI__builtin_neon_vldap1q_lane_s64},
2127 {NEON::BI__builtin_neon_vstl1_lane_u64,
2128 NEON::BI__builtin_neon_vstl1_lane_s64},
2129 {NEON::BI__builtin_neon_vstl1_lane_f64,
2130 NEON::BI__builtin_neon_vstl1_lane_s64},
2131 {NEON::BI__builtin_neon_vstl1_lane_p64,
2132 NEON::BI__builtin_neon_vstl1_lane_s64},
2133 {NEON::BI__builtin_neon_vstl1q_lane_u64,
2134 NEON::BI__builtin_neon_vstl1q_lane_s64},
2135 {NEON::BI__builtin_neon_vstl1q_lane_f64,
2136 NEON::BI__builtin_neon_vstl1q_lane_s64},
2137 {NEON::BI__builtin_neon_vstl1q_lane_p64,
2138 NEON::BI__builtin_neon_vstl1q_lane_s64},
2144 llvm::Triple::ArchType arch) {
2153 if (builtinID == Builtin::BI__builtin_cpu_supports) {
2154 cgm.errorNYI(
expr->getSourceRange(),
2155 std::string(
"unimplemented AArch64 builtin call: ") +
2156 getContext().BuiltinInfo.getName(builtinID));
2157 return mlir::Value{};
2160 switch (builtinID) {
2163 case clang::AArch64::BI__builtin_arm_nop:
2164 case clang::AArch64::BI__builtin_arm_yield:
2165 case clang::AArch64::BI__yield:
2166 case clang::AArch64::BI__builtin_arm_wfe:
2167 case clang::AArch64::BI__wfe:
2168 case clang::AArch64::BI__builtin_arm_wfi:
2169 case clang::AArch64::BI__wfi:
2170 case clang::AArch64::BI__builtin_arm_sev:
2171 case clang::AArch64::BI__sev:
2172 case clang::AArch64::BI__builtin_arm_sevl:
2173 case clang::AArch64::BI__sevl:
2174 cgm.errorNYI(
expr->getSourceRange(),
2175 std::string(
"unimplemented AArch64 builtin call: ") +
2176 getContext().BuiltinInfo.getName(builtinID));
2177 return mlir::Value{};
2180 if (builtinID == clang::AArch64::BI__builtin_arm_trap) {
2181 cgm.errorNYI(
expr->getSourceRange(),
2182 std::string(
"unimplemented AArch64 builtin call: ") +
2183 getContext().BuiltinInfo.getName(builtinID));
2184 return mlir::Value{};
2187 if (builtinID == clang::AArch64::BI__builtin_arm_get_sme_state) {
2188 cgm.errorNYI(
expr->getSourceRange(),
2189 std::string(
"unimplemented AArch64 builtin call: ") +
2190 getContext().BuiltinInfo.getName(builtinID));
2191 return mlir::Value{};
2194 if (builtinID == clang::AArch64::BI__builtin_arm_rbit) {
2195 cgm.errorNYI(
expr->getSourceRange(),
2196 std::string(
"unimplemented AArch64 builtin call: ") +
2197 getContext().BuiltinInfo.getName(builtinID));
2198 return mlir::Value{};
2200 if (builtinID == clang::AArch64::BI__builtin_arm_rbit64) {
2201 cgm.errorNYI(
expr->getSourceRange(),
2202 std::string(
"unimplemented AArch64 builtin call: ") +
2203 getContext().BuiltinInfo.getName(builtinID));
2204 return mlir::Value{};
2207 if (builtinID == clang::AArch64::BI__builtin_arm_clz ||
2208 builtinID == clang::AArch64::BI__builtin_arm_clz64) {
2209 cgm.errorNYI(
expr->getSourceRange(),
2210 std::string(
"unimplemented AArch64 builtin call: ") +
2211 getContext().BuiltinInfo.getName(builtinID));
2212 return mlir::Value{};
2215 if (builtinID == clang::AArch64::BI__builtin_arm_cls) {
2216 cgm.errorNYI(
expr->getSourceRange(),
2217 std::string(
"unimplemented AArch64 builtin call: ") +
2218 getContext().BuiltinInfo.getName(builtinID));
2219 return mlir::Value{};
2221 if (builtinID == clang::AArch64::BI__builtin_arm_cls64) {
2222 cgm.errorNYI(
expr->getSourceRange(),
2223 std::string(
"unimplemented AArch64 builtin call: ") +
2224 getContext().BuiltinInfo.getName(builtinID));
2225 return mlir::Value{};
2228 if (builtinID == clang::AArch64::BI__builtin_arm_rint32zf ||
2229 builtinID == clang::AArch64::BI__builtin_arm_rint32z) {
2230 cgm.errorNYI(
expr->getSourceRange(),
2231 std::string(
"unimplemented AArch64 builtin call: ") +
2232 getContext().BuiltinInfo.getName(builtinID));
2233 return mlir::Value{};
2236 if (builtinID == clang::AArch64::BI__builtin_arm_rint64zf ||
2237 builtinID == clang::AArch64::BI__builtin_arm_rint64z) {
2238 cgm.errorNYI(
expr->getSourceRange(),
2239 std::string(
"unimplemented AArch64 builtin call: ") +
2240 getContext().BuiltinInfo.getName(builtinID));
2241 return mlir::Value{};
2244 if (builtinID == clang::AArch64::BI__builtin_arm_rint32xf ||
2245 builtinID == clang::AArch64::BI__builtin_arm_rint32x) {
2246 cgm.errorNYI(
expr->getSourceRange(),
2247 std::string(
"unimplemented AArch64 builtin call: ") +
2248 getContext().BuiltinInfo.getName(builtinID));
2249 return mlir::Value{};
2252 if (builtinID == clang::AArch64::BI__builtin_arm_rint64xf ||
2253 builtinID == clang::AArch64::BI__builtin_arm_rint64x) {
2254 cgm.errorNYI(
expr->getSourceRange(),
2255 std::string(
"unimplemented AArch64 builtin call: ") +
2256 getContext().BuiltinInfo.getName(builtinID));
2257 return mlir::Value{};
2260 if (builtinID == clang::AArch64::BI__builtin_arm_jcvt) {
2261 cgm.errorNYI(
expr->getSourceRange(),
2262 std::string(
"unimplemented AArch64 builtin call: ") +
2263 getContext().BuiltinInfo.getName(builtinID));
2264 return mlir::Value{};
2267 if (builtinID == clang::AArch64::BI__builtin_arm_ld64b ||
2268 builtinID == clang::AArch64::BI__builtin_arm_st64b ||
2269 builtinID == clang::AArch64::BI__builtin_arm_st64bv ||
2270 builtinID == clang::AArch64::BI__builtin_arm_st64bv0) {
2271 cgm.errorNYI(
expr->getSourceRange(),
2272 std::string(
"unimplemented AArch64 builtin call: ") +
2273 getContext().BuiltinInfo.getName(builtinID));
2274 return mlir::Value{};
2277 if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
2278 builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
2279 cgm.errorNYI(
expr->getSourceRange(),
2280 std::string(
"unimplemented AArch64 builtin call: ") +
2281 getContext().BuiltinInfo.getName(builtinID));
2282 return mlir::Value{};
2285 if (builtinID == clang::AArch64::BI__clear_cache) {
2286 cgm.errorNYI(
expr->getSourceRange(),
2287 std::string(
"unimplemented AArch64 builtin call: ") +
2288 getContext().BuiltinInfo.getName(builtinID));
2289 return mlir::Value{};
2292 if ((builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2293 builtinID == clang::AArch64::BI__builtin_arm_ldaex) &&
2295 cgm.errorNYI(
expr->getSourceRange(),
2296 std::string(
"unimplemented AArch64 builtin call: ") +
2297 getContext().BuiltinInfo.getName(builtinID));
2298 return mlir::Value{};
2300 if (builtinID == clang::AArch64::BI__builtin_arm_ldrex ||
2301 builtinID == clang::AArch64::BI__builtin_arm_ldaex) {
2302 cgm.errorNYI(
expr->getSourceRange(),
2303 std::string(
"unimplemented AArch64 builtin call: ") +
2304 getContext().BuiltinInfo.getName(builtinID));
2305 return mlir::Value{};
2308 if ((builtinID == clang::AArch64::BI__builtin_arm_strex ||
2309 builtinID == clang::AArch64::BI__builtin_arm_stlex) &&
2311 cgm.errorNYI(
expr->getSourceRange(),
2312 std::string(
"unimplemented AArch64 builtin call: ") +
2313 getContext().BuiltinInfo.getName(builtinID));
2314 return mlir::Value{};
2317 if (builtinID == clang::AArch64::BI__builtin_arm_strex ||
2318 builtinID == clang::AArch64::BI__builtin_arm_stlex) {
2319 cgm.errorNYI(
expr->getSourceRange(),
2320 std::string(
"unimplemented AArch64 builtin call: ") +
2321 getContext().BuiltinInfo.getName(builtinID));
2322 return mlir::Value{};
2325 if (builtinID == clang::AArch64::BI__getReg ||
2326 builtinID == clang::AArch64::BI__setReg ||
2327 builtinID == clang::AArch64::BI__getRegFp ||
2328 builtinID == clang::AArch64::BI__setRegFp) {
2329 cgm.errorNYI(
expr->getSourceRange(),
2330 std::string(
"unimplemented AArch64 builtin call: ") +
2331 getContext().BuiltinInfo.getName(builtinID));
2332 return mlir::Value{};
2335 if (builtinID == clang::AArch64::BI__break) {
2336 cgm.errorNYI(
expr->getSourceRange(),
2337 std::string(
"unimplemented AArch64 builtin call: ") +
2338 getContext().BuiltinInfo.getName(builtinID));
2339 return mlir::Value{};
2342 if (builtinID == clang::AArch64::BI__builtin_arm_clrex) {
2343 cgm.errorNYI(
expr->getSourceRange(),
2344 std::string(
"unimplemented AArch64 builtin call: ") +
2345 getContext().BuiltinInfo.getName(builtinID));
2346 return mlir::Value{};
2349 if (builtinID == clang::AArch64::BI_ReadWriteBarrier) {
2350 cgm.errorNYI(
expr->getSourceRange(),
2351 std::string(
"unimplemented AArch64 builtin call: ") +
2352 getContext().BuiltinInfo.getName(builtinID));
2353 return mlir::Value{};
2357 Intrinsic::ID crcIntrinsicID = Intrinsic::not_intrinsic;
2358 switch (builtinID) {
2359 case clang::AArch64::BI__builtin_arm_crc32b:
2360 crcIntrinsicID = Intrinsic::aarch64_crc32b;
2362 case clang::AArch64::BI__builtin_arm_crc32cb:
2363 crcIntrinsicID = Intrinsic::aarch64_crc32cb;
2365 case clang::AArch64::BI__builtin_arm_crc32h:
2366 crcIntrinsicID = Intrinsic::aarch64_crc32h;
2368 case clang::AArch64::BI__builtin_arm_crc32ch:
2369 crcIntrinsicID = Intrinsic::aarch64_crc32ch;
2371 case clang::AArch64::BI__builtin_arm_crc32w:
2372 crcIntrinsicID = Intrinsic::aarch64_crc32w;
2374 case clang::AArch64::BI__builtin_arm_crc32cw:
2375 crcIntrinsicID = Intrinsic::aarch64_crc32cw;
2377 case clang::AArch64::BI__builtin_arm_crc32d:
2378 crcIntrinsicID = Intrinsic::aarch64_crc32x;
2380 case clang::AArch64::BI__builtin_arm_crc32cd:
2381 crcIntrinsicID = Intrinsic::aarch64_crc32cx;
2385 if (crcIntrinsicID != Intrinsic::not_intrinsic) {
2386 cgm.errorNYI(
expr->getSourceRange(),
2387 std::string(
"unimplemented AArch64 builtin call: ") +
2388 getContext().BuiltinInfo.getName(builtinID));
2389 return mlir::Value{};
2393 if (builtinID == AArch64::BI__builtin_arm_mops_memset_tag) {
2394 cgm.errorNYI(
expr->getSourceRange(),
2395 std::string(
"unimplemented AArch64 builtin call: ") +
2396 getContext().BuiltinInfo.getName(builtinID));
2397 return mlir::Value{};
2401 Intrinsic::ID mteIntrinsicID = Intrinsic::not_intrinsic;
2402 switch (builtinID) {
2403 case clang::AArch64::BI__builtin_arm_irg:
2404 mteIntrinsicID = Intrinsic::aarch64_irg;
2406 case clang::AArch64::BI__builtin_arm_addg:
2407 mteIntrinsicID = Intrinsic::aarch64_addg;
2409 case clang::AArch64::BI__builtin_arm_gmi:
2410 mteIntrinsicID = Intrinsic::aarch64_gmi;
2412 case clang::AArch64::BI__builtin_arm_ldg:
2413 mteIntrinsicID = Intrinsic::aarch64_ldg;
2415 case clang::AArch64::BI__builtin_arm_stg:
2416 mteIntrinsicID = Intrinsic::aarch64_stg;
2418 case clang::AArch64::BI__builtin_arm_subp:
2419 mteIntrinsicID = Intrinsic::aarch64_subp;
2423 if (mteIntrinsicID != Intrinsic::not_intrinsic) {
2424 cgm.errorNYI(
expr->getSourceRange(),
2425 std::string(
"unimplemented AArch64 builtin call: ") +
2426 getContext().BuiltinInfo.getName(builtinID));
2427 return mlir::Value{};
2430 if (builtinID == clang::AArch64::BI__builtin_arm_rsr ||
2431 builtinID == clang::AArch64::BI__builtin_arm_rsr64 ||
2432 builtinID == clang::AArch64::BI__builtin_arm_rsr128 ||
2433 builtinID == clang::AArch64::BI__builtin_arm_rsrp ||
2434 builtinID == clang::AArch64::BI__builtin_arm_wsr ||
2435 builtinID == clang::AArch64::BI__builtin_arm_wsr64 ||
2436 builtinID == clang::AArch64::BI__builtin_arm_wsr128 ||
2437 builtinID == clang::AArch64::BI__builtin_arm_wsrp) {
2438 cgm.errorNYI(
expr->getSourceRange(),
2439 std::string(
"unimplemented AArch64 builtin call: ") +
2440 getContext().BuiltinInfo.getName(builtinID));
2441 return mlir::Value{};
2444 if (builtinID == clang::AArch64::BI_ReadStatusReg ||
2445 builtinID == clang::AArch64::BI_WriteStatusReg ||
2446 builtinID == clang::AArch64::BI__sys) {
2447 cgm.errorNYI(
expr->getSourceRange(),
2448 std::string(
"unimplemented AArch64 builtin call: ") +
2449 getContext().BuiltinInfo.getName(builtinID));
2450 return mlir::Value{};
2453 if (builtinID == clang::AArch64::BI_AddressOfReturnAddress) {
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__builtin_sponentry) {
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__mulh ||
2468 builtinID == clang::AArch64::BI__umulh) {
2469 cgm.errorNYI(
expr->getSourceRange(),
2470 std::string(
"unimplemented AArch64 builtin call: ") +
2471 getContext().BuiltinInfo.getName(builtinID));
2472 return mlir::Value{};
2475 if (builtinID == AArch64::BI__writex18byte ||
2476 builtinID == AArch64::BI__writex18word ||
2477 builtinID == AArch64::BI__writex18dword ||
2478 builtinID == AArch64::BI__writex18qword) {
2479 cgm.errorNYI(
expr->getSourceRange(),
2480 std::string(
"unimplemented AArch64 builtin call: ") +
2481 getContext().BuiltinInfo.getName(builtinID));
2482 return mlir::Value{};
2485 if (builtinID == AArch64::BI__readx18byte ||
2486 builtinID == AArch64::BI__readx18word ||
2487 builtinID == AArch64::BI__readx18dword ||
2488 builtinID == AArch64::BI__readx18qword) {
2489 cgm.errorNYI(
expr->getSourceRange(),
2490 std::string(
"unimplemented AArch64 builtin call: ") +
2491 getContext().BuiltinInfo.getName(builtinID));
2492 return mlir::Value{};
2495 if (builtinID == AArch64::BI__addx18byte ||
2496 builtinID == AArch64::BI__addx18word ||
2497 builtinID == AArch64::BI__addx18dword ||
2498 builtinID == AArch64::BI__addx18qword ||
2499 builtinID == AArch64::BI__incx18byte ||
2500 builtinID == AArch64::BI__incx18word ||
2501 builtinID == AArch64::BI__incx18dword ||
2502 builtinID == AArch64::BI__incx18qword) {
2503 cgm.errorNYI(
expr->getSourceRange(),
2504 std::string(
"unimplemented AArch64 builtin call: ") +
2505 getContext().BuiltinInfo.getName(builtinID));
2506 return mlir::Value{};
2509 if (builtinID == AArch64::BI_CopyDoubleFromInt64 ||
2510 builtinID == AArch64::BI_CopyFloatFromInt32 ||
2511 builtinID == AArch64::BI_CopyInt32FromFloat ||
2512 builtinID == AArch64::BI_CopyInt64FromDouble) {
2513 cgm.errorNYI(
expr->getSourceRange(),
2514 std::string(
"unimplemented AArch64 builtin call: ") +
2515 getContext().BuiltinInfo.getName(builtinID));
2516 return mlir::Value{};
2519 if (builtinID == AArch64::BI_CountLeadingOnes ||
2520 builtinID == AArch64::BI_CountLeadingOnes64 ||
2521 builtinID == AArch64::BI_CountLeadingZeros ||
2522 builtinID == AArch64::BI_CountLeadingZeros64) {
2523 cgm.errorNYI(
expr->getSourceRange(),
2524 std::string(
"unimplemented AArch64 builtin call: ") +
2525 getContext().BuiltinInfo.getName(builtinID));
2526 return mlir::Value{};
2529 if (builtinID == AArch64::BI_CountLeadingSigns ||
2530 builtinID == AArch64::BI_CountLeadingSigns64) {
2531 cgm.errorNYI(
expr->getSourceRange(),
2532 std::string(
"unimplemented AArch64 builtin call: ") +
2533 getContext().BuiltinInfo.getName(builtinID));
2534 return mlir::Value{};
2537 if (builtinID == AArch64::BI_CountOneBits ||
2538 builtinID == AArch64::BI_CountOneBits64 ||
2539 builtinID == AArch64::BI_CountTrailingZeros ||
2540 builtinID == AArch64::BI_CountTrailingZeros64) {
2541 cgm.errorNYI(
expr->getSourceRange(),
2542 std::string(
"unimplemented AArch64 builtin call: ") +
2543 getContext().BuiltinInfo.getName(builtinID));
2544 return mlir::Value{};
2547 if (builtinID == AArch64::BI__prefetch ||
2548 builtinID == AArch64::BI__prefetch2) {
2549 cgm.errorNYI(
expr->getSourceRange(),
2550 std::string(
"unimplemented AArch64 builtin call: ") +
2551 getContext().BuiltinInfo.getName(builtinID));
2552 return mlir::Value{};
2555 if (builtinID == AArch64::BI__hlt) {
2556 cgm.errorNYI(
expr->getSourceRange(),
2557 std::string(
"unimplemented AArch64 builtin call: ") +
2558 getContext().BuiltinInfo.getName(builtinID));
2559 return mlir::Value{};
2562 if (builtinID == NEON::BI__builtin_neon_vcvth_bf16_f32) {
2563 cgm.errorNYI(
expr->getSourceRange(),
2564 std::string(
"unimplemented AArch64 builtin call: ") +
2565 getContext().BuiltinInfo.getName(builtinID));
2566 return mlir::Value{};
2575 return p.first == builtinID;
2578 builtinID = it->second;
2583 unsigned iceArguments = 0;
2598 unsigned numArgs =
expr->getNumArgs() - (hasExtraArg ? 1 : 0);
2599 for (
unsigned i = 0, e = numArgs; i != e; i++) {
2601 switch (builtinID) {
2602 case NEON::BI__builtin_neon_vld1_v:
2603 case NEON::BI__builtin_neon_vld1q_v:
2604 case NEON::BI__builtin_neon_vld1_dup_v:
2605 case NEON::BI__builtin_neon_vld1q_dup_v:
2606 case NEON::BI__builtin_neon_vld1_lane_v:
2607 case NEON::BI__builtin_neon_vld1q_lane_v:
2608 case NEON::BI__builtin_neon_vst1_v:
2609 case NEON::BI__builtin_neon_vst1q_v:
2610 case NEON::BI__builtin_neon_vst1_lane_v:
2611 case NEON::BI__builtin_neon_vst1q_lane_v:
2612 case NEON::BI__builtin_neon_vstrq_p128:
2613 case NEON::BI__builtin_neon_vst2_v:
2614 case NEON::BI__builtin_neon_vst2q_v:
2615 case NEON::BI__builtin_neon_vst2_lane_v:
2616 case NEON::BI__builtin_neon_vst2q_lane_v:
2617 case NEON::BI__builtin_neon_vst3_v:
2618 case NEON::BI__builtin_neon_vst3q_v:
2619 case NEON::BI__builtin_neon_vst3_lane_v:
2620 case NEON::BI__builtin_neon_vst3q_lane_v:
2621 case NEON::BI__builtin_neon_vst4_v:
2622 case NEON::BI__builtin_neon_vst4q_v:
2623 case NEON::BI__builtin_neon_vst4_lane_v:
2624 case NEON::BI__builtin_neon_vst4q_lane_v:
2630 case NEON::BI__builtin_neon_vldap1_lane_s64:
2631 case NEON::BI__builtin_neon_vldap1q_lane_s64:
2632 case NEON::BI__builtin_neon_vstl1_lane_s64:
2633 case NEON::BI__builtin_neon_vstl1q_lane_s64:
2635 expr->getSourceRange(),
2636 std::string(
"unimplemented AArch64 builtin argument handling ") +
2637 getContext().BuiltinInfo.getName(builtinID));
2658 const Expr *arg =
expr->getArg(
expr->getNumArgs() - 1);
2662 if (std::optional<llvm::APSInt> result =
2666 bool usgn =
type.isUnsigned();
2668 mlir::Location loc =
getLoc(
expr->getExprLoc());
2682 switch (builtinID) {
2685 case NEON::BI__builtin_neon_vabsh_f16: {
2686 mlir::Type halfTy = builder.getFp16Ty();
2688 std::nullopt, halfTy, loc);
2690 case NEON::BI__builtin_neon_vaddq_p128: {
2691 cir::VectorType byteTy = cir::VectorType::get(builder.getUInt8Ty(), 16);
2692 ops[0] = builder.createBitcast(ops[0], byteTy);
2693 ops[1] = builder.createBitcast(ops[1], byteTy);
2694 mlir::Value result = builder.createXor(loc, ops[0], ops[1]);
2697 case NEON::BI__builtin_neon_vldrq_p128:
2698 cgm.errorNYI(
expr->getSourceRange(),
2699 std::string(
"unimplemented AArch64 builtin call: ") +
2700 getContext().BuiltinInfo.getName(builtinID));
2701 return mlir::Value{};
2702 case NEON::BI__builtin_neon_vstrq_p128: {
2703 builder.createStore(loc, ops[1], ptrOp0);
2706 case NEON::BI__builtin_neon_vcvts_f32_u32:
2707 case NEON::BI__builtin_neon_vcvtd_f64_u64:
2708 case NEON::BI__builtin_neon_vcvts_f32_s32:
2709 case NEON::BI__builtin_neon_vcvtd_f64_s64: {
2710 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0],
2713 case NEON::BI__builtin_neon_vcvth_f16_u16:
2714 case NEON::BI__builtin_neon_vcvth_f16_u32:
2715 case NEON::BI__builtin_neon_vcvth_f16_u64:
2716 case NEON::BI__builtin_neon_vcvth_f16_s16:
2717 case NEON::BI__builtin_neon_vcvth_f16_s32:
2718 case NEON::BI__builtin_neon_vcvth_f16_s64:
2719 case NEON::BI__builtin_neon_vcvtah_u16_f16:
2720 case NEON::BI__builtin_neon_vcvtmh_u16_f16:
2721 case NEON::BI__builtin_neon_vcvtnh_u16_f16:
2722 case NEON::BI__builtin_neon_vcvtph_u16_f16:
2723 case NEON::BI__builtin_neon_vcvth_u16_f16:
2724 case NEON::BI__builtin_neon_vcvtah_s16_f16:
2725 case NEON::BI__builtin_neon_vcvtmh_s16_f16:
2726 case NEON::BI__builtin_neon_vcvtnh_s16_f16:
2727 case NEON::BI__builtin_neon_vcvtph_s16_f16:
2728 case NEON::BI__builtin_neon_vcvth_s16_f16:
2729 case NEON::BI__builtin_neon_vcaleh_f16:
2730 case NEON::BI__builtin_neon_vcalth_f16:
2731 case NEON::BI__builtin_neon_vcageh_f16:
2732 case NEON::BI__builtin_neon_vcagth_f16:
2733 case NEON::BI__builtin_neon_vcvth_n_s16_f16:
2734 case NEON::BI__builtin_neon_vcvth_n_u16_f16:
2735 case NEON::BI__builtin_neon_vcvth_n_f16_s16:
2736 case NEON::BI__builtin_neon_vcvth_n_f16_u16:
2737 case NEON::BI__builtin_neon_vpaddd_s64:
2738 case NEON::BI__builtin_neon_vpaddd_f64:
2739 case NEON::BI__builtin_neon_vpadds_f32:
2740 cgm.errorNYI(
expr->getSourceRange(),
2741 std::string(
"unimplemented AArch64 builtin call: ") +
2742 getContext().BuiltinInfo.getName(builtinID));
2743 return mlir::Value{};
2744 case NEON::BI__builtin_neon_vceqzd_s64:
2745 case NEON::BI__builtin_neon_vceqzd_f64:
2746 case NEON::BI__builtin_neon_vceqzs_f32:
2747 case NEON::BI__builtin_neon_vceqzh_f16:
2749 *
this, builder, loc, ops[0],
2751 case NEON::BI__builtin_neon_vcgezd_s64:
2752 case NEON::BI__builtin_neon_vcgezd_f64:
2753 case NEON::BI__builtin_neon_vcgezs_f32:
2754 case NEON::BI__builtin_neon_vcgezh_f16:
2755 case NEON::BI__builtin_neon_vclezd_s64:
2756 case NEON::BI__builtin_neon_vclezd_f64:
2757 case NEON::BI__builtin_neon_vclezs_f32:
2758 case NEON::BI__builtin_neon_vclezh_f16:
2759 case NEON::BI__builtin_neon_vcgtzd_s64:
2760 case NEON::BI__builtin_neon_vcgtzd_f64:
2761 case NEON::BI__builtin_neon_vcgtzs_f32:
2762 case NEON::BI__builtin_neon_vcgtzh_f16:
2763 case NEON::BI__builtin_neon_vcltzd_s64:
2764 case NEON::BI__builtin_neon_vcltzd_f64:
2765 case NEON::BI__builtin_neon_vcltzs_f32:
2766 case NEON::BI__builtin_neon_vcltzh_f16:
2767 case NEON::BI__builtin_neon_vceqzd_u64: {
2769 *
this, builder, loc, ops[0],
2772 case NEON::BI__builtin_neon_vceqd_f64:
2773 case NEON::BI__builtin_neon_vcled_f64:
2774 case NEON::BI__builtin_neon_vcltd_f64:
2775 case NEON::BI__builtin_neon_vcged_f64:
2776 case NEON::BI__builtin_neon_vcgtd_f64:
2777 case NEON::BI__builtin_neon_vceqs_f32:
2778 case NEON::BI__builtin_neon_vcles_f32:
2779 case NEON::BI__builtin_neon_vclts_f32:
2780 case NEON::BI__builtin_neon_vcges_f32:
2781 case NEON::BI__builtin_neon_vcgts_f32:
2782 case NEON::BI__builtin_neon_vceqh_f16:
2783 case NEON::BI__builtin_neon_vcleh_f16:
2784 case NEON::BI__builtin_neon_vclth_f16:
2785 case NEON::BI__builtin_neon_vcgeh_f16:
2786 case NEON::BI__builtin_neon_vcgth_f16:
2787 case NEON::BI__builtin_neon_vceqd_s64:
2788 case NEON::BI__builtin_neon_vceqd_u64:
2789 case NEON::BI__builtin_neon_vcgtd_s64:
2790 case NEON::BI__builtin_neon_vcgtd_u64:
2791 case NEON::BI__builtin_neon_vcltd_s64:
2792 case NEON::BI__builtin_neon_vcltd_u64:
2793 case NEON::BI__builtin_neon_vcged_u64:
2794 case NEON::BI__builtin_neon_vcged_s64:
2795 case NEON::BI__builtin_neon_vcled_u64:
2796 case NEON::BI__builtin_neon_vcled_s64:
2797 cgm.errorNYI(
expr->getSourceRange(),
2798 std::string(
"unimplemented AArch64 builtin call: ") +
2799 getContext().BuiltinInfo.getName(builtinID));
2800 return mlir::Value{};
2801 case NEON::BI__builtin_neon_vnegd_s64: {
2802 return builder.createNeg(loc, ops[0]);
2804 case NEON::BI__builtin_neon_vnegh_f16: {
2805 return builder.createFNeg(loc, ops[0]);
2807 case NEON::BI__builtin_neon_vtstd_s64:
2808 case NEON::BI__builtin_neon_vtstd_u64:
2809 cgm.errorNYI(
expr->getSourceRange(),
2810 std::string(
"unimplemented AArch64 builtin call: ") +
2811 getContext().BuiltinInfo.getName(builtinID));
2812 return mlir::Value{};
2813 case NEON::BI__builtin_neon_vset_lane_i8:
2814 case NEON::BI__builtin_neon_vset_lane_i16:
2815 case NEON::BI__builtin_neon_vset_lane_i32:
2816 case NEON::BI__builtin_neon_vset_lane_i64:
2817 case NEON::BI__builtin_neon_vset_lane_bf16:
2818 case NEON::BI__builtin_neon_vset_lane_f32:
2819 case NEON::BI__builtin_neon_vsetq_lane_i8:
2820 case NEON::BI__builtin_neon_vsetq_lane_i16:
2821 case NEON::BI__builtin_neon_vsetq_lane_i32:
2822 case NEON::BI__builtin_neon_vsetq_lane_i64:
2823 case NEON::BI__builtin_neon_vsetq_lane_bf16:
2824 case NEON::BI__builtin_neon_vsetq_lane_f32:
2825 case NEON::BI__builtin_neon_vset_lane_f64:
2826 case NEON::BI__builtin_neon_vset_lane_mf8:
2827 case NEON::BI__builtin_neon_vsetq_lane_mf8:
2828 case NEON::BI__builtin_neon_vsetq_lane_f64:
2829 return cir::VecInsertOp::create(builder, loc, ops[1], ops[0], ops[2]);
2830 case NEON::BI__builtin_neon_vget_lane_i8:
2831 case NEON::BI__builtin_neon_vdupb_lane_i8:
2832 case NEON::BI__builtin_neon_vgetq_lane_i8:
2833 case NEON::BI__builtin_neon_vdupb_laneq_i8:
2834 case NEON::BI__builtin_neon_vget_lane_mf8:
2835 case NEON::BI__builtin_neon_vdupb_lane_mf8:
2836 case NEON::BI__builtin_neon_vgetq_lane_mf8:
2837 case NEON::BI__builtin_neon_vdupb_laneq_mf8:
2838 case NEON::BI__builtin_neon_vget_lane_i16:
2839 case NEON::BI__builtin_neon_vduph_lane_i16:
2840 case NEON::BI__builtin_neon_vgetq_lane_i16:
2841 case NEON::BI__builtin_neon_vduph_laneq_i16:
2842 case NEON::BI__builtin_neon_vget_lane_i32:
2843 case NEON::BI__builtin_neon_vdups_lane_i32:
2844 case NEON::BI__builtin_neon_vdups_lane_f32:
2845 case NEON::BI__builtin_neon_vgetq_lane_i32:
2846 case NEON::BI__builtin_neon_vdups_laneq_i32:
2847 case NEON::BI__builtin_neon_vget_lane_i64:
2848 case NEON::BI__builtin_neon_vdupd_lane_i64:
2849 case NEON::BI__builtin_neon_vdupd_lane_f64:
2850 case NEON::BI__builtin_neon_vgetq_lane_i64:
2851 case NEON::BI__builtin_neon_vdupd_laneq_i64:
2852 case NEON::BI__builtin_neon_vget_lane_f32:
2853 case NEON::BI__builtin_neon_vget_lane_f64:
2854 case NEON::BI__builtin_neon_vgetq_lane_f32:
2855 case NEON::BI__builtin_neon_vdups_laneq_f32:
2856 case NEON::BI__builtin_neon_vgetq_lane_f64:
2857 case NEON::BI__builtin_neon_vdupd_laneq_f64:
2858 return cir::VecExtractOp::create(builder, loc, ops[0],
2860 case NEON::BI__builtin_neon_vaddh_f16:
2861 return builder.createFAdd(loc, ops[0], ops[1]);
2862 case NEON::BI__builtin_neon_vsubh_f16:
2863 return builder.createFSub(loc, ops[0], ops[1]);
2864 case NEON::BI__builtin_neon_vmulh_f16:
2865 return builder.createFMul(loc, ops[0], ops[1]);
2866 case NEON::BI__builtin_neon_vdivh_f16:
2867 return builder.createFDiv(loc, ops[0], ops[1]);
2868 case NEON::BI__builtin_neon_vfmah_f16: {
2870 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2873 std::nullopt, ty, loc);
2875 case NEON::BI__builtin_neon_vfmsh_f16: {
2877 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
2878 ops[0] = builder.createFNeg(loc, ops[0]);
2881 std::nullopt, ty, loc);
2883 case NEON::BI__builtin_neon_vaddd_s64:
2884 case NEON::BI__builtin_neon_vaddd_u64:
2885 return builder.createAdd(loc, ops[0], ops[1]);
2886 case NEON::BI__builtin_neon_vsubd_s64:
2887 case NEON::BI__builtin_neon_vsubd_u64:
2888 return builder.createSub(loc, ops[0], ops[1]);
2889 case NEON::BI__builtin_neon_vqdmlalh_s16:
2890 case NEON::BI__builtin_neon_vqdmlslh_s16:
2891 cgm.errorNYI(
expr->getSourceRange(),
2892 std::string(
"unimplemented AArch64 builtin call: ") +
2893 getContext().BuiltinInfo.getName(builtinID));
2894 return mlir::Value{};
2895 case NEON::BI__builtin_neon_vqshlud_n_s64: {
2896 cir::IntType int64Type = builder.getSInt64Ty();
2902 case NEON::BI__builtin_neon_vqshld_n_u64:
2903 case NEON::BI__builtin_neon_vqshld_n_s64: {
2904 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2905 ? builder.getUInt64Ty()
2906 : builder.getSInt64Ty();
2907 llvm::StringRef intrinsicName =
2908 builtinID == NEON::BI__builtin_neon_vqshld_n_u64 ?
"aarch64.neon.uqshl"
2909 :
"aarch64.neon.sqshl";
2914 case NEON::BI__builtin_neon_vrshrd_n_u64:
2915 case NEON::BI__builtin_neon_vrshrd_n_s64: {
2916 llvm::StringRef intrName = builtinID == NEON::BI__builtin_neon_vrshrd_n_s64
2917 ?
"aarch64.neon.srshl"
2918 :
"aarch64.neon.urshl";
2919 cir::IntType int64Ty = builtinID == NEON::BI__builtin_neon_vqshld_n_u64
2920 ? builder.getUInt64Ty()
2921 : builder.getSInt64Ty();
2925 ops[1] = builder.getSInt64(sv, loc);
2926 return emitNeonCall(
cgm, builder, {int64Ty, builder.getSInt64Ty()}, ops,
2927 intrName, int64Ty, loc);
2929 case NEON::BI__builtin_neon_vrsrad_n_u64:
2930 case NEON::BI__builtin_neon_vrsrad_n_s64: {
2931 cir::IntType int64Type = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2932 ? builder.getUInt64Ty()
2933 : builder.getSInt64Ty();
2934 ops[2] = builder.createNeg(loc, ops[2]);
2935 const StringRef intrName = builtinID == NEON::BI__builtin_neon_vrsrad_n_u64
2936 ?
"aarch64.neon.urshl"
2937 :
"aarch64.neon.srshl";
2940 ops[1], builder.createIntCast(ops[2], builder.getSInt64Ty())};
2941 ops[1] = builder.emitIntrinsicCallOp(loc, intrName, int64Type, args);
2942 return builder.createAdd(loc, ops[0],
2943 builder.createBitcast(ops[1], int64Type));
2945 case NEON::BI__builtin_neon_vshld_n_s64:
2946 case NEON::BI__builtin_neon_vshld_n_u64: {
2948 std::optional<llvm::APSInt> amt =
2950 assert(amt &&
"Expected argument to be a constant");
2951 return builder.createShiftLeft(loc, ops[0], amt->getZExtValue());
2953 case NEON::BI__builtin_neon_vshrd_n_s64: {
2954 std::optional<llvm::APSInt> amt =
2956 assert(amt &&
"Expected argument to be a constant");
2957 return builder.createShiftRight(
2958 loc, ops[0], std::min(
static_cast<uint64_t
>(63), amt->getZExtValue()));
2960 case NEON::BI__builtin_neon_vshrd_n_u64: {
2961 std::optional<llvm::APSInt> amt =
2963 assert(amt &&
"Expected argument to be a constant");
2964 uint64_t shiftAmt = amt->getZExtValue();
2967 return builder.getConstInt(loc, builder.getUInt64Ty(), 0);
2968 return builder.createShiftRight(loc, ops[0], shiftAmt);
2970 case NEON::BI__builtin_neon_vsrad_n_s64: {
2971 std::optional<llvm::APSInt> amt =
2973 assert(amt &&
"Expected argument to be a constant");
2975 std::min(
static_cast<uint64_t
>(63), amt->getZExtValue());
2976 mlir::Value shifted =
2977 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2978 return builder.createAdd(loc, ops[0], shifted);
2980 case NEON::BI__builtin_neon_vsrad_n_u64: {
2981 std::optional<llvm::APSInt> amt =
2983 assert(amt &&
"Expected argument to be a constant");
2984 uint64_t shiftAmt = amt->getZExtValue();
2988 mlir::Value shifted =
2989 builder.createShiftRight(loc, ops[1],
static_cast<unsigned>(shiftAmt));
2990 return builder.createAdd(loc, ops[0], shifted);
2992 case NEON::BI__builtin_neon_vqdmlalh_lane_s16:
2993 case NEON::BI__builtin_neon_vqdmlalh_laneq_s16:
2994 case NEON::BI__builtin_neon_vqdmlslh_lane_s16:
2995 case NEON::BI__builtin_neon_vqdmlslh_laneq_s16:
2996 case NEON::BI__builtin_neon_vqdmlals_s32:
2997 case NEON::BI__builtin_neon_vqdmlsls_s32:
2998 case NEON::BI__builtin_neon_vqdmlals_lane_s32:
2999 case NEON::BI__builtin_neon_vqdmlals_laneq_s32:
3000 case NEON::BI__builtin_neon_vqdmlsls_lane_s32:
3001 case NEON::BI__builtin_neon_vqdmlsls_laneq_s32: {
3002 cgm.errorNYI(
expr->getSourceRange(),
3003 std::string(
"unimplemented AArch64 builtin call: ") +
3004 getContext().BuiltinInfo.getName(builtinID));
3005 return mlir::Value{};
3007 case NEON::BI__builtin_neon_vget_lane_bf16:
3008 case NEON::BI__builtin_neon_vduph_lane_bf16:
3009 case NEON::BI__builtin_neon_vduph_lane_f16:
3010 case NEON::BI__builtin_neon_vgetq_lane_bf16:
3011 case NEON::BI__builtin_neon_vduph_laneq_bf16:
3012 case NEON::BI__builtin_neon_vduph_laneq_f16: {
3013 return cir::VecExtractOp::create(builder, loc, ops[0], ops[1]);
3015 case NEON::BI__builtin_neon_vcvt_bf16_f32:
3016 case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:
3017 case NEON::BI__builtin_neon_vcvtq_high_bf16_f32:
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_vcvt_f16_f32: {
3023 auto v4f32 = cir::VectorType::get(
cgm.floatTy, 4);
3024 auto v4f16 = cir::VectorType::get(
cgm.fP16Ty, 4);
3025 return builder.createFloatingCast(builder.createBitcast(ops[0], v4f32),
3028 case NEON::BI__builtin_neon_vcvt_f32_f16: {
3029 auto v4f32 = cir::VectorType::get(
cgm.floatTy, 4);
3030 auto v4f16 = cir::VectorType::get(
cgm.fP16Ty, 4);
3031 return builder.createFloatingCast(builder.createBitcast(ops[0], v4f16),
3034 case clang::AArch64::BI_InterlockedAdd:
3035 case clang::AArch64::BI_InterlockedAdd_acq:
3036 case clang::AArch64::BI_InterlockedAdd_rel:
3037 case clang::AArch64::BI_InterlockedAdd_nf:
3038 case clang::AArch64::BI_InterlockedAdd64:
3039 case clang::AArch64::BI_InterlockedAdd64_acq:
3040 case clang::AArch64::BI_InterlockedAdd64_rel:
3041 case clang::AArch64::BI_InterlockedAdd64_nf:
3042 cgm.errorNYI(
expr->getSourceRange(),
3043 std::string(
"unimplemented AArch64 builtin call: ") +
3044 getContext().BuiltinInfo.getName(builtinID));
3045 return mlir::Value{};
3052 llvm::StringRef intrName;
3054 switch (builtinID) {
3056 return std::nullopt;
3057 case NEON::BI__builtin_neon_vbsl_v:
3058 case NEON::BI__builtin_neon_vbslq_v: {
3061 ops[0] = builder.createBitcast(ops[0], bitTy);
3062 ops[1] = builder.createBitcast(ops[1], bitTy);
3063 ops[2] = builder.createBitcast(ops[2], bitTy);
3065 ops[1] = builder.createAnd(loc, ops[0], ops[1]);
3066 ops[2] = builder.createAnd(loc, builder.createNot(ops[0]), ops[2]);
3067 ops[0] = builder.createOr(loc, ops[1], ops[2]);
3068 return builder.createBitcast(ops[0], ty);
3070 case NEON::BI__builtin_neon_vfma_lane_v:
3071 case NEON::BI__builtin_neon_vfmaq_lane_v: {
3072 mlir::Value addend = builder.createBitcast(ops[0], ty);
3073 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3077 cir::VectorType sourceTy = cir::VectorType::get(
3078 ty.getElementType(), builtinID == NEON::BI__builtin_neon_vfmaq_lane_v
3081 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3082 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3086 std::nullopt, ty, loc);
3088 case NEON::BI__builtin_neon_vfma_laneq_v: {
3090 if (ty.getElementType() ==
cgm.doubleTy) {
3091 mlir::Value addend = builder.createBitcast(ops[0],
cgm.doubleTy);
3092 mlir::Value multiplicand = builder.createBitcast(ops[1],
cgm.doubleTy);
3095 cir::VectorType sourceTy = cir::VectorType::get(
cgm.doubleTy, 2);
3096 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3097 laneSource = builder.createExtractElement(
3103 return builder.createBitcast(
3105 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3106 std::nullopt,
cgm.doubleTy, loc),
3110 mlir::Value addend = builder.createBitcast(ops[0], ty);
3111 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3114 cir::VectorType sourceTy =
3115 cir::VectorType::get(ty.getElementType(), ty.getSize() * 2);
3116 mlir::Value laneSource = builder.createBitcast(ops[2], sourceTy);
3117 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3121 std::nullopt, ty, loc);
3123 case NEON::BI__builtin_neon_vfmaq_laneq_v: {
3124 mlir::Value addend = builder.createBitcast(ops[0], ty);
3125 mlir::Value multiplicand = builder.createBitcast(ops[1], ty);
3126 mlir::Value laneSource = builder.createBitcast(ops[2], ty);
3127 laneSource =
emitNeonSplat(builder, loc, laneSource, ops[3], ty.getSize());
3131 std::nullopt, ty, loc);
3133 case NEON::BI__builtin_neon_vfmah_lane_f16:
3134 case NEON::BI__builtin_neon_vfmas_lane_f32:
3135 case NEON::BI__builtin_neon_vfmah_laneq_f16:
3136 case NEON::BI__builtin_neon_vfmas_laneq_f32: {
3138 mlir::Value laneSource = builder.createExtractElement(
3144 std::nullopt, ty, loc);
3146 case NEON::BI__builtin_neon_vfmad_lane_f64:
3147 case NEON::BI__builtin_neon_vfmad_laneq_f64: {
3150 mlir::Value laneSource = builder.createExtractElement(
3155 cgm, builder, {
cgm.doubleTy,
cgm.doubleTy,
cgm.doubleTy}, fmaOps,
3156 std::nullopt,
cgm.doubleTy, loc);
3158 case NEON::BI__builtin_neon_vmull_v: {
3159 intrName = usgn ?
"aarch64.neon.umull" :
"aarch64.neon.smull";
3161 intrName =
"aarch64.neon.pmull";
3162 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3164 return emitNeonCall(
cgm, builder, {argTy, argTy}, ops, intrName, ty, loc);
3166 case NEON::BI__builtin_neon_vmax_v:
3167 case NEON::BI__builtin_neon_vmaxq_v:
3168 intrName = usgn ?
"aarch64.neon.umax" :
"aarch64.neon.smax";
3169 if (cir::isFPOrVectorOfFPType(ty))
3170 intrName =
"aarch64.neon.fmax";
3172 case NEON::BI__builtin_neon_vmaxh_f16: {
3173 auto halfTy = builder.getFp16Ty();
3174 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmax", halfTy, ops);
3176 case NEON::BI__builtin_neon_vmin_v:
3177 case NEON::BI__builtin_neon_vminq_v:
3178 intrName = usgn ?
"aarch64.neon.umin" :
"aarch64.neon.smin";
3179 if (cir::isFPOrVectorOfFPType(ty))
3180 intrName =
"aarch64.neon.fmin";
3182 case NEON::BI__builtin_neon_vminh_f16: {
3183 auto halfTy = builder.getFp16Ty();
3184 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmin", halfTy, ops);
3186 case NEON::BI__builtin_neon_vabd_v:
3187 case NEON::BI__builtin_neon_vabdq_v:
3188 intrName = usgn ?
"aarch64.neon.uabd" :
"aarch64.neon.sabd";
3189 if (cir::isFPOrVectorOfFPType(ty))
3190 intrName =
"aarch64.neon.fabd";
3192 case NEON::BI__builtin_neon_vpadal_v:
3193 case NEON::BI__builtin_neon_vpadalq_v: {
3194 intrName = usgn ?
"aarch64.neon.uaddlp" :
"aarch64.neon.saddlp";
3196 mlir::Value pairwiseSum =
3198 inputs, intrName, ty, loc);
3199 mlir::Value accumValue = builder.createBitcast(loc, ops[0], ty);
3200 return cir::AddOp::create(builder, loc, ty, pairwiseSum, accumValue);
3202 case NEON::BI__builtin_neon_vpmin_v:
3203 case NEON::BI__builtin_neon_vpminq_v:
3204 intrName = usgn ?
"aarch64.neon.uminp" :
"aarch64.neon.sminp";
3205 if (cir::isFPOrVectorOfFPType(ty))
3206 intrName =
"aarch64.neon.fminp";
3208 case NEON::BI__builtin_neon_vpmax_v:
3209 case NEON::BI__builtin_neon_vpmaxq_v:
3210 intrName = usgn ?
"aarch64.neon.umaxp" :
"aarch64.neon.smaxp";
3211 if (cir::isFPOrVectorOfFPType(ty))
3212 intrName =
"aarch64.neon.fmaxp";
3214 case NEON::BI__builtin_neon_vminnm_v:
3215 case NEON::BI__builtin_neon_vminnmq_v:
3216 intrName =
"aarch64.neon.fminnm";
3218 case NEON::BI__builtin_neon_vminnmh_f16: {
3219 auto halfTy = builder.getFp16Ty();
3220 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fminnm", halfTy, ops);
3222 case NEON::BI__builtin_neon_vmaxnm_v:
3223 case NEON::BI__builtin_neon_vmaxnmq_v:
3224 intrName =
"aarch64.neon.fmaxnm";
3226 case NEON::BI__builtin_neon_vmaxnmh_f16: {
3227 auto halfTy = builder.getFp16Ty();
3228 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.fmaxnm", halfTy, ops);
3230 case NEON::BI__builtin_neon_vrecpss_f32:
3231 case NEON::BI__builtin_neon_vrecpsd_f64:
3232 cgm.errorNYI(
expr->getSourceRange(),
3233 std::string(
"unimplemented AArch64 builtin call: ") +
3234 getContext().BuiltinInfo.getName(builtinID));
3235 return mlir::Value{};
3236 case NEON::BI__builtin_neon_vrecpsh_f16: {
3237 auto halfTy = builder.getFp16Ty();
3238 return builder.emitIntrinsicCallOp(loc,
"aarch64.neon.frecps", halfTy, ops);
3240 case NEON::BI__builtin_neon_vqshrun_n_v: {
3241 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3244 "aarch64.neon.sqshrun", ty, loc);
3246 case NEON::BI__builtin_neon_vqrshrun_n_v: {
3247 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3250 "aarch64.neon.sqrshrun", ty, loc);
3252 case NEON::BI__builtin_neon_vqshrn_n_v: {
3253 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3255 llvm::StringRef intrName =
3256 usgn ?
"aarch64.neon.uqshrn" :
"aarch64.neon.sqshrn";
3260 case NEON::BI__builtin_neon_vrshrn_n_v:
3261 cgm.errorNYI(
expr->getSourceRange(),
3262 std::string(
"unimplemented AArch64 builtin call: ") +
3263 getContext().BuiltinInfo.getName(builtinID));
3264 return mlir::Value{};
3265 case NEON::BI__builtin_neon_vqrshrn_n_v: {
3266 cir::VectorType argTy = builder.getExtendedOrTruncatedElementVectorType(
3268 llvm::StringRef intrName =
3269 usgn ?
"aarch64.neon.uqrshrn" :
"aarch64.neon.sqrshrn";
3273 case NEON::BI__builtin_neon_vrndah_f16: {
3275 mlir::Type halfTy = builder.getFp16Ty();
3277 std::nullopt, halfTy, loc);
3279 case NEON::BI__builtin_neon_vrnda_v:
3280 case NEON::BI__builtin_neon_vrndaq_v:
3284 case NEON::BI__builtin_neon_vrndih_f16: {
3286 mlir::Type halfTy = builder.getFp16Ty();
3288 std::nullopt, halfTy, loc);
3290 case NEON::BI__builtin_neon_vrndmh_f16: {
3292 mlir::Type halfTy = builder.getFp16Ty();
3294 std::nullopt, halfTy, loc);
3296 case NEON::BI__builtin_neon_vrndm_v:
3297 case NEON::BI__builtin_neon_vrndmq_v:
3301 case NEON::BI__builtin_neon_vrndnh_f16: {
3303 mlir::Type halfTy = builder.getFp16Ty();
3305 std::nullopt, halfTy, loc);
3307 case NEON::BI__builtin_neon_vrndn_v:
3308 case NEON::BI__builtin_neon_vrndnq_v:
3311 std::nullopt, ty, loc);
3312 case NEON::BI__builtin_neon_vrndns_f32: {
3314 mlir::Type
floatTy = builder.getSingleTy();
3318 case NEON::BI__builtin_neon_vrndph_f16: {
3320 mlir::Type halfTy = builder.getFp16Ty();
3322 std::nullopt, halfTy, loc);
3324 case NEON::BI__builtin_neon_vrndp_v:
3325 case NEON::BI__builtin_neon_vrndpq_v:
3329 case NEON::BI__builtin_neon_vrndxh_f16: {
3331 mlir::Type halfTy = builder.getFp16Ty();
3333 std::nullopt, halfTy, loc);
3335 case NEON::BI__builtin_neon_vrndx_v:
3336 case NEON::BI__builtin_neon_vrndxq_v:
3340 case NEON::BI__builtin_neon_vrndh_f16: {
3342 mlir::Type halfTy = builder.getFp16Ty();
3344 std::nullopt, halfTy, loc);
3346 case NEON::BI__builtin_neon_vrnd_v:
3347 case NEON::BI__builtin_neon_vrndq_v:
3351 case NEON::BI__builtin_neon_vcvt_f64_v:
3352 case NEON::BI__builtin_neon_vcvtq_f64_v:
3353 ops[0] = builder.createBitcast(ops[0], ty);
3356 return builder.createCast(loc, cir::CastKind::int_to_float, ops[0], ty);
3357 case NEON::BI__builtin_neon_vcvt_f64_f32: {
3358 auto v2f32 = cir::VectorType::get(
cgm.floatTy, 2);
3359 auto v2f64 = cir::VectorType::get(
cgm.doubleTy, 2);
3360 return builder.createFloatingCast(builder.createBitcast(ops[0], v2f32),
3363 case NEON::BI__builtin_neon_vcvt_f32_f64: {
3364 auto v2f32 = cir::VectorType::get(
cgm.floatTy, 2);
3365 auto v2f64 = cir::VectorType::get(
cgm.doubleTy, 2);
3366 return builder.createFloatingCast(builder.createBitcast(ops[0], v2f64),
3369 case NEON::BI__builtin_neon_vcvt_s32_v:
3370 case NEON::BI__builtin_neon_vcvt_u32_v:
3371 case NEON::BI__builtin_neon_vcvt_s64_v:
3372 case NEON::BI__builtin_neon_vcvt_u64_v:
3373 case NEON::BI__builtin_neon_vcvt_s16_f16:
3374 case NEON::BI__builtin_neon_vcvt_u16_f16:
3375 case NEON::BI__builtin_neon_vcvtq_s32_v:
3376 case NEON::BI__builtin_neon_vcvtq_u32_v:
3377 case NEON::BI__builtin_neon_vcvtq_s64_v:
3378 case NEON::BI__builtin_neon_vcvtq_u64_v:
3379 case NEON::BI__builtin_neon_vcvtq_s16_f16:
3380 case NEON::BI__builtin_neon_vcvtq_u16_f16:
3382 case NEON::BI__builtin_neon_vcvta_s16_f16:
3383 case NEON::BI__builtin_neon_vcvta_u16_f16:
3384 case NEON::BI__builtin_neon_vcvtaq_s16_f16:
3385 case NEON::BI__builtin_neon_vcvtaq_u16_f16:
3386 cgm.errorNYI(
expr->getSourceRange(),
3387 std::string(
"unimplemented AArch64 builtin call: ") +
3388 getContext().BuiltinInfo.getName(builtinID));
3389 return mlir::Value{};
3390 case NEON::BI__builtin_neon_vcvta_s32_v:
3391 case NEON::BI__builtin_neon_vcvtaq_s32_v:
3392 case NEON::BI__builtin_neon_vcvta_u32_v:
3393 case NEON::BI__builtin_neon_vcvtaq_u32_v:
3394 case NEON::BI__builtin_neon_vcvta_s64_v:
3395 case NEON::BI__builtin_neon_vcvtaq_s64_v:
3396 case NEON::BI__builtin_neon_vcvta_u64_v:
3397 case NEON::BI__builtin_neon_vcvtaq_u64_v: {
3399 llvm::StringRef intrName =
3400 usgn ?
"aarch64.neon.fcvtau" :
"aarch64.neon.fcvtas";
3404 case NEON::BI__builtin_neon_vcvtm_s16_f16:
3405 case NEON::BI__builtin_neon_vcvtmq_s16_f16:
3406 case NEON::BI__builtin_neon_vcvtm_u16_f16:
3407 case NEON::BI__builtin_neon_vcvtmq_u16_f16:
3408 cgm.errorNYI(
expr->getSourceRange(),
3409 std::string(
"unimplemented AArch64 builtin call: ") +
3410 getContext().BuiltinInfo.getName(builtinID));
3411 return mlir::Value{};
3412 case NEON::BI__builtin_neon_vcvtm_s32_v:
3413 case NEON::BI__builtin_neon_vcvtmq_s32_v:
3414 case NEON::BI__builtin_neon_vcvtm_u32_v:
3415 case NEON::BI__builtin_neon_vcvtmq_u32_v:
3416 case NEON::BI__builtin_neon_vcvtm_s64_v:
3417 case NEON::BI__builtin_neon_vcvtmq_s64_v:
3418 case NEON::BI__builtin_neon_vcvtm_u64_v:
3419 case NEON::BI__builtin_neon_vcvtmq_u64_v: {
3421 llvm::StringRef intrName =
3422 usgn ?
"aarch64.neon.fcvtmu" :
"aarch64.neon.fcvtms";
3426 case NEON::BI__builtin_neon_vcvtn_s16_f16:
3427 case NEON::BI__builtin_neon_vcvtnq_s16_f16:
3428 case NEON::BI__builtin_neon_vcvtn_u16_f16:
3429 case NEON::BI__builtin_neon_vcvtnq_u16_f16:
3430 cgm.errorNYI(
expr->getSourceRange(),
3431 std::string(
"unimplemented AArch64 builtin call: ") +
3432 getContext().BuiltinInfo.getName(builtinID));
3433 return mlir::Value{};
3435 case NEON::BI__builtin_neon_vcvtn_s32_v:
3436 case NEON::BI__builtin_neon_vcvtnq_s32_v:
3437 case NEON::BI__builtin_neon_vcvtn_u32_v:
3438 case NEON::BI__builtin_neon_vcvtnq_u32_v:
3439 case NEON::BI__builtin_neon_vcvtn_s64_v:
3440 case NEON::BI__builtin_neon_vcvtnq_s64_v:
3441 case NEON::BI__builtin_neon_vcvtn_u64_v:
3442 case NEON::BI__builtin_neon_vcvtnq_u64_v: {
3444 llvm::StringRef intrName =
3445 usgn ?
"aarch64.neon.fcvtnu" :
"aarch64.neon.fcvtns";
3449 case NEON::BI__builtin_neon_vcvtp_s16_f16:
3450 case NEON::BI__builtin_neon_vcvtpq_s16_f16:
3451 case NEON::BI__builtin_neon_vcvtp_u16_f16:
3452 case NEON::BI__builtin_neon_vcvtpq_u16_f16:
3453 cgm.errorNYI(
expr->getSourceRange(),
3454 std::string(
"unimplemented AArch64 builtin call: ") +
3455 getContext().BuiltinInfo.getName(builtinID));
3456 return mlir::Value{};
3457 case NEON::BI__builtin_neon_vcvtp_s32_v:
3458 case NEON::BI__builtin_neon_vcvtpq_s32_v:
3459 case NEON::BI__builtin_neon_vcvtp_u32_v:
3460 case NEON::BI__builtin_neon_vcvtpq_u32_v:
3461 case NEON::BI__builtin_neon_vcvtp_s64_v:
3462 case NEON::BI__builtin_neon_vcvtpq_s64_v:
3463 case NEON::BI__builtin_neon_vcvtp_u64_v:
3464 case NEON::BI__builtin_neon_vcvtpq_u64_v: {
3466 llvm::StringRef intrName =
3467 usgn ?
"aarch64.neon.fcvtpu" :
"aarch64.neon.fcvtps";
3471 case NEON::BI__builtin_neon_vmulx_v:
3472 case NEON::BI__builtin_neon_vmulxq_v:
3473 case NEON::BI__builtin_neon_vmulxh_lane_f16:
3474 case NEON::BI__builtin_neon_vmulxh_laneq_f16:
3475 case NEON::BI__builtin_neon_vmul_lane_v:
3476 case NEON::BI__builtin_neon_vmul_laneq_v:
3477 case NEON::BI__builtin_neon_vpmaxnm_v:
3478 case NEON::BI__builtin_neon_vpmaxnmq_v:
3479 cgm.errorNYI(
expr->getSourceRange(),
3480 std::string(
"unimplemented AArch64 builtin call: ") +
3481 getContext().BuiltinInfo.getName(builtinID));
3482 return mlir::Value{};
3483 case NEON::BI__builtin_neon_vpminnm_v:
3484 case NEON::BI__builtin_neon_vpminnmq_v:
3485 intrName =
"aarch64.neon.fminnmp";
3487 case NEON::BI__builtin_neon_vsqrth_f16: {
3488 mlir::Type halfTy = builder.getFp16Ty();
3490 std::nullopt, halfTy, loc);
3492 case NEON::BI__builtin_neon_vsqrt_v:
3493 case NEON::BI__builtin_neon_vsqrtq_v:
3497 case NEON::BI__builtin_neon_vrbit_v:
3498 case NEON::BI__builtin_neon_vrbitq_v:
3499 case NEON::BI__builtin_neon_vmaxv_f16:
3500 case NEON::BI__builtin_neon_vmaxvq_f16:
3501 case NEON::BI__builtin_neon_vminv_f16:
3502 case NEON::BI__builtin_neon_vminvq_f16:
3503 case NEON::BI__builtin_neon_vmaxnmv_f16:
3504 case NEON::BI__builtin_neon_vmaxnmvq_f16:
3505 case NEON::BI__builtin_neon_vminnmv_f16:
3506 case NEON::BI__builtin_neon_vminnmvq_f16:
3507 case NEON::BI__builtin_neon_vmul_n_f64:
3508 cgm.errorNYI(
expr->getSourceRange(),
3509 std::string(
"unimplemented AArch64 builtin call: ") +
3510 getContext().BuiltinInfo.getName(builtinID));
3511 return mlir::Value{};
3512 case NEON::BI__builtin_neon_vaddlv_u8:
3513 case NEON::BI__builtin_neon_vaddlvq_u8:
3514 case NEON::BI__builtin_neon_vaddlv_u16:
3515 case NEON::BI__builtin_neon_vaddlvq_u16:
3516 case NEON::BI__builtin_neon_vaddlv_s8:
3517 case NEON::BI__builtin_neon_vaddlvq_s8:
3518 case NEON::BI__builtin_neon_vaddlv_s16:
3519 case NEON::BI__builtin_neon_vaddlvq_s16: {
3522 auto eltTy = mlir::cast<cir::IntType>(
3523 mlir::cast<cir::VectorType>(argTy).getElementType());
3528 bool needsTrunc = eltTy.getWidth() == 8;
3529 intrName =
isUnsigned ?
"aarch64.neon.uaddlv" :
"aarch64.neon.saddlv";
3530 mlir::Type intrRetTy = userRetTy;
3532 intrRetTy =
isUnsigned ? builder.getUInt32Ty() : builder.getSInt32Ty();
3533 mlir::Value result =
3536 result = builder.createIntCast(result, userRetTy);
3539 case NEON::BI__builtin_neon_vsri_n_v:
3540 case NEON::BI__builtin_neon_vsriq_n_v: {
3542 ops[0], ops[1], builder.createIntCast(ops[2], builder.getUInt32Ty())};
3543 return emitNeonCall(
cgm, builder, {ty, ty, builder.getUInt32Ty()}, vsriArgs,
3544 "aarch64.neon.vsri", ty, loc);
3546 case NEON::BI__builtin_neon_vsli_n_v:
3547 case NEON::BI__builtin_neon_vsliq_n_v: {
3549 intrName =
"aarch64.neon.vsli";
3557 case NEON::BI__builtin_neon_vsra_n_v:
3558 case NEON::BI__builtin_neon_vsraq_n_v: {
3559 ops[0] = builder.createBitcast(ops[0], ty);
3561 return builder.createAdd(loc, ops[0], ops[1]);
3563 case NEON::BI__builtin_neon_vrsra_n_v:
3564 case NEON::BI__builtin_neon_vrsraq_n_v: {
3565 intrName = usgn ?
"aarch64.neon.urshl" :
"aarch64.neon.srshl";
3568 cir::VectorType shiftAmtVecTy =
3571 mlir::Value tmp =
emitNeonCall(
cgm, builder, {ty, shiftAmtVecTy}, tmpOps,
3575 ops[0] = builder.createBitcast(ops[0], ty);
3576 return builder.createAdd(loc, ops[0], tmp);
3578 case NEON::BI__builtin_neon_vld1_v:
3579 case NEON::BI__builtin_neon_vld1q_v:
3581 case NEON::BI__builtin_neon_vst1_v:
3582 case NEON::BI__builtin_neon_vst1q_v: {
3583 ops[1] = builder.createBitcast(ops[1], ty);
3584 builder.createStore(loc, ops[1], ptrOp0.
withElementType(builder, ty));
3587 case NEON::BI__builtin_neon_vld1_lane_v:
3588 case NEON::BI__builtin_neon_vld1q_lane_v: {
3589 ops[1] = builder.createBitcast(ops[1], ty);
3590 mlir::Value scalar = builder.createLoad(
3592 return cir::VecInsertOp::create(builder, loc, ops[1], scalar, ops[2]);
3594 case NEON::BI__builtin_neon_vld1_dup_v:
3595 case NEON::BI__builtin_neon_vld1q_dup_v: {
3596 mlir::Value scalar = builder.createLoad(
3598 return cir::VecSplatOp::create(builder, loc, ty, scalar);
3600 case NEON::BI__builtin_neon_vldap1_lane_s64:
3601 case NEON::BI__builtin_neon_vldap1q_lane_s64:
3602 cgm.errorNYI(
expr->getSourceRange(),
3603 std::string(
"unimplemented AArch64 builtin call: ") +
3604 getContext().BuiltinInfo.getName(builtinID));
3605 return mlir::Value{};
3606 case NEON::BI__builtin_neon_vst1_lane_v:
3607 case NEON::BI__builtin_neon_vst1q_lane_v: {
3608 ops[1] = builder.createBitcast(ops[1], ty);
3609 mlir::Value scalar = builder.createExtractElement(
3611 builder.createStore(loc, scalar,
3615 case NEON::BI__builtin_neon_vstl1_lane_s64:
3616 case NEON::BI__builtin_neon_vstl1q_lane_s64:
3617 case NEON::BI__builtin_neon_vld2_v:
3618 case NEON::BI__builtin_neon_vld2q_v:
3619 case NEON::BI__builtin_neon_vld3_v:
3620 case NEON::BI__builtin_neon_vld3q_v:
3621 case NEON::BI__builtin_neon_vld4_v:
3622 case NEON::BI__builtin_neon_vld4q_v:
3623 case NEON::BI__builtin_neon_vld2_dup_v:
3624 case NEON::BI__builtin_neon_vld2q_dup_v:
3625 case NEON::BI__builtin_neon_vld3_dup_v:
3626 case NEON::BI__builtin_neon_vld3q_dup_v:
3627 case NEON::BI__builtin_neon_vld4_dup_v:
3628 case NEON::BI__builtin_neon_vld4q_dup_v:
3629 case NEON::BI__builtin_neon_vld2_lane_v:
3630 case NEON::BI__builtin_neon_vld2q_lane_v:
3631 case NEON::BI__builtin_neon_vld3_lane_v:
3632 case NEON::BI__builtin_neon_vld3q_lane_v:
3633 case NEON::BI__builtin_neon_vld4_lane_v:
3634 case NEON::BI__builtin_neon_vld4q_lane_v:
3635 cgm.errorNYI(
expr->getSourceRange(),
3636 std::string(
"unimplemented AArch64 builtin call: ") +
3637 getContext().BuiltinInfo.getName(builtinID));
3638 return mlir::Value{};
3639 case NEON::BI__builtin_neon_vst2_v:
3640 case NEON::BI__builtin_neon_vst2q_v: {
3643 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3648 case NEON::BI__builtin_neon_vst2_lane_v:
3649 case NEON::BI__builtin_neon_vst2q_lane_v: {
3650 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3651 ops[2] = builder.createIntCast(ops[2],
sInt64Ty);
3653 builder.getVoidPtrTy()};
3654 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st2lane",
3657 case NEON::BI__builtin_neon_vst3_v:
3658 case NEON::BI__builtin_neon_vst3q_v: {
3659 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3661 builder.getVoidPtrTy()};
3665 case NEON::BI__builtin_neon_vst3_lane_v:
3666 case NEON::BI__builtin_neon_vst3q_lane_v: {
3667 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3668 ops[3] = builder.createIntCast(ops[3],
sInt64Ty);
3670 builder.getVoidPtrTy()};
3671 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st3lane",
3674 case NEON::BI__builtin_neon_vst4_v:
3675 case NEON::BI__builtin_neon_vst4q_v: {
3676 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3678 builder.getVoidPtrTy()};
3682 case NEON::BI__builtin_neon_vst4_lane_v:
3683 case NEON::BI__builtin_neon_vst4q_lane_v: {
3684 std::rotate(ops.begin(), ops.begin() + 1, ops.end());
3685 ops[4] = builder.createIntCast(ops[4],
sInt64Ty);
3687 ty, ty, ty, ty,
sInt64Ty, builder.getVoidPtrTy()};
3688 return emitNeonCall(
cgm, builder, argTypes, ops,
"aarch64.neon.st4lane",
3691 case NEON::BI__builtin_neon_vtrn_v:
3692 case NEON::BI__builtin_neon_vtrnq_v: {
3693 ops[1] = builder.createBitcast(ops[1], ty);
3694 ops[2] = builder.createBitcast(ops[2], ty);
3696 mlir::Value baseAddr =
3697 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3700 for (
unsigned vi = 0; vi != 2; ++vi) {
3702 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3703 indices.push_back(i + vi);
3704 indices.push_back(i + e + vi);
3706 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3707 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3708 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3709 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3713 case NEON::BI__builtin_neon_vuzp_v:
3714 case NEON::BI__builtin_neon_vuzpq_v: {
3715 ops[1] = builder.createBitcast(ops[1], ty);
3716 ops[2] = builder.createBitcast(ops[2], ty);
3718 mlir::Value baseAddr =
3719 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3721 for (
unsigned vi = 0; vi != 2; ++vi) {
3723 for (
unsigned i = 0, e = ty.getSize(); i != e; ++i) {
3724 indices.push_back(2 * i + vi);
3726 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3727 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3728 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3729 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3733 case NEON::BI__builtin_neon_vzip_v:
3734 case NEON::BI__builtin_neon_vzipq_v: {
3735 ops[1] = builder.createBitcast(ops[1], ty);
3736 ops[2] = builder.createBitcast(ops[2], ty);
3738 mlir::Value baseAddr =
3739 builder.createBitcast(ops[0], builder.getPointerTo(ty));
3741 for (
unsigned vi = 0; vi != 2; ++vi) {
3743 for (
unsigned i = 0, e = ty.getSize(); i != e; i += 2) {
3744 indices.push_back((i + vi * e) >> 1);
3745 indices.push_back(((i + vi * e) >> 1) + e);
3747 cir::ConstantOp idx = builder.getConstInt(loc, builder.getSInt32Ty(), vi);
3748 mlir::Value addr = builder.createPtrStride(loc, baseAddr, idx);
3749 sv = builder.createVecShuffle(loc, ops[1], ops[2], indices);
3750 (void)builder.CIRBaseBuilderTy::createStore(loc, sv, addr);
3754 case NEON::BI__builtin_neon_vqtbl1q_v:
3755 case NEON::BI__builtin_neon_vqtbl2q_v:
3756 case NEON::BI__builtin_neon_vqtbl3q_v:
3757 case NEON::BI__builtin_neon_vqtbl4q_v:
3758 case NEON::BI__builtin_neon_vqtbx1q_v:
3759 case NEON::BI__builtin_neon_vqtbx2q_v:
3760 case NEON::BI__builtin_neon_vqtbx3q_v:
3761 case NEON::BI__builtin_neon_vqtbx4q_v:
3762 cgm.errorNYI(
expr->getSourceRange(),
3763 std::string(
"unimplemented AArch64 builtin call: ") +
3764 getContext().BuiltinInfo.getName(builtinID));
3765 return mlir::Value{};
3766 case NEON::BI__builtin_neon_vsqadd_v:
3767 case NEON::BI__builtin_neon_vsqaddq_v:
3768 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.usqadd", ty,
3770 case NEON::BI__builtin_neon_vuqadd_v:
3771 case NEON::BI__builtin_neon_vuqaddq_v:
3772 return emitNeonCall(
cgm, builder, {ty, ty}, ops,
"aarch64.neon.suqadd", ty,
3774 case NEON::BI__builtin_neon_vluti2_laneq_mf8:
3775 case NEON::BI__builtin_neon_vluti2_laneq_bf16:
3776 case NEON::BI__builtin_neon_vluti2_laneq_f16:
3777 case NEON::BI__builtin_neon_vluti2_laneq_p16:
3778 case NEON::BI__builtin_neon_vluti2_laneq_p8:
3779 case NEON::BI__builtin_neon_vluti2_laneq_s16:
3780 case NEON::BI__builtin_neon_vluti2_laneq_s8:
3781 case NEON::BI__builtin_neon_vluti2_laneq_u16:
3782 case NEON::BI__builtin_neon_vluti2_laneq_u8:
3783 case NEON::BI__builtin_neon_vluti2q_laneq_mf8:
3784 case NEON::BI__builtin_neon_vluti2q_laneq_bf16:
3785 case NEON::BI__builtin_neon_vluti2q_laneq_f16:
3786 case NEON::BI__builtin_neon_vluti2q_laneq_p16:
3787 case NEON::BI__builtin_neon_vluti2q_laneq_p8:
3788 case NEON::BI__builtin_neon_vluti2q_laneq_s16:
3789 case NEON::BI__builtin_neon_vluti2q_laneq_s8:
3790 case NEON::BI__builtin_neon_vluti2q_laneq_u16:
3791 case NEON::BI__builtin_neon_vluti2q_laneq_u8:
3792 case NEON::BI__builtin_neon_vluti2_lane_mf8:
3793 case NEON::BI__builtin_neon_vluti2_lane_bf16:
3794 case NEON::BI__builtin_neon_vluti2_lane_f16:
3795 case NEON::BI__builtin_neon_vluti2_lane_p16:
3796 case NEON::BI__builtin_neon_vluti2_lane_p8:
3797 case NEON::BI__builtin_neon_vluti2_lane_s16:
3798 case NEON::BI__builtin_neon_vluti2_lane_s8:
3799 case NEON::BI__builtin_neon_vluti2_lane_u16:
3800 case NEON::BI__builtin_neon_vluti2_lane_u8:
3801 case NEON::BI__builtin_neon_vluti2q_lane_mf8:
3802 case NEON::BI__builtin_neon_vluti2q_lane_bf16:
3803 case NEON::BI__builtin_neon_vluti2q_lane_f16:
3804 case NEON::BI__builtin_neon_vluti2q_lane_p16:
3805 case NEON::BI__builtin_neon_vluti2q_lane_p8:
3806 case NEON::BI__builtin_neon_vluti2q_lane_s16:
3807 case NEON::BI__builtin_neon_vluti2q_lane_s8:
3808 case NEON::BI__builtin_neon_vluti2q_lane_u16:
3809 case NEON::BI__builtin_neon_vluti2q_lane_u8:
3810 case NEON::BI__builtin_neon_vluti4q_lane_mf8:
3811 case NEON::BI__builtin_neon_vluti4q_lane_p8:
3812 case NEON::BI__builtin_neon_vluti4q_lane_s8:
3813 case NEON::BI__builtin_neon_vluti4q_lane_u8:
3814 case NEON::BI__builtin_neon_vluti4q_laneq_mf8:
3815 case NEON::BI__builtin_neon_vluti4q_laneq_p8:
3816 case NEON::BI__builtin_neon_vluti4q_laneq_s8:
3817 case NEON::BI__builtin_neon_vluti4q_laneq_u8:
3818 case NEON::BI__builtin_neon_vluti4q_lane_bf16_x2:
3819 case NEON::BI__builtin_neon_vluti4q_lane_f16_x2:
3820 case NEON::BI__builtin_neon_vluti4q_lane_p16_x2:
3821 case NEON::BI__builtin_neon_vluti4q_lane_s16_x2:
3822 case NEON::BI__builtin_neon_vluti4q_lane_u16_x2:
3823 case NEON::BI__builtin_neon_vluti4q_laneq_bf16_x2:
3824 case NEON::BI__builtin_neon_vluti4q_laneq_f16_x2:
3825 case NEON::BI__builtin_neon_vluti4q_laneq_p16_x2:
3826 case NEON::BI__builtin_neon_vluti4q_laneq_s16_x2:
3827 case NEON::BI__builtin_neon_vluti4q_laneq_u16_x2:
3828 case NEON::BI__builtin_neon_vmmlaq_f16_mf8_fpm:
3829 case NEON::BI__builtin_neon_vmmlaq_f32_mf8_fpm:
3830 case NEON::BI__builtin_neon_vcvt1_low_bf16_mf8_fpm:
3831 case NEON::BI__builtin_neon_vcvt1_bf16_mf8_fpm:
3832 case NEON::BI__builtin_neon_vcvt1_high_bf16_mf8_fpm:
3833 case NEON::BI__builtin_neon_vcvt2_low_bf16_mf8_fpm:
3834 case NEON::BI__builtin_neon_vcvt2_bf16_mf8_fpm:
3835 case NEON::BI__builtin_neon_vcvt2_high_bf16_mf8_fpm:
3836 case NEON::BI__builtin_neon_vcvt1_low_f16_mf8_fpm:
3837 case NEON::BI__builtin_neon_vcvt1_f16_mf8_fpm:
3838 case NEON::BI__builtin_neon_vcvt1_high_f16_mf8_fpm:
3839 case NEON::BI__builtin_neon_vcvt2_low_f16_mf8_fpm:
3840 case NEON::BI__builtin_neon_vcvt2_f16_mf8_fpm:
3841 case NEON::BI__builtin_neon_vcvt2_high_f16_mf8_fpm:
3842 case NEON::BI__builtin_neon_vcvt_mf8_f32_fpm:
3843 case NEON::BI__builtin_neon_vcvt_mf8_f16_fpm:
3844 case NEON::BI__builtin_neon_vcvtq_mf8_f16_fpm:
3845 case NEON::BI__builtin_neon_vcvt_high_mf8_f32_fpm:
3846 case NEON::BI__builtin_neon_vdot_f16_mf8_fpm:
3847 case NEON::BI__builtin_neon_vdotq_f16_mf8_fpm:
3848 case NEON::BI__builtin_neon_vdot_lane_f16_mf8_fpm:
3849 case NEON::BI__builtin_neon_vdotq_lane_f16_mf8_fpm:
3850 case NEON::BI__builtin_neon_vdot_laneq_f16_mf8_fpm:
3851 case NEON::BI__builtin_neon_vdotq_laneq_f16_mf8_fpm:
3852 case NEON::BI__builtin_neon_vdot_f32_mf8_fpm:
3853 case NEON::BI__builtin_neon_vdotq_f32_mf8_fpm:
3854 case NEON::BI__builtin_neon_vdot_lane_f32_mf8_fpm:
3855 case NEON::BI__builtin_neon_vdotq_lane_f32_mf8_fpm:
3856 case NEON::BI__builtin_neon_vdot_laneq_f32_mf8_fpm:
3857 case NEON::BI__builtin_neon_vdotq_laneq_f32_mf8_fpm:
3858 case NEON::BI__builtin_neon_vmlalbq_f16_mf8_fpm:
3859 case NEON::BI__builtin_neon_vmlaltq_f16_mf8_fpm:
3860 case NEON::BI__builtin_neon_vmlallbbq_f32_mf8_fpm:
3861 case NEON::BI__builtin_neon_vmlallbtq_f32_mf8_fpm:
3862 case NEON::BI__builtin_neon_vmlalltbq_f32_mf8_fpm:
3863 case NEON::BI__builtin_neon_vmlallttq_f32_mf8_fpm:
3864 case NEON::BI__builtin_neon_vmlalbq_lane_f16_mf8_fpm:
3865 case NEON::BI__builtin_neon_vmlalbq_laneq_f16_mf8_fpm:
3866 case NEON::BI__builtin_neon_vmlaltq_lane_f16_mf8_fpm:
3867 case NEON::BI__builtin_neon_vmlaltq_laneq_f16_mf8_fpm:
3868 case NEON::BI__builtin_neon_vmlallbbq_lane_f32_mf8_fpm:
3869 case NEON::BI__builtin_neon_vmlallbbq_laneq_f32_mf8_fpm:
3870 case NEON::BI__builtin_neon_vmlallbtq_lane_f32_mf8_fpm:
3871 case NEON::BI__builtin_neon_vmlallbtq_laneq_f32_mf8_fpm:
3872 case NEON::BI__builtin_neon_vmlalltbq_lane_f32_mf8_fpm:
3873 case NEON::BI__builtin_neon_vmlalltbq_laneq_f32_mf8_fpm:
3874 case NEON::BI__builtin_neon_vmlallttq_lane_f32_mf8_fpm:
3875 case NEON::BI__builtin_neon_vmlallttq_laneq_f32_mf8_fpm:
3876 case NEON::BI__builtin_neon_vamin_f16:
3877 case NEON::BI__builtin_neon_vaminq_f16:
3878 case NEON::BI__builtin_neon_vamin_f32:
3879 case NEON::BI__builtin_neon_vaminq_f32:
3880 case NEON::BI__builtin_neon_vaminq_f64:
3881 case NEON::BI__builtin_neon_vamax_f16:
3882 case NEON::BI__builtin_neon_vamaxq_f16:
3883 case NEON::BI__builtin_neon_vamax_f32:
3884 case NEON::BI__builtin_neon_vamaxq_f32:
3885 case NEON::BI__builtin_neon_vamaxq_f64:
3886 case NEON::BI__builtin_neon_vscale_f16:
3887 case NEON::BI__builtin_neon_vscaleq_f16:
3888 case NEON::BI__builtin_neon_vscale_f32:
3889 case NEON::BI__builtin_neon_vscaleq_f32:
3890 case NEON::BI__builtin_neon_vscaleq_f64:
3891 cgm.errorNYI(
expr->getSourceRange(),
3892 std::string(
"unimplemented AArch64 builtin call: ") +
3893 getContext().BuiltinInfo.getName(builtinID));
3894 return mlir::Value{};