1267 if (builtinID == Builtin::BI__builtin_cpu_is)
1269 if (builtinID == Builtin::BI__builtin_cpu_supports)
1271 if (builtinID == Builtin::BI__builtin_cpu_init)
1277 if (std::optional<MSVCIntrin> MsvcIntId =
1289 unsigned iceArguments = 0;
1294 for (
auto [idx, arg] : llvm::enumerate(
expr->arguments()))
1298 mlir::Type
voidTy = builder.getVoidTy();
1300 switch (builtinID) {
1302 return std::nullopt;
1303 case X86::BI_mm_clflush:
1304 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1305 "x86.sse2.clflush",
voidTy, ops[0]);
1306 case X86::BI_mm_lfence:
1307 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1308 "x86.sse2.lfence",
voidTy);
1309 case X86::BI_mm_pause:
1310 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1311 "x86.sse2.pause",
voidTy);
1312 case X86::BI_mm_mfence:
1313 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1314 "x86.sse2.mfence",
voidTy);
1315 case X86::BI_mm_sfence:
1316 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
1317 "x86.sse.sfence",
voidTy);
1318 case X86::BI_mm_prefetch:
1319 case X86::BI_m_prefetch:
1320 case X86::BI_m_prefetchw:
1322 case X86::BI__rdtsc:
1323 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
"x86.rdtsc",
1324 builder.getUInt64Ty());
1325 case X86::BI__builtin_ia32_rdtscp: {
1326 mlir::Location loc =
getLoc(
expr->getExprLoc());
1327 mlir::Type i64Ty = builder.getUInt64Ty();
1328 mlir::Type i32Ty = builder.getUInt32Ty();
1329 mlir::Type members[] = {i64Ty, i32Ty};
1330 mlir::Type structTy = builder.getAnonRecordTy(
1332 mlir::Value result =
1333 builder.emitIntrinsicCallOp(loc,
"x86.rdtscp", structTy);
1336 mlir::Value processorId =
1337 cir::ExtractMemberOp::create(builder, loc, i32Ty, result, 1);
1342 return cir::ExtractMemberOp::create(builder, loc, i64Ty, result, 0);
1344 case X86::BI__builtin_ia32_roundps:
1345 case X86::BI__builtin_ia32_roundpd:
1346 case X86::BI__builtin_ia32_roundps256:
1347 case X86::BI__builtin_ia32_roundpd256:
1348 case X86::BI__builtin_ia32_roundss:
1349 case X86::BI__builtin_ia32_roundsd:
1351 case X86::BI__builtin_ia32_lzcnt_u16:
1352 case X86::BI__builtin_ia32_lzcnt_u32:
1353 case X86::BI__builtin_ia32_lzcnt_u64:
1354 return cir::BitClzOp::create(builder,
getLoc(
expr->getExprLoc()), ops[0],
1357 case X86::BI__builtin_ia32_tzcnt_u16:
1358 case X86::BI__builtin_ia32_tzcnt_u32:
1359 case X86::BI__builtin_ia32_tzcnt_u64:
1360 return cir::BitCtzOp::create(builder,
getLoc(
expr->getExprLoc()), ops[0],
1363 case X86::BI__builtin_ia32_undef128:
1364 case X86::BI__builtin_ia32_undef256:
1365 case X86::BI__builtin_ia32_undef512:
1373 case X86::BI__builtin_ia32_vec_ext_v4hi:
1374 case X86::BI__builtin_ia32_vec_ext_v16qi:
1375 case X86::BI__builtin_ia32_vec_ext_v8hi:
1376 case X86::BI__builtin_ia32_vec_ext_v4si:
1377 case X86::BI__builtin_ia32_vec_ext_v4sf:
1378 case X86::BI__builtin_ia32_vec_ext_v2di:
1379 case X86::BI__builtin_ia32_vec_ext_v32qi:
1380 case X86::BI__builtin_ia32_vec_ext_v16hi:
1381 case X86::BI__builtin_ia32_vec_ext_v8si:
1382 case X86::BI__builtin_ia32_vec_ext_v4di: {
1386 index &= numElts - 1;
1388 cir::ConstantOp indexVal =
1393 return cir::VecExtractOp::create(builder,
getLoc(
expr->getExprLoc()),
1396 case X86::BI__builtin_ia32_vec_set_v4hi:
1397 case X86::BI__builtin_ia32_vec_set_v16qi:
1398 case X86::BI__builtin_ia32_vec_set_v8hi:
1399 case X86::BI__builtin_ia32_vec_set_v4si:
1400 case X86::BI__builtin_ia32_vec_set_v2di:
1401 case X86::BI__builtin_ia32_vec_set_v32qi:
1402 case X86::BI__builtin_ia32_vec_set_v16hi:
1403 case X86::BI__builtin_ia32_vec_set_v8si:
1404 case X86::BI__builtin_ia32_vec_set_v4di: {
1408 case X86::BI__builtin_ia32_kunpckhi:
1410 "x86.avx512.kunpackb", ops);
1411 case X86::BI__builtin_ia32_kunpcksi:
1413 "x86.avx512.kunpackw", ops);
1414 case X86::BI__builtin_ia32_kunpckdi:
1416 "x86.avx512.kunpackd", ops);
1417 case X86::BI_mm_setcsr:
1418 case X86::BI__builtin_ia32_ldmxcsr: {
1419 mlir::Location loc =
getLoc(
expr->getExprLoc());
1421 builder.createStore(loc, ops[0], tmp);
1422 return builder.emitIntrinsicCallOp(loc,
"x86.sse.ldmxcsr",
1425 case X86::BI_mm_getcsr:
1426 case X86::BI__builtin_ia32_stmxcsr: {
1427 mlir::Location loc =
getLoc(
expr->getExprLoc());
1429 builder.emitIntrinsicCallOp(loc,
"x86.sse.stmxcsr", builder.getVoidTy(),
1431 return builder.createLoad(loc, tmp);
1433 case X86::BI__builtin_ia32_xsave:
1434 case X86::BI__builtin_ia32_xsave64:
1435 case X86::BI__builtin_ia32_xrstor:
1436 case X86::BI__builtin_ia32_xrstor64:
1437 case X86::BI__builtin_ia32_xsaveopt:
1438 case X86::BI__builtin_ia32_xsaveopt64:
1439 case X86::BI__builtin_ia32_xrstors:
1440 case X86::BI__builtin_ia32_xrstors64:
1441 case X86::BI__builtin_ia32_xsavec:
1442 case X86::BI__builtin_ia32_xsavec64:
1443 case X86::BI__builtin_ia32_xsaves:
1444 case X86::BI__builtin_ia32_xsaves64:
1445 case X86::BI__builtin_ia32_xsetbv:
1446 case X86::BI_xsetbv: {
1447 mlir::Location loc =
getLoc(
expr->getExprLoc());
1448 StringRef intrinsicName;
1449 switch (builtinID) {
1451 llvm_unreachable(
"Unexpected builtin");
1452 case X86::BI__builtin_ia32_xsave:
1453 intrinsicName =
"x86.xsave";
1455 case X86::BI__builtin_ia32_xsave64:
1456 intrinsicName =
"x86.xsave64";
1458 case X86::BI__builtin_ia32_xrstor:
1459 intrinsicName =
"x86.xrstor";
1461 case X86::BI__builtin_ia32_xrstor64:
1462 intrinsicName =
"x86.xrstor64";
1464 case X86::BI__builtin_ia32_xsaveopt:
1465 intrinsicName =
"x86.xsaveopt";
1467 case X86::BI__builtin_ia32_xsaveopt64:
1468 intrinsicName =
"x86.xsaveopt64";
1470 case X86::BI__builtin_ia32_xrstors:
1471 intrinsicName =
"x86.xrstors";
1473 case X86::BI__builtin_ia32_xrstors64:
1474 intrinsicName =
"x86.xrstors64";
1476 case X86::BI__builtin_ia32_xsavec:
1477 intrinsicName =
"x86.xsavec";
1479 case X86::BI__builtin_ia32_xsavec64:
1480 intrinsicName =
"x86.xsavec64";
1482 case X86::BI__builtin_ia32_xsaves:
1483 intrinsicName =
"x86.xsaves";
1485 case X86::BI__builtin_ia32_xsaves64:
1486 intrinsicName =
"x86.xsaves64";
1488 case X86::BI__builtin_ia32_xsetbv:
1489 case X86::BI_xsetbv:
1490 intrinsicName =
"x86.xsetbv";
1498 mlir::Type i32Ty = builder.getSInt32Ty();
1501 cir::ConstantOp shift32 = builder.getSInt64(32, loc);
1502 mlir::Value mhi = builder.createShift(loc, ops[1], shift32.getResult(),
1504 mhi = builder.createIntCast(mhi, i32Ty);
1507 mlir::Value mlo = builder.createIntCast(ops[1], i32Ty);
1509 return builder.emitIntrinsicCallOp(loc, intrinsicName,
voidTy,
1510 mlir::ValueRange{ops[0], mhi, mlo});
1512 case X86::BI__builtin_ia32_xgetbv:
1513 case X86::BI_xgetbv:
1516 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
"x86.xgetbv",
1517 builder.getUInt64Ty(), ops[0]);
1518 case X86::BI__builtin_ia32_storedqudi128_mask:
1519 case X86::BI__builtin_ia32_storedqusi128_mask:
1520 case X86::BI__builtin_ia32_storedquhi128_mask:
1521 case X86::BI__builtin_ia32_storedquqi128_mask:
1522 case X86::BI__builtin_ia32_storeupd128_mask:
1523 case X86::BI__builtin_ia32_storeups128_mask:
1524 case X86::BI__builtin_ia32_storedqudi256_mask:
1525 case X86::BI__builtin_ia32_storedqusi256_mask:
1526 case X86::BI__builtin_ia32_storedquhi256_mask:
1527 case X86::BI__builtin_ia32_storedquqi256_mask:
1528 case X86::BI__builtin_ia32_storeupd256_mask:
1529 case X86::BI__builtin_ia32_storeups256_mask:
1530 case X86::BI__builtin_ia32_storedqudi512_mask:
1531 case X86::BI__builtin_ia32_storedqusi512_mask:
1532 case X86::BI__builtin_ia32_storedquhi512_mask:
1533 case X86::BI__builtin_ia32_storedquqi512_mask:
1534 case X86::BI__builtin_ia32_storeupd512_mask:
1535 case X86::BI__builtin_ia32_storeups512_mask:
1536 case X86::BI__builtin_ia32_storesbf16128_mask:
1537 case X86::BI__builtin_ia32_storesh128_mask:
1538 case X86::BI__builtin_ia32_storess128_mask:
1539 case X86::BI__builtin_ia32_storesd128_mask:
1540 cgm.errorNYI(
expr->getSourceRange(),
1541 std::string(
"unimplemented x86 builtin call: ") +
1542 getContext().BuiltinInfo.getName(builtinID));
1543 return mlir::Value{};
1544 case X86::BI__builtin_ia32_cvtmask2b128:
1545 case X86::BI__builtin_ia32_cvtmask2b256:
1546 case X86::BI__builtin_ia32_cvtmask2b512:
1547 case X86::BI__builtin_ia32_cvtmask2w128:
1548 case X86::BI__builtin_ia32_cvtmask2w256:
1549 case X86::BI__builtin_ia32_cvtmask2w512:
1550 case X86::BI__builtin_ia32_cvtmask2d128:
1551 case X86::BI__builtin_ia32_cvtmask2d256:
1552 case X86::BI__builtin_ia32_cvtmask2d512:
1553 case X86::BI__builtin_ia32_cvtmask2q128:
1554 case X86::BI__builtin_ia32_cvtmask2q256:
1555 case X86::BI__builtin_ia32_cvtmask2q512:
1559 case X86::BI__builtin_ia32_cvtb2mask128:
1560 case X86::BI__builtin_ia32_cvtb2mask256:
1561 case X86::BI__builtin_ia32_cvtb2mask512:
1562 case X86::BI__builtin_ia32_cvtw2mask128:
1563 case X86::BI__builtin_ia32_cvtw2mask256:
1564 case X86::BI__builtin_ia32_cvtw2mask512:
1565 case X86::BI__builtin_ia32_cvtd2mask128:
1566 case X86::BI__builtin_ia32_cvtd2mask256:
1567 case X86::BI__builtin_ia32_cvtd2mask512:
1568 case X86::BI__builtin_ia32_cvtq2mask128:
1569 case X86::BI__builtin_ia32_cvtq2mask256:
1570 case X86::BI__builtin_ia32_cvtq2mask512:
1573 case X86::BI__builtin_ia32_cvtdq2ps512_mask:
1574 case X86::BI__builtin_ia32_cvtqq2ps512_mask:
1575 case X86::BI__builtin_ia32_cvtqq2pd512_mask:
1576 case X86::BI__builtin_ia32_vcvtw2ph512_mask:
1577 case X86::BI__builtin_ia32_vcvtdq2ph512_mask:
1578 case X86::BI__builtin_ia32_vcvtqq2ph512_mask:
1579 case X86::BI__builtin_ia32_cvtudq2ps512_mask:
1580 case X86::BI__builtin_ia32_cvtuqq2ps512_mask:
1581 case X86::BI__builtin_ia32_cvtuqq2pd512_mask:
1582 case X86::BI__builtin_ia32_vcvtuw2ph512_mask:
1583 case X86::BI__builtin_ia32_vcvtudq2ph512_mask:
1584 case X86::BI__builtin_ia32_vcvtuqq2ph512_mask:
1585 case X86::BI__builtin_ia32_vfmaddsh3_mask:
1586 case X86::BI__builtin_ia32_vfmaddss3_mask:
1587 case X86::BI__builtin_ia32_vfmaddsd3_mask:
1588 case X86::BI__builtin_ia32_vfmaddsh3_maskz:
1589 case X86::BI__builtin_ia32_vfmaddss3_maskz:
1590 case X86::BI__builtin_ia32_vfmaddsd3_maskz:
1591 case X86::BI__builtin_ia32_vfmaddsh3_mask3:
1592 case X86::BI__builtin_ia32_vfmaddss3_mask3:
1593 case X86::BI__builtin_ia32_vfmaddsd3_mask3:
1594 case X86::BI__builtin_ia32_vfmsubsh3_mask3:
1595 case X86::BI__builtin_ia32_vfmsubss3_mask3:
1596 case X86::BI__builtin_ia32_vfmsubsd3_mask3:
1597 case X86::BI__builtin_ia32_vfmaddph512_mask:
1598 case X86::BI__builtin_ia32_vfmaddph512_maskz:
1599 case X86::BI__builtin_ia32_vfmaddph512_mask3:
1600 case X86::BI__builtin_ia32_vfmaddps512_mask:
1601 case X86::BI__builtin_ia32_vfmaddps512_maskz:
1602 case X86::BI__builtin_ia32_vfmaddps512_mask3:
1603 case X86::BI__builtin_ia32_vfmsubps512_mask3:
1604 case X86::BI__builtin_ia32_vfmaddpd512_mask:
1605 case X86::BI__builtin_ia32_vfmaddpd512_maskz:
1606 case X86::BI__builtin_ia32_vfmaddpd512_mask3:
1607 case X86::BI__builtin_ia32_vfmsubpd512_mask3:
1608 case X86::BI__builtin_ia32_vfmsubph512_mask3:
1609 case X86::BI__builtin_ia32_vfmaddsubph512_mask:
1610 case X86::BI__builtin_ia32_vfmaddsubph512_maskz:
1611 case X86::BI__builtin_ia32_vfmaddsubph512_mask3:
1612 case X86::BI__builtin_ia32_vfmsubaddph512_mask3:
1613 case X86::BI__builtin_ia32_vfmaddsubps512_mask:
1614 case X86::BI__builtin_ia32_vfmaddsubps512_maskz:
1615 case X86::BI__builtin_ia32_vfmaddsubps512_mask3:
1616 case X86::BI__builtin_ia32_vfmsubaddps512_mask3:
1617 case X86::BI__builtin_ia32_vfmaddsubpd512_mask:
1618 case X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
1619 case X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
1620 case X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
1621 case X86::BI__builtin_ia32_movdqa32store128_mask:
1622 case X86::BI__builtin_ia32_movdqa64store128_mask:
1623 case X86::BI__builtin_ia32_storeaps128_mask:
1624 case X86::BI__builtin_ia32_storeapd128_mask:
1625 case X86::BI__builtin_ia32_movdqa32store256_mask:
1626 case X86::BI__builtin_ia32_movdqa64store256_mask:
1627 case X86::BI__builtin_ia32_storeaps256_mask:
1628 case X86::BI__builtin_ia32_storeapd256_mask:
1629 case X86::BI__builtin_ia32_movdqa32store512_mask:
1630 case X86::BI__builtin_ia32_movdqa64store512_mask:
1631 case X86::BI__builtin_ia32_storeaps512_mask:
1632 case X86::BI__builtin_ia32_storeapd512_mask:
1633 cgm.errorNYI(
expr->getSourceRange(),
1634 std::string(
"unimplemented X86 builtin call: ") +
1635 getContext().BuiltinInfo.getName(builtinID));
1638 case X86::BI__builtin_ia32_loadups128_mask:
1639 case X86::BI__builtin_ia32_loadups256_mask:
1640 case X86::BI__builtin_ia32_loadups512_mask:
1641 case X86::BI__builtin_ia32_loadupd128_mask:
1642 case X86::BI__builtin_ia32_loadupd256_mask:
1643 case X86::BI__builtin_ia32_loadupd512_mask:
1644 case X86::BI__builtin_ia32_loaddquqi128_mask:
1645 case X86::BI__builtin_ia32_loaddquqi256_mask:
1646 case X86::BI__builtin_ia32_loaddquqi512_mask:
1647 case X86::BI__builtin_ia32_loaddquhi128_mask:
1648 case X86::BI__builtin_ia32_loaddquhi256_mask:
1649 case X86::BI__builtin_ia32_loaddquhi512_mask:
1650 case X86::BI__builtin_ia32_loaddqusi128_mask:
1651 case X86::BI__builtin_ia32_loaddqusi256_mask:
1652 case X86::BI__builtin_ia32_loaddqusi512_mask:
1653 case X86::BI__builtin_ia32_loaddqudi128_mask:
1654 case X86::BI__builtin_ia32_loaddqudi256_mask:
1655 case X86::BI__builtin_ia32_loaddqudi512_mask:
1656 case X86::BI__builtin_ia32_loadsbf16128_mask:
1657 case X86::BI__builtin_ia32_loadsh128_mask:
1658 case X86::BI__builtin_ia32_loadss128_mask:
1659 case X86::BI__builtin_ia32_loadsd128_mask:
1663 case X86::BI__builtin_ia32_loadaps128_mask:
1664 case X86::BI__builtin_ia32_loadaps256_mask:
1665 case X86::BI__builtin_ia32_loadaps512_mask:
1666 case X86::BI__builtin_ia32_loadapd128_mask:
1667 case X86::BI__builtin_ia32_loadapd256_mask:
1668 case X86::BI__builtin_ia32_loadapd512_mask:
1669 case X86::BI__builtin_ia32_movdqa32load128_mask:
1670 case X86::BI__builtin_ia32_movdqa32load256_mask:
1671 case X86::BI__builtin_ia32_movdqa32load512_mask:
1672 case X86::BI__builtin_ia32_movdqa64load128_mask:
1673 case X86::BI__builtin_ia32_movdqa64load256_mask:
1674 case X86::BI__builtin_ia32_movdqa64load512_mask:
1678 .getTypeAlignInChars(
expr->getArg(1)->getType())
1682 case X86::BI__builtin_ia32_expandloaddf128_mask:
1683 case X86::BI__builtin_ia32_expandloaddf256_mask:
1684 case X86::BI__builtin_ia32_expandloaddf512_mask:
1685 case X86::BI__builtin_ia32_expandloadsf128_mask:
1686 case X86::BI__builtin_ia32_expandloadsf256_mask:
1687 case X86::BI__builtin_ia32_expandloadsf512_mask:
1688 case X86::BI__builtin_ia32_expandloaddi128_mask:
1689 case X86::BI__builtin_ia32_expandloaddi256_mask:
1690 case X86::BI__builtin_ia32_expandloaddi512_mask:
1691 case X86::BI__builtin_ia32_expandloadsi128_mask:
1692 case X86::BI__builtin_ia32_expandloadsi256_mask:
1693 case X86::BI__builtin_ia32_expandloadsi512_mask:
1694 case X86::BI__builtin_ia32_expandloadhi128_mask:
1695 case X86::BI__builtin_ia32_expandloadhi256_mask:
1696 case X86::BI__builtin_ia32_expandloadhi512_mask:
1697 case X86::BI__builtin_ia32_expandloadqi128_mask:
1698 case X86::BI__builtin_ia32_expandloadqi256_mask:
1699 case X86::BI__builtin_ia32_expandloadqi512_mask: {
1700 cgm.errorNYI(
expr->getSourceRange(),
1701 std::string(
"unimplemented X86 builtin call: ") +
1702 getContext().BuiltinInfo.getName(builtinID));
1705 case X86::BI__builtin_ia32_compressstoredf128_mask:
1706 case X86::BI__builtin_ia32_compressstoredf256_mask:
1707 case X86::BI__builtin_ia32_compressstoredf512_mask:
1708 case X86::BI__builtin_ia32_compressstoresf128_mask:
1709 case X86::BI__builtin_ia32_compressstoresf256_mask:
1710 case X86::BI__builtin_ia32_compressstoresf512_mask:
1711 case X86::BI__builtin_ia32_compressstoredi128_mask:
1712 case X86::BI__builtin_ia32_compressstoredi256_mask:
1713 case X86::BI__builtin_ia32_compressstoredi512_mask:
1714 case X86::BI__builtin_ia32_compressstoresi128_mask:
1715 case X86::BI__builtin_ia32_compressstoresi256_mask:
1716 case X86::BI__builtin_ia32_compressstoresi512_mask:
1717 case X86::BI__builtin_ia32_compressstorehi128_mask:
1718 case X86::BI__builtin_ia32_compressstorehi256_mask:
1719 case X86::BI__builtin_ia32_compressstorehi512_mask:
1720 case X86::BI__builtin_ia32_compressstoreqi128_mask:
1721 case X86::BI__builtin_ia32_compressstoreqi256_mask:
1722 case X86::BI__builtin_ia32_compressstoreqi512_mask:
1724 case X86::BI__builtin_ia32_expanddf128_mask:
1725 case X86::BI__builtin_ia32_expanddf256_mask:
1726 case X86::BI__builtin_ia32_expanddf512_mask:
1727 case X86::BI__builtin_ia32_expandsf128_mask:
1728 case X86::BI__builtin_ia32_expandsf256_mask:
1729 case X86::BI__builtin_ia32_expandsf512_mask:
1730 case X86::BI__builtin_ia32_expanddi128_mask:
1731 case X86::BI__builtin_ia32_expanddi256_mask:
1732 case X86::BI__builtin_ia32_expanddi512_mask:
1733 case X86::BI__builtin_ia32_expandsi128_mask:
1734 case X86::BI__builtin_ia32_expandsi256_mask:
1735 case X86::BI__builtin_ia32_expandsi512_mask:
1736 case X86::BI__builtin_ia32_expandhi128_mask:
1737 case X86::BI__builtin_ia32_expandhi256_mask:
1738 case X86::BI__builtin_ia32_expandhi512_mask:
1739 case X86::BI__builtin_ia32_expandqi128_mask:
1740 case X86::BI__builtin_ia32_expandqi256_mask:
1741 case X86::BI__builtin_ia32_expandqi512_mask: {
1742 mlir::Location loc =
getLoc(
expr->getExprLoc());
1744 "x86.avx512.mask.expand");
1746 case X86::BI__builtin_ia32_compressdf128_mask:
1747 case X86::BI__builtin_ia32_compressdf256_mask:
1748 case X86::BI__builtin_ia32_compressdf512_mask:
1749 case X86::BI__builtin_ia32_compresssf128_mask:
1750 case X86::BI__builtin_ia32_compresssf256_mask:
1751 case X86::BI__builtin_ia32_compresssf512_mask:
1752 case X86::BI__builtin_ia32_compressdi128_mask:
1753 case X86::BI__builtin_ia32_compressdi256_mask:
1754 case X86::BI__builtin_ia32_compressdi512_mask:
1755 case X86::BI__builtin_ia32_compresssi128_mask:
1756 case X86::BI__builtin_ia32_compresssi256_mask:
1757 case X86::BI__builtin_ia32_compresssi512_mask:
1758 case X86::BI__builtin_ia32_compresshi128_mask:
1759 case X86::BI__builtin_ia32_compresshi256_mask:
1760 case X86::BI__builtin_ia32_compresshi512_mask:
1761 case X86::BI__builtin_ia32_compressqi128_mask:
1762 case X86::BI__builtin_ia32_compressqi256_mask:
1763 case X86::BI__builtin_ia32_compressqi512_mask: {
1764 mlir::Location loc =
getLoc(
expr->getExprLoc());
1766 "x86.avx512.mask.compress");
1768 case X86::BI__builtin_ia32_gather3div2df:
1769 case X86::BI__builtin_ia32_gather3div2di:
1770 case X86::BI__builtin_ia32_gather3div4df:
1771 case X86::BI__builtin_ia32_gather3div4di:
1772 case X86::BI__builtin_ia32_gather3div4sf:
1773 case X86::BI__builtin_ia32_gather3div4si:
1774 case X86::BI__builtin_ia32_gather3div8sf:
1775 case X86::BI__builtin_ia32_gather3div8si:
1776 case X86::BI__builtin_ia32_gather3siv2df:
1777 case X86::BI__builtin_ia32_gather3siv2di:
1778 case X86::BI__builtin_ia32_gather3siv4df:
1779 case X86::BI__builtin_ia32_gather3siv4di:
1780 case X86::BI__builtin_ia32_gather3siv4sf:
1781 case X86::BI__builtin_ia32_gather3siv4si:
1782 case X86::BI__builtin_ia32_gather3siv8sf:
1783 case X86::BI__builtin_ia32_gather3siv8si:
1784 case X86::BI__builtin_ia32_gathersiv8df:
1785 case X86::BI__builtin_ia32_gathersiv16sf:
1786 case X86::BI__builtin_ia32_gatherdiv8df:
1787 case X86::BI__builtin_ia32_gatherdiv16sf:
1788 case X86::BI__builtin_ia32_gathersiv8di:
1789 case X86::BI__builtin_ia32_gathersiv16si:
1790 case X86::BI__builtin_ia32_gatherdiv8di:
1791 case X86::BI__builtin_ia32_gatherdiv16si: {
1792 StringRef intrinsicName;
1793 switch (builtinID) {
1795 llvm_unreachable(
"Unexpected builtin");
1796 case X86::BI__builtin_ia32_gather3div2df:
1797 intrinsicName =
"x86.avx512.mask.gather3div2.df";
1799 case X86::BI__builtin_ia32_gather3div2di:
1800 intrinsicName =
"x86.avx512.mask.gather3div2.di";
1802 case X86::BI__builtin_ia32_gather3div4df:
1803 intrinsicName =
"x86.avx512.mask.gather3div4.df";
1805 case X86::BI__builtin_ia32_gather3div4di:
1806 intrinsicName =
"x86.avx512.mask.gather3div4.di";
1808 case X86::BI__builtin_ia32_gather3div4sf:
1809 intrinsicName =
"x86.avx512.mask.gather3div4.sf";
1811 case X86::BI__builtin_ia32_gather3div4si:
1812 intrinsicName =
"x86.avx512.mask.gather3div4.si";
1814 case X86::BI__builtin_ia32_gather3div8sf:
1815 intrinsicName =
"x86.avx512.mask.gather3div8.sf";
1817 case X86::BI__builtin_ia32_gather3div8si:
1818 intrinsicName =
"x86.avx512.mask.gather3div8.si";
1820 case X86::BI__builtin_ia32_gather3siv2df:
1821 intrinsicName =
"x86.avx512.mask.gather3siv2.df";
1823 case X86::BI__builtin_ia32_gather3siv2di:
1824 intrinsicName =
"x86.avx512.mask.gather3siv2.di";
1826 case X86::BI__builtin_ia32_gather3siv4df:
1827 intrinsicName =
"x86.avx512.mask.gather3siv4.df";
1829 case X86::BI__builtin_ia32_gather3siv4di:
1830 intrinsicName =
"x86.avx512.mask.gather3siv4.di";
1832 case X86::BI__builtin_ia32_gather3siv4sf:
1833 intrinsicName =
"x86.avx512.mask.gather3siv4.sf";
1835 case X86::BI__builtin_ia32_gather3siv4si:
1836 intrinsicName =
"x86.avx512.mask.gather3siv4.si";
1838 case X86::BI__builtin_ia32_gather3siv8sf:
1839 intrinsicName =
"x86.avx512.mask.gather3siv8.sf";
1841 case X86::BI__builtin_ia32_gather3siv8si:
1842 intrinsicName =
"x86.avx512.mask.gather3siv8.si";
1844 case X86::BI__builtin_ia32_gathersiv8df:
1845 intrinsicName =
"x86.avx512.mask.gather.dpd.512";
1847 case X86::BI__builtin_ia32_gathersiv16sf:
1848 intrinsicName =
"x86.avx512.mask.gather.dps.512";
1850 case X86::BI__builtin_ia32_gatherdiv8df:
1851 intrinsicName =
"x86.avx512.mask.gather.qpd.512";
1853 case X86::BI__builtin_ia32_gatherdiv16sf:
1854 intrinsicName =
"x86.avx512.mask.gather.qps.512";
1856 case X86::BI__builtin_ia32_gathersiv8di:
1857 intrinsicName =
"x86.avx512.mask.gather.dpq.512";
1859 case X86::BI__builtin_ia32_gathersiv16si:
1860 intrinsicName =
"x86.avx512.mask.gather.dpi.512";
1862 case X86::BI__builtin_ia32_gatherdiv8di:
1863 intrinsicName =
"x86.avx512.mask.gather.qpq.512";
1865 case X86::BI__builtin_ia32_gatherdiv16si:
1866 intrinsicName =
"x86.avx512.mask.gather.qpi.512";
1870 mlir::Location loc =
getLoc(
expr->getExprLoc());
1875 return builder.emitIntrinsicCallOp(loc, intrinsicName,
1878 case X86::BI__builtin_ia32_scattersiv8df:
1879 case X86::BI__builtin_ia32_scattersiv16sf:
1880 case X86::BI__builtin_ia32_scatterdiv8df:
1881 case X86::BI__builtin_ia32_scatterdiv16sf:
1882 case X86::BI__builtin_ia32_scattersiv8di:
1883 case X86::BI__builtin_ia32_scattersiv16si:
1884 case X86::BI__builtin_ia32_scatterdiv8di:
1885 case X86::BI__builtin_ia32_scatterdiv16si:
1886 case X86::BI__builtin_ia32_scatterdiv2df:
1887 case X86::BI__builtin_ia32_scatterdiv2di:
1888 case X86::BI__builtin_ia32_scatterdiv4df:
1889 case X86::BI__builtin_ia32_scatterdiv4di:
1890 case X86::BI__builtin_ia32_scatterdiv4sf:
1891 case X86::BI__builtin_ia32_scatterdiv4si:
1892 case X86::BI__builtin_ia32_scatterdiv8sf:
1893 case X86::BI__builtin_ia32_scatterdiv8si:
1894 case X86::BI__builtin_ia32_scattersiv2df:
1895 case X86::BI__builtin_ia32_scattersiv2di:
1896 case X86::BI__builtin_ia32_scattersiv4df:
1897 case X86::BI__builtin_ia32_scattersiv4di:
1898 case X86::BI__builtin_ia32_scattersiv4sf:
1899 case X86::BI__builtin_ia32_scattersiv4si:
1900 case X86::BI__builtin_ia32_scattersiv8sf:
1901 case X86::BI__builtin_ia32_scattersiv8si: {
1902 llvm::StringRef intrinsicName;
1903 switch (builtinID) {
1905 llvm_unreachable(
"Unexpected builtin");
1906 case X86::BI__builtin_ia32_scattersiv8df:
1907 intrinsicName =
"x86.avx512.mask.scatter.dpd.512";
1909 case X86::BI__builtin_ia32_scattersiv16sf:
1910 intrinsicName =
"x86.avx512.mask.scatter.dps.512";
1912 case X86::BI__builtin_ia32_scatterdiv8df:
1913 intrinsicName =
"x86.avx512.mask.scatter.qpd.512";
1915 case X86::BI__builtin_ia32_scatterdiv16sf:
1916 intrinsicName =
"x86.avx512.mask.scatter.qps.512";
1918 case X86::BI__builtin_ia32_scattersiv8di:
1919 intrinsicName =
"x86.avx512.mask.scatter.dpq.512";
1921 case X86::BI__builtin_ia32_scattersiv16si:
1922 intrinsicName =
"x86.avx512.mask.scatter.dpi.512";
1924 case X86::BI__builtin_ia32_scatterdiv8di:
1925 intrinsicName =
"x86.avx512.mask.scatter.qpq.512";
1927 case X86::BI__builtin_ia32_scatterdiv16si:
1928 intrinsicName =
"x86.avx512.mask.scatter.qpi.512";
1930 case X86::BI__builtin_ia32_scatterdiv2df:
1931 intrinsicName =
"x86.avx512.mask.scatterdiv2.df";
1933 case X86::BI__builtin_ia32_scatterdiv2di:
1934 intrinsicName =
"x86.avx512.mask.scatterdiv2.di";
1936 case X86::BI__builtin_ia32_scatterdiv4df:
1937 intrinsicName =
"x86.avx512.mask.scatterdiv4.df";
1939 case X86::BI__builtin_ia32_scatterdiv4di:
1940 intrinsicName =
"x86.avx512.mask.scatterdiv4.di";
1942 case X86::BI__builtin_ia32_scatterdiv4sf:
1943 intrinsicName =
"x86.avx512.mask.scatterdiv4.sf";
1945 case X86::BI__builtin_ia32_scatterdiv4si:
1946 intrinsicName =
"x86.avx512.mask.scatterdiv4.si";
1948 case X86::BI__builtin_ia32_scatterdiv8sf:
1949 intrinsicName =
"x86.avx512.mask.scatterdiv8.sf";
1951 case X86::BI__builtin_ia32_scatterdiv8si:
1952 intrinsicName =
"x86.avx512.mask.scatterdiv8.si";
1954 case X86::BI__builtin_ia32_scattersiv2df:
1955 intrinsicName =
"x86.avx512.mask.scattersiv2.df";
1957 case X86::BI__builtin_ia32_scattersiv2di:
1958 intrinsicName =
"x86.avx512.mask.scattersiv2.di";
1960 case X86::BI__builtin_ia32_scattersiv4df:
1961 intrinsicName =
"x86.avx512.mask.scattersiv4.df";
1963 case X86::BI__builtin_ia32_scattersiv4di:
1964 intrinsicName =
"x86.avx512.mask.scattersiv4.di";
1966 case X86::BI__builtin_ia32_scattersiv4sf:
1967 intrinsicName =
"x86.avx512.mask.scattersiv4.sf";
1969 case X86::BI__builtin_ia32_scattersiv4si:
1970 intrinsicName =
"x86.avx512.mask.scattersiv4.si";
1972 case X86::BI__builtin_ia32_scattersiv8sf:
1973 intrinsicName =
"x86.avx512.mask.scattersiv8.sf";
1975 case X86::BI__builtin_ia32_scattersiv8si:
1976 intrinsicName =
"x86.avx512.mask.scattersiv8.si";
1980 mlir::Location loc =
getLoc(
expr->getExprLoc());
1986 return builder.emitIntrinsicCallOp(loc, intrinsicName,
1989 case X86::BI__builtin_ia32_vextractf128_pd256:
1990 case X86::BI__builtin_ia32_vextractf128_ps256:
1991 case X86::BI__builtin_ia32_vextractf128_si256:
1992 case X86::BI__builtin_ia32_extract128i256:
1993 case X86::BI__builtin_ia32_extractf64x4_mask:
1994 case X86::BI__builtin_ia32_extractf32x4_mask:
1995 case X86::BI__builtin_ia32_extracti64x4_mask:
1996 case X86::BI__builtin_ia32_extracti32x4_mask:
1997 case X86::BI__builtin_ia32_extractf32x8_mask:
1998 case X86::BI__builtin_ia32_extracti32x8_mask:
1999 case X86::BI__builtin_ia32_extractf32x4_256_mask:
2000 case X86::BI__builtin_ia32_extracti32x4_256_mask:
2001 case X86::BI__builtin_ia32_extractf64x2_256_mask:
2002 case X86::BI__builtin_ia32_extracti64x2_256_mask:
2003 case X86::BI__builtin_ia32_extractf64x2_512_mask:
2004 case X86::BI__builtin_ia32_extracti64x2_512_mask: {
2005 mlir::Location loc =
getLoc(
expr->getExprLoc());
2007 unsigned numElts = dstTy.getFixedSize();
2008 unsigned srcNumElts =
2010 unsigned subVectors = srcNumElts / numElts;
2011 assert(llvm::isPowerOf2_32(subVectors) &&
"Expected power of 2 subvectors");
2013 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
2015 index &= subVectors - 1;
2018 int64_t indices[16];
2019 std::iota(indices, indices + numElts,
index);
2021 mlir::Value poison =
2022 builder.getConstant(loc, cir::PoisonAttr::get(ops[0].
getType()));
2023 mlir::Value res = builder.createVecShuffle(loc, ops[0], poison,
2025 if (ops.size() == 4)
2030 case X86::BI__builtin_ia32_vinsertf128_pd256:
2031 case X86::BI__builtin_ia32_vinsertf128_ps256:
2032 case X86::BI__builtin_ia32_vinsertf128_si256:
2033 case X86::BI__builtin_ia32_insert128i256:
2034 case X86::BI__builtin_ia32_insertf64x4:
2035 case X86::BI__builtin_ia32_insertf32x4:
2036 case X86::BI__builtin_ia32_inserti64x4:
2037 case X86::BI__builtin_ia32_inserti32x4:
2038 case X86::BI__builtin_ia32_insertf32x8:
2039 case X86::BI__builtin_ia32_inserti32x8:
2040 case X86::BI__builtin_ia32_insertf32x4_256:
2041 case X86::BI__builtin_ia32_inserti32x4_256:
2042 case X86::BI__builtin_ia32_insertf64x2_256:
2043 case X86::BI__builtin_ia32_inserti64x2_256:
2044 case X86::BI__builtin_ia32_insertf64x2_512:
2045 case X86::BI__builtin_ia32_inserti64x2_512: {
2046 unsigned dstNumElts =
2048 unsigned srcNumElts =
2050 unsigned subVectors = dstNumElts / srcNumElts;
2051 assert(llvm::isPowerOf2_32(subVectors) &&
"Expected power of 2 subvectors");
2052 assert(dstNumElts <= 16);
2055 index &= subVectors - 1;
2056 index *= srcNumElts;
2059 for (
unsigned i = 0; i != dstNumElts; ++i)
2060 mask[i] = (i >= srcNumElts) ? srcNumElts + (i % srcNumElts) : i;
2063 builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[1], mask);
2065 for (
unsigned i = 0; i != dstNumElts; ++i) {
2067 mask[i] = (i -
index) + dstNumElts;
2072 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], op1,
2075 case X86::BI__builtin_ia32_pmovqd512_mask:
2076 case X86::BI__builtin_ia32_pmovwb512_mask: {
2082 case X86::BI__builtin_ia32_pmovdb512_mask:
2083 case X86::BI__builtin_ia32_pmovdw512_mask:
2084 case X86::BI__builtin_ia32_pmovqw512_mask: {
2087 mlir::Location loc =
getLoc(
expr->getExprLoc());
2088 auto c = mlir::dyn_cast_or_null<cir::ConstantOp>(ops[2].getDefiningOp());
2089 if (c && c.isAllOnesValue())
2090 return builder.createIntCast(ops[0],
2093 llvm::StringRef intrinsicName;
2094 switch (builtinID) {
2096 llvm_unreachable(
"Unsupported intrinsic!");
2097 case X86::BI__builtin_ia32_pmovdb512_mask:
2098 intrinsicName =
"x86.avx512.mask.pmov.db.512";
2100 case X86::BI__builtin_ia32_pmovdw512_mask:
2101 intrinsicName =
"x86.avx512.mask.pmov.dw.512";
2103 case X86::BI__builtin_ia32_pmovqw512_mask:
2104 intrinsicName =
"x86.avx512.mask.pmov.qw.512";
2107 return builder.emitIntrinsicCallOp(loc, intrinsicName, ops[1].
getType(),
2110 case X86::BI__builtin_ia32_pblendw128:
2111 case X86::BI__builtin_ia32_blendpd:
2112 case X86::BI__builtin_ia32_blendps:
2113 case X86::BI__builtin_ia32_blendpd256:
2114 case X86::BI__builtin_ia32_blendps256:
2115 case X86::BI__builtin_ia32_pblendw256:
2116 case X86::BI__builtin_ia32_pblendd128:
2117 case X86::BI__builtin_ia32_pblendd256: {
2124 mlir::Type i32Ty = builder.getSInt32Ty();
2125 for (
unsigned i = 0; i != numElts; ++i)
2127 cir::IntAttr::get(i32Ty, ((imm >> (i % 8)) & 0x1) ? numElts + i : i));
2129 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
2132 case X86::BI__builtin_ia32_pshuflw:
2133 case X86::BI__builtin_ia32_pshuflw256:
2134 case X86::BI__builtin_ia32_pshuflw512:
2137 case X86::BI__builtin_ia32_pshufhw:
2138 case X86::BI__builtin_ia32_pshufhw256:
2139 case X86::BI__builtin_ia32_pshufhw512:
2142 case X86::BI__builtin_ia32_pshufd:
2143 case X86::BI__builtin_ia32_pshufd256:
2144 case X86::BI__builtin_ia32_pshufd512:
2145 case X86::BI__builtin_ia32_vpermilpd:
2146 case X86::BI__builtin_ia32_vpermilps:
2147 case X86::BI__builtin_ia32_vpermilpd256:
2148 case X86::BI__builtin_ia32_vpermilps256:
2149 case X86::BI__builtin_ia32_vpermilpd512:
2150 case X86::BI__builtin_ia32_vpermilps512: {
2156 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], mask);
2158 case X86::BI__builtin_ia32_shufpd:
2159 case X86::BI__builtin_ia32_shufpd256:
2160 case X86::BI__builtin_ia32_shufpd512:
2161 case X86::BI__builtin_ia32_shufps:
2162 case X86::BI__builtin_ia32_shufps256:
2163 case X86::BI__builtin_ia32_shufps512: {
2169 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
2172 case X86::BI__builtin_ia32_permdi256:
2173 case X86::BI__builtin_ia32_permdf256:
2174 case X86::BI__builtin_ia32_permdi512:
2175 case X86::BI__builtin_ia32_permdf512: {
2177 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
2183 for (
unsigned l = 0; l != numElts; l += 4)
2184 for (
unsigned i = 0; i != 4; ++i)
2185 Indices[l + i] = l + ((imm >> (2 * i)) & 0x3);
2187 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0],
2190 case X86::BI__builtin_ia32_palignr128:
2191 case X86::BI__builtin_ia32_palignr256:
2192 case X86::BI__builtin_ia32_palignr512: {
2196 assert(numElts % 16 == 0);
2206 if (shiftVal > 16) {
2213 int64_t indices[64];
2215 for (
unsigned l = 0; l != numElts; l += 16) {
2216 for (
unsigned i = 0; i != 16; ++i) {
2217 uint32_t idx = shiftVal + i;
2219 idx += numElts - 16;
2220 indices[l + i] = l + idx;
2224 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[1], ops[0],
2227 case X86::BI__builtin_ia32_alignd128:
2228 case X86::BI__builtin_ia32_alignd256:
2229 case X86::BI__builtin_ia32_alignd512:
2230 case X86::BI__builtin_ia32_alignq128:
2231 case X86::BI__builtin_ia32_alignq256:
2232 case X86::BI__builtin_ia32_alignq512: {
2235 ops[2].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
2239 shiftVal &= numElts - 1;
2242 mlir::Type i32Ty = builder.getSInt32Ty();
2243 for (
unsigned i = 0; i != numElts; ++i)
2244 indices.push_back(cir::IntAttr::get(i32Ty, i + shiftVal));
2246 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
2249 case X86::BI__builtin_ia32_shuf_f32x4_256:
2250 case X86::BI__builtin_ia32_shuf_f64x2_256:
2251 case X86::BI__builtin_ia32_shuf_i32x4_256:
2252 case X86::BI__builtin_ia32_shuf_i64x2_256:
2253 case X86::BI__builtin_ia32_shuf_f32x4:
2254 case X86::BI__builtin_ia32_shuf_f64x2:
2255 case X86::BI__builtin_ia32_shuf_i32x4:
2256 case X86::BI__builtin_ia32_shuf_i64x2: {
2257 mlir::Value src1 = ops[0];
2258 mlir::Value src2 = ops[1];
2261 ops[2].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
2265 unsigned numLanes = totalBits == 512 ? 4 : 2;
2266 unsigned numElemsPerLane = numElems / numLanes;
2269 mlir::Type i32Ty = builder.getSInt32Ty();
2271 for (
unsigned l = 0; l != numElems; l += numElemsPerLane) {
2272 unsigned index = (imm % numLanes) * numElemsPerLane;
2274 if (l >= (numElems / 2))
2276 for (
unsigned i = 0; i != numElemsPerLane; ++i) {
2277 indices.push_back(cir::IntAttr::get(i32Ty,
index + i));
2281 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), src1, src2,
2284 case X86::BI__builtin_ia32_vperm2f128_pd256:
2285 case X86::BI__builtin_ia32_vperm2f128_ps256:
2286 case X86::BI__builtin_ia32_vperm2f128_si256:
2287 case X86::BI__builtin_ia32_permti256:
2289 case X86::BI__builtin_ia32_pslldqi128_byteshift:
2290 case X86::BI__builtin_ia32_pslldqi256_byteshift:
2291 case X86::BI__builtin_ia32_pslldqi512_byteshift:
2295 case X86::BI__builtin_ia32_psrldqi128_byteshift:
2296 case X86::BI__builtin_ia32_psrldqi256_byteshift:
2297 case X86::BI__builtin_ia32_psrldqi512_byteshift:
2301 case X86::BI__builtin_ia32_kshiftliqi:
2302 case X86::BI__builtin_ia32_kshiftlihi:
2303 case X86::BI__builtin_ia32_kshiftlisi:
2304 case X86::BI__builtin_ia32_kshiftlidi: {
2305 mlir::Location loc =
getLoc(
expr->getExprLoc());
2307 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
2311 if (shiftVal >= numElems)
2312 return builder.getNullValue(ops[0].
getType(), loc);
2317 mlir::Type i32Ty = builder.getSInt32Ty();
2318 for (
auto i : llvm::seq<unsigned>(0, numElems))
2319 indices.push_back(cir::IntAttr::get(i32Ty, numElems + i - shiftVal));
2321 mlir::Value zero = builder.getNullValue(
in.getType(), loc);
2322 mlir::Value sv = builder.createVecShuffle(loc, zero,
in, indices);
2323 return builder.createBitcast(sv, ops[0].
getType());
2325 case X86::BI__builtin_ia32_kshiftriqi:
2326 case X86::BI__builtin_ia32_kshiftrihi:
2327 case X86::BI__builtin_ia32_kshiftrisi:
2328 case X86::BI__builtin_ia32_kshiftridi: {
2329 mlir::Location loc =
getLoc(
expr->getExprLoc());
2331 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
2335 if (shiftVal >= numElems)
2336 return builder.getNullValue(ops[0].
getType(), loc);
2341 mlir::Type i32Ty = builder.getSInt32Ty();
2342 for (
auto i : llvm::seq<unsigned>(0, numElems))
2343 indices.push_back(cir::IntAttr::get(i32Ty, i + shiftVal));
2345 mlir::Value zero = builder.getNullValue(
in.getType(), loc);
2346 mlir::Value sv = builder.createVecShuffle(loc,
in, zero, indices);
2347 return builder.createBitcast(sv, ops[0].
getType());
2349 case X86::BI__builtin_ia32_movnti:
2350 case X86::BI__builtin_ia32_movnti64:
2351 case X86::BI__builtin_ia32_movntsd:
2352 case X86::BI__builtin_ia32_movntss: {
2353 mlir::Location loc =
getLoc(
expr->getExprLoc());
2356 mlir::Value src = ops[1];
2358 if (builtinID == X86::BI__builtin_ia32_movntsd ||
2359 builtinID == X86::BI__builtin_ia32_movntss)
2360 src = builder.createExtractElement(loc, ops[1], 0);
2363 builder.createStore(loc, src, dest,
2365 return so.getValue();
2367 case X86::BI__builtin_ia32_vprotbi:
2368 case X86::BI__builtin_ia32_vprotwi:
2369 case X86::BI__builtin_ia32_vprotdi:
2370 case X86::BI__builtin_ia32_vprotqi:
2371 case X86::BI__builtin_ia32_prold128:
2372 case X86::BI__builtin_ia32_prold256:
2373 case X86::BI__builtin_ia32_prold512:
2374 case X86::BI__builtin_ia32_prolq128:
2375 case X86::BI__builtin_ia32_prolq256:
2376 case X86::BI__builtin_ia32_prolq512:
2378 ops[0], ops[1],
false);
2379 case X86::BI__builtin_ia32_prord128:
2380 case X86::BI__builtin_ia32_prord256:
2381 case X86::BI__builtin_ia32_prord512:
2382 case X86::BI__builtin_ia32_prorq128:
2383 case X86::BI__builtin_ia32_prorq256:
2384 case X86::BI__builtin_ia32_prorq512:
2386 ops[0], ops[1],
true);
2387 case X86::BI__builtin_ia32_selectb_128:
2388 case X86::BI__builtin_ia32_selectb_256:
2389 case X86::BI__builtin_ia32_selectb_512:
2390 case X86::BI__builtin_ia32_selectw_128:
2391 case X86::BI__builtin_ia32_selectw_256:
2392 case X86::BI__builtin_ia32_selectw_512:
2393 case X86::BI__builtin_ia32_selectd_128:
2394 case X86::BI__builtin_ia32_selectd_256:
2395 case X86::BI__builtin_ia32_selectd_512:
2396 case X86::BI__builtin_ia32_selectq_128:
2397 case X86::BI__builtin_ia32_selectq_256:
2398 case X86::BI__builtin_ia32_selectq_512:
2399 case X86::BI__builtin_ia32_selectph_128:
2400 case X86::BI__builtin_ia32_selectph_256:
2401 case X86::BI__builtin_ia32_selectph_512:
2402 case X86::BI__builtin_ia32_selectpbf_128:
2403 case X86::BI__builtin_ia32_selectpbf_256:
2404 case X86::BI__builtin_ia32_selectpbf_512:
2405 case X86::BI__builtin_ia32_selectps_128:
2406 case X86::BI__builtin_ia32_selectps_256:
2407 case X86::BI__builtin_ia32_selectps_512:
2408 case X86::BI__builtin_ia32_selectpd_128:
2409 case X86::BI__builtin_ia32_selectpd_256:
2410 case X86::BI__builtin_ia32_selectpd_512:
2413 case X86::BI__builtin_ia32_selectsh_128:
2414 case X86::BI__builtin_ia32_selectsbf_128:
2415 case X86::BI__builtin_ia32_selectss_128:
2416 case X86::BI__builtin_ia32_selectsd_128: {
2417 mlir::Location loc =
getLoc(
expr->getExprLoc());
2418 mlir::Value scalar1 =
2419 builder.createExtractElement(loc, ops[1], uint64_t(0));
2420 mlir::Value scalar2 =
2421 builder.createExtractElement(loc, ops[2], uint64_t(0));
2422 mlir::Value result =
2424 return builder.createInsertElement(loc, ops[1], result, uint64_t(0));
2426 case X86::BI__builtin_ia32_cmpb128_mask:
2427 case X86::BI__builtin_ia32_cmpb256_mask:
2428 case X86::BI__builtin_ia32_cmpb512_mask:
2429 case X86::BI__builtin_ia32_cmpw128_mask:
2430 case X86::BI__builtin_ia32_cmpw256_mask:
2431 case X86::BI__builtin_ia32_cmpw512_mask:
2432 case X86::BI__builtin_ia32_cmpd128_mask:
2433 case X86::BI__builtin_ia32_cmpd256_mask:
2434 case X86::BI__builtin_ia32_cmpd512_mask:
2435 case X86::BI__builtin_ia32_cmpq128_mask:
2436 case X86::BI__builtin_ia32_cmpq256_mask:
2437 case X86::BI__builtin_ia32_cmpq512_mask:
2438 case X86::BI__builtin_ia32_ucmpb128_mask:
2439 case X86::BI__builtin_ia32_ucmpb256_mask:
2440 case X86::BI__builtin_ia32_ucmpb512_mask:
2441 case X86::BI__builtin_ia32_ucmpw128_mask:
2442 case X86::BI__builtin_ia32_ucmpw256_mask:
2443 case X86::BI__builtin_ia32_ucmpw512_mask:
2444 case X86::BI__builtin_ia32_ucmpd128_mask:
2445 case X86::BI__builtin_ia32_ucmpd256_mask:
2446 case X86::BI__builtin_ia32_ucmpd512_mask:
2447 case X86::BI__builtin_ia32_ucmpq128_mask:
2448 case X86::BI__builtin_ia32_ucmpq256_mask:
2449 case X86::BI__builtin_ia32_ucmpq512_mask: {
2454 case X86::BI__builtin_ia32_vpcomb:
2455 case X86::BI__builtin_ia32_vpcomw:
2456 case X86::BI__builtin_ia32_vpcomd:
2457 case X86::BI__builtin_ia32_vpcomq:
2459 case X86::BI__builtin_ia32_vpcomub:
2460 case X86::BI__builtin_ia32_vpcomuw:
2461 case X86::BI__builtin_ia32_vpcomud:
2462 case X86::BI__builtin_ia32_vpcomuq:
2464 case X86::BI__builtin_ia32_kortestcqi:
2465 case X86::BI__builtin_ia32_kortestchi:
2466 case X86::BI__builtin_ia32_kortestcsi:
2467 case X86::BI__builtin_ia32_kortestcdi: {
2468 mlir::Location loc =
getLoc(
expr->getExprLoc());
2470 mlir::Value allOnesOp =
2471 builder.getConstAPInt(loc, ty, APInt::getAllOnes(ty.getWidth()));
2474 cir::CmpOp::create(builder, loc, cir::CmpOpKind::eq, orOp, allOnesOp);
2475 return builder.createCast(cir::CastKind::bool_to_int, cmp,
2476 cgm.convertType(
expr->getType()));
2478 case X86::BI__builtin_ia32_kortestzqi:
2479 case X86::BI__builtin_ia32_kortestzhi:
2480 case X86::BI__builtin_ia32_kortestzsi:
2481 case X86::BI__builtin_ia32_kortestzdi: {
2482 mlir::Location loc =
getLoc(
expr->getExprLoc());
2484 mlir::Value allZerosOp = builder.getNullValue(ty, loc).getResult();
2487 cir::CmpOp::create(builder, loc, cir::CmpOpKind::eq, orOp, allZerosOp);
2488 return builder.createCast(cir::CastKind::bool_to_int, cmp,
2489 cgm.convertType(
expr->getType()));
2491 case X86::BI__builtin_ia32_ktestcqi:
2493 "x86.avx512.ktestc.b", ops);
2494 case X86::BI__builtin_ia32_ktestzqi:
2496 "x86.avx512.ktestz.b", ops);
2497 case X86::BI__builtin_ia32_ktestchi:
2499 "x86.avx512.ktestc.w", ops);
2500 case X86::BI__builtin_ia32_ktestzhi:
2502 "x86.avx512.ktestz.w", ops);
2503 case X86::BI__builtin_ia32_ktestcsi:
2505 "x86.avx512.ktestc.d", ops);
2506 case X86::BI__builtin_ia32_ktestzsi:
2508 "x86.avx512.ktestz.d", ops);
2509 case X86::BI__builtin_ia32_ktestcdi:
2511 "x86.avx512.ktestc.q", ops);
2512 case X86::BI__builtin_ia32_ktestzdi:
2514 "x86.avx512.ktestz.q", ops);
2515 case X86::BI__builtin_ia32_kaddqi:
2517 "x86.avx512.kadd.b", ops);
2518 case X86::BI__builtin_ia32_kaddhi:
2520 "x86.avx512.kadd.w", ops);
2521 case X86::BI__builtin_ia32_kaddsi:
2523 "x86.avx512.kadd.d", ops);
2524 case X86::BI__builtin_ia32_kadddi:
2526 "x86.avx512.kadd.q", ops);
2527 case X86::BI__builtin_ia32_kandqi:
2528 case X86::BI__builtin_ia32_kandhi:
2529 case X86::BI__builtin_ia32_kandsi:
2530 case X86::BI__builtin_ia32_kanddi:
2533 case X86::BI__builtin_ia32_kandnqi:
2534 case X86::BI__builtin_ia32_kandnhi:
2535 case X86::BI__builtin_ia32_kandnsi:
2536 case X86::BI__builtin_ia32_kandndi:
2539 case X86::BI__builtin_ia32_korqi:
2540 case X86::BI__builtin_ia32_korhi:
2541 case X86::BI__builtin_ia32_korsi:
2542 case X86::BI__builtin_ia32_kordi:
2545 case X86::BI__builtin_ia32_kxnorqi:
2546 case X86::BI__builtin_ia32_kxnorhi:
2547 case X86::BI__builtin_ia32_kxnorsi:
2548 case X86::BI__builtin_ia32_kxnordi:
2551 case X86::BI__builtin_ia32_kxorqi:
2552 case X86::BI__builtin_ia32_kxorhi:
2553 case X86::BI__builtin_ia32_kxorsi:
2554 case X86::BI__builtin_ia32_kxordi:
2557 case X86::BI__builtin_ia32_knotqi:
2558 case X86::BI__builtin_ia32_knothi:
2559 case X86::BI__builtin_ia32_knotsi:
2560 case X86::BI__builtin_ia32_knotdi: {
2562 unsigned numElts = intTy.getWidth();
2563 mlir::Value resVec =
2565 return builder.createBitcast(builder.createNot(resVec), ops[0].getType());
2567 case X86::BI__builtin_ia32_kmovb:
2568 case X86::BI__builtin_ia32_kmovw:
2569 case X86::BI__builtin_ia32_kmovd:
2570 case X86::BI__builtin_ia32_kmovq: {
2575 unsigned numElts = intTy.getWidth();
2576 mlir::Value resVec =
2578 return builder.createBitcast(resVec, ops[0].
getType());
2580 case X86::BI__builtin_ia32_sqrtsh_round_mask:
2581 case X86::BI__builtin_ia32_sqrtsd_round_mask:
2582 case X86::BI__builtin_ia32_sqrtss_round_mask:
2583 cgm.errorNYI(
expr->getSourceRange(),
2584 std::string(
"unimplemented X86 builtin call: ") +
2585 getContext().BuiltinInfo.getName(builtinID));
2586 return mlir::Value{};
2587 case X86::BI__builtin_ia32_sqrtph512:
2588 case X86::BI__builtin_ia32_sqrtps512:
2589 case X86::BI__builtin_ia32_sqrtpd512: {
2590 mlir::Location loc =
getLoc(
expr->getExprLoc());
2591 mlir::Value arg = ops[0];
2592 return cir::SqrtOp::create(builder, loc, arg).getResult();
2594 case X86::BI__builtin_ia32_pmulhw128:
2595 case X86::BI__builtin_ia32_pmulhw256:
2596 case X86::BI__builtin_ia32_pmulhw512:
2597 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
"smulh",
2598 ops[0].getType(), ops);
2599 case X86::BI__builtin_ia32_pmulhuw128:
2600 case X86::BI__builtin_ia32_pmulhuw256:
2601 case X86::BI__builtin_ia32_pmulhuw512:
2602 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
"umulh",
2603 ops[0].getType(), ops);
2604 case X86::BI__builtin_ia32_pmuludq128:
2605 case X86::BI__builtin_ia32_pmuludq256:
2606 case X86::BI__builtin_ia32_pmuludq512: {
2607 unsigned opTypePrimitiveSizeInBits =
2608 cgm.getDataLayout().getTypeSizeInBits(ops[0].
getType());
2610 ops, opTypePrimitiveSizeInBits);
2612 case X86::BI__builtin_ia32_pmuldq128:
2613 case X86::BI__builtin_ia32_pmuldq256:
2614 case X86::BI__builtin_ia32_pmuldq512: {
2615 unsigned opTypePrimitiveSizeInBits =
2616 cgm.getDataLayout().getTypeSizeInBits(ops[0].
getType());
2618 ops, opTypePrimitiveSizeInBits);
2620 case X86::BI__builtin_ia32_pternlogd512_mask:
2621 case X86::BI__builtin_ia32_pternlogq512_mask:
2622 case X86::BI__builtin_ia32_pternlogd128_mask:
2623 case X86::BI__builtin_ia32_pternlogd256_mask:
2624 case X86::BI__builtin_ia32_pternlogq128_mask:
2625 case X86::BI__builtin_ia32_pternlogq256_mask:
2626 case X86::BI__builtin_ia32_pternlogd512_maskz:
2627 case X86::BI__builtin_ia32_pternlogq512_maskz:
2628 case X86::BI__builtin_ia32_pternlogd128_maskz:
2629 case X86::BI__builtin_ia32_pternlogd256_maskz:
2630 case X86::BI__builtin_ia32_pternlogq128_maskz:
2631 case X86::BI__builtin_ia32_pternlogq256_maskz:
2632 cgm.errorNYI(
expr->getSourceRange(),
2633 std::string(
"unimplemented X86 builtin call: ") +
2634 getContext().BuiltinInfo.getName(builtinID));
2635 return mlir::Value{};
2636 case X86::BI__builtin_ia32_vpshldd128:
2637 case X86::BI__builtin_ia32_vpshldd256:
2638 case X86::BI__builtin_ia32_vpshldd512:
2639 case X86::BI__builtin_ia32_vpshldq128:
2640 case X86::BI__builtin_ia32_vpshldq256:
2641 case X86::BI__builtin_ia32_vpshldq512:
2642 case X86::BI__builtin_ia32_vpshldw128:
2643 case X86::BI__builtin_ia32_vpshldw256:
2644 case X86::BI__builtin_ia32_vpshldw512:
2646 ops[1], ops[2],
false);
2647 case X86::BI__builtin_ia32_vpshrdd128:
2648 case X86::BI__builtin_ia32_vpshrdd256:
2649 case X86::BI__builtin_ia32_vpshrdd512:
2650 case X86::BI__builtin_ia32_vpshrdq128:
2651 case X86::BI__builtin_ia32_vpshrdq256:
2652 case X86::BI__builtin_ia32_vpshrdq512:
2653 case X86::BI__builtin_ia32_vpshrdw128:
2654 case X86::BI__builtin_ia32_vpshrdw256:
2655 case X86::BI__builtin_ia32_vpshrdw512:
2658 ops[0], ops[2],
true);
2659 case X86::BI__builtin_ia32_reduce_fadd_pd512:
2660 case X86::BI__builtin_ia32_reduce_fadd_ps512:
2661 case X86::BI__builtin_ia32_reduce_fadd_ph512:
2662 case X86::BI__builtin_ia32_reduce_fadd_ph256:
2663 case X86::BI__builtin_ia32_reduce_fadd_ph128: {
2666 fastMathFlags |= cir::FastMathFlags::reassoc;
2668 return cir::VecReduceFAddOp::create(builder,
getLoc(
expr->getExprLoc()),
2669 ops[0], ops[1], fastMath)
2672 case X86::BI__builtin_ia32_reduce_fmul_pd512:
2673 case X86::BI__builtin_ia32_reduce_fmul_ps512:
2674 case X86::BI__builtin_ia32_reduce_fmul_ph512:
2675 case X86::BI__builtin_ia32_reduce_fmul_ph256:
2676 case X86::BI__builtin_ia32_reduce_fmul_ph128: {
2679 fastMathFlags |= cir::FastMathFlags::reassoc;
2681 return cir::VecReduceFMulOp::create(builder,
getLoc(
expr->getExprLoc()),
2682 ops[0], ops[1], fastMath)
2685 case X86::BI__builtin_ia32_reduce_fmax_pd512:
2686 case X86::BI__builtin_ia32_reduce_fmax_ps512:
2687 case X86::BI__builtin_ia32_reduce_fmax_ph512:
2688 case X86::BI__builtin_ia32_reduce_fmax_ph256:
2689 case X86::BI__builtin_ia32_reduce_fmax_ph128: {
2692 fastMathFlags |= cir::FastMathFlags::nnan;
2694 return cir::VecReduceFMaxOp::create(builder,
getLoc(
expr->getExprLoc()),
2698 case X86::BI__builtin_ia32_reduce_fmin_pd512:
2699 case X86::BI__builtin_ia32_reduce_fmin_ps512:
2700 case X86::BI__builtin_ia32_reduce_fmin_ph512:
2701 case X86::BI__builtin_ia32_reduce_fmin_ph256:
2702 case X86::BI__builtin_ia32_reduce_fmin_ph128: {
2705 fastMathFlags |= cir::FastMathFlags::nnan;
2707 return cir::VecReduceFMinOp::create(builder,
getLoc(
expr->getExprLoc()),
2711 case X86::BI__builtin_ia32_rdrand16_step:
2712 case X86::BI__builtin_ia32_rdrand32_step:
2713 case X86::BI__builtin_ia32_rdrand64_step:
2714 case X86::BI__builtin_ia32_rdseed16_step:
2715 case X86::BI__builtin_ia32_rdseed32_step:
2716 case X86::BI__builtin_ia32_rdseed64_step: {
2717 llvm::StringRef intrinsicName;
2718 switch (builtinID) {
2720 llvm_unreachable(
"Unsupported intrinsic!");
2721 case X86::BI__builtin_ia32_rdrand16_step:
2722 intrinsicName =
"x86.rdrand.16";
2724 case X86::BI__builtin_ia32_rdrand32_step:
2725 intrinsicName =
"x86.rdrand.32";
2727 case X86::BI__builtin_ia32_rdrand64_step:
2728 intrinsicName =
"x86.rdrand.64";
2730 case X86::BI__builtin_ia32_rdseed16_step:
2731 intrinsicName =
"x86.rdseed.16";
2733 case X86::BI__builtin_ia32_rdseed32_step:
2734 intrinsicName =
"x86.rdseed.32";
2736 case X86::BI__builtin_ia32_rdseed64_step:
2737 intrinsicName =
"x86.rdseed.64";
2741 mlir::Location loc =
getLoc(
expr->getExprLoc());
2744 builder.getUInt32Ty()};
2745 cir::StructType resRecord = cir::StructType::get(
2750 builder.emitIntrinsicCallOp(loc, intrinsicName, resRecord);
2752 cir::ExtractMemberOp::create(builder, loc, randTy, call, 0);
2753 builder.CIRBaseBuilderTy::createStore(loc, rand, ops[0]);
2755 return cir::ExtractMemberOp::create(builder, loc, builder.getUInt32Ty(),
2758 case X86::BI__builtin_ia32_addcarryx_u32:
2759 case X86::BI__builtin_ia32_addcarryx_u64:
2760 case X86::BI__builtin_ia32_subborrow_u32:
2761 case X86::BI__builtin_ia32_subborrow_u64:
2762 cgm.errorNYI(
expr->getSourceRange(),
2763 std::string(
"unimplemented X86 builtin call: ") +
2764 getContext().BuiltinInfo.getName(builtinID));
2765 return mlir::Value{};
2766 case X86::BI__builtin_ia32_fpclassps128_mask:
2767 case X86::BI__builtin_ia32_fpclassps256_mask:
2768 case X86::BI__builtin_ia32_fpclassps512_mask:
2769 case X86::BI__builtin_ia32_vfpclassbf16128_mask:
2770 case X86::BI__builtin_ia32_vfpclassbf16256_mask:
2771 case X86::BI__builtin_ia32_vfpclassbf16512_mask:
2772 case X86::BI__builtin_ia32_fpclassph128_mask:
2773 case X86::BI__builtin_ia32_fpclassph256_mask:
2774 case X86::BI__builtin_ia32_fpclassph512_mask:
2775 case X86::BI__builtin_ia32_fpclasspd128_mask:
2776 case X86::BI__builtin_ia32_fpclasspd256_mask:
2777 case X86::BI__builtin_ia32_fpclasspd512_mask:
2779 case X86::BI__builtin_ia32_vp2intersect_q_512:
2780 case X86::BI__builtin_ia32_vp2intersect_q_256:
2781 case X86::BI__builtin_ia32_vp2intersect_q_128:
2782 case X86::BI__builtin_ia32_vp2intersect_d_512:
2783 case X86::BI__builtin_ia32_vp2intersect_d_256:
2784 case X86::BI__builtin_ia32_vp2intersect_d_128: {
2786 mlir::Location loc =
getLoc(
expr->getExprLoc());
2787 StringRef intrinsicName;
2789 switch (builtinID) {
2791 llvm_unreachable(
"Unexpected builtin");
2792 case X86::BI__builtin_ia32_vp2intersect_q_512:
2793 intrinsicName =
"x86.avx512.vp2intersect.q.512";
2795 case X86::BI__builtin_ia32_vp2intersect_q_256:
2796 intrinsicName =
"x86.avx512.vp2intersect.q.256";
2798 case X86::BI__builtin_ia32_vp2intersect_q_128:
2799 intrinsicName =
"x86.avx512.vp2intersect.q.128";
2801 case X86::BI__builtin_ia32_vp2intersect_d_512:
2802 intrinsicName =
"x86.avx512.vp2intersect.d.512";
2804 case X86::BI__builtin_ia32_vp2intersect_d_256:
2805 intrinsicName =
"x86.avx512.vp2intersect.d.256";
2807 case X86::BI__builtin_ia32_vp2intersect_d_128:
2808 intrinsicName =
"x86.avx512.vp2intersect.d.128";
2812 auto resVector = cir::VectorType::getFixed(builder.getSIntNTy(1), numElts);
2814 mlir::Type resMembers[] = {resVector, resVector};
2815 cir::StructType resRecord = cir::StructType::get(
2819 mlir::Value call = builder.emitIntrinsicCallOp(
2820 getLoc(
expr->getExprLoc()), intrinsicName, resRecord,
2821 mlir::ValueRange{ops[0], ops[1]});
2822 mlir::Value result =
2823 cir::ExtractMemberOp::create(builder, loc, resVector, call, 0);
2827 builder.createStore(loc, result, addr);
2829 result = cir::ExtractMemberOp::create(builder, loc, resVector, call, 1);
2833 builder.createStore(loc, result, addr);
2834 return mlir::Value{};
2836 case X86::BI__builtin_ia32_vpmultishiftqb128:
2837 case X86::BI__builtin_ia32_vpmultishiftqb256:
2838 case X86::BI__builtin_ia32_vpmultishiftqb512:
2839 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
2840 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
2841 case X86::BI__builtin_ia32_vpshufbitqmb512_mask:
2842 cgm.errorNYI(
expr->getSourceRange(),
2843 std::string(
"unimplemented X86 builtin call: ") +
2844 getContext().BuiltinInfo.getName(builtinID));
2846 case X86::BI__builtin_ia32_cmpeqps:
2847 case X86::BI__builtin_ia32_cmpeqpd:
2850 case X86::BI__builtin_ia32_cmpltps:
2851 case X86::BI__builtin_ia32_cmpltpd:
2854 case X86::BI__builtin_ia32_cmpleps:
2855 case X86::BI__builtin_ia32_cmplepd:
2858 case X86::BI__builtin_ia32_cmpunordps:
2859 case X86::BI__builtin_ia32_cmpunordpd:
2862 case X86::BI__builtin_ia32_cmpneqps:
2863 case X86::BI__builtin_ia32_cmpneqpd:
2866 case X86::BI__builtin_ia32_cmpnltps:
2867 case X86::BI__builtin_ia32_cmpnltpd:
2870 case X86::BI__builtin_ia32_cmpnleps:
2871 case X86::BI__builtin_ia32_cmpnlepd:
2874 case X86::BI__builtin_ia32_cmpordps:
2875 case X86::BI__builtin_ia32_cmpordpd:
2878 case X86::BI__builtin_ia32_cmpph128_mask:
2879 case X86::BI__builtin_ia32_cmpph256_mask:
2880 case X86::BI__builtin_ia32_cmpph512_mask:
2881 case X86::BI__builtin_ia32_cmpps128_mask:
2882 case X86::BI__builtin_ia32_cmpps256_mask:
2883 case X86::BI__builtin_ia32_cmpps512_mask:
2884 case X86::BI__builtin_ia32_cmppd128_mask:
2885 case X86::BI__builtin_ia32_cmppd256_mask:
2886 case X86::BI__builtin_ia32_cmppd512_mask:
2887 case X86::BI__builtin_ia32_vcmpbf16512_mask:
2888 case X86::BI__builtin_ia32_vcmpbf16256_mask:
2889 case X86::BI__builtin_ia32_vcmpbf16128_mask:
2890 case X86::BI__builtin_ia32_cmpps:
2891 case X86::BI__builtin_ia32_cmpps256:
2892 case X86::BI__builtin_ia32_cmppd:
2893 case X86::BI__builtin_ia32_cmppd256:
2894 case X86::BI__builtin_ia32_cmpeqss:
2895 case X86::BI__builtin_ia32_cmpltss:
2896 case X86::BI__builtin_ia32_cmpless:
2897 case X86::BI__builtin_ia32_cmpunordss:
2898 case X86::BI__builtin_ia32_cmpneqss:
2899 case X86::BI__builtin_ia32_cmpnltss:
2900 case X86::BI__builtin_ia32_cmpnless:
2901 case X86::BI__builtin_ia32_cmpordss:
2902 case X86::BI__builtin_ia32_cmpeqsd:
2903 case X86::BI__builtin_ia32_cmpltsd:
2904 case X86::BI__builtin_ia32_cmplesd:
2905 case X86::BI__builtin_ia32_cmpunordsd:
2906 case X86::BI__builtin_ia32_cmpneqsd:
2907 case X86::BI__builtin_ia32_cmpnltsd:
2908 case X86::BI__builtin_ia32_cmpnlesd:
2909 case X86::BI__builtin_ia32_cmpordsd:
2910 cgm.errorNYI(
expr->getSourceRange(),
2911 std::string(
"unimplemented X86 builtin call: ") +
2912 getContext().BuiltinInfo.getName(builtinID));
2914 case X86::BI__builtin_ia32_vcvtph2ps_mask:
2915 case X86::BI__builtin_ia32_vcvtph2ps256_mask:
2916 case X86::BI__builtin_ia32_vcvtph2ps512_mask: {
2917 mlir::Location loc =
getLoc(
expr->getExprLoc());
2921 case X86::BI__builtin_ia32_cvtneps2bf16_128_mask: {
2922 mlir::Location loc =
getLoc(
expr->getExprLoc());
2926 unsigned numElts = inputTy.getFixedSize();
2931 args.push_back(ops[0]);
2932 args.push_back(ops[1]);
2933 args.push_back(mask);
2935 return builder.emitIntrinsicCallOp(
2936 loc,
"x86.avx512bf16.mask.cvtneps2bf16.128", resTy, args);
2938 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
2939 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask: {
2940 mlir::Location loc =
getLoc(
expr->getExprLoc());
2942 StringRef intrinsicName;
2943 if (builtinID == X86::BI__builtin_ia32_cvtneps2bf16_256_mask) {
2944 intrinsicName =
"x86.avx512bf16.cvtneps2bf16.256";
2946 assert(builtinID == X86::BI__builtin_ia32_cvtneps2bf16_512_mask);
2947 intrinsicName =
"x86.avx512bf16.cvtneps2bf16.512";
2950 mlir::Value res = builder.emitIntrinsicCallOp(loc, intrinsicName, resTy,
2951 mlir::ValueRange{ops[0]});
2955 case X86::BI__cpuid:
2956 case X86::BI__cpuidex: {
2957 mlir::Location loc =
getLoc(
expr->getExprLoc());
2958 mlir::Value subFuncId = builtinID == X86::BI__cpuidex
2960 : builder.getConstInt(loc,
sInt32Ty, 0);
2961 cir::CpuIdOp::create(builder, loc, ops[0],
2963 return mlir::Value{};
2966 case X86::BI__emulu:
2968 case X86::BI__umulh:
2969 case X86::BI_mul128:
2970 case X86::BI_umul128: {
2971 cgm.errorNYI(
expr->getSourceRange(),
2972 std::string(
"unimplemented X86 builtin call: ") +
2973 getContext().BuiltinInfo.getName(builtinID));
2974 return mlir::Value{};
2976 case X86::BI__faststorefence: {
2977 cir::AtomicFenceOp::create(
2979 cir::MemOrder::SequentiallyConsistent,
2981 cir::SyncScopeKind::System));
2982 return mlir::Value{};
2984 case X86::BI__shiftleft128:
2985 case X86::BI__shiftright128: {
2989 std::swap(ops[0], ops[1]);
2992 auto amtTy = mlir::cast<cir::IntType>(ops[2].
getType());
2993 cir::IntType i64Ty = builder.getUInt64Ty();
2996 ops[2] = builder.createIntCast(ops[2], i64Ty);
2998 const StringRef intrinsicName =
2999 (builtinID == X86::BI__shiftleft128) ?
"fshl" :
"fshr";
3000 return builder.emitIntrinsicCallOp(
3001 getLoc(
expr->getExprLoc()), intrinsicName, i64Ty,
3002 mlir::ValueRange{ops[0], ops[1], ops[2]});
3004 case X86::BI_ReadWriteBarrier:
3005 case X86::BI_ReadBarrier:
3006 case X86::BI_WriteBarrier: {
3007 cir::AtomicFenceOp::create(
3009 cir::MemOrder::SequentiallyConsistent,
3011 cir::SyncScopeKind::SingleThread));
3012 return mlir::Value{};
3014 case X86::BI_AddressOfReturnAddress: {
3015 mlir::Location loc =
getLoc(
expr->getExprLoc());
3018 return builder.createCast(loc, cir::CastKind::bitcast, addr,
voidPtrTy);
3020 case X86::BI__stosb:
3022 case X86::BI__int2c:
3023 case X86::BI__readfsbyte:
3024 case X86::BI__readfsword:
3025 case X86::BI__readfsdword:
3026 case X86::BI__readfsqword:
3027 case X86::BI__readgsbyte:
3028 case X86::BI__readgsword:
3029 case X86::BI__readgsdword:
3030 case X86::BI__readgsqword: {
3031 cgm.errorNYI(
expr->getSourceRange(),
3032 std::string(
"unimplemented X86 builtin call: ") +
3033 getContext().BuiltinInfo.getName(builtinID));
3034 return mlir::Value{};
3036 case X86::BI__builtin_ia32_encodekey128_u32: {
3038 {ops[0], ops[1]}, ops[2], 6,
"x86.encodekey128", 3);
3040 case X86::BI__builtin_ia32_encodekey256_u32: {
3043 {ops[0], ops[1], ops[2]}, ops[3], 7,
3044 "x86.encodekey256", 4);
3047 case X86::BI__builtin_ia32_aesenc128kl_u8:
3048 case X86::BI__builtin_ia32_aesdec128kl_u8:
3049 case X86::BI__builtin_ia32_aesenc256kl_u8:
3050 case X86::BI__builtin_ia32_aesdec256kl_u8: {
3051 llvm::StringRef intrinsicName;
3052 switch (builtinID) {
3054 llvm_unreachable(
"Unexpected builtin");
3055 case X86::BI__builtin_ia32_aesenc128kl_u8:
3056 intrinsicName =
"x86.aesenc128kl";
3058 case X86::BI__builtin_ia32_aesdec128kl_u8:
3059 intrinsicName =
"x86.aesdec128kl";
3061 case X86::BI__builtin_ia32_aesenc256kl_u8:
3062 intrinsicName =
"x86.aesenc256kl";
3064 case X86::BI__builtin_ia32_aesdec256kl_u8:
3065 intrinsicName =
"x86.aesdec256kl";
3072 case X86::BI__builtin_ia32_aesencwide128kl_u8:
3073 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
3074 case X86::BI__builtin_ia32_aesencwide256kl_u8:
3075 case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
3076 llvm::StringRef intrinsicName;
3077 switch (builtinID) {
3079 llvm_unreachable(
"Unexpected builtin");
3080 case X86::BI__builtin_ia32_aesencwide128kl_u8:
3081 intrinsicName =
"x86.aesencwide128kl";
3083 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
3084 intrinsicName =
"x86.aesdecwide128kl";
3086 case X86::BI__builtin_ia32_aesencwide256kl_u8:
3087 intrinsicName =
"x86.aesencwide256kl";
3089 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
3090 intrinsicName =
"x86.aesdecwide256kl";
3097 case X86::BI__builtin_ia32_vfcmaddcph512_mask:
3098 case X86::BI__builtin_ia32_vfmaddcph512_mask:
3099 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask:
3100 case X86::BI__builtin_ia32_vfmaddcsh_round_mask:
3101 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3:
3102 case X86::BI__builtin_ia32_vfmaddcsh_round_mask3:
3103 case X86::BI__builtin_ia32_prefetchi:
3104 cgm.errorNYI(
expr->getSourceRange(),
3105 std::string(
"unimplemented X86 builtin call: ") +
3106 getContext().BuiltinInfo.getName(builtinID));
3107 return mlir::Value{};