731 if (builtinID == Builtin::BI__builtin_cpu_is) {
732 cgm.errorNYI(
expr->getSourceRange(),
"__builtin_cpu_is");
733 return mlir::Value{};
735 if (builtinID == Builtin::BI__builtin_cpu_supports) {
736 cgm.errorNYI(
expr->getSourceRange(),
"__builtin_cpu_supports");
737 return mlir::Value{};
739 if (builtinID == Builtin::BI__builtin_cpu_init) {
740 cgm.errorNYI(
expr->getSourceRange(),
"__builtin_cpu_init");
741 return mlir::Value{};
756 unsigned iceArguments = 0;
761 for (
auto [idx, arg] : llvm::enumerate(
expr->arguments()))
765 mlir::Type
voidTy = builder.getVoidTy();
770 case X86::BI_mm_clflush:
771 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
772 "x86.sse2.clflush",
voidTy, ops[0]);
773 case X86::BI_mm_lfence:
774 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
775 "x86.sse2.lfence",
voidTy);
776 case X86::BI_mm_pause:
777 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
778 "x86.sse2.pause",
voidTy);
779 case X86::BI_mm_mfence:
780 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
781 "x86.sse2.mfence",
voidTy);
782 case X86::BI_mm_sfence:
783 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
784 "x86.sse.sfence",
voidTy);
785 case X86::BI_mm_prefetch:
786 case X86::BI_m_prefetch:
787 case X86::BI_m_prefetchw:
790 case X86::BI__builtin_ia32_rdtscp: {
791 cgm.errorNYI(
expr->getSourceRange(),
792 std::string(
"unimplemented X86 builtin call: ") +
794 return mlir::Value{};
796 case X86::BI__builtin_ia32_lzcnt_u16:
797 case X86::BI__builtin_ia32_lzcnt_u32:
798 case X86::BI__builtin_ia32_lzcnt_u64: {
799 mlir::Location loc =
getLoc(
expr->getExprLoc());
800 mlir::Value isZeroPoison = builder.getFalse(loc);
801 return builder.emitIntrinsicCallOp(loc,
"ctlz", ops[0].
getType(),
802 mlir::ValueRange{ops[0], isZeroPoison});
804 case X86::BI__builtin_ia32_tzcnt_u16:
805 case X86::BI__builtin_ia32_tzcnt_u32:
806 case X86::BI__builtin_ia32_tzcnt_u64: {
807 mlir::Location loc =
getLoc(
expr->getExprLoc());
808 mlir::Value isZeroPoison = builder.getFalse(loc);
809 return builder.emitIntrinsicCallOp(loc,
"cttz", ops[0].
getType(),
810 mlir::ValueRange{ops[0], isZeroPoison});
812 case X86::BI__builtin_ia32_undef128:
813 case X86::BI__builtin_ia32_undef256:
814 case X86::BI__builtin_ia32_undef512:
822 case X86::BI__builtin_ia32_vec_ext_v4hi:
823 case X86::BI__builtin_ia32_vec_ext_v16qi:
824 case X86::BI__builtin_ia32_vec_ext_v8hi:
825 case X86::BI__builtin_ia32_vec_ext_v4si:
826 case X86::BI__builtin_ia32_vec_ext_v4sf:
827 case X86::BI__builtin_ia32_vec_ext_v2di:
828 case X86::BI__builtin_ia32_vec_ext_v32qi:
829 case X86::BI__builtin_ia32_vec_ext_v16hi:
830 case X86::BI__builtin_ia32_vec_ext_v8si:
831 case X86::BI__builtin_ia32_vec_ext_v4di: {
835 index &= numElts - 1;
837 cir::ConstantOp indexVal =
842 return cir::VecExtractOp::create(builder,
getLoc(
expr->getExprLoc()),
845 case X86::BI__builtin_ia32_vec_set_v4hi:
846 case X86::BI__builtin_ia32_vec_set_v16qi:
847 case X86::BI__builtin_ia32_vec_set_v8hi:
848 case X86::BI__builtin_ia32_vec_set_v4si:
849 case X86::BI__builtin_ia32_vec_set_v2di:
850 case X86::BI__builtin_ia32_vec_set_v32qi:
851 case X86::BI__builtin_ia32_vec_set_v16hi:
852 case X86::BI__builtin_ia32_vec_set_v8si:
853 case X86::BI__builtin_ia32_vec_set_v4di: {
857 case X86::BI__builtin_ia32_kunpckhi:
859 "x86.avx512.kunpackb", ops);
860 case X86::BI__builtin_ia32_kunpcksi:
862 "x86.avx512.kunpackw", ops);
863 case X86::BI__builtin_ia32_kunpckdi:
865 "x86.avx512.kunpackd", ops);
866 case X86::BI_mm_setcsr:
867 case X86::BI__builtin_ia32_ldmxcsr: {
868 mlir::Location loc =
getLoc(
expr->getExprLoc());
870 builder.createStore(loc, ops[0], tmp);
871 return builder.emitIntrinsicCallOp(loc,
"x86.sse.ldmxcsr",
874 case X86::BI_mm_getcsr:
875 case X86::BI__builtin_ia32_stmxcsr: {
876 mlir::Location loc =
getLoc(
expr->getExprLoc());
878 builder.emitIntrinsicCallOp(loc,
"x86.sse.stmxcsr", builder.getVoidTy(),
880 return builder.createLoad(loc, tmp);
882 case X86::BI__builtin_ia32_xsave:
883 case X86::BI__builtin_ia32_xsave64:
884 case X86::BI__builtin_ia32_xrstor:
885 case X86::BI__builtin_ia32_xrstor64:
886 case X86::BI__builtin_ia32_xsaveopt:
887 case X86::BI__builtin_ia32_xsaveopt64:
888 case X86::BI__builtin_ia32_xrstors:
889 case X86::BI__builtin_ia32_xrstors64:
890 case X86::BI__builtin_ia32_xsavec:
891 case X86::BI__builtin_ia32_xsavec64:
892 case X86::BI__builtin_ia32_xsaves:
893 case X86::BI__builtin_ia32_xsaves64:
894 case X86::BI__builtin_ia32_xsetbv:
895 case X86::BI_xsetbv: {
896 mlir::Location loc =
getLoc(
expr->getExprLoc());
897 StringRef intrinsicName;
900 llvm_unreachable(
"Unexpected builtin");
901 case X86::BI__builtin_ia32_xsave:
902 intrinsicName =
"x86.xsave";
904 case X86::BI__builtin_ia32_xsave64:
905 intrinsicName =
"x86.xsave64";
907 case X86::BI__builtin_ia32_xrstor:
908 intrinsicName =
"x86.xrstor";
910 case X86::BI__builtin_ia32_xrstor64:
911 intrinsicName =
"x86.xrstor64";
913 case X86::BI__builtin_ia32_xsaveopt:
914 intrinsicName =
"x86.xsaveopt";
916 case X86::BI__builtin_ia32_xsaveopt64:
917 intrinsicName =
"x86.xsaveopt64";
919 case X86::BI__builtin_ia32_xrstors:
920 intrinsicName =
"x86.xrstors";
922 case X86::BI__builtin_ia32_xrstors64:
923 intrinsicName =
"x86.xrstors64";
925 case X86::BI__builtin_ia32_xsavec:
926 intrinsicName =
"x86.xsavec";
928 case X86::BI__builtin_ia32_xsavec64:
929 intrinsicName =
"x86.xsavec64";
931 case X86::BI__builtin_ia32_xsaves:
932 intrinsicName =
"x86.xsaves";
934 case X86::BI__builtin_ia32_xsaves64:
935 intrinsicName =
"x86.xsaves64";
937 case X86::BI__builtin_ia32_xsetbv:
939 intrinsicName =
"x86.xsetbv";
947 mlir::Type i32Ty = builder.getSInt32Ty();
950 cir::ConstantOp shift32 = builder.getSInt64(32, loc);
951 mlir::Value mhi = builder.createShift(loc, ops[1], shift32.getResult(),
953 mhi = builder.createIntCast(mhi, i32Ty);
956 mlir::Value mlo = builder.createIntCast(ops[1], i32Ty);
958 return builder.emitIntrinsicCallOp(loc, intrinsicName,
voidTy,
959 mlir::ValueRange{ops[0], mhi, mlo});
961 case X86::BI__builtin_ia32_xgetbv:
965 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
"x86.xgetbv",
966 builder.getUInt64Ty(), ops[0]);
967 case X86::BI__builtin_ia32_storedqudi128_mask:
968 case X86::BI__builtin_ia32_storedqusi128_mask:
969 case X86::BI__builtin_ia32_storedquhi128_mask:
970 case X86::BI__builtin_ia32_storedquqi128_mask:
971 case X86::BI__builtin_ia32_storeupd128_mask:
972 case X86::BI__builtin_ia32_storeups128_mask:
973 case X86::BI__builtin_ia32_storedqudi256_mask:
974 case X86::BI__builtin_ia32_storedqusi256_mask:
975 case X86::BI__builtin_ia32_storedquhi256_mask:
976 case X86::BI__builtin_ia32_storedquqi256_mask:
977 case X86::BI__builtin_ia32_storeupd256_mask:
978 case X86::BI__builtin_ia32_storeups256_mask:
979 case X86::BI__builtin_ia32_storedqudi512_mask:
980 case X86::BI__builtin_ia32_storedqusi512_mask:
981 case X86::BI__builtin_ia32_storedquhi512_mask:
982 case X86::BI__builtin_ia32_storedquqi512_mask:
983 case X86::BI__builtin_ia32_storeupd512_mask:
984 case X86::BI__builtin_ia32_storeups512_mask:
985 case X86::BI__builtin_ia32_storesbf16128_mask:
986 case X86::BI__builtin_ia32_storesh128_mask:
987 case X86::BI__builtin_ia32_storess128_mask:
988 case X86::BI__builtin_ia32_storesd128_mask:
989 cgm.errorNYI(
expr->getSourceRange(),
990 std::string(
"unimplemented x86 builtin call: ") +
992 return mlir::Value{};
993 case X86::BI__builtin_ia32_cvtmask2b128:
994 case X86::BI__builtin_ia32_cvtmask2b256:
995 case X86::BI__builtin_ia32_cvtmask2b512:
996 case X86::BI__builtin_ia32_cvtmask2w128:
997 case X86::BI__builtin_ia32_cvtmask2w256:
998 case X86::BI__builtin_ia32_cvtmask2w512:
999 case X86::BI__builtin_ia32_cvtmask2d128:
1000 case X86::BI__builtin_ia32_cvtmask2d256:
1001 case X86::BI__builtin_ia32_cvtmask2d512:
1002 case X86::BI__builtin_ia32_cvtmask2q128:
1003 case X86::BI__builtin_ia32_cvtmask2q256:
1004 case X86::BI__builtin_ia32_cvtmask2q512:
1008 case X86::BI__builtin_ia32_cvtb2mask128:
1009 case X86::BI__builtin_ia32_cvtb2mask256:
1010 case X86::BI__builtin_ia32_cvtb2mask512:
1011 case X86::BI__builtin_ia32_cvtw2mask128:
1012 case X86::BI__builtin_ia32_cvtw2mask256:
1013 case X86::BI__builtin_ia32_cvtw2mask512:
1014 case X86::BI__builtin_ia32_cvtd2mask128:
1015 case X86::BI__builtin_ia32_cvtd2mask256:
1016 case X86::BI__builtin_ia32_cvtd2mask512:
1017 case X86::BI__builtin_ia32_cvtq2mask128:
1018 case X86::BI__builtin_ia32_cvtq2mask256:
1019 case X86::BI__builtin_ia32_cvtq2mask512:
1022 case X86::BI__builtin_ia32_cvtdq2ps512_mask:
1023 case X86::BI__builtin_ia32_cvtqq2ps512_mask:
1024 case X86::BI__builtin_ia32_cvtqq2pd512_mask:
1025 case X86::BI__builtin_ia32_vcvtw2ph512_mask:
1026 case X86::BI__builtin_ia32_vcvtdq2ph512_mask:
1027 case X86::BI__builtin_ia32_vcvtqq2ph512_mask:
1028 case X86::BI__builtin_ia32_cvtudq2ps512_mask:
1029 case X86::BI__builtin_ia32_cvtuqq2ps512_mask:
1030 case X86::BI__builtin_ia32_cvtuqq2pd512_mask:
1031 case X86::BI__builtin_ia32_vcvtuw2ph512_mask:
1032 case X86::BI__builtin_ia32_vcvtudq2ph512_mask:
1033 case X86::BI__builtin_ia32_vcvtuqq2ph512_mask:
1034 case X86::BI__builtin_ia32_vfmaddsh3_mask:
1035 case X86::BI__builtin_ia32_vfmaddss3_mask:
1036 case X86::BI__builtin_ia32_vfmaddsd3_mask:
1037 case X86::BI__builtin_ia32_vfmaddsh3_maskz:
1038 case X86::BI__builtin_ia32_vfmaddss3_maskz:
1039 case X86::BI__builtin_ia32_vfmaddsd3_maskz:
1040 case X86::BI__builtin_ia32_vfmaddsh3_mask3:
1041 case X86::BI__builtin_ia32_vfmaddss3_mask3:
1042 case X86::BI__builtin_ia32_vfmaddsd3_mask3:
1043 case X86::BI__builtin_ia32_vfmsubsh3_mask3:
1044 case X86::BI__builtin_ia32_vfmsubss3_mask3:
1045 case X86::BI__builtin_ia32_vfmsubsd3_mask3:
1046 case X86::BI__builtin_ia32_vfmaddph512_mask:
1047 case X86::BI__builtin_ia32_vfmaddph512_maskz:
1048 case X86::BI__builtin_ia32_vfmaddph512_mask3:
1049 case X86::BI__builtin_ia32_vfmaddps512_mask:
1050 case X86::BI__builtin_ia32_vfmaddps512_maskz:
1051 case X86::BI__builtin_ia32_vfmaddps512_mask3:
1052 case X86::BI__builtin_ia32_vfmsubps512_mask3:
1053 case X86::BI__builtin_ia32_vfmaddpd512_mask:
1054 case X86::BI__builtin_ia32_vfmaddpd512_maskz:
1055 case X86::BI__builtin_ia32_vfmaddpd512_mask3:
1056 case X86::BI__builtin_ia32_vfmsubpd512_mask3:
1057 case X86::BI__builtin_ia32_vfmsubph512_mask3:
1058 case X86::BI__builtin_ia32_vfmaddsubph512_mask:
1059 case X86::BI__builtin_ia32_vfmaddsubph512_maskz:
1060 case X86::BI__builtin_ia32_vfmaddsubph512_mask3:
1061 case X86::BI__builtin_ia32_vfmsubaddph512_mask3:
1062 case X86::BI__builtin_ia32_vfmaddsubps512_mask:
1063 case X86::BI__builtin_ia32_vfmaddsubps512_maskz:
1064 case X86::BI__builtin_ia32_vfmaddsubps512_mask3:
1065 case X86::BI__builtin_ia32_vfmsubaddps512_mask3:
1066 case X86::BI__builtin_ia32_vfmaddsubpd512_mask:
1067 case X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
1068 case X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
1069 case X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
1070 case X86::BI__builtin_ia32_movdqa32store128_mask:
1071 case X86::BI__builtin_ia32_movdqa64store128_mask:
1072 case X86::BI__builtin_ia32_storeaps128_mask:
1073 case X86::BI__builtin_ia32_storeapd128_mask:
1074 case X86::BI__builtin_ia32_movdqa32store256_mask:
1075 case X86::BI__builtin_ia32_movdqa64store256_mask:
1076 case X86::BI__builtin_ia32_storeaps256_mask:
1077 case X86::BI__builtin_ia32_storeapd256_mask:
1078 case X86::BI__builtin_ia32_movdqa32store512_mask:
1079 case X86::BI__builtin_ia32_movdqa64store512_mask:
1080 case X86::BI__builtin_ia32_storeaps512_mask:
1081 case X86::BI__builtin_ia32_storeapd512_mask:
1082 case X86::BI__builtin_ia32_loadups128_mask:
1083 case X86::BI__builtin_ia32_loadups256_mask:
1084 case X86::BI__builtin_ia32_loadups512_mask:
1085 case X86::BI__builtin_ia32_loadupd128_mask:
1086 case X86::BI__builtin_ia32_loadupd256_mask:
1087 case X86::BI__builtin_ia32_loadupd512_mask:
1088 case X86::BI__builtin_ia32_loaddquqi128_mask:
1089 case X86::BI__builtin_ia32_loaddquqi256_mask:
1090 case X86::BI__builtin_ia32_loaddquqi512_mask:
1091 case X86::BI__builtin_ia32_loaddquhi128_mask:
1092 case X86::BI__builtin_ia32_loaddquhi256_mask:
1093 case X86::BI__builtin_ia32_loaddquhi512_mask:
1094 case X86::BI__builtin_ia32_loaddqusi128_mask:
1095 case X86::BI__builtin_ia32_loaddqusi256_mask:
1096 case X86::BI__builtin_ia32_loaddqusi512_mask:
1097 case X86::BI__builtin_ia32_loaddqudi128_mask:
1098 case X86::BI__builtin_ia32_loaddqudi256_mask:
1099 case X86::BI__builtin_ia32_loaddqudi512_mask:
1100 case X86::BI__builtin_ia32_loadsbf16128_mask:
1101 case X86::BI__builtin_ia32_loadsh128_mask:
1102 case X86::BI__builtin_ia32_loadss128_mask:
1103 case X86::BI__builtin_ia32_loadsd128_mask:
1104 case X86::BI__builtin_ia32_loadaps128_mask:
1105 case X86::BI__builtin_ia32_loadaps256_mask:
1106 case X86::BI__builtin_ia32_loadaps512_mask:
1107 case X86::BI__builtin_ia32_loadapd128_mask:
1108 case X86::BI__builtin_ia32_loadapd256_mask:
1109 case X86::BI__builtin_ia32_loadapd512_mask:
1110 case X86::BI__builtin_ia32_movdqa32load128_mask:
1111 case X86::BI__builtin_ia32_movdqa32load256_mask:
1112 case X86::BI__builtin_ia32_movdqa32load512_mask:
1113 case X86::BI__builtin_ia32_movdqa64load128_mask:
1114 case X86::BI__builtin_ia32_movdqa64load256_mask:
1115 case X86::BI__builtin_ia32_movdqa64load512_mask:
1116 case X86::BI__builtin_ia32_expandloaddf128_mask:
1117 case X86::BI__builtin_ia32_expandloaddf256_mask:
1118 case X86::BI__builtin_ia32_expandloaddf512_mask:
1119 case X86::BI__builtin_ia32_expandloadsf128_mask:
1120 case X86::BI__builtin_ia32_expandloadsf256_mask:
1121 case X86::BI__builtin_ia32_expandloadsf512_mask:
1122 case X86::BI__builtin_ia32_expandloaddi128_mask:
1123 case X86::BI__builtin_ia32_expandloaddi256_mask:
1124 case X86::BI__builtin_ia32_expandloaddi512_mask:
1125 case X86::BI__builtin_ia32_expandloadsi128_mask:
1126 case X86::BI__builtin_ia32_expandloadsi256_mask:
1127 case X86::BI__builtin_ia32_expandloadsi512_mask:
1128 case X86::BI__builtin_ia32_expandloadhi128_mask:
1129 case X86::BI__builtin_ia32_expandloadhi256_mask:
1130 case X86::BI__builtin_ia32_expandloadhi512_mask:
1131 case X86::BI__builtin_ia32_expandloadqi128_mask:
1132 case X86::BI__builtin_ia32_expandloadqi256_mask:
1133 case X86::BI__builtin_ia32_expandloadqi512_mask:
1134 case X86::BI__builtin_ia32_compressstoredf128_mask:
1135 case X86::BI__builtin_ia32_compressstoredf256_mask:
1136 case X86::BI__builtin_ia32_compressstoredf512_mask:
1137 case X86::BI__builtin_ia32_compressstoresf128_mask:
1138 case X86::BI__builtin_ia32_compressstoresf256_mask:
1139 case X86::BI__builtin_ia32_compressstoresf512_mask:
1140 case X86::BI__builtin_ia32_compressstoredi128_mask:
1141 case X86::BI__builtin_ia32_compressstoredi256_mask:
1142 case X86::BI__builtin_ia32_compressstoredi512_mask:
1143 case X86::BI__builtin_ia32_compressstoresi128_mask:
1144 case X86::BI__builtin_ia32_compressstoresi256_mask:
1145 case X86::BI__builtin_ia32_compressstoresi512_mask:
1146 case X86::BI__builtin_ia32_compressstorehi128_mask:
1147 case X86::BI__builtin_ia32_compressstorehi256_mask:
1148 case X86::BI__builtin_ia32_compressstorehi512_mask:
1149 case X86::BI__builtin_ia32_compressstoreqi128_mask:
1150 case X86::BI__builtin_ia32_compressstoreqi256_mask:
1151 case X86::BI__builtin_ia32_compressstoreqi512_mask:
1152 cgm.errorNYI(
expr->getSourceRange(),
1153 std::string(
"unimplemented X86 builtin call: ") +
1154 getContext().BuiltinInfo.getName(builtinID));
1155 return mlir::Value{};
1156 case X86::BI__builtin_ia32_expanddf128_mask:
1157 case X86::BI__builtin_ia32_expanddf256_mask:
1158 case X86::BI__builtin_ia32_expanddf512_mask:
1159 case X86::BI__builtin_ia32_expandsf128_mask:
1160 case X86::BI__builtin_ia32_expandsf256_mask:
1161 case X86::BI__builtin_ia32_expandsf512_mask:
1162 case X86::BI__builtin_ia32_expanddi128_mask:
1163 case X86::BI__builtin_ia32_expanddi256_mask:
1164 case X86::BI__builtin_ia32_expanddi512_mask:
1165 case X86::BI__builtin_ia32_expandsi128_mask:
1166 case X86::BI__builtin_ia32_expandsi256_mask:
1167 case X86::BI__builtin_ia32_expandsi512_mask:
1168 case X86::BI__builtin_ia32_expandhi128_mask:
1169 case X86::BI__builtin_ia32_expandhi256_mask:
1170 case X86::BI__builtin_ia32_expandhi512_mask:
1171 case X86::BI__builtin_ia32_expandqi128_mask:
1172 case X86::BI__builtin_ia32_expandqi256_mask:
1173 case X86::BI__builtin_ia32_expandqi512_mask: {
1174 mlir::Location loc =
getLoc(
expr->getExprLoc());
1176 "x86.avx512.mask.expand");
1178 case X86::BI__builtin_ia32_compressdf128_mask:
1179 case X86::BI__builtin_ia32_compressdf256_mask:
1180 case X86::BI__builtin_ia32_compressdf512_mask:
1181 case X86::BI__builtin_ia32_compresssf128_mask:
1182 case X86::BI__builtin_ia32_compresssf256_mask:
1183 case X86::BI__builtin_ia32_compresssf512_mask:
1184 case X86::BI__builtin_ia32_compressdi128_mask:
1185 case X86::BI__builtin_ia32_compressdi256_mask:
1186 case X86::BI__builtin_ia32_compressdi512_mask:
1187 case X86::BI__builtin_ia32_compresssi128_mask:
1188 case X86::BI__builtin_ia32_compresssi256_mask:
1189 case X86::BI__builtin_ia32_compresssi512_mask:
1190 case X86::BI__builtin_ia32_compresshi128_mask:
1191 case X86::BI__builtin_ia32_compresshi256_mask:
1192 case X86::BI__builtin_ia32_compresshi512_mask:
1193 case X86::BI__builtin_ia32_compressqi128_mask:
1194 case X86::BI__builtin_ia32_compressqi256_mask:
1195 case X86::BI__builtin_ia32_compressqi512_mask: {
1196 mlir::Location loc =
getLoc(
expr->getExprLoc());
1198 "x86.avx512.mask.compress");
1200 case X86::BI__builtin_ia32_gather3div2df:
1201 case X86::BI__builtin_ia32_gather3div2di:
1202 case X86::BI__builtin_ia32_gather3div4df:
1203 case X86::BI__builtin_ia32_gather3div4di:
1204 case X86::BI__builtin_ia32_gather3div4sf:
1205 case X86::BI__builtin_ia32_gather3div4si:
1206 case X86::BI__builtin_ia32_gather3div8sf:
1207 case X86::BI__builtin_ia32_gather3div8si:
1208 case X86::BI__builtin_ia32_gather3siv2df:
1209 case X86::BI__builtin_ia32_gather3siv2di:
1210 case X86::BI__builtin_ia32_gather3siv4df:
1211 case X86::BI__builtin_ia32_gather3siv4di:
1212 case X86::BI__builtin_ia32_gather3siv4sf:
1213 case X86::BI__builtin_ia32_gather3siv4si:
1214 case X86::BI__builtin_ia32_gather3siv8sf:
1215 case X86::BI__builtin_ia32_gather3siv8si:
1216 case X86::BI__builtin_ia32_gathersiv8df:
1217 case X86::BI__builtin_ia32_gathersiv16sf:
1218 case X86::BI__builtin_ia32_gatherdiv8df:
1219 case X86::BI__builtin_ia32_gatherdiv16sf:
1220 case X86::BI__builtin_ia32_gathersiv8di:
1221 case X86::BI__builtin_ia32_gathersiv16si:
1222 case X86::BI__builtin_ia32_gatherdiv8di:
1223 case X86::BI__builtin_ia32_gatherdiv16si: {
1224 StringRef intrinsicName;
1225 switch (builtinID) {
1227 llvm_unreachable(
"Unexpected builtin");
1228 case X86::BI__builtin_ia32_gather3div2df:
1229 intrinsicName =
"x86.avx512.mask.gather3div2.df";
1231 case X86::BI__builtin_ia32_gather3div2di:
1232 intrinsicName =
"x86.avx512.mask.gather3div2.di";
1234 case X86::BI__builtin_ia32_gather3div4df:
1235 intrinsicName =
"x86.avx512.mask.gather3div4.df";
1237 case X86::BI__builtin_ia32_gather3div4di:
1238 intrinsicName =
"x86.avx512.mask.gather3div4.di";
1240 case X86::BI__builtin_ia32_gather3div4sf:
1241 intrinsicName =
"x86.avx512.mask.gather3div4.sf";
1243 case X86::BI__builtin_ia32_gather3div4si:
1244 intrinsicName =
"x86.avx512.mask.gather3div4.si";
1246 case X86::BI__builtin_ia32_gather3div8sf:
1247 intrinsicName =
"x86.avx512.mask.gather3div8.sf";
1249 case X86::BI__builtin_ia32_gather3div8si:
1250 intrinsicName =
"x86.avx512.mask.gather3div8.si";
1252 case X86::BI__builtin_ia32_gather3siv2df:
1253 intrinsicName =
"x86.avx512.mask.gather3siv2.df";
1255 case X86::BI__builtin_ia32_gather3siv2di:
1256 intrinsicName =
"x86.avx512.mask.gather3siv2.di";
1258 case X86::BI__builtin_ia32_gather3siv4df:
1259 intrinsicName =
"x86.avx512.mask.gather3siv4.df";
1261 case X86::BI__builtin_ia32_gather3siv4di:
1262 intrinsicName =
"x86.avx512.mask.gather3siv4.di";
1264 case X86::BI__builtin_ia32_gather3siv4sf:
1265 intrinsicName =
"x86.avx512.mask.gather3siv4.sf";
1267 case X86::BI__builtin_ia32_gather3siv4si:
1268 intrinsicName =
"x86.avx512.mask.gather3siv4.si";
1270 case X86::BI__builtin_ia32_gather3siv8sf:
1271 intrinsicName =
"x86.avx512.mask.gather3siv8.sf";
1273 case X86::BI__builtin_ia32_gather3siv8si:
1274 intrinsicName =
"x86.avx512.mask.gather3siv8.si";
1276 case X86::BI__builtin_ia32_gathersiv8df:
1277 intrinsicName =
"x86.avx512.mask.gather.dpd.512";
1279 case X86::BI__builtin_ia32_gathersiv16sf:
1280 intrinsicName =
"x86.avx512.mask.gather.dps.512";
1282 case X86::BI__builtin_ia32_gatherdiv8df:
1283 intrinsicName =
"x86.avx512.mask.gather.qpd.512";
1285 case X86::BI__builtin_ia32_gatherdiv16sf:
1286 intrinsicName =
"x86.avx512.mask.gather.qps.512";
1288 case X86::BI__builtin_ia32_gathersiv8di:
1289 intrinsicName =
"x86.avx512.mask.gather.dpq.512";
1291 case X86::BI__builtin_ia32_gathersiv16si:
1292 intrinsicName =
"x86.avx512.mask.gather.dpi.512";
1294 case X86::BI__builtin_ia32_gatherdiv8di:
1295 intrinsicName =
"x86.avx512.mask.gather.qpq.512";
1297 case X86::BI__builtin_ia32_gatherdiv16si:
1298 intrinsicName =
"x86.avx512.mask.gather.qpi.512";
1302 mlir::Location loc =
getLoc(
expr->getExprLoc());
1307 return builder.emitIntrinsicCallOp(loc, intrinsicName,
1310 case X86::BI__builtin_ia32_scattersiv8df:
1311 case X86::BI__builtin_ia32_scattersiv16sf:
1312 case X86::BI__builtin_ia32_scatterdiv8df:
1313 case X86::BI__builtin_ia32_scatterdiv16sf:
1314 case X86::BI__builtin_ia32_scattersiv8di:
1315 case X86::BI__builtin_ia32_scattersiv16si:
1316 case X86::BI__builtin_ia32_scatterdiv8di:
1317 case X86::BI__builtin_ia32_scatterdiv16si:
1318 case X86::BI__builtin_ia32_scatterdiv2df:
1319 case X86::BI__builtin_ia32_scatterdiv2di:
1320 case X86::BI__builtin_ia32_scatterdiv4df:
1321 case X86::BI__builtin_ia32_scatterdiv4di:
1322 case X86::BI__builtin_ia32_scatterdiv4sf:
1323 case X86::BI__builtin_ia32_scatterdiv4si:
1324 case X86::BI__builtin_ia32_scatterdiv8sf:
1325 case X86::BI__builtin_ia32_scatterdiv8si:
1326 case X86::BI__builtin_ia32_scattersiv2df:
1327 case X86::BI__builtin_ia32_scattersiv2di:
1328 case X86::BI__builtin_ia32_scattersiv4df:
1329 case X86::BI__builtin_ia32_scattersiv4di:
1330 case X86::BI__builtin_ia32_scattersiv4sf:
1331 case X86::BI__builtin_ia32_scattersiv4si:
1332 case X86::BI__builtin_ia32_scattersiv8sf:
1333 case X86::BI__builtin_ia32_scattersiv8si: {
1334 llvm::StringRef intrinsicName;
1335 switch (builtinID) {
1337 llvm_unreachable(
"Unexpected builtin");
1338 case X86::BI__builtin_ia32_scattersiv8df:
1339 intrinsicName =
"x86.avx512.mask.scatter.dpd.512";
1341 case X86::BI__builtin_ia32_scattersiv16sf:
1342 intrinsicName =
"x86.avx512.mask.scatter.dps.512";
1344 case X86::BI__builtin_ia32_scatterdiv8df:
1345 intrinsicName =
"x86.avx512.mask.scatter.qpd.512";
1347 case X86::BI__builtin_ia32_scatterdiv16sf:
1348 intrinsicName =
"x86.avx512.mask.scatter.qps.512";
1350 case X86::BI__builtin_ia32_scattersiv8di:
1351 intrinsicName =
"x86.avx512.mask.scatter.dpq.512";
1353 case X86::BI__builtin_ia32_scattersiv16si:
1354 intrinsicName =
"x86.avx512.mask.scatter.dpi.512";
1356 case X86::BI__builtin_ia32_scatterdiv8di:
1357 intrinsicName =
"x86.avx512.mask.scatter.qpq.512";
1359 case X86::BI__builtin_ia32_scatterdiv16si:
1360 intrinsicName =
"x86.avx512.mask.scatter.qpi.512";
1362 case X86::BI__builtin_ia32_scatterdiv2df:
1363 intrinsicName =
"x86.avx512.mask.scatterdiv2.df";
1365 case X86::BI__builtin_ia32_scatterdiv2di:
1366 intrinsicName =
"x86.avx512.mask.scatterdiv2.di";
1368 case X86::BI__builtin_ia32_scatterdiv4df:
1369 intrinsicName =
"x86.avx512.mask.scatterdiv4.df";
1371 case X86::BI__builtin_ia32_scatterdiv4di:
1372 intrinsicName =
"x86.avx512.mask.scatterdiv4.di";
1374 case X86::BI__builtin_ia32_scatterdiv4sf:
1375 intrinsicName =
"x86.avx512.mask.scatterdiv4.sf";
1377 case X86::BI__builtin_ia32_scatterdiv4si:
1378 intrinsicName =
"x86.avx512.mask.scatterdiv4.si";
1380 case X86::BI__builtin_ia32_scatterdiv8sf:
1381 intrinsicName =
"x86.avx512.mask.scatterdiv8.sf";
1383 case X86::BI__builtin_ia32_scatterdiv8si:
1384 intrinsicName =
"x86.avx512.mask.scatterdiv8.si";
1386 case X86::BI__builtin_ia32_scattersiv2df:
1387 intrinsicName =
"x86.avx512.mask.scattersiv2.df";
1389 case X86::BI__builtin_ia32_scattersiv2di:
1390 intrinsicName =
"x86.avx512.mask.scattersiv2.di";
1392 case X86::BI__builtin_ia32_scattersiv4df:
1393 intrinsicName =
"x86.avx512.mask.scattersiv4.df";
1395 case X86::BI__builtin_ia32_scattersiv4di:
1396 intrinsicName =
"x86.avx512.mask.scattersiv4.di";
1398 case X86::BI__builtin_ia32_scattersiv4sf:
1399 intrinsicName =
"x86.avx512.mask.scattersiv4.sf";
1401 case X86::BI__builtin_ia32_scattersiv4si:
1402 intrinsicName =
"x86.avx512.mask.scattersiv4.si";
1404 case X86::BI__builtin_ia32_scattersiv8sf:
1405 intrinsicName =
"x86.avx512.mask.scattersiv8.sf";
1407 case X86::BI__builtin_ia32_scattersiv8si:
1408 intrinsicName =
"x86.avx512.mask.scattersiv8.si";
1412 mlir::Location loc =
getLoc(
expr->getExprLoc());
1418 return builder.emitIntrinsicCallOp(loc, intrinsicName,
1421 case X86::BI__builtin_ia32_vextractf128_pd256:
1422 case X86::BI__builtin_ia32_vextractf128_ps256:
1423 case X86::BI__builtin_ia32_vextractf128_si256:
1424 case X86::BI__builtin_ia32_extract128i256:
1425 case X86::BI__builtin_ia32_extractf64x4_mask:
1426 case X86::BI__builtin_ia32_extractf32x4_mask:
1427 case X86::BI__builtin_ia32_extracti64x4_mask:
1428 case X86::BI__builtin_ia32_extracti32x4_mask:
1429 case X86::BI__builtin_ia32_extractf32x8_mask:
1430 case X86::BI__builtin_ia32_extracti32x8_mask:
1431 case X86::BI__builtin_ia32_extractf32x4_256_mask:
1432 case X86::BI__builtin_ia32_extracti32x4_256_mask:
1433 case X86::BI__builtin_ia32_extractf64x2_256_mask:
1434 case X86::BI__builtin_ia32_extracti64x2_256_mask:
1435 case X86::BI__builtin_ia32_extractf64x2_512_mask:
1436 case X86::BI__builtin_ia32_extracti64x2_512_mask: {
1437 mlir::Location loc =
getLoc(
expr->getExprLoc());
1439 unsigned numElts = dstTy.getSize();
1441 unsigned subVectors = srcNumElts / numElts;
1442 assert(llvm::isPowerOf2_32(subVectors) &&
"Expected power of 2 subvectors");
1444 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
1446 index &= subVectors - 1;
1449 int64_t indices[16];
1450 std::iota(indices, indices + numElts,
index);
1452 mlir::Value poison =
1453 builder.getConstant(loc, cir::PoisonAttr::get(ops[0].
getType()));
1454 mlir::Value res = builder.createVecShuffle(loc, ops[0], poison,
1456 if (ops.size() == 4)
1461 case X86::BI__builtin_ia32_vinsertf128_pd256:
1462 case X86::BI__builtin_ia32_vinsertf128_ps256:
1463 case X86::BI__builtin_ia32_vinsertf128_si256:
1464 case X86::BI__builtin_ia32_insert128i256:
1465 case X86::BI__builtin_ia32_insertf64x4:
1466 case X86::BI__builtin_ia32_insertf32x4:
1467 case X86::BI__builtin_ia32_inserti64x4:
1468 case X86::BI__builtin_ia32_inserti32x4:
1469 case X86::BI__builtin_ia32_insertf32x8:
1470 case X86::BI__builtin_ia32_inserti32x8:
1471 case X86::BI__builtin_ia32_insertf32x4_256:
1472 case X86::BI__builtin_ia32_inserti32x4_256:
1473 case X86::BI__builtin_ia32_insertf64x2_256:
1474 case X86::BI__builtin_ia32_inserti64x2_256:
1475 case X86::BI__builtin_ia32_insertf64x2_512:
1476 case X86::BI__builtin_ia32_inserti64x2_512: {
1479 unsigned subVectors = dstNumElts / srcNumElts;
1480 assert(llvm::isPowerOf2_32(subVectors) &&
"Expected power of 2 subvectors");
1481 assert(dstNumElts <= 16);
1484 index &= subVectors - 1;
1485 index *= srcNumElts;
1488 for (
unsigned i = 0; i != dstNumElts; ++i)
1489 mask[i] = (i >= srcNumElts) ? srcNumElts + (i % srcNumElts) : i;
1492 builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[1], mask);
1494 for (
unsigned i = 0; i != dstNumElts; ++i) {
1496 mask[i] = (i -
index) + dstNumElts;
1501 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], op1,
1504 case X86::BI__builtin_ia32_pmovqd512_mask:
1505 case X86::BI__builtin_ia32_pmovwb512_mask: {
1511 case X86::BI__builtin_ia32_pblendw128:
1512 case X86::BI__builtin_ia32_blendpd:
1513 case X86::BI__builtin_ia32_blendps:
1514 case X86::BI__builtin_ia32_blendpd256:
1515 case X86::BI__builtin_ia32_blendps256:
1516 case X86::BI__builtin_ia32_pblendw256:
1517 case X86::BI__builtin_ia32_pblendd128:
1518 case X86::BI__builtin_ia32_pblendd256: {
1525 mlir::Type i32Ty = builder.getSInt32Ty();
1526 for (
unsigned i = 0; i != numElts; ++i)
1528 cir::IntAttr::get(i32Ty, ((imm >> (i % 8)) & 0x1) ? numElts + i : i));
1530 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
1533 case X86::BI__builtin_ia32_pshuflw:
1534 case X86::BI__builtin_ia32_pshuflw256:
1535 case X86::BI__builtin_ia32_pshuflw512:
1538 case X86::BI__builtin_ia32_pshufhw:
1539 case X86::BI__builtin_ia32_pshufhw256:
1540 case X86::BI__builtin_ia32_pshufhw512:
1543 case X86::BI__builtin_ia32_pshufd:
1544 case X86::BI__builtin_ia32_pshufd256:
1545 case X86::BI__builtin_ia32_pshufd512:
1546 case X86::BI__builtin_ia32_vpermilpd:
1547 case X86::BI__builtin_ia32_vpermilps:
1548 case X86::BI__builtin_ia32_vpermilpd256:
1549 case X86::BI__builtin_ia32_vpermilps256:
1550 case X86::BI__builtin_ia32_vpermilpd512:
1551 case X86::BI__builtin_ia32_vpermilps512: {
1557 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], mask);
1559 case X86::BI__builtin_ia32_shufpd:
1560 case X86::BI__builtin_ia32_shufpd256:
1561 case X86::BI__builtin_ia32_shufpd512:
1562 case X86::BI__builtin_ia32_shufps:
1563 case X86::BI__builtin_ia32_shufps256:
1564 case X86::BI__builtin_ia32_shufps512: {
1570 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
1573 case X86::BI__builtin_ia32_permdi256:
1574 case X86::BI__builtin_ia32_permdf256:
1575 case X86::BI__builtin_ia32_permdi512:
1576 case X86::BI__builtin_ia32_permdf512: {
1578 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
1584 for (
unsigned l = 0; l != numElts; l += 4)
1585 for (
unsigned i = 0; i != 4; ++i)
1586 Indices[l + i] = l + ((imm >> (2 * i)) & 0x3);
1588 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0],
1591 case X86::BI__builtin_ia32_palignr128:
1592 case X86::BI__builtin_ia32_palignr256:
1593 case X86::BI__builtin_ia32_palignr512: {
1597 assert(numElts % 16 == 0);
1607 if (shiftVal > 16) {
1614 int64_t indices[64];
1616 for (
unsigned l = 0; l != numElts; l += 16) {
1617 for (
unsigned i = 0; i != 16; ++i) {
1618 uint32_t idx = shiftVal + i;
1620 idx += numElts - 16;
1621 indices[l + i] = l + idx;
1625 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[1], ops[0],
1628 case X86::BI__builtin_ia32_alignd128:
1629 case X86::BI__builtin_ia32_alignd256:
1630 case X86::BI__builtin_ia32_alignd512:
1631 case X86::BI__builtin_ia32_alignq128:
1632 case X86::BI__builtin_ia32_alignq256:
1633 case X86::BI__builtin_ia32_alignq512: {
1636 ops[2].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
1640 shiftVal &= numElts - 1;
1643 mlir::Type i32Ty = builder.getSInt32Ty();
1644 for (
unsigned i = 0; i != numElts; ++i)
1645 indices.push_back(cir::IntAttr::get(i32Ty, i + shiftVal));
1647 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), ops[0], ops[1],
1650 case X86::BI__builtin_ia32_shuf_f32x4_256:
1651 case X86::BI__builtin_ia32_shuf_f64x2_256:
1652 case X86::BI__builtin_ia32_shuf_i32x4_256:
1653 case X86::BI__builtin_ia32_shuf_i64x2_256:
1654 case X86::BI__builtin_ia32_shuf_f32x4:
1655 case X86::BI__builtin_ia32_shuf_f64x2:
1656 case X86::BI__builtin_ia32_shuf_i32x4:
1657 case X86::BI__builtin_ia32_shuf_i64x2: {
1658 mlir::Value src1 = ops[0];
1659 mlir::Value src2 = ops[1];
1662 ops[2].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue();
1666 unsigned numLanes = totalBits == 512 ? 4 : 2;
1667 unsigned numElemsPerLane = numElems / numLanes;
1670 mlir::Type i32Ty = builder.getSInt32Ty();
1672 for (
unsigned l = 0; l != numElems; l += numElemsPerLane) {
1673 unsigned index = (imm % numLanes) * numElemsPerLane;
1675 if (l >= (numElems / 2))
1677 for (
unsigned i = 0; i != numElemsPerLane; ++i) {
1678 indices.push_back(cir::IntAttr::get(i32Ty,
index + i));
1682 return builder.createVecShuffle(
getLoc(
expr->getExprLoc()), src1, src2,
1685 case X86::BI__builtin_ia32_vperm2f128_pd256:
1686 case X86::BI__builtin_ia32_vperm2f128_ps256:
1687 case X86::BI__builtin_ia32_vperm2f128_si256:
1688 case X86::BI__builtin_ia32_permti256:
1689 case X86::BI__builtin_ia32_pslldqi128_byteshift:
1690 case X86::BI__builtin_ia32_pslldqi256_byteshift:
1691 case X86::BI__builtin_ia32_pslldqi512_byteshift:
1692 case X86::BI__builtin_ia32_psrldqi128_byteshift:
1693 case X86::BI__builtin_ia32_psrldqi256_byteshift:
1694 case X86::BI__builtin_ia32_psrldqi512_byteshift:
1695 cgm.errorNYI(
expr->getSourceRange(),
1696 std::string(
"unimplemented X86 builtin call: ") +
1697 getContext().BuiltinInfo.getName(builtinID));
1698 return mlir::Value{};
1699 case X86::BI__builtin_ia32_kshiftliqi:
1700 case X86::BI__builtin_ia32_kshiftlihi:
1701 case X86::BI__builtin_ia32_kshiftlisi:
1702 case X86::BI__builtin_ia32_kshiftlidi: {
1703 mlir::Location loc =
getLoc(
expr->getExprLoc());
1705 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
1709 if (shiftVal >= numElems)
1710 return builder.getNullValue(ops[0].
getType(), loc);
1715 mlir::Type i32Ty = builder.getSInt32Ty();
1716 for (
auto i : llvm::seq<unsigned>(0, numElems))
1717 indices.push_back(cir::IntAttr::get(i32Ty, numElems + i - shiftVal));
1719 mlir::Value zero = builder.getNullValue(
in.getType(), loc);
1720 mlir::Value sv = builder.createVecShuffle(loc, zero,
in, indices);
1721 return builder.createBitcast(sv, ops[0].
getType());
1723 case X86::BI__builtin_ia32_kshiftriqi:
1724 case X86::BI__builtin_ia32_kshiftrihi:
1725 case X86::BI__builtin_ia32_kshiftrisi:
1726 case X86::BI__builtin_ia32_kshiftridi: {
1727 mlir::Location loc =
getLoc(
expr->getExprLoc());
1729 ops[1].getDefiningOp<cir::ConstantOp>().getIntValue().getZExtValue() &
1733 if (shiftVal >= numElems)
1734 return builder.getNullValue(ops[0].
getType(), loc);
1739 mlir::Type i32Ty = builder.getSInt32Ty();
1740 for (
auto i : llvm::seq<unsigned>(0, numElems))
1741 indices.push_back(cir::IntAttr::get(i32Ty, i + shiftVal));
1743 mlir::Value zero = builder.getNullValue(
in.getType(), loc);
1744 mlir::Value sv = builder.createVecShuffle(loc,
in, zero, indices);
1745 return builder.createBitcast(sv, ops[0].
getType());
1747 case X86::BI__builtin_ia32_vprotbi:
1748 case X86::BI__builtin_ia32_vprotwi:
1749 case X86::BI__builtin_ia32_vprotdi:
1750 case X86::BI__builtin_ia32_vprotqi:
1751 case X86::BI__builtin_ia32_prold128:
1752 case X86::BI__builtin_ia32_prold256:
1753 case X86::BI__builtin_ia32_prold512:
1754 case X86::BI__builtin_ia32_prolq128:
1755 case X86::BI__builtin_ia32_prolq256:
1756 case X86::BI__builtin_ia32_prolq512:
1758 ops[0], ops[1],
false);
1759 case X86::BI__builtin_ia32_prord128:
1760 case X86::BI__builtin_ia32_prord256:
1761 case X86::BI__builtin_ia32_prord512:
1762 case X86::BI__builtin_ia32_prorq128:
1763 case X86::BI__builtin_ia32_prorq256:
1764 case X86::BI__builtin_ia32_prorq512:
1766 ops[0], ops[1],
true);
1767 case X86::BI__builtin_ia32_selectb_128:
1768 case X86::BI__builtin_ia32_selectb_256:
1769 case X86::BI__builtin_ia32_selectb_512:
1770 case X86::BI__builtin_ia32_selectw_128:
1771 case X86::BI__builtin_ia32_selectw_256:
1772 case X86::BI__builtin_ia32_selectw_512:
1773 case X86::BI__builtin_ia32_selectd_128:
1774 case X86::BI__builtin_ia32_selectd_256:
1775 case X86::BI__builtin_ia32_selectd_512:
1776 case X86::BI__builtin_ia32_selectq_128:
1777 case X86::BI__builtin_ia32_selectq_256:
1778 case X86::BI__builtin_ia32_selectq_512:
1779 case X86::BI__builtin_ia32_selectph_128:
1780 case X86::BI__builtin_ia32_selectph_256:
1781 case X86::BI__builtin_ia32_selectph_512:
1782 case X86::BI__builtin_ia32_selectpbf_128:
1783 case X86::BI__builtin_ia32_selectpbf_256:
1784 case X86::BI__builtin_ia32_selectpbf_512:
1785 case X86::BI__builtin_ia32_selectps_128:
1786 case X86::BI__builtin_ia32_selectps_256:
1787 case X86::BI__builtin_ia32_selectps_512:
1788 case X86::BI__builtin_ia32_selectpd_128:
1789 case X86::BI__builtin_ia32_selectpd_256:
1790 case X86::BI__builtin_ia32_selectpd_512:
1791 case X86::BI__builtin_ia32_selectsh_128:
1792 case X86::BI__builtin_ia32_selectsbf_128:
1793 case X86::BI__builtin_ia32_selectss_128:
1794 case X86::BI__builtin_ia32_selectsd_128:
1795 case X86::BI__builtin_ia32_cmpb128_mask:
1796 case X86::BI__builtin_ia32_cmpb256_mask:
1797 case X86::BI__builtin_ia32_cmpb512_mask:
1798 case X86::BI__builtin_ia32_cmpw128_mask:
1799 case X86::BI__builtin_ia32_cmpw256_mask:
1800 case X86::BI__builtin_ia32_cmpw512_mask:
1801 case X86::BI__builtin_ia32_cmpd128_mask:
1802 case X86::BI__builtin_ia32_cmpd256_mask:
1803 case X86::BI__builtin_ia32_cmpd512_mask:
1804 case X86::BI__builtin_ia32_cmpq128_mask:
1805 case X86::BI__builtin_ia32_cmpq256_mask:
1806 case X86::BI__builtin_ia32_cmpq512_mask:
1807 case X86::BI__builtin_ia32_ucmpb128_mask:
1808 case X86::BI__builtin_ia32_ucmpb256_mask:
1809 case X86::BI__builtin_ia32_ucmpb512_mask:
1810 case X86::BI__builtin_ia32_ucmpw128_mask:
1811 case X86::BI__builtin_ia32_ucmpw256_mask:
1812 case X86::BI__builtin_ia32_ucmpw512_mask:
1813 case X86::BI__builtin_ia32_ucmpd128_mask:
1814 case X86::BI__builtin_ia32_ucmpd256_mask:
1815 case X86::BI__builtin_ia32_ucmpd512_mask:
1816 case X86::BI__builtin_ia32_ucmpq128_mask:
1817 case X86::BI__builtin_ia32_ucmpq256_mask:
1818 case X86::BI__builtin_ia32_ucmpq512_mask:
1819 cgm.errorNYI(
expr->getSourceRange(),
1820 std::string(
"unimplemented X86 builtin call: ") +
1821 getContext().BuiltinInfo.getName(builtinID));
1822 return mlir::Value{};
1823 case X86::BI__builtin_ia32_vpcomb:
1824 case X86::BI__builtin_ia32_vpcomw:
1825 case X86::BI__builtin_ia32_vpcomd:
1826 case X86::BI__builtin_ia32_vpcomq:
1828 case X86::BI__builtin_ia32_vpcomub:
1829 case X86::BI__builtin_ia32_vpcomuw:
1830 case X86::BI__builtin_ia32_vpcomud:
1831 case X86::BI__builtin_ia32_vpcomuq:
1833 case X86::BI__builtin_ia32_kortestcqi:
1834 case X86::BI__builtin_ia32_kortestchi:
1835 case X86::BI__builtin_ia32_kortestcsi:
1836 case X86::BI__builtin_ia32_kortestcdi: {
1837 mlir::Location loc =
getLoc(
expr->getExprLoc());
1839 mlir::Value allOnesOp =
1840 builder.getConstAPInt(loc, ty, APInt::getAllOnes(ty.getWidth()));
1841 mlir::Value orOp =
emitX86MaskLogic(builder, loc, cir::BinOpKind::Or, ops);
1843 cir::CmpOp::create(builder, loc, cir::CmpOpKind::eq, orOp, allOnesOp);
1844 return builder.createCast(cir::CastKind::bool_to_int, cmp,
1845 cgm.convertType(
expr->getType()));
1847 case X86::BI__builtin_ia32_kortestzqi:
1848 case X86::BI__builtin_ia32_kortestzhi:
1849 case X86::BI__builtin_ia32_kortestzsi:
1850 case X86::BI__builtin_ia32_kortestzdi: {
1851 mlir::Location loc =
getLoc(
expr->getExprLoc());
1853 mlir::Value allZerosOp = builder.getNullValue(ty, loc).getResult();
1854 mlir::Value orOp =
emitX86MaskLogic(builder, loc, cir::BinOpKind::Or, ops);
1856 cir::CmpOp::create(builder, loc, cir::CmpOpKind::eq, orOp, allZerosOp);
1857 return builder.createCast(cir::CastKind::bool_to_int, cmp,
1858 cgm.convertType(
expr->getType()));
1860 case X86::BI__builtin_ia32_ktestcqi:
1862 "x86.avx512.ktestc.b", ops);
1863 case X86::BI__builtin_ia32_ktestzqi:
1865 "x86.avx512.ktestz.b", ops);
1866 case X86::BI__builtin_ia32_ktestchi:
1868 "x86.avx512.ktestc.w", ops);
1869 case X86::BI__builtin_ia32_ktestzhi:
1871 "x86.avx512.ktestz.w", ops);
1872 case X86::BI__builtin_ia32_ktestcsi:
1874 "x86.avx512.ktestc.d", ops);
1875 case X86::BI__builtin_ia32_ktestzsi:
1877 "x86.avx512.ktestz.d", ops);
1878 case X86::BI__builtin_ia32_ktestcdi:
1880 "x86.avx512.ktestc.q", ops);
1881 case X86::BI__builtin_ia32_ktestzdi:
1883 "x86.avx512.ktestz.q", ops);
1884 case X86::BI__builtin_ia32_kaddqi:
1886 "x86.avx512.kadd.b", ops);
1887 case X86::BI__builtin_ia32_kaddhi:
1889 "x86.avx512.kadd.w", ops);
1890 case X86::BI__builtin_ia32_kaddsi:
1892 "x86.avx512.kadd.d", ops);
1893 case X86::BI__builtin_ia32_kadddi:
1895 "x86.avx512.kadd.q", ops);
1896 case X86::BI__builtin_ia32_kandqi:
1897 case X86::BI__builtin_ia32_kandhi:
1898 case X86::BI__builtin_ia32_kandsi:
1899 case X86::BI__builtin_ia32_kanddi:
1901 cir::BinOpKind::And, ops);
1902 case X86::BI__builtin_ia32_kandnqi:
1903 case X86::BI__builtin_ia32_kandnhi:
1904 case X86::BI__builtin_ia32_kandnsi:
1905 case X86::BI__builtin_ia32_kandndi:
1907 cir::BinOpKind::And, ops,
true);
1908 case X86::BI__builtin_ia32_korqi:
1909 case X86::BI__builtin_ia32_korhi:
1910 case X86::BI__builtin_ia32_korsi:
1911 case X86::BI__builtin_ia32_kordi:
1913 cir::BinOpKind::Or, ops);
1914 case X86::BI__builtin_ia32_kxnorqi:
1915 case X86::BI__builtin_ia32_kxnorhi:
1916 case X86::BI__builtin_ia32_kxnorsi:
1917 case X86::BI__builtin_ia32_kxnordi:
1919 cir::BinOpKind::Xor, ops,
true);
1920 case X86::BI__builtin_ia32_kxorqi:
1921 case X86::BI__builtin_ia32_kxorhi:
1922 case X86::BI__builtin_ia32_kxorsi:
1923 case X86::BI__builtin_ia32_kxordi:
1925 cir::BinOpKind::Xor, ops);
1926 case X86::BI__builtin_ia32_knotqi:
1927 case X86::BI__builtin_ia32_knothi:
1928 case X86::BI__builtin_ia32_knotsi:
1929 case X86::BI__builtin_ia32_knotdi: {
1931 unsigned numElts = intTy.getWidth();
1932 mlir::Value resVec =
1934 return builder.createBitcast(builder.createNot(resVec), ops[0].getType());
1936 case X86::BI__builtin_ia32_kmovb:
1937 case X86::BI__builtin_ia32_kmovw:
1938 case X86::BI__builtin_ia32_kmovd:
1939 case X86::BI__builtin_ia32_kmovq: {
1944 unsigned numElts = intTy.getWidth();
1945 mlir::Value resVec =
1947 return builder.createBitcast(resVec, ops[0].
getType());
1949 case X86::BI__builtin_ia32_sqrtsh_round_mask:
1950 case X86::BI__builtin_ia32_sqrtsd_round_mask:
1951 case X86::BI__builtin_ia32_sqrtss_round_mask:
1952 cgm.errorNYI(
expr->getSourceRange(),
1953 std::string(
"unimplemented X86 builtin call: ") +
1954 getContext().BuiltinInfo.getName(builtinID));
1955 return mlir::Value{};
1956 case X86::BI__builtin_ia32_sqrtph512:
1957 case X86::BI__builtin_ia32_sqrtps512:
1958 case X86::BI__builtin_ia32_sqrtpd512: {
1959 mlir::Location loc =
getLoc(
expr->getExprLoc());
1960 mlir::Value arg = ops[0];
1961 return cir::SqrtOp::create(builder, loc, arg.getType(), arg).getResult();
1963 case X86::BI__builtin_ia32_pmuludq128:
1964 case X86::BI__builtin_ia32_pmuludq256:
1965 case X86::BI__builtin_ia32_pmuludq512: {
1966 unsigned opTypePrimitiveSizeInBits =
1967 cgm.getDataLayout().getTypeSizeInBits(ops[0].
getType());
1969 ops, opTypePrimitiveSizeInBits);
1971 case X86::BI__builtin_ia32_pmuldq128:
1972 case X86::BI__builtin_ia32_pmuldq256:
1973 case X86::BI__builtin_ia32_pmuldq512: {
1974 unsigned opTypePrimitiveSizeInBits =
1975 cgm.getDataLayout().getTypeSizeInBits(ops[0].
getType());
1977 ops, opTypePrimitiveSizeInBits);
1979 case X86::BI__builtin_ia32_pternlogd512_mask:
1980 case X86::BI__builtin_ia32_pternlogq512_mask:
1981 case X86::BI__builtin_ia32_pternlogd128_mask:
1982 case X86::BI__builtin_ia32_pternlogd256_mask:
1983 case X86::BI__builtin_ia32_pternlogq128_mask:
1984 case X86::BI__builtin_ia32_pternlogq256_mask:
1985 case X86::BI__builtin_ia32_pternlogd512_maskz:
1986 case X86::BI__builtin_ia32_pternlogq512_maskz:
1987 case X86::BI__builtin_ia32_pternlogd128_maskz:
1988 case X86::BI__builtin_ia32_pternlogd256_maskz:
1989 case X86::BI__builtin_ia32_pternlogq128_maskz:
1990 case X86::BI__builtin_ia32_pternlogq256_maskz:
1991 case X86::BI__builtin_ia32_vpshldd128:
1992 case X86::BI__builtin_ia32_vpshldd256:
1993 case X86::BI__builtin_ia32_vpshldd512:
1994 case X86::BI__builtin_ia32_vpshldq128:
1995 case X86::BI__builtin_ia32_vpshldq256:
1996 case X86::BI__builtin_ia32_vpshldq512:
1997 case X86::BI__builtin_ia32_vpshldw128:
1998 case X86::BI__builtin_ia32_vpshldw256:
1999 case X86::BI__builtin_ia32_vpshldw512:
2000 case X86::BI__builtin_ia32_vpshrdd128:
2001 case X86::BI__builtin_ia32_vpshrdd256:
2002 case X86::BI__builtin_ia32_vpshrdd512:
2003 case X86::BI__builtin_ia32_vpshrdq128:
2004 case X86::BI__builtin_ia32_vpshrdq256:
2005 case X86::BI__builtin_ia32_vpshrdq512:
2006 case X86::BI__builtin_ia32_vpshrdw128:
2007 case X86::BI__builtin_ia32_vpshrdw256:
2008 case X86::BI__builtin_ia32_vpshrdw512:
2009 cgm.errorNYI(
expr->getSourceRange(),
2010 std::string(
"unimplemented X86 builtin call: ") +
2011 getContext().BuiltinInfo.getName(builtinID));
2012 return mlir::Value{};
2013 case X86::BI__builtin_ia32_reduce_fadd_pd512:
2014 case X86::BI__builtin_ia32_reduce_fadd_ps512:
2015 case X86::BI__builtin_ia32_reduce_fadd_ph512:
2016 case X86::BI__builtin_ia32_reduce_fadd_ph256:
2017 case X86::BI__builtin_ia32_reduce_fadd_ph128: {
2019 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
2020 "vector.reduce.fadd", ops[0].getType(),
2021 mlir::ValueRange{ops[0], ops[1]});
2023 case X86::BI__builtin_ia32_reduce_fmul_pd512:
2024 case X86::BI__builtin_ia32_reduce_fmul_ps512:
2025 case X86::BI__builtin_ia32_reduce_fmul_ph512:
2026 case X86::BI__builtin_ia32_reduce_fmul_ph256:
2027 case X86::BI__builtin_ia32_reduce_fmul_ph128: {
2029 return builder.emitIntrinsicCallOp(
getLoc(
expr->getExprLoc()),
2030 "vector.reduce.fmul", ops[0].getType(),
2031 mlir::ValueRange{ops[0], ops[1]});
2033 case X86::BI__builtin_ia32_reduce_fmax_pd512:
2034 case X86::BI__builtin_ia32_reduce_fmax_ps512:
2035 case X86::BI__builtin_ia32_reduce_fmax_ph512:
2036 case X86::BI__builtin_ia32_reduce_fmax_ph256:
2037 case X86::BI__builtin_ia32_reduce_fmax_ph128: {
2040 return builder.emitIntrinsicCallOp(
2041 getLoc(
expr->getExprLoc()),
"vector.reduce.fmax",
2042 vecTy.getElementType(), mlir::ValueRange{ops[0]});
2044 case X86::BI__builtin_ia32_reduce_fmin_pd512:
2045 case X86::BI__builtin_ia32_reduce_fmin_ps512:
2046 case X86::BI__builtin_ia32_reduce_fmin_ph512:
2047 case X86::BI__builtin_ia32_reduce_fmin_ph256:
2048 case X86::BI__builtin_ia32_reduce_fmin_ph128: {
2051 return builder.emitIntrinsicCallOp(
2052 getLoc(
expr->getExprLoc()),
"vector.reduce.fmin",
2053 vecTy.getElementType(), mlir::ValueRange{ops[0]});
2055 case X86::BI__builtin_ia32_rdrand16_step:
2056 case X86::BI__builtin_ia32_rdrand32_step:
2057 case X86::BI__builtin_ia32_rdrand64_step:
2058 case X86::BI__builtin_ia32_rdseed16_step:
2059 case X86::BI__builtin_ia32_rdseed32_step:
2060 case X86::BI__builtin_ia32_rdseed64_step: {
2061 llvm::StringRef intrinsicName;
2062 switch (builtinID) {
2064 llvm_unreachable(
"Unsupported intrinsic!");
2065 case X86::BI__builtin_ia32_rdrand16_step:
2066 intrinsicName =
"x86.rdrand.16";
2068 case X86::BI__builtin_ia32_rdrand32_step:
2069 intrinsicName =
"x86.rdrand.32";
2071 case X86::BI__builtin_ia32_rdrand64_step:
2072 intrinsicName =
"x86.rdrand.64";
2074 case X86::BI__builtin_ia32_rdseed16_step:
2075 intrinsicName =
"x86.rdseed.16";
2077 case X86::BI__builtin_ia32_rdseed32_step:
2078 intrinsicName =
"x86.rdseed.32";
2080 case X86::BI__builtin_ia32_rdseed64_step:
2081 intrinsicName =
"x86.rdseed.64";
2085 mlir::Location loc =
getLoc(
expr->getExprLoc());
2088 builder.getUInt32Ty()};
2089 cir::RecordType resRecord =
2090 cir::RecordType::get(&
getMLIRContext(), resultTypes,
false,
false,
2091 cir::RecordType::RecordKind::Struct);
2094 builder.emitIntrinsicCallOp(loc, intrinsicName, resRecord);
2096 cir::ExtractMemberOp::create(builder, loc, randTy, call, 0);
2097 builder.CIRBaseBuilderTy::createStore(loc, rand, ops[0]);
2099 return cir::ExtractMemberOp::create(builder, loc, builder.getUInt32Ty(),
2102 case X86::BI__builtin_ia32_addcarryx_u32:
2103 case X86::BI__builtin_ia32_addcarryx_u64:
2104 case X86::BI__builtin_ia32_subborrow_u32:
2105 case X86::BI__builtin_ia32_subborrow_u64:
2106 cgm.errorNYI(
expr->getSourceRange(),
2107 std::string(
"unimplemented X86 builtin call: ") +
2108 getContext().BuiltinInfo.getName(builtinID));
2109 return mlir::Value{};
2110 case X86::BI__builtin_ia32_fpclassps128_mask:
2111 case X86::BI__builtin_ia32_fpclassps256_mask:
2112 case X86::BI__builtin_ia32_fpclassps512_mask:
2113 case X86::BI__builtin_ia32_vfpclassbf16128_mask:
2114 case X86::BI__builtin_ia32_vfpclassbf16256_mask:
2115 case X86::BI__builtin_ia32_vfpclassbf16512_mask:
2116 case X86::BI__builtin_ia32_fpclassph128_mask:
2117 case X86::BI__builtin_ia32_fpclassph256_mask:
2118 case X86::BI__builtin_ia32_fpclassph512_mask:
2119 case X86::BI__builtin_ia32_fpclasspd128_mask:
2120 case X86::BI__builtin_ia32_fpclasspd256_mask:
2121 case X86::BI__builtin_ia32_fpclasspd512_mask:
2123 case X86::BI__builtin_ia32_vp2intersect_q_512:
2124 case X86::BI__builtin_ia32_vp2intersect_q_256:
2125 case X86::BI__builtin_ia32_vp2intersect_q_128:
2126 case X86::BI__builtin_ia32_vp2intersect_d_512:
2127 case X86::BI__builtin_ia32_vp2intersect_d_256:
2128 case X86::BI__builtin_ia32_vp2intersect_d_128: {
2130 mlir::Location loc =
getLoc(
expr->getExprLoc());
2131 StringRef intrinsicName;
2133 switch (builtinID) {
2135 llvm_unreachable(
"Unexpected builtin");
2136 case X86::BI__builtin_ia32_vp2intersect_q_512:
2137 intrinsicName =
"x86.avx512.vp2intersect.q.512";
2139 case X86::BI__builtin_ia32_vp2intersect_q_256:
2140 intrinsicName =
"x86.avx512.vp2intersect.q.256";
2142 case X86::BI__builtin_ia32_vp2intersect_q_128:
2143 intrinsicName =
"x86.avx512.vp2intersect.q.128";
2145 case X86::BI__builtin_ia32_vp2intersect_d_512:
2146 intrinsicName =
"x86.avx512.vp2intersect.d.512";
2148 case X86::BI__builtin_ia32_vp2intersect_d_256:
2149 intrinsicName =
"x86.avx512.vp2intersect.d.256";
2151 case X86::BI__builtin_ia32_vp2intersect_d_128:
2152 intrinsicName =
"x86.avx512.vp2intersect.d.128";
2156 auto resVector = cir::VectorType::get(builder.getBoolTy(), numElts);
2158 cir::RecordType resRecord =
2159 cir::RecordType::get(&
getMLIRContext(), {resVector, resVector},
false,
2160 false, cir::RecordType::RecordKind::Struct);
2162 mlir::Value call = builder.emitIntrinsicCallOp(
2163 getLoc(
expr->getExprLoc()), intrinsicName, resRecord,
2164 mlir::ValueRange{ops[0], ops[1]});
2165 mlir::Value result =
2166 cir::ExtractMemberOp::create(builder, loc, resVector, call, 0);
2170 builder.createStore(loc, result, addr);
2172 result = cir::ExtractMemberOp::create(builder, loc, resVector, call, 1);
2176 builder.createStore(loc, result, addr);
2177 return mlir::Value{};
2179 case X86::BI__builtin_ia32_vpmultishiftqb128:
2180 case X86::BI__builtin_ia32_vpmultishiftqb256:
2181 case X86::BI__builtin_ia32_vpmultishiftqb512:
2182 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
2183 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
2184 case X86::BI__builtin_ia32_vpshufbitqmb512_mask:
2185 case X86::BI__builtin_ia32_cmpeqps:
2186 case X86::BI__builtin_ia32_cmpeqpd:
2187 case X86::BI__builtin_ia32_cmpltps:
2188 case X86::BI__builtin_ia32_cmpltpd:
2189 case X86::BI__builtin_ia32_cmpleps:
2190 case X86::BI__builtin_ia32_cmplepd:
2191 case X86::BI__builtin_ia32_cmpunordps:
2192 case X86::BI__builtin_ia32_cmpunordpd:
2193 case X86::BI__builtin_ia32_cmpneqps:
2194 case X86::BI__builtin_ia32_cmpneqpd:
2195 cgm.errorNYI(
expr->getSourceRange(),
2196 std::string(
"unimplemented X86 builtin call: ") +
2197 getContext().BuiltinInfo.getName(builtinID));
2198 return mlir::Value{};
2199 case X86::BI__builtin_ia32_cmpnltps:
2200 case X86::BI__builtin_ia32_cmpnltpd:
2202 cir::CmpOpKind::lt,
true);
2203 case X86::BI__builtin_ia32_cmpnleps:
2204 case X86::BI__builtin_ia32_cmpnlepd:
2206 cir::CmpOpKind::le,
true);
2207 case X86::BI__builtin_ia32_cmpordps:
2208 case X86::BI__builtin_ia32_cmpordpd:
2209 case X86::BI__builtin_ia32_cmpph128_mask:
2210 case X86::BI__builtin_ia32_cmpph256_mask:
2211 case X86::BI__builtin_ia32_cmpph512_mask:
2212 case X86::BI__builtin_ia32_cmpps128_mask:
2213 case X86::BI__builtin_ia32_cmpps256_mask:
2214 case X86::BI__builtin_ia32_cmpps512_mask:
2215 case X86::BI__builtin_ia32_cmppd128_mask:
2216 case X86::BI__builtin_ia32_cmppd256_mask:
2217 case X86::BI__builtin_ia32_cmppd512_mask:
2218 case X86::BI__builtin_ia32_vcmpbf16512_mask:
2219 case X86::BI__builtin_ia32_vcmpbf16256_mask:
2220 case X86::BI__builtin_ia32_vcmpbf16128_mask:
2221 case X86::BI__builtin_ia32_cmpps:
2222 case X86::BI__builtin_ia32_cmpps256:
2223 case X86::BI__builtin_ia32_cmppd:
2224 case X86::BI__builtin_ia32_cmppd256:
2225 case X86::BI__builtin_ia32_cmpeqss:
2226 case X86::BI__builtin_ia32_cmpltss:
2227 case X86::BI__builtin_ia32_cmpless:
2228 case X86::BI__builtin_ia32_cmpunordss:
2229 case X86::BI__builtin_ia32_cmpneqss:
2230 case X86::BI__builtin_ia32_cmpnltss:
2231 case X86::BI__builtin_ia32_cmpnless:
2232 case X86::BI__builtin_ia32_cmpordss:
2233 case X86::BI__builtin_ia32_cmpeqsd:
2234 case X86::BI__builtin_ia32_cmpltsd:
2235 case X86::BI__builtin_ia32_cmplesd:
2236 case X86::BI__builtin_ia32_cmpunordsd:
2237 case X86::BI__builtin_ia32_cmpneqsd:
2238 case X86::BI__builtin_ia32_cmpnltsd:
2239 case X86::BI__builtin_ia32_cmpnlesd:
2240 case X86::BI__builtin_ia32_cmpordsd:
2241 cgm.errorNYI(
expr->getSourceRange(),
2242 std::string(
"unimplemented X86 builtin call: ") +
2243 getContext().BuiltinInfo.getName(builtinID));
2245 case X86::BI__builtin_ia32_vcvtph2ps_mask:
2246 case X86::BI__builtin_ia32_vcvtph2ps256_mask:
2247 case X86::BI__builtin_ia32_vcvtph2ps512_mask: {
2248 mlir::Location loc =
getLoc(
expr->getExprLoc());
2252 case X86::BI__builtin_ia32_cvtneps2bf16_128_mask: {
2253 mlir::Location loc =
getLoc(
expr->getExprLoc());
2257 unsigned numElts = inputTy.getSize();
2262 args.push_back(ops[0]);
2263 args.push_back(ops[1]);
2264 args.push_back(mask);
2266 return builder.emitIntrinsicCallOp(
2267 loc,
"x86.avx512bf16.mask.cvtneps2bf16.128", resTy, args);
2269 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
2270 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask: {
2271 mlir::Location loc =
getLoc(
expr->getExprLoc());
2273 StringRef intrinsicName;
2274 if (builtinID == X86::BI__builtin_ia32_cvtneps2bf16_256_mask) {
2275 intrinsicName =
"x86.avx512bf16.cvtneps2bf16.256";
2277 assert(builtinID == X86::BI__builtin_ia32_cvtneps2bf16_512_mask);
2278 intrinsicName =
"x86.avx512bf16.cvtneps2bf16.512";
2281 mlir::Value res = builder.emitIntrinsicCallOp(loc, intrinsicName, resTy,
2282 mlir::ValueRange{ops[0]});
2286 case X86::BI__cpuid:
2287 case X86::BI__cpuidex: {
2288 mlir::Location loc =
getLoc(
expr->getExprLoc());
2289 mlir::Value subFuncId = builtinID == X86::BI__cpuidex
2291 : builder.getConstInt(loc,
sInt32Ty, 0);
2292 cir::CpuIdOp::create(builder, loc, ops[0],
2294 return mlir::Value{};
2297 case X86::BI__emulu:
2299 case X86::BI__umulh:
2300 case X86::BI_mul128:
2301 case X86::BI_umul128: {
2302 cgm.errorNYI(
expr->getSourceRange(),
2303 std::string(
"unimplemented X86 builtin call: ") +
2304 getContext().BuiltinInfo.getName(builtinID));
2305 return mlir::Value{};
2307 case X86::BI__faststorefence: {
2308 cir::AtomicFenceOp::create(
2310 cir::MemOrder::SequentiallyConsistent,
2312 cir::SyncScopeKind::System));
2313 return mlir::Value{};
2315 case X86::BI__shiftleft128:
2316 case X86::BI__shiftright128: {
2320 std::swap(ops[0], ops[1]);
2323 auto amtTy = mlir::cast<cir::IntType>(ops[2].
getType());
2324 cir::IntType i64Ty = builder.getUInt64Ty();
2327 ops[2] = builder.createIntCast(ops[2], i64Ty);
2329 const StringRef intrinsicName =
2330 (builtinID == X86::BI__shiftleft128) ?
"fshl" :
"fshr";
2331 return builder.emitIntrinsicCallOp(
2332 getLoc(
expr->getExprLoc()), intrinsicName, i64Ty,
2333 mlir::ValueRange{ops[0], ops[1], ops[2]});
2335 case X86::BI_ReadWriteBarrier:
2336 case X86::BI_ReadBarrier:
2337 case X86::BI_WriteBarrier: {
2338 cir::AtomicFenceOp::create(
2340 cir::MemOrder::SequentiallyConsistent,
2342 cir::SyncScopeKind::SingleThread));
2343 return mlir::Value{};
2345 case X86::BI_AddressOfReturnAddress: {
2346 mlir::Location loc =
getLoc(
expr->getExprLoc());
2349 return builder.createCast(loc, cir::CastKind::bitcast, addr,
voidPtrTy);
2351 case X86::BI__stosb:
2353 case X86::BI__int2c:
2354 case X86::BI__readfsbyte:
2355 case X86::BI__readfsword:
2356 case X86::BI__readfsdword:
2357 case X86::BI__readfsqword:
2358 case X86::BI__readgsbyte:
2359 case X86::BI__readgsword:
2360 case X86::BI__readgsdword:
2361 case X86::BI__readgsqword:
2362 case X86::BI__builtin_ia32_encodekey128_u32:
2363 case X86::BI__builtin_ia32_encodekey256_u32: {
2364 cgm.errorNYI(
expr->getSourceRange(),
2365 std::string(
"unimplemented X86 builtin call: ") +
2366 getContext().BuiltinInfo.getName(builtinID));
2367 return mlir::Value{};
2369 case X86::BI__builtin_ia32_aesenc128kl_u8:
2370 case X86::BI__builtin_ia32_aesdec128kl_u8:
2371 case X86::BI__builtin_ia32_aesenc256kl_u8:
2372 case X86::BI__builtin_ia32_aesdec256kl_u8: {
2373 llvm::StringRef intrinsicName;
2374 switch (builtinID) {
2376 llvm_unreachable(
"Unexpected builtin");
2377 case X86::BI__builtin_ia32_aesenc128kl_u8:
2378 intrinsicName =
"x86.aesenc128kl";
2380 case X86::BI__builtin_ia32_aesdec128kl_u8:
2381 intrinsicName =
"x86.aesdec128kl";
2383 case X86::BI__builtin_ia32_aesenc256kl_u8:
2384 intrinsicName =
"x86.aesenc256kl";
2386 case X86::BI__builtin_ia32_aesdec256kl_u8:
2387 intrinsicName =
"x86.aesdec256kl";
2394 case X86::BI__builtin_ia32_aesencwide128kl_u8:
2395 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
2396 case X86::BI__builtin_ia32_aesencwide256kl_u8:
2397 case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
2398 llvm::StringRef intrinsicName;
2399 switch (builtinID) {
2401 llvm_unreachable(
"Unexpected builtin");
2402 case X86::BI__builtin_ia32_aesencwide128kl_u8:
2403 intrinsicName =
"x86.aesencwide128kl";
2405 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
2406 intrinsicName =
"x86.aesdecwide128kl";
2408 case X86::BI__builtin_ia32_aesencwide256kl_u8:
2409 intrinsicName =
"x86.aesencwide256kl";
2411 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
2412 intrinsicName =
"x86.aesdecwide256kl";
2419 case X86::BI__builtin_ia32_vfcmaddcph512_mask:
2420 case X86::BI__builtin_ia32_vfmaddcph512_mask:
2421 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask:
2422 case X86::BI__builtin_ia32_vfmaddcsh_round_mask:
2423 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3:
2424 case X86::BI__builtin_ia32_vfmaddcsh_round_mask3:
2425 case X86::BI__builtin_ia32_prefetchi:
2426 cgm.errorNYI(
expr->getSourceRange(),
2427 std::string(
"unimplemented X86 builtin call: ") +
2428 getContext().BuiltinInfo.getName(builtinID));
2429 return mlir::Value{};