1082 if (builtinID == Builtin::BI__builtin_cpu_is)
1084 if (builtinID == Builtin::BI__builtin_cpu_supports)
1086 if (builtinID == Builtin::BI__builtin_cpu_init)
1101 unsigned iceArguments = 0;
1106 for (
auto [idx, arg] : llvm::enumerate(
expr->arguments()))
1110 mlir::Type
voidTy = builder.getVoidTy();
1112 switch (builtinID) {
1114 return std::nullopt;
1115 case X86::BI_mm_clflush:
1116 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1117 "x86.sse2.clflush",
voidTy, ops[0]);
1118 case X86::BI_mm_lfence:
1119 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1120 "x86.sse2.lfence",
voidTy);
1121 case X86::BI_mm_pause:
1122 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1123 "x86.sse2.pause",
voidTy);
1124 case X86::BI_mm_mfence:
1125 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1126 "x86.sse2.mfence",
voidTy);
1127 case X86::BI_mm_sfence:
1128 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1129 "x86.sse.sfence",
voidTy);
1130 case X86::BI_mm_prefetch:
1131 case X86::BI_m_prefetch:
1132 case X86::BI_m_prefetchw:
1134 case X86::BI__rdtsc:
1135 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
"x86.rdtsc",
1136 builder.getUInt64Ty());
1137 case X86::BI__builtin_ia32_rdtscp: {
1138 mlir::Location loc =
getLoc(
expr->getExprLoc());
1139 mlir::Type i64Ty = builder.getUInt64Ty();
1140 mlir::Type i32Ty = builder.getUInt32Ty();
1141 mlir::Type members[] = {i64Ty, i32Ty};
1142 mlir::Type structTy = builder.getAnonRecordTy(
1144 mlir::Value result =
1145 builder.emitIntrinsicCallOp(loc,
"x86.rdtscp", structTy);
1148 mlir::Value processorId =
1149 cir::ExtractMemberOp::create(builder, loc, i32Ty, result, 1);
1154 return cir::ExtractMemberOp::create(builder, loc, i64Ty, result, 0);
1156 case X86::BI__builtin_ia32_lzcnt_u16:
1157 case X86::BI__builtin_ia32_lzcnt_u32:
1158 case X86::BI__builtin_ia32_lzcnt_u64: {
1159 mlir::Location loc =
getLoc(
expr->getExprLoc());
1160 mlir::Value isZeroPoison = builder.getFalse(loc);
1161 return builder.emitIntrinsicCallOp(loc,
"ctlz", ops[0].
getType(),
1162 mlir::ValueRange{ops[0], isZeroPoison});
1164 case X86::BI__builtin_ia32_tzcnt_u16:
1165 case X86::BI__builtin_ia32_tzcnt_u32:
1166 case X86::BI__builtin_ia32_tzcnt_u64: {
1167 mlir::Location loc =
getLoc(
expr->getExprLoc());
1168 mlir::Value isZeroPoison = builder.getFalse(loc);
1169 return builder.emitIntrinsicCallOp(loc,
"cttz", ops[0].
getType(),
1170 mlir::ValueRange{ops[0], isZeroPoison});
1172 case X86::BI__builtin_ia32_undef128:
1173 case X86::BI__builtin_ia32_undef256:
1174 case X86::BI__builtin_ia32_undef512:
1182 case X86::BI__builtin_ia32_vec_ext_v4hi:
1183 case X86::BI__builtin_ia32_vec_ext_v16qi:
1184 case X86::BI__builtin_ia32_vec_ext_v8hi:
1185 case X86::BI__builtin_ia32_vec_ext_v4si:
1186 case X86::BI__builtin_ia32_vec_ext_v4sf:
1187 case X86::BI__builtin_ia32_vec_ext_v2di:
1188 case X86::BI__builtin_ia32_vec_ext_v32qi:
1189 case X86::BI__builtin_ia32_vec_ext_v16hi:
1190 case X86::BI__builtin_ia32_vec_ext_v8si:
1191 case X86::BI__builtin_ia32_vec_ext_v4di: {
1195 index &= numElts - 1;
1197 cir::ConstantOp indexVal =
1202 return cir::VecExtractOp::create(builder,
getLoc(
expr->getExprLoc()),
1205 case X86::BI__builtin_ia32_vec_set_v4hi:
1206 case X86::BI__builtin_ia32_vec_set_v16qi:
1207 case X86::BI__builtin_ia32_vec_set_v8hi:
1208 case X86::BI__builtin_ia32_vec_set_v4si:
1209 case X86::BI__builtin_ia32_vec_set_v2di:
1210 case X86::BI__builtin_ia32_vec_set_v32qi:
1211 case X86::BI__builtin_ia32_vec_set_v16hi:
1212 case X86::BI__builtin_ia32_vec_set_v8si:
1213 case X86::BI__builtin_ia32_vec_set_v4di: {
1217 case X86::BI__builtin_ia32_kunpckhi:
1219 "x86.avx512.kunpackb", ops);
1220 case X86::BI__builtin_ia32_kunpcksi:
1222 "x86.avx512.kunpackw", ops);
1223 case X86::BI__builtin_ia32_kunpckdi:
1225 "x86.avx512.kunpackd", ops);
1226 case X86::BI_mm_setcsr:
1227 case X86::BI__builtin_ia32_ldmxcsr: {
1228 mlir::Location loc =
getLoc(
expr->getExprLoc());
1230 builder.createStore(loc, ops[0], tmp);
1231 return builder.emitIntrinsicCallOp(loc,
"x86.sse.ldmxcsr",
1234 case X86::BI_mm_getcsr:
1235 case X86::BI__builtin_ia32_stmxcsr: {
1236 mlir::Location loc =
getLoc(
expr->getExprLoc());
1238 builder.emitIntrinsicCallOp(loc,
"x86.sse.stmxcsr", builder.getVoidTy(),
1240 return builder.createLoad(loc, tmp);
1242 case X86::BI__builtin_ia32_xsave:
1243 case X86::BI__builtin_ia32_xsave64:
1244 case X86::BI__builtin_ia32_xrstor:
1245 case X86::BI__builtin_ia32_xrstor64:
1246 case X86::BI__builtin_ia32_xsaveopt:
1247 case X86::BI__builtin_ia32_xsaveopt64:
1248 case X86::BI__builtin_ia32_xrstors:
1249 case X86::BI__builtin_ia32_xrstors64:
1250 case X86::BI__builtin_ia32_xsavec:
1251 case X86::BI__builtin_ia32_xsavec64:
1252 case X86::BI__builtin_ia32_xsaves:
1253 case X86::BI__builtin_ia32_xsaves64:
1254 case X86::BI__builtin_ia32_xsetbv:
1255 case X86::BI_xsetbv: {
1256 mlir::Location loc =
getLoc(
expr->getExprLoc());
1257 StringRef intrinsicName;
1258 switch (builtinID) {
1260 llvm_unreachable(
"Unexpected builtin");
1261 case X86::BI__builtin_ia32_xsave:
1262 intrinsicName =
"x86.xsave";
1264 case X86::BI__builtin_ia32_xsave64:
1265 intrinsicName =
"x86.xsave64";
1267 case X86::BI__builtin_ia32_xrstor:
1268 intrinsicName =
"x86.xrstor";
1270 case X86::BI__builtin_ia32_xrstor64:
1271 intrinsicName =
"x86.xrstor64";
1273 case X86::BI__builtin_ia32_xsaveopt:
1274 intrinsicName =
"x86.xsaveopt";
1276 case X86::BI__builtin_ia32_xsaveopt64:
1277 intrinsicName =
"x86.xsaveopt64";
1279 case X86::BI__builtin_ia32_xrstors:
1280 intrinsicName =
"x86.xrstors";
1282 case X86::BI__builtin_ia32_xrstors64:
1283 intrinsicName =
"x86.xrstors64";
1285 case X86::BI__builtin_ia32_xsavec:
1286 intrinsicName =
"x86.xsavec";
1288 case X86::BI__builtin_ia32_xsavec64:
1289 intrinsicName =
"x86.xsavec64";
1291 case X86::BI__builtin_ia32_xsaves:
1292 intrinsicName =
"x86.xsaves";
1294 case X86::BI__builtin_ia32_xsaves64:
1295 intrinsicName =
"x86.xsaves64";
1297 case X86::BI__builtin_ia32_xsetbv:
1298 case X86::BI_xsetbv:
1299 intrinsicName =
"x86.xsetbv";
1307 mlir::Type i32Ty = builder.getSInt32Ty();
1310 cir::ConstantOp shift32 = builder.getSInt64(32, loc);
1311 mlir::Value mhi = builder.createShift(loc, ops[1], shift32.getResult(),
1313 mhi = builder.createIntCast(mhi, i32Ty);
1316 mlir::Value mlo = builder.createIntCast(ops[1], i32Ty);
1318 return builder.emitIntrinsicCallOp(loc, intrinsicName,
voidTy,
1319 mlir::ValueRange{ops[0], mhi, mlo});
1321 case X86::BI__builtin_ia32_xgetbv:
1322 case X86::BI_xgetbv:
1325 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
"x86.xgetbv",
1326 builder.getUInt64Ty(), ops[0]);
1327 case X86::BI__builtin_ia32_storedqudi128_mask:
1328 case X86::BI__builtin_ia32_storedqusi128_mask:
1329 case X86::BI__builtin_ia32_storedquhi128_mask:
1330 case X86::BI__builtin_ia32_storedquqi128_mask:
1331 case X86::BI__builtin_ia32_storeupd128_mask:
1332 case X86::BI__builtin_ia32_storeups128_mask:
1333 case X86::BI__builtin_ia32_storedqudi256_mask:
1334 case X86::BI__builtin_ia32_storedqusi256_mask:
1335 case X86::BI__builtin_ia32_storedquhi256_mask:
1336 case X86::BI__builtin_ia32_storedquqi256_mask:
1337 case X86::BI__builtin_ia32_storeupd256_mask:
1338 case X86::BI__builtin_ia32_storeups256_mask:
1339 case X86::BI__builtin_ia32_storedqudi512_mask:
1340 case X86::BI__builtin_ia32_storedqusi512_mask:
1341 case X86::BI__builtin_ia32_storedquhi512_mask:
1342 case X86::BI__builtin_ia32_storedquqi512_mask:
1343 case X86::BI__builtin_ia32_storeupd512_mask:
1344 case X86::BI__builtin_ia32_storeups512_mask:
1345 case X86::BI__builtin_ia32_storesbf16128_mask:
1346 case X86::BI__builtin_ia32_storesh128_mask:
1347 case X86::BI__builtin_ia32_storess128_mask:
1348 case X86::BI__builtin_ia32_storesd128_mask:
1349 cgm.errorNYI(
expr->getSourceRange(),
1350 std::string(
"unimplemented x86 builtin call: ") +
1351 getContext().BuiltinInfo.getName(builtinID));
1352 return mlir::Value{};
1353 case X86::BI__builtin_ia32_cvtmask2b128:
1354 case X86::BI__builtin_ia32_cvtmask2b256:
1355 case X86::BI__builtin_ia32_cvtmask2b512:
1356 case X86::BI__builtin_ia32_cvtmask2w128:
1357 case X86::BI__builtin_ia32_cvtmask2w256:
1358 case X86::BI__builtin_ia32_cvtmask2w512:
1359 case X86::BI__builtin_ia32_cvtmask2d128:
1360 case X86::BI__builtin_ia32_cvtmask2d256:
1361 case X86::BI__builtin_ia32_cvtmask2d512:
1362 case X86::BI__builtin_ia32_cvtmask2q128:
1363 case X86::BI__builtin_ia32_cvtmask2q256:
1364 case X86::BI__builtin_ia32_cvtmask2q512:
1368 case X86::BI__builtin_ia32_cvtb2mask128:
1369 case X86::BI__builtin_ia32_cvtb2mask256:
1370 case X86::BI__builtin_ia32_cvtb2mask512:
1371 case X86::BI__builtin_ia32_cvtw2mask128:
1372 case X86::BI__builtin_ia32_cvtw2mask256:
1373 case X86::BI__builtin_ia32_cvtw2mask512:
1374 case X86::BI__builtin_ia32_cvtd2mask128:
1375 case X86::BI__builtin_ia32_cvtd2mask256:
1376 case X86::BI__builtin_ia32_cvtd2mask512:
1377 case X86::BI__builtin_ia32_cvtq2mask128:
1378 case X86::BI__builtin_ia32_cvtq2mask256:
1379 case X86::BI__builtin_ia32_cvtq2mask512:
1382 case X86::BI__builtin_ia32_cvtdq2ps512_mask:
1383 case X86::BI__builtin_ia32_cvtqq2ps512_mask:
1384 case X86::BI__builtin_ia32_cvtqq2pd512_mask:
1385 case X86::BI__builtin_ia32_vcvtw2ph512_mask:
1386 case X86::BI__builtin_ia32_vcvtdq2ph512_mask:
1387 case X86::BI__builtin_ia32_vcvtqq2ph512_mask:
1388 case X86::BI__builtin_ia32_cvtudq2ps512_mask:
1389 case X86::BI__builtin_ia32_cvtuqq2ps512_mask:
1390 case X86::BI__builtin_ia32_cvtuqq2pd512_mask:
1391 case X86::BI__builtin_ia32_vcvtuw2ph512_mask:
1392 case X86::BI__builtin_ia32_vcvtudq2ph512_mask:
1393 case X86::BI__builtin_ia32_vcvtuqq2ph512_mask:
1394 case X86::BI__builtin_ia32_vfmaddsh3_mask:
1395 case X86::BI__builtin_ia32_vfmaddss3_mask:
1396 case X86::BI__builtin_ia32_vfmaddsd3_mask:
1397 case X86::BI__builtin_ia32_vfmaddsh3_maskz:
1398 case X86::BI__builtin_ia32_vfmaddss3_maskz:
1399 case X86::BI__builtin_ia32_vfmaddsd3_maskz:
1400 case X86::BI__builtin_ia32_vfmaddsh3_mask3:
1401 case X86::BI__builtin_ia32_vfmaddss3_mask3:
1402 case X86::BI__builtin_ia32_vfmaddsd3_mask3:
1403 case X86::BI__builtin_ia32_vfmsubsh3_mask3:
1404 case X86::BI__builtin_ia32_vfmsubss3_mask3:
1405 case X86::BI__builtin_ia32_vfmsubsd3_mask3:
1406 case X86::BI__builtin_ia32_vfmaddph512_mask:
1407 case X86::BI__builtin_ia32_vfmaddph512_maskz:
1408 case X86::BI__builtin_ia32_vfmaddph512_mask3:
1409 case X86::BI__builtin_ia32_vfmaddps512_mask:
1410 case X86::BI__builtin_ia32_vfmaddps512_maskz:
1411 case X86::BI__builtin_ia32_vfmaddps512_mask3:
1412 case X86::BI__builtin_ia32_vfmsubps512_mask3:
1413 case X86::BI__builtin_ia32_vfmaddpd512_mask:
1414 case X86::BI__builtin_ia32_vfmaddpd512_maskz:
1415 case X86::BI__builtin_ia32_vfmaddpd512_mask3:
1416 case X86::BI__builtin_ia32_vfmsubpd512_mask3:
1417 case X86::BI__builtin_ia32_vfmsubph512_mask3:
1418 case X86::BI__builtin_ia32_vfmaddsubph512_mask:
1419 case X86::BI__builtin_ia32_vfmaddsubph512_maskz:
1420 case X86::BI__builtin_ia32_vfmaddsubph512_mask3:
1421 case X86::BI__builtin_ia32_vfmsubaddph512_mask3:
1422 case X86::BI__builtin_ia32_vfmaddsubps512_mask:
1423 case X86::BI__builtin_ia32_vfmaddsubps512_maskz:
1424 case X86::BI__builtin_ia32_vfmaddsubps512_mask3:
1425 case X86::BI__builtin_ia32_vfmsubaddps512_mask3:
1426 case X86::BI__builtin_ia32_vfmaddsubpd512_mask:
1427 case X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
1428 case X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
1429 case X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
1430 case X86::BI__builtin_ia32_movdqa32store128_mask:
1431 case X86::BI__builtin_ia32_movdqa64store128_mask:
1432 case X86::BI__builtin_ia32_storeaps128_mask:
1433 case X86::BI__builtin_ia32_storeapd128_mask:
1434 case X86::BI__builtin_ia32_movdqa32store256_mask:
1435 case X86::BI__builtin_ia32_movdqa64store256_mask:
1436 case X86::BI__builtin_ia32_storeaps256_mask:
1437 case X86::BI__builtin_ia32_storeapd256_mask:
1438 case X86::BI__builtin_ia32_movdqa32store512_mask:
1439 case X86::BI__builtin_ia32_movdqa64store512_mask:
1440 case X86::BI__builtin_ia32_storeaps512_mask:
1441 case X86::BI__builtin_ia32_storeapd512_mask:
1442 cgm.errorNYI(
expr->getSourceRange(),
1443 std::string(
"unimplemented X86 builtin call: ") +
1444 getContext().BuiltinInfo.getName(builtinID));
1447 case X86::BI__builtin_ia32_loadups128_mask:
1448 case X86::BI__builtin_ia32_loadups256_mask:
1449 case X86::BI__builtin_ia32_loadups512_mask:
1450 case X86::BI__builtin_ia32_loadupd128_mask:
1451 case X86::BI__builtin_ia32_loadupd256_mask:
1452 case X86::BI__builtin_ia32_loadupd512_mask:
1453 case X86::BI__builtin_ia32_loaddquqi128_mask:
1454 case X86::BI__builtin_ia32_loaddquqi256_mask:
1455 case X86::BI__builtin_ia32_loaddquqi512_mask:
1456 case X86::BI__builtin_ia32_loaddquhi128_mask:
1457 case X86::BI__builtin_ia32_loaddquhi256_mask:
1458 case X86::BI__builtin_ia32_loaddquhi512_mask:
1459 case X86::BI__builtin_ia32_loaddqusi128_mask:
1460 case X86::BI__builtin_ia32_loaddqusi256_mask:
1461 case X86::BI__builtin_ia32_loaddqusi512_mask:
1462 case X86::BI__builtin_ia32_loaddqudi128_mask:
1463 case X86::BI__builtin_ia32_loaddqudi256_mask:
1464 case X86::BI__builtin_ia32_loaddqudi512_mask:
1465 case X86::BI__builtin_ia32_loadsbf16128_mask:
1466 case X86::BI__builtin_ia32_loadsh128_mask:
1467 case X86::BI__builtin_ia32_loadss128_mask:
1468 case X86::BI__builtin_ia32_loadsd128_mask:
1472 case X86::BI__builtin_ia32_loadaps128_mask:
1473 case X86::BI__builtin_ia32_loadaps256_mask:
1474 case X86::BI__builtin_ia32_loadaps512_mask:
1475 case X86::BI__builtin_ia32_loadapd128_mask:
1476 case X86::BI__builtin_ia32_loadapd256_mask:
1477 case X86::BI__builtin_ia32_loadapd512_mask:
1478 case X86::BI__builtin_ia32_movdqa32load128_mask:
1479 case X86::BI__builtin_ia32_movdqa32load256_mask:
1480 case X86::BI__builtin_ia32_movdqa32load512_mask:
1481 case X86::BI__builtin_ia32_movdqa64load128_mask:
1482 case X86::BI__builtin_ia32_movdqa64load256_mask:
1483 case X86::BI__builtin_ia32_movdqa64load512_mask:
1487 .getTypeAlignInChars(
expr->getArg(1)->getType())
1491 case X86::BI__builtin_ia32_expandloaddf128_mask:
1492 case X86::BI__builtin_ia32_expandloaddf256_mask:
1493 case X86::BI__builtin_ia32_expandloaddf512_mask:
1494 case X86::BI__builtin_ia32_expandloadsf128_mask:
1495 case X86::BI__builtin_ia32_expandloadsf256_mask:
1496 case X86::BI__builtin_ia32_expandloadsf512_mask:
1497 case X86::BI__builtin_ia32_expandloaddi128_mask:
1498 case X86::BI__builtin_ia32_expandloaddi256_mask:
1499 case X86::BI__builtin_ia32_expandloaddi512_mask:
1500 case X86::BI__builtin_ia32_expandloadsi128_mask:
1501 case X86::BI__builtin_ia32_expandloadsi256_mask:
1502 case X86::BI__builtin_ia32_expandloadsi512_mask:
1503 case X86::BI__builtin_ia32_expandloadhi128_mask:
1504 case X86::BI__builtin_ia32_expandloadhi256_mask:
1505 case X86::BI__builtin_ia32_expandloadhi512_mask:
1506 case X86::BI__builtin_ia32_expandloadqi128_mask:
1507 case X86::BI__builtin_ia32_expandloadqi256_mask:
1508 case X86::BI__builtin_ia32_expandloadqi512_mask: {
1509 cgm.errorNYI(
expr->getSourceRange(),
1510 std::string(
"unimplemented X86 builtin call: ") +
1511 getContext().BuiltinInfo.getName(builtinID));
1514 case X86::BI__builtin_ia32_compressstoredf128_mask:
1515 case X86::BI__builtin_ia32_compressstoredf256_mask:
1516 case X86::BI__builtin_ia32_compressstoredf512_mask:
1517 case X86::BI__builtin_ia32_compressstoresf128_mask:
1518 case X86::BI__builtin_ia32_compressstoresf256_mask:
1519 case X86::BI__builtin_ia32_compressstoresf512_mask:
1520 case X86::BI__builtin_ia32_compressstoredi128_mask:
1521 case X86::BI__builtin_ia32_compressstoredi256_mask:
1522 case X86::BI__builtin_ia32_compressstoredi512_mask:
1523 case X86::BI__builtin_ia32_compressstoresi128_mask:
1524 case X86::BI__builtin_ia32_compressstoresi256_mask:
1525 case X86::BI__builtin_ia32_compressstoresi512_mask:
1526 case X86::BI__builtin_ia32_compressstorehi128_mask:
1527 case X86::BI__builtin_ia32_compressstorehi256_mask:
1528 case X86::BI__builtin_ia32_compressstorehi512_mask:
1529 case X86::BI__builtin_ia32_compressstoreqi128_mask:
1530 case X86::BI__builtin_ia32_compressstoreqi256_mask:
1531 case X86::BI__builtin_ia32_compressstoreqi512_mask:
1533 case X86::BI__builtin_ia32_expanddf128_mask:
1534 case X86::BI__builtin_ia32_expanddf256_mask:
1535 case X86::BI__builtin_ia32_expanddf512_mask:
1536 case X86::BI__builtin_ia32_expandsf128_mask:
1537 case X86::BI__builtin_ia32_expandsf256_mask:
1538 case X86::BI__builtin_ia32_expandsf512_mask:
1539 case X86::BI__builtin_ia32_expanddi128_mask:
1540 case X86::BI__builtin_ia32_expanddi256_mask:
1541 case X86::BI__builtin_ia32_expanddi512_mask:
1542 case X86::BI__builtin_ia32_expandsi128_mask:
1543 case X86::BI__builtin_ia32_expandsi256_mask:
1544 case X86::BI__builtin_ia32_expandsi512_mask:
1545 case X86::BI__builtin_ia32_expandhi128_mask:
1546 case X86::BI__builtin_ia32_expandhi256_mask:
1547 case X86::BI__builtin_ia32_expandhi512_mask:
1548 case X86::BI__builtin_ia32_expandqi128_mask:
1549 case X86::BI__builtin_ia32_expandqi256_mask:
1550 case X86::BI__builtin_ia32_expandqi512_mask: {
1551 mlir::Location loc =
getLoc(
expr->getExprLoc());
1553 "x86.avx512.mask.expand");
1555 case X86::BI__builtin_ia32_compressdf128_mask:
1556 case X86::BI__builtin_ia32_compressdf256_mask:
1557 case X86::BI__builtin_ia32_compressdf512_mask:
1558 case X86::BI__builtin_ia32_compresssf128_mask:
1559 case X86::BI__builtin_ia32_compresssf256_mask:
1560 case X86::BI__builtin_ia32_compresssf512_mask:
1561 case X86::BI__builtin_ia32_compressdi128_mask:
1562 case X86::BI__builtin_ia32_compressdi256_mask:
1563 case X86::BI__builtin_ia32_compressdi512_mask:
1564 case X86::BI__builtin_ia32_compresssi128_mask:
1565 case X86::BI__builtin_ia32_compresssi256_mask:
1566 case X86::BI__builtin_ia32_compresssi512_mask:
1567 case X86::BI__builtin_ia32_compresshi128_mask:
1568 case X86::BI__builtin_ia32_compresshi256_mask:
1569 case X86::BI__builtin_ia32_compresshi512_mask:
1570 case X86::BI__builtin_ia32_compressqi128_mask:
1571 case X86::BI__builtin_ia32_compressqi256_mask:
1572 case X86::BI__builtin_ia32_compressqi512_mask: {
1573 mlir::Location loc =
getLoc(
expr->getExprLoc());
1575 "x86.avx512.mask.compress");
1577 case X86::BI__builtin_ia32_gather3div2df:
1578 case X86::BI__builtin_ia32_gather3div2di:
1579 case X86::BI__builtin_ia32_gather3div4df:
1580 case X86::BI__builtin_ia32_gather3div4di:
1581 case X86::BI__builtin_ia32_gather3div4sf:
1582 case X86::BI__builtin_ia32_gather3div4si:
1583 case X86::BI__builtin_ia32_gather3div8sf:
1584 case X86::BI__builtin_ia32_gather3div8si:
1585 case X86::BI__builtin_ia32_gather3siv2df:
1586 case X86::BI__builtin_ia32_gather3siv2di:
1587 case X86::BI__builtin_ia32_gather3siv4df:
1588 case X86::BI__builtin_ia32_gather3siv4di:
1589 case X86::BI__builtin_ia32_gather3siv4sf:
1590 case X86::BI__builtin_ia32_gather3siv4si:
1591 case X86::BI__builtin_ia32_gather3siv8sf:
1592 case X86::BI__builtin_ia32_gather3siv8si:
1593 case X86::BI__builtin_ia32_gathersiv8df:
1594 case X86::BI__builtin_ia32_gathersiv16sf:
1595 case X86::BI__builtin_ia32_gatherdiv8df:
1596 case X86::BI__builtin_ia32_gatherdiv16sf:
1597 case X86::BI__builtin_ia32_gathersiv8di:
1598 case X86::BI__builtin_ia32_gathersiv16si:
1599 case X86::BI__builtin_ia32_gatherdiv8di:
1600 case X86::BI__builtin_ia32_gatherdiv16si: {
1601 StringRef intrinsicName;
1602 switch (builtinID) {
1604 llvm_unreachable(
"Unexpected builtin");
1605 case X86::BI__builtin_ia32_gather3div2df:
1606 intrinsicName =
"x86.avx512.mask.gather3div2.df";
1608 case X86::BI__builtin_ia32_gather3div2di:
1609 intrinsicName =
"x86.avx512.mask.gather3div2.di";
1611 case X86::BI__builtin_ia32_gather3div4df:
1612 intrinsicName =
"x86.avx512.mask.gather3div4.df";
1614 case X86::BI__builtin_ia32_gather3div4di:
1615 intrinsicName =
"x86.avx512.mask.gather3div4.di";
1617 case X86::BI__builtin_ia32_gather3div4sf:
1618 intrinsicName =
"x86.avx512.mask.gather3div4.sf";
1620 case X86::BI__builtin_ia32_gather3div4si:
1621 intrinsicName =
"x86.avx512.mask.gather3div4.si";
1623 case X86::BI__builtin_ia32_gather3div8sf:
1624 intrinsicName =
"x86.avx512.mask.gather3div8.sf";
1626 case X86::BI__builtin_ia32_gather3div8si:
1627 intrinsicName =
"x86.avx512.mask.gather3div8.si";
1629 case X86::BI__builtin_ia32_gather3siv2df:
1630 intrinsicName =
"x86.avx512.mask.gather3siv2.df";
1632 case X86::BI__builtin_ia32_gather3siv2di:
1633 intrinsicName =
"x86.avx512.mask.gather3siv2.di";
1635 case X86::BI__builtin_ia32_gather3siv4df:
1636 intrinsicName =
"x86.avx512.mask.gather3siv4.df";
1638 case X86::BI__builtin_ia32_gather3siv4di:
1639 intrinsicName =
"x86.avx512.mask.gather3siv4.di";
1641 case X86::BI__builtin_ia32_gather3siv4sf:
1642 intrinsicName =
"x86.avx512.mask.gather3siv4.sf";
1644 case X86::BI__builtin_ia32_gather3siv4si:
1645 intrinsicName =
"x86.avx512.mask.gather3siv4.si";
1647 case X86::BI__builtin_ia32_gather3siv8sf:
1648 intrinsicName =
"x86.avx512.mask.gather3siv8.sf";
1650 case X86::BI__builtin_ia32_gather3siv8si:
1651 intrinsicName =
"x86.avx512.mask.gather3siv8.si";
1653 case X86::BI__builtin_ia32_gathersiv8df:
1654 intrinsicName =
"x86.avx512.mask.gather.dpd.512";
1656 case X86::BI__builtin_ia32_gathersiv16sf:
1657 intrinsicName =
"x86.avx512.mask.gather.dps.512";
1659 case X86::BI__builtin_ia32_gatherdiv8df:
1660 intrinsicName =
"x86.avx512.mask.gather.qpd.512";
1662 case X86::BI__builtin_ia32_gatherdiv16sf:
1663 intrinsicName =
"x86.avx512.mask.gather.qps.512";
1665 case X86::BI__builtin_ia32_gathersiv8di:
1666 intrinsicName =
"x86.avx512.mask.gather.dpq.512";
1668 case X86::BI__builtin_ia32_gathersiv16si:
1669 intrinsicName =
"x86.avx512.mask.gather.dpi.512";
1671 case X86::BI__builtin_ia32_gatherdiv8di:
1672 intrinsicName =
"x86.avx512.mask.gather.qpq.512";
1674 case X86::BI__builtin_ia32_gatherdiv16si:
1675 intrinsicName =
"x86.avx512.mask.gather.qpi.512";
1679 mlir::Location loc =
getLoc(
expr->getExprLoc());
1684 return builder.emitIntrinsicCallOp(loc, intrinsicName,
1687 case X86::BI__builtin_ia32_scattersiv8df:
1688 case X86::BI__builtin_ia32_scattersiv16sf:
1689 case X86::BI__builtin_ia32_scatterdiv8df:
1690 case X86::BI__builtin_ia32_scatterdiv16sf:
1691 case X86::BI__builtin_ia32_scattersiv8di:
1692 case X86::BI__builtin_ia32_scattersiv16si:
1693 case X86::BI__builtin_ia32_scatterdiv8di:
1694 case X86::BI__builtin_ia32_scatterdiv16si:
1695 case X86::BI__builtin_ia32_scatterdiv2df:
1696 case X86::BI__builtin_ia32_scatterdiv2di:
1697 case X86::BI__builtin_ia32_scatterdiv4df:
1698 case X86::BI__builtin_ia32_scatterdiv4di:
1699 case X86::BI__builtin_ia32_scatterdiv4sf:
1700 case X86::BI__builtin_ia32_scatterdiv4si:
1701 case X86::BI__builtin_ia32_scatterdiv8sf:
1702 case X86::BI__builtin_ia32_scatterdiv8si:
1703 case X86::BI__builtin_ia32_scattersiv2df:
1704 case X86::BI__builtin_ia32_scattersiv2di:
1705 case X86::BI__builtin_ia32_scattersiv4df:
1706 case X86::BI__builtin_ia32_scattersiv4di:
1707 case X86::BI__builtin_ia32_scattersiv4sf:
1708 case X86::BI__builtin_ia32_scattersiv4si:
1709 case X86::BI__builtin_ia32_scattersiv8sf:
1710 case X86::BI__builtin_ia32_scattersiv8si: {
1711 llvm::StringRef intrinsicName;
1712 switch (builtinID) {
1714 llvm_unreachable(
"Unexpected builtin");
1715 case X86::BI__builtin_ia32_scattersiv8df:
1716 intrinsicName =
"x86.avx512.mask.scatter.dpd.512";
1718 case X86::BI__builtin_ia32_scattersiv16sf:
1719 intrinsicName =
"x86.avx512.mask.scatter.dps.512";
1721 case X86::BI__builtin_ia32_scatterdiv8df:
1722 intrinsicName =
"x86.avx512.mask.scatter.qpd.512";
1724 case X86::BI__builtin_ia32_scatterdiv16sf:
1725 intrinsicName =
"x86.avx512.mask.scatter.qps.512";
1727 case X86::BI__builtin_ia32_scattersiv8di:
1728 intrinsicName =
"x86.avx512.mask.scatter.dpq.512";
1730 case X86::BI__builtin_ia32_scattersiv16si:
1731 intrinsicName =
"x86.avx512.mask.scatter.dpi.512";
1733 case X86::BI__builtin_ia32_scatterdiv8di:
1734 intrinsicName =
"x86.avx512.mask.scatter.qpq.512";
1736 case X86::BI__builtin_ia32_scatterdiv16si:
1737 intrinsicName =
"x86.avx512.mask.scatter.qpi.512";
1739 case X86::BI__builtin_ia32_scatterdiv2df:
1740 intrinsicName =
"x86.avx512.mask.scatterdiv2.df";
1742 case X86::BI__builtin_ia32_scatterdiv2di:
1743 intrinsicName =
"x86.avx512.mask.scatterdiv2.di";
1745 case X86::BI__builtin_ia32_scatterdiv4df:
1746 intrinsicName =
"x86.avx512.mask.scatterdiv4.df";
1748 case X86::BI__builtin_ia32_scatterdiv4di:
1749 intrinsicName =
"x86.avx512.mask.scatterdiv4.di";
1751 case X86::BI__builtin_ia32_scatterdiv4sf:
1752 intrinsicName =
"x86.avx512.mask.scatterdiv4.sf";
1754 case X86::BI__builtin_ia32_scatterdiv4si:
1755 intrinsicName =
"x86.avx512.mask.scatterdiv4.si";
1757 case X86::BI__builtin_ia32_scatterdiv8sf:
1758 intrinsicName =
"x86.avx512.mask.scatterdiv8.sf";
1760 case X86::BI__builtin_ia32_scatterdiv8si:
1761 intrinsicName =
"x86.avx512.mask.scatterdiv8.si";
1763 case X86::BI__builtin_ia32_scattersiv2df:
1764 intrinsicName =
"x86.avx512.mask.scattersiv2.df";
1766 case X86::BI__builtin_ia32_scattersiv2di:
1767 intrinsicName =
"x86.avx512.mask.scattersiv2.di";
1769 case X86::BI__builtin_ia32_scattersiv4df:
1770 intrinsicName =
"x86.avx512.mask.scattersiv4.df";
1772 case X86::BI__builtin_ia32_scattersiv4di:
1773 intrinsicName =
"x86.avx512.mask.scattersiv4.di";
1775 case X86::BI__builtin_ia32_scattersiv4sf:
1776 intrinsicName =
"x86.avx512.mask.scattersiv4.sf";
1778 case X86::BI__builtin_ia32_scattersiv4si:
1779 intrinsicName =
"x86.avx512.mask.scattersiv4.si";
1781 case X86::BI__builtin_ia32_scattersiv8sf:
1782 intrinsicName =
"x86.avx512.mask.scattersiv8.sf";
1784 case X86::BI__builtin_ia32_scattersiv8si:
1785 intrinsicName =
"x86.avx512.mask.scattersiv8.si";
1789 mlir::Location loc =
getLoc(
expr->getExprLoc());
1795 return builder.emitIntrinsicCallOp(loc, intrinsicName,
1798 case X86::BI__builtin_ia32_vextractf128_pd256:
1799 case X86::BI__builtin_ia32_vextractf128_ps256:
1800 case X86::BI__builtin_ia32_vextractf128_si256:
1801 case X86::BI__builtin_ia32_extract128i256:
1802 case X86::BI__builtin_ia32_extractf64x4_mask:
1803 case X86::BI__builtin_ia32_extractf32x4_mask:
1804 case X86::BI__builtin_ia32_extracti64x4_mask:
1805 case X86::BI__builtin_ia32_extracti32x4_mask:
1806 case X86::BI__builtin_ia32_extractf32x8_mask:
1807 case X86::BI__builtin_ia32_extracti32x8_mask:
1808 case X86::BI__builtin_ia32_extractf32x4_256_mask:
1809 case X86::BI__builtin_ia32_extracti32x4_256_mask:
1810 case X86::BI__builtin_ia32_extractf64x2_256_mask:
1811 case X86::BI__builtin_ia32_extracti64x2_256_mask:
1812 case X86::BI__builtin_ia32_extractf64x2_512_mask:
1813 case X86::BI__builtin_ia32_extracti64x2_512_mask: {
1814 mlir::Location loc =
getLoc(
expr->getExprLoc());
1816 unsigned numElts = dstTy.getSize();
1818 unsigned subVectors = srcNumElts / numElts;
1819 assert(llvm::isPowerOf2_32(subVectors) &&
"Expected power of 2 subvectors");
1821 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
1823 index &= subVectors - 1;
1826 int64_t indices[16];
1827 std::iota(indices, indices + numElts,
index);
1829 mlir::Value poison =
1830 builder.getConstant(loc, cir::PoisonAttr::get(ops[0].
getType()));
1831 mlir::Value res = builder.createVecShuffle(loc, ops[0], poison,
1833 if (ops.size() == 4)
1838 case X86::BI__builtin_ia32_vinsertf128_pd256:
1839 case X86::BI__builtin_ia32_vinsertf128_ps256:
1840 case X86::BI__builtin_ia32_vinsertf128_si256:
1841 case X86::BI__builtin_ia32_insert128i256:
1842 case X86::BI__builtin_ia32_insertf64x4:
1843 case X86::BI__builtin_ia32_insertf32x4:
1844 case X86::BI__builtin_ia32_inserti64x4:
1845 case X86::BI__builtin_ia32_inserti32x4:
1846 case X86::BI__builtin_ia32_insertf32x8:
1847 case X86::BI__builtin_ia32_inserti32x8:
1848 case X86::BI__builtin_ia32_insertf32x4_256:
1849 case X86::BI__builtin_ia32_inserti32x4_256:
1850 case X86::BI__builtin_ia32_insertf64x2_256:
1851 case X86::BI__builtin_ia32_inserti64x2_256:
1852 case X86::BI__builtin_ia32_insertf64x2_512:
1853 case X86::BI__builtin_ia32_inserti64x2_512: {
1856 unsigned subVectors = dstNumElts / srcNumElts;
1857 assert(llvm::isPowerOf2_32(subVectors) &&
"Expected power of 2 subvectors");
1858 assert(dstNumElts <= 16);
1861 index &= subVectors - 1;
1862 index *= srcNumElts;
1865 for (
unsigned i = 0; i != dstNumElts; ++i)
1866 mask[i] = (i >= srcNumElts) ? srcNumElts + (i % srcNumElts) : i;
1869 builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[1], mask);
1871 for (
unsigned i = 0; i != dstNumElts; ++i) {
1873 mask[i] = (i -
index) + dstNumElts;
1878 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], op1,
1881 case X86::BI__builtin_ia32_pmovqd512_mask:
1882 case X86::BI__builtin_ia32_pmovwb512_mask: {
1888 case X86::BI__builtin_ia32_pblendw128:
1889 case X86::BI__builtin_ia32_blendpd:
1890 case X86::BI__builtin_ia32_blendps:
1891 case X86::BI__builtin_ia32_blendpd256:
1892 case X86::BI__builtin_ia32_blendps256:
1893 case X86::BI__builtin_ia32_pblendw256:
1894 case X86::BI__builtin_ia32_pblendd128:
1895 case X86::BI__builtin_ia32_pblendd256: {
1902 mlir::Type i32Ty = builder.getSInt32Ty();
1903 for (
unsigned i = 0; i != numElts; ++i)
1905 cir::IntAttr::get(i32Ty, ((imm >> (i % 8)) & 0x1) ? numElts + i : i));
1907 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
1910 case X86::BI__builtin_ia32_pshuflw:
1911 case X86::BI__builtin_ia32_pshuflw256:
1912 case X86::BI__builtin_ia32_pshuflw512:
1915 case X86::BI__builtin_ia32_pshufhw:
1916 case X86::BI__builtin_ia32_pshufhw256:
1917 case X86::BI__builtin_ia32_pshufhw512:
1920 case X86::BI__builtin_ia32_pshufd:
1921 case X86::BI__builtin_ia32_pshufd256:
1922 case X86::BI__builtin_ia32_pshufd512:
1923 case X86::BI__builtin_ia32_vpermilpd:
1924 case X86::BI__builtin_ia32_vpermilps:
1925 case X86::BI__builtin_ia32_vpermilpd256:
1926 case X86::BI__builtin_ia32_vpermilps256:
1927 case X86::BI__builtin_ia32_vpermilpd512:
1928 case X86::BI__builtin_ia32_vpermilps512: {
1934 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], mask);
1936 case X86::BI__builtin_ia32_shufpd:
1937 case X86::BI__builtin_ia32_shufpd256:
1938 case X86::BI__builtin_ia32_shufpd512:
1939 case X86::BI__builtin_ia32_shufps:
1940 case X86::BI__builtin_ia32_shufps256:
1941 case X86::BI__builtin_ia32_shufps512: {
1947 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
1950 case X86::BI__builtin_ia32_permdi256:
1951 case X86::BI__builtin_ia32_permdf256:
1952 case X86::BI__builtin_ia32_permdi512:
1953 case X86::BI__builtin_ia32_permdf512: {
1955 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
1961 for (
unsigned l = 0; l != numElts; l += 4)
1962 for (
unsigned i = 0; i != 4; ++i)
1963 Indices[l + i] = l + ((imm >> (2 * i)) & 0x3);
1965 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0],
1968 case X86::BI__builtin_ia32_palignr128:
1969 case X86::BI__builtin_ia32_palignr256:
1970 case X86::BI__builtin_ia32_palignr512: {
1974 assert(numElts % 16 == 0);
1984 if (shiftVal > 16) {
1991 int64_t indices[64];
1993 for (
unsigned l = 0; l != numElts; l += 16) {
1994 for (
unsigned i = 0; i != 16; ++i) {
1995 uint32_t idx = shiftVal + i;
1997 idx += numElts - 16;
1998 indices[l + i] = l + idx;
2002 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[1], ops[0],
2005 case X86::BI__builtin_ia32_alignd128:
2006 case X86::BI__builtin_ia32_alignd256:
2007 case X86::BI__builtin_ia32_alignd512:
2008 case X86::BI__builtin_ia32_alignq128:
2009 case X86::BI__builtin_ia32_alignq256:
2010 case X86::BI__builtin_ia32_alignq512: {
2013 ops[2].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
2017 shiftVal &= numElts - 1;
2020 mlir::Type i32Ty = builder.getSInt32Ty();
2021 for (
unsigned i = 0; i != numElts; ++i)
2022 indices.push_back(cir::IntAttr::get(i32Ty, i + shiftVal));
2024 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
2027 case X86::BI__builtin_ia32_shuf_f32x4_256:
2028 case X86::BI__builtin_ia32_shuf_f64x2_256:
2029 case X86::BI__builtin_ia32_shuf_i32x4_256:
2030 case X86::BI__builtin_ia32_shuf_i64x2_256:
2031 case X86::BI__builtin_ia32_shuf_f32x4:
2032 case X86::BI__builtin_ia32_shuf_f64x2:
2033 case X86::BI__builtin_ia32_shuf_i32x4:
2034 case X86::BI__builtin_ia32_shuf_i64x2: {
2035 mlir::Value src1 = ops[0];
2036 mlir::Value src2 = ops[1];
2039 ops[2].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
2043 unsigned numLanes = totalBits == 512 ? 4 : 2;
2044 unsigned numElemsPerLane = numElems / numLanes;
2047 mlir::Type i32Ty = builder.getSInt32Ty();
2049 for (
unsigned l = 0; l != numElems; l += numElemsPerLane) {
2050 unsigned index = (imm % numLanes) * numElemsPerLane;
2052 if (l >= (numElems / 2))
2054 for (
unsigned i = 0; i != numElemsPerLane; ++i) {
2055 indices.push_back(cir::IntAttr::get(i32Ty,
index + i));
2059 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), src1, src2,
2062 case X86::BI__builtin_ia32_vperm2f128_pd256:
2063 case X86::BI__builtin_ia32_vperm2f128_ps256:
2064 case X86::BI__builtin_ia32_vperm2f128_si256:
2065 case X86::BI__builtin_ia32_permti256:
2067 case X86::BI__builtin_ia32_pslldqi128_byteshift:
2068 case X86::BI__builtin_ia32_pslldqi256_byteshift:
2069 case X86::BI__builtin_ia32_pslldqi512_byteshift:
2073 case X86::BI__builtin_ia32_psrldqi128_byteshift:
2074 case X86::BI__builtin_ia32_psrldqi256_byteshift:
2075 case X86::BI__builtin_ia32_psrldqi512_byteshift:
2079 case X86::BI__builtin_ia32_kshiftliqi:
2080 case X86::BI__builtin_ia32_kshiftlihi:
2081 case X86::BI__builtin_ia32_kshiftlisi:
2082 case X86::BI__builtin_ia32_kshiftlidi: {
2083 mlir::Location loc =
getLoc(
expr->getExprLoc());
2085 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
2089 if (shiftVal >= numElems)
2090 return builder.getNullValue(ops[0].
getType(), loc);
2095 mlir::Type i32Ty = builder.getSInt32Ty();
2096 for (
auto i : llvm::seq<unsigned>(0, numElems))
2097 indices.push_back(cir::IntAttr::get(i32Ty, numElems + i - shiftVal));
2099 mlir::Value zero = builder.getNullValue(
in.getType(), loc);
2100 mlir::Value sv = builder.createVecShuffle(loc, zero,
in, indices);
2101 return builder.createBitcast(sv, ops[0].
getType());
2103 case X86::BI__builtin_ia32_kshiftriqi:
2104 case X86::BI__builtin_ia32_kshiftrihi:
2105 case X86::BI__builtin_ia32_kshiftrisi:
2106 case X86::BI__builtin_ia32_kshiftridi: {
2107 mlir::Location loc =
getLoc(
expr->getExprLoc());
2109 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
2113 if (shiftVal >= numElems)
2114 return builder.getNullValue(ops[0].
getType(), loc);
2119 mlir::Type i32Ty = builder.getSInt32Ty();
2120 for (
auto i : llvm::seq<unsigned>(0, numElems))
2121 indices.push_back(cir::IntAttr::get(i32Ty, i + shiftVal));
2123 mlir::Value zero = builder.getNullValue(
in.getType(), loc);
2124 mlir::Value sv = builder.createVecShuffle(loc,
in, zero, indices);
2125 return builder.createBitcast(sv, ops[0].
getType());
2127 case X86::BI__builtin_ia32_movnti:
2128 case X86::BI__builtin_ia32_movnti64:
2129 case X86::BI__builtin_ia32_movntsd:
2130 case X86::BI__builtin_ia32_movntss: {
2131 mlir::Location loc =
getLoc(
expr->getExprLoc());
2134 mlir::Value src = ops[1];
2136 if (builtinID == X86::BI__builtin_ia32_movntsd ||
2137 builtinID == X86::BI__builtin_ia32_movntss)
2138 src = builder.createExtractElement(loc, ops[1], 0);
2141 builder.createStore(loc, src, dest,
2143 return so.getValue();
2145 case X86::BI__builtin_ia32_vprotbi:
2146 case X86::BI__builtin_ia32_vprotwi:
2147 case X86::BI__builtin_ia32_vprotdi:
2148 case X86::BI__builtin_ia32_vprotqi:
2149 case X86::BI__builtin_ia32_prold128:
2150 case X86::BI__builtin_ia32_prold256:
2151 case X86::BI__builtin_ia32_prold512:
2152 case X86::BI__builtin_ia32_prolq128:
2153 case X86::BI__builtin_ia32_prolq256:
2154 case X86::BI__builtin_ia32_prolq512:
2156 ops[0], ops[1],
false);
2157 case X86::BI__builtin_ia32_prord128:
2158 case X86::BI__builtin_ia32_prord256:
2159 case X86::BI__builtin_ia32_prord512:
2160 case X86::BI__builtin_ia32_prorq128:
2161 case X86::BI__builtin_ia32_prorq256:
2162 case X86::BI__builtin_ia32_prorq512:
2164 ops[0], ops[1],
true);
2165 case X86::BI__builtin_ia32_selectb_128:
2166 case X86::BI__builtin_ia32_selectb_256:
2167 case X86::BI__builtin_ia32_selectb_512:
2168 case X86::BI__builtin_ia32_selectw_128:
2169 case X86::BI__builtin_ia32_selectw_256:
2170 case X86::BI__builtin_ia32_selectw_512:
2171 case X86::BI__builtin_ia32_selectd_128:
2172 case X86::BI__builtin_ia32_selectd_256:
2173 case X86::BI__builtin_ia32_selectd_512:
2174 case X86::BI__builtin_ia32_selectq_128:
2175 case X86::BI__builtin_ia32_selectq_256:
2176 case X86::BI__builtin_ia32_selectq_512:
2177 case X86::BI__builtin_ia32_selectph_128:
2178 case X86::BI__builtin_ia32_selectph_256:
2179 case X86::BI__builtin_ia32_selectph_512:
2180 case X86::BI__builtin_ia32_selectpbf_128:
2181 case X86::BI__builtin_ia32_selectpbf_256:
2182 case X86::BI__builtin_ia32_selectpbf_512:
2183 case X86::BI__builtin_ia32_selectps_128:
2184 case X86::BI__builtin_ia32_selectps_256:
2185 case X86::BI__builtin_ia32_selectps_512:
2186 case X86::BI__builtin_ia32_selectpd_128:
2187 case X86::BI__builtin_ia32_selectpd_256:
2188 case X86::BI__builtin_ia32_selectpd_512:
2191 case X86::BI__builtin_ia32_selectsh_128:
2192 case X86::BI__builtin_ia32_selectsbf_128:
2193 case X86::BI__builtin_ia32_selectss_128:
2194 case X86::BI__builtin_ia32_selectsd_128: {
2195 mlir::Location loc =
getLoc(
expr->getExprLoc());
2196 mlir::Value scalar1 =
2197 builder.createExtractElement(loc, ops[1], uint64_t(0));
2198 mlir::Value scalar2 =
2199 builder.createExtractElement(loc, ops[2], uint64_t(0));
2200 mlir::Value result =
2202 return builder.createInsertElement(loc, ops[1], result, uint64_t(0));
2204 case X86::BI__builtin_ia32_cmpb128_mask:
2205 case X86::BI__builtin_ia32_cmpb256_mask:
2206 case X86::BI__builtin_ia32_cmpb512_mask:
2207 case X86::BI__builtin_ia32_cmpw128_mask:
2208 case X86::BI__builtin_ia32_cmpw256_mask:
2209 case X86::BI__builtin_ia32_cmpw512_mask:
2210 case X86::BI__builtin_ia32_cmpd128_mask:
2211 case X86::BI__builtin_ia32_cmpd256_mask:
2212 case X86::BI__builtin_ia32_cmpd512_mask:
2213 case X86::BI__builtin_ia32_cmpq128_mask:
2214 case X86::BI__builtin_ia32_cmpq256_mask:
2215 case X86::BI__builtin_ia32_cmpq512_mask:
2216 case X86::BI__builtin_ia32_ucmpb128_mask:
2217 case X86::BI__builtin_ia32_ucmpb256_mask:
2218 case X86::BI__builtin_ia32_ucmpb512_mask:
2219 case X86::BI__builtin_ia32_ucmpw128_mask:
2220 case X86::BI__builtin_ia32_ucmpw256_mask:
2221 case X86::BI__builtin_ia32_ucmpw512_mask:
2222 case X86::BI__builtin_ia32_ucmpd128_mask:
2223 case X86::BI__builtin_ia32_ucmpd256_mask:
2224 case X86::BI__builtin_ia32_ucmpd512_mask:
2225 case X86::BI__builtin_ia32_ucmpq128_mask:
2226 case X86::BI__builtin_ia32_ucmpq256_mask:
2227 case X86::BI__builtin_ia32_ucmpq512_mask: {
2232 case X86::BI__builtin_ia32_vpcomb:
2233 case X86::BI__builtin_ia32_vpcomw:
2234 case X86::BI__builtin_ia32_vpcomd:
2235 case X86::BI__builtin_ia32_vpcomq:
2237 case X86::BI__builtin_ia32_vpcomub:
2238 case X86::BI__builtin_ia32_vpcomuw:
2239 case X86::BI__builtin_ia32_vpcomud:
2240 case X86::BI__builtin_ia32_vpcomuq:
2242 case X86::BI__builtin_ia32_kortestcqi:
2243 case X86::BI__builtin_ia32_kortestchi:
2244 case X86::BI__builtin_ia32_kortestcsi:
2245 case X86::BI__builtin_ia32_kortestcdi: {
2246 mlir::Location loc =
getLoc(
expr->getExprLoc());
2248 mlir::Value allOnesOp =
2249 builder.getConstAPInt(loc, ty, APInt::getAllOnes(ty.getWidth()));
2252 cir::CmpOp::create(builder, loc, cir::CmpOpKind::eq, orOp, allOnesOp);
2253 return builder.createCast(cir::CastKind::bool_to_int, cmp,
2254 cgm.convertType(
expr->getType()));
2256 case X86::BI__builtin_ia32_kortestzqi:
2257 case X86::BI__builtin_ia32_kortestzhi:
2258 case X86::BI__builtin_ia32_kortestzsi:
2259 case X86::BI__builtin_ia32_kortestzdi: {
2260 mlir::Location loc =
getLoc(
expr->getExprLoc());
2262 mlir::Value allZerosOp = builder.getNullValue(ty, loc).getResult();
2265 cir::CmpOp::create(builder, loc, cir::CmpOpKind::eq, orOp, allZerosOp);
2266 return builder.createCast(cir::CastKind::bool_to_int, cmp,
2267 cgm.convertType(
expr->getType()));
2269 case X86::BI__builtin_ia32_ktestcqi:
2271 "x86.avx512.ktestc.b", ops);
2272 case X86::BI__builtin_ia32_ktestzqi:
2274 "x86.avx512.ktestz.b", ops);
2275 case X86::BI__builtin_ia32_ktestchi:
2277 "x86.avx512.ktestc.w", ops);
2278 case X86::BI__builtin_ia32_ktestzhi:
2280 "x86.avx512.ktestz.w", ops);
2281 case X86::BI__builtin_ia32_ktestcsi:
2283 "x86.avx512.ktestc.d", ops);
2284 case X86::BI__builtin_ia32_ktestzsi:
2286 "x86.avx512.ktestz.d", ops);
2287 case X86::BI__builtin_ia32_ktestcdi:
2289 "x86.avx512.ktestc.q", ops);
2290 case X86::BI__builtin_ia32_ktestzdi:
2292 "x86.avx512.ktestz.q", ops);
2293 case X86::BI__builtin_ia32_kaddqi:
2295 "x86.avx512.kadd.b", ops);
2296 case X86::BI__builtin_ia32_kaddhi:
2298 "x86.avx512.kadd.w", ops);
2299 case X86::BI__builtin_ia32_kaddsi:
2301 "x86.avx512.kadd.d", ops);
2302 case X86::BI__builtin_ia32_kadddi:
2304 "x86.avx512.kadd.q", ops);
2305 case X86::BI__builtin_ia32_kandqi:
2306 case X86::BI__builtin_ia32_kandhi:
2307 case X86::BI__builtin_ia32_kandsi:
2308 case X86::BI__builtin_ia32_kanddi:
2311 case X86::BI__builtin_ia32_kandnqi:
2312 case X86::BI__builtin_ia32_kandnhi:
2313 case X86::BI__builtin_ia32_kandnsi:
2314 case X86::BI__builtin_ia32_kandndi:
2317 case X86::BI__builtin_ia32_korqi:
2318 case X86::BI__builtin_ia32_korhi:
2319 case X86::BI__builtin_ia32_korsi:
2320 case X86::BI__builtin_ia32_kordi:
2323 case X86::BI__builtin_ia32_kxnorqi:
2324 case X86::BI__builtin_ia32_kxnorhi:
2325 case X86::BI__builtin_ia32_kxnorsi:
2326 case X86::BI__builtin_ia32_kxnordi:
2329 case X86::BI__builtin_ia32_kxorqi:
2330 case X86::BI__builtin_ia32_kxorhi:
2331 case X86::BI__builtin_ia32_kxorsi:
2332 case X86::BI__builtin_ia32_kxordi:
2335 case X86::BI__builtin_ia32_knotqi:
2336 case X86::BI__builtin_ia32_knothi:
2337 case X86::BI__builtin_ia32_knotsi:
2338 case X86::BI__builtin_ia32_knotdi: {
2340 unsigned numElts = intTy.getWidth();
2341 mlir::Value resVec =
2343 return builder.createBitcast(builder.createNot(resVec), ops[0].getType());
2345 case X86::BI__builtin_ia32_kmovb:
2346 case X86::BI__builtin_ia32_kmovw:
2347 case X86::BI__builtin_ia32_kmovd:
2348 case X86::BI__builtin_ia32_kmovq: {
2353 unsigned numElts = intTy.getWidth();
2354 mlir::Value resVec =
2356 return builder.createBitcast(resVec, ops[0].
getType());
2358 case X86::BI__builtin_ia32_sqrtsh_round_mask:
2359 case X86::BI__builtin_ia32_sqrtsd_round_mask:
2360 case X86::BI__builtin_ia32_sqrtss_round_mask:
2361 cgm.errorNYI(
expr->getSourceRange(),
2362 std::string(
"unimplemented X86 builtin call: ") +
2363 getContext().BuiltinInfo.getName(builtinID));
2364 return mlir::Value{};
2365 case X86::BI__builtin_ia32_sqrtph512:
2366 case X86::BI__builtin_ia32_sqrtps512:
2367 case X86::BI__builtin_ia32_sqrtpd512: {
2368 mlir::Location loc =
getLoc(
expr->getExprLoc());
2369 mlir::Value arg = ops[0];
2370 return cir::SqrtOp::create(builder, loc, arg.getType(), arg).getResult();
2372 case X86::BI__builtin_ia32_pmuludq128:
2373 case X86::BI__builtin_ia32_pmuludq256:
2374 case X86::BI__builtin_ia32_pmuludq512: {
2375 unsigned opTypePrimitiveSizeInBits =
2376 cgm.getDataLayout().getTypeSizeInBits(ops[0].
getType());
2378 ops, opTypePrimitiveSizeInBits);
2380 case X86::BI__builtin_ia32_pmuldq128:
2381 case X86::BI__builtin_ia32_pmuldq256:
2382 case X86::BI__builtin_ia32_pmuldq512: {
2383 unsigned opTypePrimitiveSizeInBits =
2384 cgm.getDataLayout().getTypeSizeInBits(ops[0].
getType());
2386 ops, opTypePrimitiveSizeInBits);
2388 case X86::BI__builtin_ia32_pternlogd512_mask:
2389 case X86::BI__builtin_ia32_pternlogq512_mask:
2390 case X86::BI__builtin_ia32_pternlogd128_mask:
2391 case X86::BI__builtin_ia32_pternlogd256_mask:
2392 case X86::BI__builtin_ia32_pternlogq128_mask:
2393 case X86::BI__builtin_ia32_pternlogq256_mask:
2394 case X86::BI__builtin_ia32_pternlogd512_maskz:
2395 case X86::BI__builtin_ia32_pternlogq512_maskz:
2396 case X86::BI__builtin_ia32_pternlogd128_maskz:
2397 case X86::BI__builtin_ia32_pternlogd256_maskz:
2398 case X86::BI__builtin_ia32_pternlogq128_maskz:
2399 case X86::BI__builtin_ia32_pternlogq256_maskz:
2400 cgm.errorNYI(
expr->getSourceRange(),
2401 std::string(
"unimplemented X86 builtin call: ") +
2402 getContext().BuiltinInfo.getName(builtinID));
2403 return mlir::Value{};
2404 case X86::BI__builtin_ia32_vpshldd128:
2405 case X86::BI__builtin_ia32_vpshldd256:
2406 case X86::BI__builtin_ia32_vpshldd512:
2407 case X86::BI__builtin_ia32_vpshldq128:
2408 case X86::BI__builtin_ia32_vpshldq256:
2409 case X86::BI__builtin_ia32_vpshldq512:
2410 case X86::BI__builtin_ia32_vpshldw128:
2411 case X86::BI__builtin_ia32_vpshldw256:
2412 case X86::BI__builtin_ia32_vpshldw512:
2414 ops[1], ops[2],
false);
2415 case X86::BI__builtin_ia32_vpshrdd128:
2416 case X86::BI__builtin_ia32_vpshrdd256:
2417 case X86::BI__builtin_ia32_vpshrdd512:
2418 case X86::BI__builtin_ia32_vpshrdq128:
2419 case X86::BI__builtin_ia32_vpshrdq256:
2420 case X86::BI__builtin_ia32_vpshrdq512:
2421 case X86::BI__builtin_ia32_vpshrdw128:
2422 case X86::BI__builtin_ia32_vpshrdw256:
2423 case X86::BI__builtin_ia32_vpshrdw512:
2426 ops[0], ops[2],
true);
2427 case X86::BI__builtin_ia32_reduce_fadd_pd512:
2428 case X86::BI__builtin_ia32_reduce_fadd_ps512:
2429 case X86::BI__builtin_ia32_reduce_fadd_ph512:
2430 case X86::BI__builtin_ia32_reduce_fadd_ph256:
2431 case X86::BI__builtin_ia32_reduce_fadd_ph128: {
2433 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
2434 "vector.reduce.fadd", ops[0].getType(),
2435 mlir::ValueRange{ops[0], ops[1]});
2437 case X86::BI__builtin_ia32_reduce_fmul_pd512:
2438 case X86::BI__builtin_ia32_reduce_fmul_ps512:
2439 case X86::BI__builtin_ia32_reduce_fmul_ph512:
2440 case X86::BI__builtin_ia32_reduce_fmul_ph256:
2441 case X86::BI__builtin_ia32_reduce_fmul_ph128: {
2443 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
2444 "vector.reduce.fmul", ops[0].getType(),
2445 mlir::ValueRange{ops[0], ops[1]});
2447 case X86::BI__builtin_ia32_reduce_fmax_pd512:
2448 case X86::BI__builtin_ia32_reduce_fmax_ps512:
2449 case X86::BI__builtin_ia32_reduce_fmax_ph512:
2450 case X86::BI__builtin_ia32_reduce_fmax_ph256:
2451 case X86::BI__builtin_ia32_reduce_fmax_ph128: {
2454 return builder.emitIntrinsicCallOp(
2455 getLoc(
expr->getExprLoc()),
"vector.reduce.fmax",
2456 vecTy.getElementType(), mlir::ValueRange{ops[0]});
2458 case X86::BI__builtin_ia32_reduce_fmin_pd512:
2459 case X86::BI__builtin_ia32_reduce_fmin_ps512:
2460 case X86::BI__builtin_ia32_reduce_fmin_ph512:
2461 case X86::BI__builtin_ia32_reduce_fmin_ph256:
2462 case X86::BI__builtin_ia32_reduce_fmin_ph128: {
2465 return builder.emitIntrinsicCallOp(
2466 getLoc(
expr->getExprLoc()),
"vector.reduce.fmin",
2467 vecTy.getElementType(), mlir::ValueRange{ops[0]});
2469 case X86::BI__builtin_ia32_rdrand16_step:
2470 case X86::BI__builtin_ia32_rdrand32_step:
2471 case X86::BI__builtin_ia32_rdrand64_step:
2472 case X86::BI__builtin_ia32_rdseed16_step:
2473 case X86::BI__builtin_ia32_rdseed32_step:
2474 case X86::BI__builtin_ia32_rdseed64_step: {
2475 llvm::StringRef intrinsicName;
2476 switch (builtinID) {
2478 llvm_unreachable(
"Unsupported intrinsic!");
2479 case X86::BI__builtin_ia32_rdrand16_step:
2480 intrinsicName =
"x86.rdrand.16";
2482 case X86::BI__builtin_ia32_rdrand32_step:
2483 intrinsicName =
"x86.rdrand.32";
2485 case X86::BI__builtin_ia32_rdrand64_step:
2486 intrinsicName =
"x86.rdrand.64";
2488 case X86::BI__builtin_ia32_rdseed16_step:
2489 intrinsicName =
"x86.rdseed.16";
2491 case X86::BI__builtin_ia32_rdseed32_step:
2492 intrinsicName =
"x86.rdseed.32";
2494 case X86::BI__builtin_ia32_rdseed64_step:
2495 intrinsicName =
"x86.rdseed.64";
2499 mlir::Location loc =
getLoc(
expr->getExprLoc());
2502 builder.getUInt32Ty()};
2503 cir::StructType resRecord = cir::StructType::get(
2508 builder.emitIntrinsicCallOp(loc, intrinsicName, resRecord);
2510 cir::ExtractMemberOp::create(builder, loc, randTy, call, 0);
2511 builder.CIRBaseBuilderTy::createStore(loc, rand, ops[0]);
2513 return cir::ExtractMemberOp::create(builder, loc, builder.getUInt32Ty(),
2516 case X86::BI__builtin_ia32_addcarryx_u32:
2517 case X86::BI__builtin_ia32_addcarryx_u64:
2518 case X86::BI__builtin_ia32_subborrow_u32:
2519 case X86::BI__builtin_ia32_subborrow_u64:
2520 cgm.errorNYI(
expr->getSourceRange(),
2521 std::string(
"unimplemented X86 builtin call: ") +
2522 getContext().BuiltinInfo.getName(builtinID));
2523 return mlir::Value{};
2524 case X86::BI__builtin_ia32_fpclassps128_mask:
2525 case X86::BI__builtin_ia32_fpclassps256_mask:
2526 case X86::BI__builtin_ia32_fpclassps512_mask:
2527 case X86::BI__builtin_ia32_vfpclassbf16128_mask:
2528 case X86::BI__builtin_ia32_vfpclassbf16256_mask:
2529 case X86::BI__builtin_ia32_vfpclassbf16512_mask:
2530 case X86::BI__builtin_ia32_fpclassph128_mask:
2531 case X86::BI__builtin_ia32_fpclassph256_mask:
2532 case X86::BI__builtin_ia32_fpclassph512_mask:
2533 case X86::BI__builtin_ia32_fpclasspd128_mask:
2534 case X86::BI__builtin_ia32_fpclasspd256_mask:
2535 case X86::BI__builtin_ia32_fpclasspd512_mask:
2537 case X86::BI__builtin_ia32_vp2intersect_q_512:
2538 case X86::BI__builtin_ia32_vp2intersect_q_256:
2539 case X86::BI__builtin_ia32_vp2intersect_q_128:
2540 case X86::BI__builtin_ia32_vp2intersect_d_512:
2541 case X86::BI__builtin_ia32_vp2intersect_d_256:
2542 case X86::BI__builtin_ia32_vp2intersect_d_128: {
2544 mlir::Location loc =
getLoc(
expr->getExprLoc());
2545 StringRef intrinsicName;
2547 switch (builtinID) {
2549 llvm_unreachable(
"Unexpected builtin");
2550 case X86::BI__builtin_ia32_vp2intersect_q_512:
2551 intrinsicName =
"x86.avx512.vp2intersect.q.512";
2553 case X86::BI__builtin_ia32_vp2intersect_q_256:
2554 intrinsicName =
"x86.avx512.vp2intersect.q.256";
2556 case X86::BI__builtin_ia32_vp2intersect_q_128:
2557 intrinsicName =
"x86.avx512.vp2intersect.q.128";
2559 case X86::BI__builtin_ia32_vp2intersect_d_512:
2560 intrinsicName =
"x86.avx512.vp2intersect.d.512";
2562 case X86::BI__builtin_ia32_vp2intersect_d_256:
2563 intrinsicName =
"x86.avx512.vp2intersect.d.256";
2565 case X86::BI__builtin_ia32_vp2intersect_d_128:
2566 intrinsicName =
"x86.avx512.vp2intersect.d.128";
2570 auto resVector = cir::VectorType::get(builder.getSIntNTy(1), numElts);
2572 mlir::Type resMembers[] = {resVector, resVector};
2573 cir::StructType resRecord = cir::StructType::get(
2577 mlir::Value call = builder.emitIntrinsicCallOp(
2578 getLoc(
expr->getExprLoc()), intrinsicName, resRecord,
2579 mlir::ValueRange{ops[0], ops[1]});
2580 mlir::Value result =
2581 cir::ExtractMemberOp::create(builder, loc, resVector, call, 0);
2585 builder.createStore(loc, result, addr);
2587 result = cir::ExtractMemberOp::create(builder, loc, resVector, call, 1);
2591 builder.createStore(loc, result, addr);
2592 return mlir::Value{};
2594 case X86::BI__builtin_ia32_vpmultishiftqb128:
2595 case X86::BI__builtin_ia32_vpmultishiftqb256:
2596 case X86::BI__builtin_ia32_vpmultishiftqb512:
2597 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
2598 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
2599 case X86::BI__builtin_ia32_vpshufbitqmb512_mask:
2600 case X86::BI__builtin_ia32_cmpeqps:
2601 case X86::BI__builtin_ia32_cmpeqpd:
2604 case X86::BI__builtin_ia32_cmpltps:
2605 case X86::BI__builtin_ia32_cmpltpd:
2608 case X86::BI__builtin_ia32_cmpleps:
2609 case X86::BI__builtin_ia32_cmplepd:
2612 case X86::BI__builtin_ia32_cmpunordps:
2613 case X86::BI__builtin_ia32_cmpunordpd:
2616 case X86::BI__builtin_ia32_cmpneqps:
2617 case X86::BI__builtin_ia32_cmpneqpd:
2620 case X86::BI__builtin_ia32_cmpnltps:
2621 case X86::BI__builtin_ia32_cmpnltpd:
2624 case X86::BI__builtin_ia32_cmpnleps:
2625 case X86::BI__builtin_ia32_cmpnlepd:
2628 case X86::BI__builtin_ia32_cmpordps:
2629 case X86::BI__builtin_ia32_cmpordpd:
2632 case X86::BI__builtin_ia32_cmpph128_mask:
2633 case X86::BI__builtin_ia32_cmpph256_mask:
2634 case X86::BI__builtin_ia32_cmpph512_mask:
2635 case X86::BI__builtin_ia32_cmpps128_mask:
2636 case X86::BI__builtin_ia32_cmpps256_mask:
2637 case X86::BI__builtin_ia32_cmpps512_mask:
2638 case X86::BI__builtin_ia32_cmppd128_mask:
2639 case X86::BI__builtin_ia32_cmppd256_mask:
2640 case X86::BI__builtin_ia32_cmppd512_mask:
2641 case X86::BI__builtin_ia32_vcmpbf16512_mask:
2642 case X86::BI__builtin_ia32_vcmpbf16256_mask:
2643 case X86::BI__builtin_ia32_vcmpbf16128_mask:
2644 case X86::BI__builtin_ia32_cmpps:
2645 case X86::BI__builtin_ia32_cmpps256:
2646 case X86::BI__builtin_ia32_cmppd:
2647 case X86::BI__builtin_ia32_cmppd256:
2648 case X86::BI__builtin_ia32_cmpeqss:
2649 case X86::BI__builtin_ia32_cmpltss:
2650 case X86::BI__builtin_ia32_cmpless:
2651 case X86::BI__builtin_ia32_cmpunordss:
2652 case X86::BI__builtin_ia32_cmpneqss:
2653 case X86::BI__builtin_ia32_cmpnltss:
2654 case X86::BI__builtin_ia32_cmpnless:
2655 case X86::BI__builtin_ia32_cmpordss:
2656 case X86::BI__builtin_ia32_cmpeqsd:
2657 case X86::BI__builtin_ia32_cmpltsd:
2658 case X86::BI__builtin_ia32_cmplesd:
2659 case X86::BI__builtin_ia32_cmpunordsd:
2660 case X86::BI__builtin_ia32_cmpneqsd:
2661 case X86::BI__builtin_ia32_cmpnltsd:
2662 case X86::BI__builtin_ia32_cmpnlesd:
2663 case X86::BI__builtin_ia32_cmpordsd:
2664 cgm.errorNYI(
expr->getSourceRange(),
2665 std::string(
"unimplemented X86 builtin call: ") +
2666 getContext().BuiltinInfo.getName(builtinID));
2668 case X86::BI__builtin_ia32_vcvtph2ps_mask:
2669 case X86::BI__builtin_ia32_vcvtph2ps256_mask:
2670 case X86::BI__builtin_ia32_vcvtph2ps512_mask: {
2671 mlir::Location loc =
getLoc(
expr->getExprLoc());
2675 case X86::BI__builtin_ia32_cvtneps2bf16_128_mask: {
2676 mlir::Location loc =
getLoc(
expr->getExprLoc());
2680 unsigned numElts = inputTy.getSize();
2685 args.push_back(ops[0]);
2686 args.push_back(ops[1]);
2687 args.push_back(mask);
2689 return builder.emitIntrinsicCallOp(
2690 loc,
"x86.avx512bf16.mask.cvtneps2bf16.128", resTy, args);
2692 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
2693 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask: {
2694 mlir::Location loc =
getLoc(
expr->getExprLoc());
2696 StringRef intrinsicName;
2697 if (builtinID == X86::BI__builtin_ia32_cvtneps2bf16_256_mask) {
2698 intrinsicName =
"x86.avx512bf16.cvtneps2bf16.256";
2700 assert(builtinID == X86::BI__builtin_ia32_cvtneps2bf16_512_mask);
2701 intrinsicName =
"x86.avx512bf16.cvtneps2bf16.512";
2704 mlir::Value res = builder.emitIntrinsicCallOp(loc, intrinsicName, resTy,
2705 mlir::ValueRange{ops[0]});
2709 case X86::BI__cpuid:
2710 case X86::BI__cpuidex: {
2711 mlir::Location loc =
getLoc(
expr->getExprLoc());
2712 mlir::Value subFuncId = builtinID == X86::BI__cpuidex
2714 : builder.getConstInt(loc,
sInt32Ty, 0);
2715 cir::CpuIdOp::create(builder, loc, ops[0],
2717 return mlir::Value{};
2720 case X86::BI__emulu:
2722 case X86::BI__umulh:
2723 case X86::BI_mul128:
2724 case X86::BI_umul128: {
2725 cgm.errorNYI(
expr->getSourceRange(),
2726 std::string(
"unimplemented X86 builtin call: ") +
2727 getContext().BuiltinInfo.getName(builtinID));
2728 return mlir::Value{};
2730 case X86::BI__faststorefence: {
2731 cir::AtomicFenceOp::create(
2733 cir::MemOrder::SequentiallyConsistent,
2735 cir::SyncScopeKind::System));
2736 return mlir::Value{};
2738 case X86::BI__shiftleft128:
2739 case X86::BI__shiftright128: {
2743 std::swap(ops[0], ops[1]);
2746 auto amtTy = mlir::cast<cir::IntType>(ops[2].
getType());
2747 cir::IntType i64Ty = builder.getUInt64Ty();
2750 ops[2] = builder.createIntCast(ops[2], i64Ty);
2752 const StringRef intrinsicName =
2753 (builtinID == X86::BI__shiftleft128) ?
"fshl" :
"fshr";
2754 return builder.emitIntrinsicCallOp(
2755 getLoc(
expr->getExprLoc()), intrinsicName, i64Ty,
2756 mlir::ValueRange{ops[0], ops[1], ops[2]});
2758 case X86::BI_ReadWriteBarrier:
2759 case X86::BI_ReadBarrier:
2760 case X86::BI_WriteBarrier: {
2761 cir::AtomicFenceOp::create(
2763 cir::MemOrder::SequentiallyConsistent,
2765 cir::SyncScopeKind::SingleThread));
2766 return mlir::Value{};
2768 case X86::BI_AddressOfReturnAddress: {
2769 mlir::Location loc =
getLoc(
expr->getExprLoc());
2772 return builder.createCast(loc, cir::CastKind::bitcast, addr,
voidPtrTy);
2774 case X86::BI__stosb:
2776 case X86::BI__int2c:
2777 case X86::BI__readfsbyte:
2778 case X86::BI__readfsword:
2779 case X86::BI__readfsdword:
2780 case X86::BI__readfsqword:
2781 case X86::BI__readgsbyte:
2782 case X86::BI__readgsword:
2783 case X86::BI__readgsdword:
2784 case X86::BI__readgsqword: {
2785 cgm.errorNYI(
expr->getSourceRange(),
2786 std::string(
"unimplemented X86 builtin call: ") +
2787 getContext().BuiltinInfo.getName(builtinID));
2788 return mlir::Value{};
2790 case X86::BI__builtin_ia32_encodekey128_u32: {
2792 {ops[0], ops[1]}, ops[2], 6,
"x86.encodekey128", 3);
2794 case X86::BI__builtin_ia32_encodekey256_u32: {
2797 {ops[0], ops[1], ops[2]}, ops[3], 7,
2798 "x86.encodekey256", 4);
2801 case X86::BI__builtin_ia32_aesenc128kl_u8:
2802 case X86::BI__builtin_ia32_aesdec128kl_u8:
2803 case X86::BI__builtin_ia32_aesenc256kl_u8:
2804 case X86::BI__builtin_ia32_aesdec256kl_u8: {
2805 llvm::StringRef intrinsicName;
2806 switch (builtinID) {
2808 llvm_unreachable(
"Unexpected builtin");
2809 case X86::BI__builtin_ia32_aesenc128kl_u8:
2810 intrinsicName =
"x86.aesenc128kl";
2812 case X86::BI__builtin_ia32_aesdec128kl_u8:
2813 intrinsicName =
"x86.aesdec128kl";
2815 case X86::BI__builtin_ia32_aesenc256kl_u8:
2816 intrinsicName =
"x86.aesenc256kl";
2818 case X86::BI__builtin_ia32_aesdec256kl_u8:
2819 intrinsicName =
"x86.aesdec256kl";
2826 case X86::BI__builtin_ia32_aesencwide128kl_u8:
2827 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
2828 case X86::BI__builtin_ia32_aesencwide256kl_u8:
2829 case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
2830 llvm::StringRef intrinsicName;
2831 switch (builtinID) {
2833 llvm_unreachable(
"Unexpected builtin");
2834 case X86::BI__builtin_ia32_aesencwide128kl_u8:
2835 intrinsicName =
"x86.aesencwide128kl";
2837 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
2838 intrinsicName =
"x86.aesdecwide128kl";
2840 case X86::BI__builtin_ia32_aesencwide256kl_u8:
2841 intrinsicName =
"x86.aesencwide256kl";
2843 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
2844 intrinsicName =
"x86.aesdecwide256kl";
2851 case X86::BI__builtin_ia32_vfcmaddcph512_mask:
2852 case X86::BI__builtin_ia32_vfmaddcph512_mask:
2853 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask:
2854 case X86::BI__builtin_ia32_vfmaddcsh_round_mask:
2855 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3:
2856 case X86::BI__builtin_ia32_vfmaddcsh_round_mask3:
2857 case X86::BI__builtin_ia32_prefetchi:
2858 cgm.errorNYI(
expr->getSourceRange(),
2859 std::string(
"unimplemented X86 builtin call: ") +
2860 getContext().BuiltinInfo.getName(builtinID));
2861 return mlir::Value{};