786 if (BuiltinID == Builtin::BI__builtin_cpu_is)
787 return EmitX86CpuIs(E);
788 if (BuiltinID == Builtin::BI__builtin_cpu_supports)
789 return EmitX86CpuSupports(E);
790 if (BuiltinID == Builtin::BI__builtin_cpu_init)
791 return EmitX86CpuInit();
799 bool IsMaskFCmp =
false;
800 bool IsConjFMA =
false;
803 unsigned ICEArguments = 0;
808 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; i++) {
818 auto getCmpIntrinsicCall = [
this, &Ops](Intrinsic::ID ID,
unsigned Imm) {
819 Ops.push_back(llvm::ConstantInt::get(
Int8Ty, Imm));
820 llvm::Function *F =
CGM.getIntrinsic(ID);
821 return Builder.CreateCall(F, Ops);
829 auto getVectorFCmpIR = [
this, &Ops, E](CmpInst::Predicate Pred,
834 Cmp =
Builder.CreateFCmpS(Pred, Ops[0], Ops[1]);
836 Cmp =
Builder.CreateFCmp(Pred, Ops[0], Ops[1]);
838 llvm::VectorType *IntVecTy = llvm::VectorType::getInteger(FPVecTy);
840 return Builder.CreateBitCast(Sext, FPVecTy);
844 default:
return nullptr;
845 case X86::BI_mm_prefetch: {
848 Value *RW = ConstantInt::get(
Int32Ty, (
C->getZExtValue() >> 2) & 0x1);
849 Value *Locality = ConstantInt::get(
Int32Ty,
C->getZExtValue() & 0x3);
854 case X86::BI_m_prefetch:
855 case X86::BI_m_prefetchw: {
859 ConstantInt::get(
Int32Ty, BuiltinID == X86::BI_m_prefetchw ? 1 : 0);
865 case X86::BI_mm_clflush: {
866 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_sse2_clflush),
869 case X86::BI_mm_lfence: {
870 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_sse2_lfence));
872 case X86::BI_mm_mfence: {
873 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_sse2_mfence));
875 case X86::BI_mm_sfence: {
876 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_sse_sfence));
878 case X86::BI_mm_pause: {
879 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_sse2_pause));
881 case X86::BI__rdtsc: {
882 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_rdtsc));
884 case X86::BI__builtin_ia32_rdtscp: {
890 case X86::BI__builtin_ia32_roundps:
891 case X86::BI__builtin_ia32_roundpd:
892 case X86::BI__builtin_ia32_roundps256:
893 case X86::BI__builtin_ia32_roundpd256: {
895 unsigned MXCSRMask = 0b100;
896 unsigned FRoundNoExcMask = 0b1000;
897 unsigned UseMXCSR = MXCSRMask & M;
898 unsigned FRoundNoExc = FRoundNoExcMask & M;
900 if (UseMXCSR || !FRoundNoExc) {
902 Intrinsic::ID ID = Intrinsic::not_intrinsic;
905 case X86::BI__builtin_ia32_roundps:
906 ID = Intrinsic::x86_sse41_round_ps;
908 case X86::BI__builtin_ia32_roundps256:
909 ID = Intrinsic::x86_avx_round_ps_256;
911 case X86::BI__builtin_ia32_roundpd:
912 ID = Intrinsic::x86_sse41_round_pd;
914 case X86::BI__builtin_ia32_roundpd256:
915 ID = Intrinsic::x86_avx_round_pd_256;
918 llvm_unreachable(
"must return from switch");
922 return Builder.CreateCall(F, Ops);
927 case X86::BI__builtin_ia32_roundss:
928 case X86::BI__builtin_ia32_roundsd: {
930 unsigned MXCSRMask = 0b100;
931 unsigned FRoundNoExcMask = 0b1000;
932 unsigned UseMXCSR = MXCSRMask & M;
933 unsigned FRoundNoExc = FRoundNoExcMask & M;
935 if (UseMXCSR || !FRoundNoExc) {
937 Intrinsic::ID ID = Intrinsic::not_intrinsic;
940 case X86::BI__builtin_ia32_roundss:
941 ID = Intrinsic::x86_sse41_round_ss;
943 case X86::BI__builtin_ia32_roundsd:
944 ID = Intrinsic::x86_sse41_round_sd;
947 llvm_unreachable(
"must return from switch");
951 return Builder.CreateCall(F, Ops);
955 Value *ValAt0 =
Builder.CreateExtractElement(Ops[1], Idx);
958 return Builder.CreateInsertElement(Ops[0], RoundedAt0, Idx);
960 case X86::BI__builtin_ia32_lzcnt_u16:
961 case X86::BI__builtin_ia32_lzcnt_u32:
962 case X86::BI__builtin_ia32_lzcnt_u64: {
966 case X86::BI__builtin_ia32_tzcnt_u16:
967 case X86::BI__builtin_ia32_tzcnt_u32:
968 case X86::BI__builtin_ia32_tzcnt_u64: {
972 case X86::BI__builtin_ia32_undef128:
973 case X86::BI__builtin_ia32_undef256:
974 case X86::BI__builtin_ia32_undef512:
981 case X86::BI__builtin_ia32_vec_ext_v4hi:
982 case X86::BI__builtin_ia32_vec_ext_v16qi:
983 case X86::BI__builtin_ia32_vec_ext_v8hi:
984 case X86::BI__builtin_ia32_vec_ext_v4si:
985 case X86::BI__builtin_ia32_vec_ext_v4sf:
986 case X86::BI__builtin_ia32_vec_ext_v2di:
987 case X86::BI__builtin_ia32_vec_ext_v32qi:
988 case X86::BI__builtin_ia32_vec_ext_v16hi:
989 case X86::BI__builtin_ia32_vec_ext_v8si:
990 case X86::BI__builtin_ia32_vec_ext_v4di: {
994 Index &= NumElts - 1;
997 return Builder.CreateExtractElement(Ops[0], Index);
999 case X86::BI__builtin_ia32_vec_set_v4hi:
1000 case X86::BI__builtin_ia32_vec_set_v16qi:
1001 case X86::BI__builtin_ia32_vec_set_v8hi:
1002 case X86::BI__builtin_ia32_vec_set_v4si:
1003 case X86::BI__builtin_ia32_vec_set_v2di:
1004 case X86::BI__builtin_ia32_vec_set_v32qi:
1005 case X86::BI__builtin_ia32_vec_set_v16hi:
1006 case X86::BI__builtin_ia32_vec_set_v8si:
1007 case X86::BI__builtin_ia32_vec_set_v4di: {
1011 Index &= NumElts - 1;
1014 return Builder.CreateInsertElement(Ops[0], Ops[1], Index);
1016 case X86::BI_mm_setcsr:
1017 case X86::BI__builtin_ia32_ldmxcsr: {
1019 Builder.CreateStore(Ops[0], Tmp);
1020 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
1023 case X86::BI_mm_getcsr:
1024 case X86::BI__builtin_ia32_stmxcsr: {
1026 Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),
1028 return Builder.CreateLoad(Tmp,
"stmxcsr");
1030 case X86::BI__builtin_ia32_xsave:
1031 case X86::BI__builtin_ia32_xsave64:
1032 case X86::BI__builtin_ia32_xrstor:
1033 case X86::BI__builtin_ia32_xrstor64:
1034 case X86::BI__builtin_ia32_xsaveopt:
1035 case X86::BI__builtin_ia32_xsaveopt64:
1036 case X86::BI__builtin_ia32_xrstors:
1037 case X86::BI__builtin_ia32_xrstors64:
1038 case X86::BI__builtin_ia32_xsavec:
1039 case X86::BI__builtin_ia32_xsavec64:
1040 case X86::BI__builtin_ia32_xsaves:
1041 case X86::BI__builtin_ia32_xsaves64:
1042 case X86::BI__builtin_ia32_xsetbv:
1043 case X86::BI_xsetbv: {
1045#define INTRINSIC_X86_XSAVE_ID(NAME) \
1046 case X86::BI__builtin_ia32_##NAME: \
1047 ID = Intrinsic::x86_##NAME; \
1049 switch (BuiltinID) {
1050 default: llvm_unreachable(
"Unsupported intrinsic!");
1064 case X86::BI_xsetbv:
1065 ID = Intrinsic::x86_xsetbv;
1068#undef INTRINSIC_X86_XSAVE_ID
1074 return Builder.CreateCall(
CGM.getIntrinsic(ID), Ops);
1076 case X86::BI__builtin_ia32_xgetbv:
1077 case X86::BI_xgetbv:
1078 return Builder.CreateCall(
CGM.getIntrinsic(Intrinsic::x86_xgetbv), Ops);
1079 case X86::BI__builtin_ia32_storedqudi128_mask:
1080 case X86::BI__builtin_ia32_storedqusi128_mask:
1081 case X86::BI__builtin_ia32_storedquhi128_mask:
1082 case X86::BI__builtin_ia32_storedquqi128_mask:
1083 case X86::BI__builtin_ia32_storeupd128_mask:
1084 case X86::BI__builtin_ia32_storeups128_mask:
1085 case X86::BI__builtin_ia32_storedqudi256_mask:
1086 case X86::BI__builtin_ia32_storedqusi256_mask:
1087 case X86::BI__builtin_ia32_storedquhi256_mask:
1088 case X86::BI__builtin_ia32_storedquqi256_mask:
1089 case X86::BI__builtin_ia32_storeupd256_mask:
1090 case X86::BI__builtin_ia32_storeups256_mask:
1091 case X86::BI__builtin_ia32_storedqudi512_mask:
1092 case X86::BI__builtin_ia32_storedqusi512_mask:
1093 case X86::BI__builtin_ia32_storedquhi512_mask:
1094 case X86::BI__builtin_ia32_storedquqi512_mask:
1095 case X86::BI__builtin_ia32_storeupd512_mask:
1096 case X86::BI__builtin_ia32_storeups512_mask:
1099 case X86::BI__builtin_ia32_storesbf16128_mask:
1100 case X86::BI__builtin_ia32_storesh128_mask:
1101 case X86::BI__builtin_ia32_storess128_mask:
1102 case X86::BI__builtin_ia32_storesd128_mask:
1105 case X86::BI__builtin_ia32_cvtmask2b128:
1106 case X86::BI__builtin_ia32_cvtmask2b256:
1107 case X86::BI__builtin_ia32_cvtmask2b512:
1108 case X86::BI__builtin_ia32_cvtmask2w128:
1109 case X86::BI__builtin_ia32_cvtmask2w256:
1110 case X86::BI__builtin_ia32_cvtmask2w512:
1111 case X86::BI__builtin_ia32_cvtmask2d128:
1112 case X86::BI__builtin_ia32_cvtmask2d256:
1113 case X86::BI__builtin_ia32_cvtmask2d512:
1114 case X86::BI__builtin_ia32_cvtmask2q128:
1115 case X86::BI__builtin_ia32_cvtmask2q256:
1116 case X86::BI__builtin_ia32_cvtmask2q512:
1119 case X86::BI__builtin_ia32_cvtb2mask128:
1120 case X86::BI__builtin_ia32_cvtb2mask256:
1121 case X86::BI__builtin_ia32_cvtb2mask512:
1122 case X86::BI__builtin_ia32_cvtw2mask128:
1123 case X86::BI__builtin_ia32_cvtw2mask256:
1124 case X86::BI__builtin_ia32_cvtw2mask512:
1125 case X86::BI__builtin_ia32_cvtd2mask128:
1126 case X86::BI__builtin_ia32_cvtd2mask256:
1127 case X86::BI__builtin_ia32_cvtd2mask512:
1128 case X86::BI__builtin_ia32_cvtq2mask128:
1129 case X86::BI__builtin_ia32_cvtq2mask256:
1130 case X86::BI__builtin_ia32_cvtq2mask512:
1133 case X86::BI__builtin_ia32_cvtdq2ps512_mask:
1134 case X86::BI__builtin_ia32_cvtqq2ps512_mask:
1135 case X86::BI__builtin_ia32_cvtqq2pd512_mask:
1136 case X86::BI__builtin_ia32_vcvtw2ph512_mask:
1137 case X86::BI__builtin_ia32_vcvtdq2ph512_mask:
1138 case X86::BI__builtin_ia32_vcvtqq2ph512_mask:
1140 case X86::BI__builtin_ia32_cvtudq2ps512_mask:
1141 case X86::BI__builtin_ia32_cvtuqq2ps512_mask:
1142 case X86::BI__builtin_ia32_cvtuqq2pd512_mask:
1143 case X86::BI__builtin_ia32_vcvtuw2ph512_mask:
1144 case X86::BI__builtin_ia32_vcvtudq2ph512_mask:
1145 case X86::BI__builtin_ia32_vcvtuqq2ph512_mask:
1148 case X86::BI__builtin_ia32_vfmaddsh3_mask:
1149 case X86::BI__builtin_ia32_vfmaddss3_mask:
1150 case X86::BI__builtin_ia32_vfmaddsd3_mask:
1152 case X86::BI__builtin_ia32_vfmaddsh3_maskz:
1153 case X86::BI__builtin_ia32_vfmaddss3_maskz:
1154 case X86::BI__builtin_ia32_vfmaddsd3_maskz:
1156 case X86::BI__builtin_ia32_vfmaddsh3_mask3:
1157 case X86::BI__builtin_ia32_vfmaddss3_mask3:
1158 case X86::BI__builtin_ia32_vfmaddsd3_mask3:
1160 case X86::BI__builtin_ia32_vfmsubsh3_mask3:
1161 case X86::BI__builtin_ia32_vfmsubss3_mask3:
1162 case X86::BI__builtin_ia32_vfmsubsd3_mask3:
1165 case X86::BI__builtin_ia32_vfmaddph512_mask:
1166 case X86::BI__builtin_ia32_vfmaddph512_maskz:
1167 case X86::BI__builtin_ia32_vfmaddph512_mask3:
1168 case X86::BI__builtin_ia32_vfmaddps512_mask:
1169 case X86::BI__builtin_ia32_vfmaddps512_maskz:
1170 case X86::BI__builtin_ia32_vfmaddps512_mask3:
1171 case X86::BI__builtin_ia32_vfmsubps512_mask3:
1172 case X86::BI__builtin_ia32_vfmaddpd512_mask:
1173 case X86::BI__builtin_ia32_vfmaddpd512_maskz:
1174 case X86::BI__builtin_ia32_vfmaddpd512_mask3:
1175 case X86::BI__builtin_ia32_vfmsubpd512_mask3:
1176 case X86::BI__builtin_ia32_vfmsubph512_mask3:
1178 case X86::BI__builtin_ia32_vfmaddsubph512_mask:
1179 case X86::BI__builtin_ia32_vfmaddsubph512_maskz:
1180 case X86::BI__builtin_ia32_vfmaddsubph512_mask3:
1181 case X86::BI__builtin_ia32_vfmsubaddph512_mask3:
1182 case X86::BI__builtin_ia32_vfmaddsubps512_mask:
1183 case X86::BI__builtin_ia32_vfmaddsubps512_maskz:
1184 case X86::BI__builtin_ia32_vfmaddsubps512_mask3:
1185 case X86::BI__builtin_ia32_vfmsubaddps512_mask3:
1186 case X86::BI__builtin_ia32_vfmaddsubpd512_mask:
1187 case X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
1188 case X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
1189 case X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
1192 case X86::BI__builtin_ia32_movdqa32store128_mask:
1193 case X86::BI__builtin_ia32_movdqa64store128_mask:
1194 case X86::BI__builtin_ia32_storeaps128_mask:
1195 case X86::BI__builtin_ia32_storeapd128_mask:
1196 case X86::BI__builtin_ia32_movdqa32store256_mask:
1197 case X86::BI__builtin_ia32_movdqa64store256_mask:
1198 case X86::BI__builtin_ia32_storeaps256_mask:
1199 case X86::BI__builtin_ia32_storeapd256_mask:
1200 case X86::BI__builtin_ia32_movdqa32store512_mask:
1201 case X86::BI__builtin_ia32_movdqa64store512_mask:
1202 case X86::BI__builtin_ia32_storeaps512_mask:
1203 case X86::BI__builtin_ia32_storeapd512_mask:
1208 case X86::BI__builtin_ia32_loadups128_mask:
1209 case X86::BI__builtin_ia32_loadups256_mask:
1210 case X86::BI__builtin_ia32_loadups512_mask:
1211 case X86::BI__builtin_ia32_loadupd128_mask:
1212 case X86::BI__builtin_ia32_loadupd256_mask:
1213 case X86::BI__builtin_ia32_loadupd512_mask:
1214 case X86::BI__builtin_ia32_loaddquqi128_mask:
1215 case X86::BI__builtin_ia32_loaddquqi256_mask:
1216 case X86::BI__builtin_ia32_loaddquqi512_mask:
1217 case X86::BI__builtin_ia32_loaddquhi128_mask:
1218 case X86::BI__builtin_ia32_loaddquhi256_mask:
1219 case X86::BI__builtin_ia32_loaddquhi512_mask:
1220 case X86::BI__builtin_ia32_loaddqusi128_mask:
1221 case X86::BI__builtin_ia32_loaddqusi256_mask:
1222 case X86::BI__builtin_ia32_loaddqusi512_mask:
1223 case X86::BI__builtin_ia32_loaddqudi128_mask:
1224 case X86::BI__builtin_ia32_loaddqudi256_mask:
1225 case X86::BI__builtin_ia32_loaddqudi512_mask:
1228 case X86::BI__builtin_ia32_loadsbf16128_mask:
1229 case X86::BI__builtin_ia32_loadsh128_mask:
1230 case X86::BI__builtin_ia32_loadss128_mask:
1231 case X86::BI__builtin_ia32_loadsd128_mask:
1234 case X86::BI__builtin_ia32_loadaps128_mask:
1235 case X86::BI__builtin_ia32_loadaps256_mask:
1236 case X86::BI__builtin_ia32_loadaps512_mask:
1237 case X86::BI__builtin_ia32_loadapd128_mask:
1238 case X86::BI__builtin_ia32_loadapd256_mask:
1239 case X86::BI__builtin_ia32_loadapd512_mask:
1240 case X86::BI__builtin_ia32_movdqa32load128_mask:
1241 case X86::BI__builtin_ia32_movdqa32load256_mask:
1242 case X86::BI__builtin_ia32_movdqa32load512_mask:
1243 case X86::BI__builtin_ia32_movdqa64load128_mask:
1244 case X86::BI__builtin_ia32_movdqa64load256_mask:
1245 case X86::BI__builtin_ia32_movdqa64load512_mask:
1250 case X86::BI__builtin_ia32_expandloaddf128_mask:
1251 case X86::BI__builtin_ia32_expandloaddf256_mask:
1252 case X86::BI__builtin_ia32_expandloaddf512_mask:
1253 case X86::BI__builtin_ia32_expandloadsf128_mask:
1254 case X86::BI__builtin_ia32_expandloadsf256_mask:
1255 case X86::BI__builtin_ia32_expandloadsf512_mask:
1256 case X86::BI__builtin_ia32_expandloaddi128_mask:
1257 case X86::BI__builtin_ia32_expandloaddi256_mask:
1258 case X86::BI__builtin_ia32_expandloaddi512_mask:
1259 case X86::BI__builtin_ia32_expandloadsi128_mask:
1260 case X86::BI__builtin_ia32_expandloadsi256_mask:
1261 case X86::BI__builtin_ia32_expandloadsi512_mask:
1262 case X86::BI__builtin_ia32_expandloadhi128_mask:
1263 case X86::BI__builtin_ia32_expandloadhi256_mask:
1264 case X86::BI__builtin_ia32_expandloadhi512_mask:
1265 case X86::BI__builtin_ia32_expandloadqi128_mask:
1266 case X86::BI__builtin_ia32_expandloadqi256_mask:
1267 case X86::BI__builtin_ia32_expandloadqi512_mask:
1270 case X86::BI__builtin_ia32_compressstoredf128_mask:
1271 case X86::BI__builtin_ia32_compressstoredf256_mask:
1272 case X86::BI__builtin_ia32_compressstoredf512_mask:
1273 case X86::BI__builtin_ia32_compressstoresf128_mask:
1274 case X86::BI__builtin_ia32_compressstoresf256_mask:
1275 case X86::BI__builtin_ia32_compressstoresf512_mask:
1276 case X86::BI__builtin_ia32_compressstoredi128_mask:
1277 case X86::BI__builtin_ia32_compressstoredi256_mask:
1278 case X86::BI__builtin_ia32_compressstoredi512_mask:
1279 case X86::BI__builtin_ia32_compressstoresi128_mask:
1280 case X86::BI__builtin_ia32_compressstoresi256_mask:
1281 case X86::BI__builtin_ia32_compressstoresi512_mask:
1282 case X86::BI__builtin_ia32_compressstorehi128_mask:
1283 case X86::BI__builtin_ia32_compressstorehi256_mask:
1284 case X86::BI__builtin_ia32_compressstorehi512_mask:
1285 case X86::BI__builtin_ia32_compressstoreqi128_mask:
1286 case X86::BI__builtin_ia32_compressstoreqi256_mask:
1287 case X86::BI__builtin_ia32_compressstoreqi512_mask:
1290 case X86::BI__builtin_ia32_expanddf128_mask:
1291 case X86::BI__builtin_ia32_expanddf256_mask:
1292 case X86::BI__builtin_ia32_expanddf512_mask:
1293 case X86::BI__builtin_ia32_expandsf128_mask:
1294 case X86::BI__builtin_ia32_expandsf256_mask:
1295 case X86::BI__builtin_ia32_expandsf512_mask:
1296 case X86::BI__builtin_ia32_expanddi128_mask:
1297 case X86::BI__builtin_ia32_expanddi256_mask:
1298 case X86::BI__builtin_ia32_expanddi512_mask:
1299 case X86::BI__builtin_ia32_expandsi128_mask:
1300 case X86::BI__builtin_ia32_expandsi256_mask:
1301 case X86::BI__builtin_ia32_expandsi512_mask:
1302 case X86::BI__builtin_ia32_expandhi128_mask:
1303 case X86::BI__builtin_ia32_expandhi256_mask:
1304 case X86::BI__builtin_ia32_expandhi512_mask:
1305 case X86::BI__builtin_ia32_expandqi128_mask:
1306 case X86::BI__builtin_ia32_expandqi256_mask:
1307 case X86::BI__builtin_ia32_expandqi512_mask:
1310 case X86::BI__builtin_ia32_compressdf128_mask:
1311 case X86::BI__builtin_ia32_compressdf256_mask:
1312 case X86::BI__builtin_ia32_compressdf512_mask:
1313 case X86::BI__builtin_ia32_compresssf128_mask:
1314 case X86::BI__builtin_ia32_compresssf256_mask:
1315 case X86::BI__builtin_ia32_compresssf512_mask:
1316 case X86::BI__builtin_ia32_compressdi128_mask:
1317 case X86::BI__builtin_ia32_compressdi256_mask:
1318 case X86::BI__builtin_ia32_compressdi512_mask:
1319 case X86::BI__builtin_ia32_compresssi128_mask:
1320 case X86::BI__builtin_ia32_compresssi256_mask:
1321 case X86::BI__builtin_ia32_compresssi512_mask:
1322 case X86::BI__builtin_ia32_compresshi128_mask:
1323 case X86::BI__builtin_ia32_compresshi256_mask:
1324 case X86::BI__builtin_ia32_compresshi512_mask:
1325 case X86::BI__builtin_ia32_compressqi128_mask:
1326 case X86::BI__builtin_ia32_compressqi256_mask:
1327 case X86::BI__builtin_ia32_compressqi512_mask:
1330 case X86::BI__builtin_ia32_gather3div2df:
1331 case X86::BI__builtin_ia32_gather3div2di:
1332 case X86::BI__builtin_ia32_gather3div4df:
1333 case X86::BI__builtin_ia32_gather3div4di:
1334 case X86::BI__builtin_ia32_gather3div4sf:
1335 case X86::BI__builtin_ia32_gather3div4si:
1336 case X86::BI__builtin_ia32_gather3div8sf:
1337 case X86::BI__builtin_ia32_gather3div8si:
1338 case X86::BI__builtin_ia32_gather3siv2df:
1339 case X86::BI__builtin_ia32_gather3siv2di:
1340 case X86::BI__builtin_ia32_gather3siv4df:
1341 case X86::BI__builtin_ia32_gather3siv4di:
1342 case X86::BI__builtin_ia32_gather3siv4sf:
1343 case X86::BI__builtin_ia32_gather3siv4si:
1344 case X86::BI__builtin_ia32_gather3siv8sf:
1345 case X86::BI__builtin_ia32_gather3siv8si:
1346 case X86::BI__builtin_ia32_gathersiv8df:
1347 case X86::BI__builtin_ia32_gathersiv16sf:
1348 case X86::BI__builtin_ia32_gatherdiv8df:
1349 case X86::BI__builtin_ia32_gatherdiv16sf:
1350 case X86::BI__builtin_ia32_gathersiv8di:
1351 case X86::BI__builtin_ia32_gathersiv16si:
1352 case X86::BI__builtin_ia32_gatherdiv8di:
1353 case X86::BI__builtin_ia32_gatherdiv16si: {
1355 switch (BuiltinID) {
1356 default: llvm_unreachable(
"Unexpected builtin");
1357 case X86::BI__builtin_ia32_gather3div2df:
1358 IID = Intrinsic::x86_avx512_mask_gather3div2_df;
1360 case X86::BI__builtin_ia32_gather3div2di:
1361 IID = Intrinsic::x86_avx512_mask_gather3div2_di;
1363 case X86::BI__builtin_ia32_gather3div4df:
1364 IID = Intrinsic::x86_avx512_mask_gather3div4_df;
1366 case X86::BI__builtin_ia32_gather3div4di:
1367 IID = Intrinsic::x86_avx512_mask_gather3div4_di;
1369 case X86::BI__builtin_ia32_gather3div4sf:
1370 IID = Intrinsic::x86_avx512_mask_gather3div4_sf;
1372 case X86::BI__builtin_ia32_gather3div4si:
1373 IID = Intrinsic::x86_avx512_mask_gather3div4_si;
1375 case X86::BI__builtin_ia32_gather3div8sf:
1376 IID = Intrinsic::x86_avx512_mask_gather3div8_sf;
1378 case X86::BI__builtin_ia32_gather3div8si:
1379 IID = Intrinsic::x86_avx512_mask_gather3div8_si;
1381 case X86::BI__builtin_ia32_gather3siv2df:
1382 IID = Intrinsic::x86_avx512_mask_gather3siv2_df;
1384 case X86::BI__builtin_ia32_gather3siv2di:
1385 IID = Intrinsic::x86_avx512_mask_gather3siv2_di;
1387 case X86::BI__builtin_ia32_gather3siv4df:
1388 IID = Intrinsic::x86_avx512_mask_gather3siv4_df;
1390 case X86::BI__builtin_ia32_gather3siv4di:
1391 IID = Intrinsic::x86_avx512_mask_gather3siv4_di;
1393 case X86::BI__builtin_ia32_gather3siv4sf:
1394 IID = Intrinsic::x86_avx512_mask_gather3siv4_sf;
1396 case X86::BI__builtin_ia32_gather3siv4si:
1397 IID = Intrinsic::x86_avx512_mask_gather3siv4_si;
1399 case X86::BI__builtin_ia32_gather3siv8sf:
1400 IID = Intrinsic::x86_avx512_mask_gather3siv8_sf;
1402 case X86::BI__builtin_ia32_gather3siv8si:
1403 IID = Intrinsic::x86_avx512_mask_gather3siv8_si;
1405 case X86::BI__builtin_ia32_gathersiv8df:
1406 IID = Intrinsic::x86_avx512_mask_gather_dpd_512;
1408 case X86::BI__builtin_ia32_gathersiv16sf:
1409 IID = Intrinsic::x86_avx512_mask_gather_dps_512;
1411 case X86::BI__builtin_ia32_gatherdiv8df:
1412 IID = Intrinsic::x86_avx512_mask_gather_qpd_512;
1414 case X86::BI__builtin_ia32_gatherdiv16sf:
1415 IID = Intrinsic::x86_avx512_mask_gather_qps_512;
1417 case X86::BI__builtin_ia32_gathersiv8di:
1418 IID = Intrinsic::x86_avx512_mask_gather_dpq_512;
1420 case X86::BI__builtin_ia32_gathersiv16si:
1421 IID = Intrinsic::x86_avx512_mask_gather_dpi_512;
1423 case X86::BI__builtin_ia32_gatherdiv8di:
1424 IID = Intrinsic::x86_avx512_mask_gather_qpq_512;
1426 case X86::BI__builtin_ia32_gatherdiv16si:
1427 IID = Intrinsic::x86_avx512_mask_gather_qpi_512;
1431 unsigned MinElts = std::min(
1436 return Builder.CreateCall(Intr, Ops);
1439 case X86::BI__builtin_ia32_scattersiv8df:
1440 case X86::BI__builtin_ia32_scattersiv16sf:
1441 case X86::BI__builtin_ia32_scatterdiv8df:
1442 case X86::BI__builtin_ia32_scatterdiv16sf:
1443 case X86::BI__builtin_ia32_scattersiv8di:
1444 case X86::BI__builtin_ia32_scattersiv16si:
1445 case X86::BI__builtin_ia32_scatterdiv8di:
1446 case X86::BI__builtin_ia32_scatterdiv16si:
1447 case X86::BI__builtin_ia32_scatterdiv2df:
1448 case X86::BI__builtin_ia32_scatterdiv2di:
1449 case X86::BI__builtin_ia32_scatterdiv4df:
1450 case X86::BI__builtin_ia32_scatterdiv4di:
1451 case X86::BI__builtin_ia32_scatterdiv4sf:
1452 case X86::BI__builtin_ia32_scatterdiv4si:
1453 case X86::BI__builtin_ia32_scatterdiv8sf:
1454 case X86::BI__builtin_ia32_scatterdiv8si:
1455 case X86::BI__builtin_ia32_scattersiv2df:
1456 case X86::BI__builtin_ia32_scattersiv2di:
1457 case X86::BI__builtin_ia32_scattersiv4df:
1458 case X86::BI__builtin_ia32_scattersiv4di:
1459 case X86::BI__builtin_ia32_scattersiv4sf:
1460 case X86::BI__builtin_ia32_scattersiv4si:
1461 case X86::BI__builtin_ia32_scattersiv8sf:
1462 case X86::BI__builtin_ia32_scattersiv8si: {
1464 switch (BuiltinID) {
1465 default: llvm_unreachable(
"Unexpected builtin");
1466 case X86::BI__builtin_ia32_scattersiv8df:
1467 IID = Intrinsic::x86_avx512_mask_scatter_dpd_512;
1469 case X86::BI__builtin_ia32_scattersiv16sf:
1470 IID = Intrinsic::x86_avx512_mask_scatter_dps_512;
1472 case X86::BI__builtin_ia32_scatterdiv8df:
1473 IID = Intrinsic::x86_avx512_mask_scatter_qpd_512;
1475 case X86::BI__builtin_ia32_scatterdiv16sf:
1476 IID = Intrinsic::x86_avx512_mask_scatter_qps_512;
1478 case X86::BI__builtin_ia32_scattersiv8di:
1479 IID = Intrinsic::x86_avx512_mask_scatter_dpq_512;
1481 case X86::BI__builtin_ia32_scattersiv16si:
1482 IID = Intrinsic::x86_avx512_mask_scatter_dpi_512;
1484 case X86::BI__builtin_ia32_scatterdiv8di:
1485 IID = Intrinsic::x86_avx512_mask_scatter_qpq_512;
1487 case X86::BI__builtin_ia32_scatterdiv16si:
1488 IID = Intrinsic::x86_avx512_mask_scatter_qpi_512;
1490 case X86::BI__builtin_ia32_scatterdiv2df:
1491 IID = Intrinsic::x86_avx512_mask_scatterdiv2_df;
1493 case X86::BI__builtin_ia32_scatterdiv2di:
1494 IID = Intrinsic::x86_avx512_mask_scatterdiv2_di;
1496 case X86::BI__builtin_ia32_scatterdiv4df:
1497 IID = Intrinsic::x86_avx512_mask_scatterdiv4_df;
1499 case X86::BI__builtin_ia32_scatterdiv4di:
1500 IID = Intrinsic::x86_avx512_mask_scatterdiv4_di;
1502 case X86::BI__builtin_ia32_scatterdiv4sf:
1503 IID = Intrinsic::x86_avx512_mask_scatterdiv4_sf;
1505 case X86::BI__builtin_ia32_scatterdiv4si:
1506 IID = Intrinsic::x86_avx512_mask_scatterdiv4_si;
1508 case X86::BI__builtin_ia32_scatterdiv8sf:
1509 IID = Intrinsic::x86_avx512_mask_scatterdiv8_sf;
1511 case X86::BI__builtin_ia32_scatterdiv8si:
1512 IID = Intrinsic::x86_avx512_mask_scatterdiv8_si;
1514 case X86::BI__builtin_ia32_scattersiv2df:
1515 IID = Intrinsic::x86_avx512_mask_scattersiv2_df;
1517 case X86::BI__builtin_ia32_scattersiv2di:
1518 IID = Intrinsic::x86_avx512_mask_scattersiv2_di;
1520 case X86::BI__builtin_ia32_scattersiv4df:
1521 IID = Intrinsic::x86_avx512_mask_scattersiv4_df;
1523 case X86::BI__builtin_ia32_scattersiv4di:
1524 IID = Intrinsic::x86_avx512_mask_scattersiv4_di;
1526 case X86::BI__builtin_ia32_scattersiv4sf:
1527 IID = Intrinsic::x86_avx512_mask_scattersiv4_sf;
1529 case X86::BI__builtin_ia32_scattersiv4si:
1530 IID = Intrinsic::x86_avx512_mask_scattersiv4_si;
1532 case X86::BI__builtin_ia32_scattersiv8sf:
1533 IID = Intrinsic::x86_avx512_mask_scattersiv8_sf;
1535 case X86::BI__builtin_ia32_scattersiv8si:
1536 IID = Intrinsic::x86_avx512_mask_scattersiv8_si;
1540 unsigned MinElts = std::min(
1545 return Builder.CreateCall(Intr, Ops);
1548 case X86::BI__builtin_ia32_vextractf128_pd256:
1549 case X86::BI__builtin_ia32_vextractf128_ps256:
1550 case X86::BI__builtin_ia32_vextractf128_si256:
1551 case X86::BI__builtin_ia32_extract128i256:
1552 case X86::BI__builtin_ia32_extractf64x4_mask:
1553 case X86::BI__builtin_ia32_extractf32x4_mask:
1554 case X86::BI__builtin_ia32_extracti64x4_mask:
1555 case X86::BI__builtin_ia32_extracti32x4_mask:
1556 case X86::BI__builtin_ia32_extractf32x8_mask:
1557 case X86::BI__builtin_ia32_extracti32x8_mask:
1558 case X86::BI__builtin_ia32_extractf32x4_256_mask:
1559 case X86::BI__builtin_ia32_extracti32x4_256_mask:
1560 case X86::BI__builtin_ia32_extractf64x2_256_mask:
1561 case X86::BI__builtin_ia32_extracti64x2_256_mask:
1562 case X86::BI__builtin_ia32_extractf64x2_512_mask:
1563 case X86::BI__builtin_ia32_extracti64x2_512_mask: {
1565 unsigned NumElts = DstTy->getNumElements();
1566 unsigned SrcNumElts =
1568 unsigned SubVectors = SrcNumElts / NumElts;
1570 assert(llvm::isPowerOf2_32(SubVectors) &&
"Expected power of 2 subvectors");
1571 Index &= SubVectors - 1;
1575 for (
unsigned i = 0; i != NumElts; ++i)
1576 Indices[i] = i + Index;
1581 if (Ops.size() == 4)
1586 case X86::BI__builtin_ia32_vinsertf128_pd256:
1587 case X86::BI__builtin_ia32_vinsertf128_ps256:
1588 case X86::BI__builtin_ia32_vinsertf128_si256:
1589 case X86::BI__builtin_ia32_insert128i256:
1590 case X86::BI__builtin_ia32_insertf64x4:
1591 case X86::BI__builtin_ia32_insertf32x4:
1592 case X86::BI__builtin_ia32_inserti64x4:
1593 case X86::BI__builtin_ia32_inserti32x4:
1594 case X86::BI__builtin_ia32_insertf32x8:
1595 case X86::BI__builtin_ia32_inserti32x8:
1596 case X86::BI__builtin_ia32_insertf32x4_256:
1597 case X86::BI__builtin_ia32_inserti32x4_256:
1598 case X86::BI__builtin_ia32_insertf64x2_256:
1599 case X86::BI__builtin_ia32_inserti64x2_256:
1600 case X86::BI__builtin_ia32_insertf64x2_512:
1601 case X86::BI__builtin_ia32_inserti64x2_512: {
1602 unsigned DstNumElts =
1604 unsigned SrcNumElts =
1606 unsigned SubVectors = DstNumElts / SrcNumElts;
1608 assert(llvm::isPowerOf2_32(SubVectors) &&
"Expected power of 2 subvectors");
1609 Index &= SubVectors - 1;
1610 Index *= SrcNumElts;
1613 for (
unsigned i = 0; i != DstNumElts; ++i)
1614 Indices[i] = (i >= SrcNumElts) ? SrcNumElts + (i % SrcNumElts) : i;
1617 Ops[1],
ArrayRef(Indices, DstNumElts),
"widen");
1619 for (
unsigned i = 0; i != DstNumElts; ++i) {
1620 if (i >= Index && i < (Index + SrcNumElts))
1621 Indices[i] = (i - Index) + DstNumElts;
1626 return Builder.CreateShuffleVector(Ops[0], Op1,
1627 ArrayRef(Indices, DstNumElts),
"insert");
1629 case X86::BI__builtin_ia32_pmovqd512_mask:
1630 case X86::BI__builtin_ia32_pmovwb512_mask: {
1634 case X86::BI__builtin_ia32_pmovdb512_mask:
1635 case X86::BI__builtin_ia32_pmovdw512_mask:
1636 case X86::BI__builtin_ia32_pmovqw512_mask: {
1637 if (
const auto *
C = dyn_cast<Constant>(Ops[2]))
1638 if (
C->isAllOnesValue())
1642 switch (BuiltinID) {
1643 default: llvm_unreachable(
"Unsupported intrinsic!");
1644 case X86::BI__builtin_ia32_pmovdb512_mask:
1645 IID = Intrinsic::x86_avx512_mask_pmov_db_512;
1647 case X86::BI__builtin_ia32_pmovdw512_mask:
1648 IID = Intrinsic::x86_avx512_mask_pmov_dw_512;
1650 case X86::BI__builtin_ia32_pmovqw512_mask:
1651 IID = Intrinsic::x86_avx512_mask_pmov_qw_512;
1656 return Builder.CreateCall(Intr, Ops);
1658 case X86::BI__builtin_ia32_pblendw128:
1659 case X86::BI__builtin_ia32_blendpd:
1660 case X86::BI__builtin_ia32_blendps:
1661 case X86::BI__builtin_ia32_blendpd256:
1662 case X86::BI__builtin_ia32_blendps256:
1663 case X86::BI__builtin_ia32_pblendw256:
1664 case X86::BI__builtin_ia32_pblendd128:
1665 case X86::BI__builtin_ia32_pblendd256: {
1673 for (
unsigned i = 0; i != NumElts; ++i)
1674 Indices[i] = ((Imm >> (i % 8)) & 0x1) ? NumElts + i : i;
1676 return Builder.CreateShuffleVector(Ops[0], Ops[1],
1677 ArrayRef(Indices, NumElts),
"blend");
1679 case X86::BI__builtin_ia32_pshuflw:
1680 case X86::BI__builtin_ia32_pshuflw256:
1681 case X86::BI__builtin_ia32_pshuflw512: {
1684 unsigned NumElts = Ty->getNumElements();
1687 Imm = (Imm & 0xff) * 0x01010101;
1690 for (
unsigned l = 0; l != NumElts; l += 8) {
1691 for (
unsigned i = 0; i != 4; ++i) {
1692 Indices[l + i] = l + (Imm & 3);
1695 for (
unsigned i = 4; i != 8; ++i)
1696 Indices[l + i] = l + i;
1699 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
1702 case X86::BI__builtin_ia32_pshufhw:
1703 case X86::BI__builtin_ia32_pshufhw256:
1704 case X86::BI__builtin_ia32_pshufhw512: {
1707 unsigned NumElts = Ty->getNumElements();
1710 Imm = (Imm & 0xff) * 0x01010101;
1713 for (
unsigned l = 0; l != NumElts; l += 8) {
1714 for (
unsigned i = 0; i != 4; ++i)
1715 Indices[l + i] = l + i;
1716 for (
unsigned i = 4; i != 8; ++i) {
1717 Indices[l + i] = l + 4 + (Imm & 3);
1722 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
1725 case X86::BI__builtin_ia32_pshufd:
1726 case X86::BI__builtin_ia32_pshufd256:
1727 case X86::BI__builtin_ia32_pshufd512:
1728 case X86::BI__builtin_ia32_vpermilpd:
1729 case X86::BI__builtin_ia32_vpermilps:
1730 case X86::BI__builtin_ia32_vpermilpd256:
1731 case X86::BI__builtin_ia32_vpermilps256:
1732 case X86::BI__builtin_ia32_vpermilpd512:
1733 case X86::BI__builtin_ia32_vpermilps512: {
1736 unsigned NumElts = Ty->getNumElements();
1737 unsigned NumLanes = Ty->getPrimitiveSizeInBits() / 128;
1738 unsigned NumLaneElts = NumElts / NumLanes;
1741 Imm = (Imm & 0xff) * 0x01010101;
1744 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
1745 for (
unsigned i = 0; i != NumLaneElts; ++i) {
1746 Indices[i + l] = (Imm % NumLaneElts) + l;
1751 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
1754 case X86::BI__builtin_ia32_shufpd:
1755 case X86::BI__builtin_ia32_shufpd256:
1756 case X86::BI__builtin_ia32_shufpd512:
1757 case X86::BI__builtin_ia32_shufps:
1758 case X86::BI__builtin_ia32_shufps256:
1759 case X86::BI__builtin_ia32_shufps512: {
1762 unsigned NumElts = Ty->getNumElements();
1763 unsigned NumLanes = Ty->getPrimitiveSizeInBits() / 128;
1764 unsigned NumLaneElts = NumElts / NumLanes;
1767 Imm = (Imm & 0xff) * 0x01010101;
1770 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
1771 for (
unsigned i = 0; i != NumLaneElts; ++i) {
1772 unsigned Index = Imm % NumLaneElts;
1774 if (i >= (NumLaneElts / 2))
1776 Indices[l + i] = l + Index;
1780 return Builder.CreateShuffleVector(Ops[0], Ops[1],
1781 ArrayRef(Indices, NumElts),
"shufp");
1783 case X86::BI__builtin_ia32_permdi256:
1784 case X86::BI__builtin_ia32_permdf256:
1785 case X86::BI__builtin_ia32_permdi512:
1786 case X86::BI__builtin_ia32_permdf512: {
1789 unsigned NumElts = Ty->getNumElements();
1793 for (
unsigned l = 0; l != NumElts; l += 4)
1794 for (
unsigned i = 0; i != 4; ++i)
1795 Indices[l + i] = l + ((Imm >> (2 * i)) & 0x3);
1797 return Builder.CreateShuffleVector(Ops[0],
ArrayRef(Indices, NumElts),
1800 case X86::BI__builtin_ia32_palignr128:
1801 case X86::BI__builtin_ia32_palignr256:
1802 case X86::BI__builtin_ia32_palignr512: {
1807 assert(NumElts % 16 == 0);
1816 if (ShiftVal > 16) {
1819 Ops[0] = llvm::Constant::getNullValue(Ops[0]->
getType());
1824 for (
unsigned l = 0; l != NumElts; l += 16) {
1825 for (
unsigned i = 0; i != 16; ++i) {
1826 unsigned Idx = ShiftVal + i;
1828 Idx += NumElts - 16;
1829 Indices[l + i] = Idx + l;
1833 return Builder.CreateShuffleVector(Ops[1], Ops[0],
1834 ArrayRef(Indices, NumElts),
"palignr");
1836 case X86::BI__builtin_ia32_alignd128:
1837 case X86::BI__builtin_ia32_alignd256:
1838 case X86::BI__builtin_ia32_alignd512:
1839 case X86::BI__builtin_ia32_alignq128:
1840 case X86::BI__builtin_ia32_alignq256:
1841 case X86::BI__builtin_ia32_alignq512: {
1847 ShiftVal &= NumElts - 1;
1850 for (
unsigned i = 0; i != NumElts; ++i)
1851 Indices[i] = i + ShiftVal;
1853 return Builder.CreateShuffleVector(Ops[1], Ops[0],
1854 ArrayRef(Indices, NumElts),
"valign");
1856 case X86::BI__builtin_ia32_shuf_f32x4_256:
1857 case X86::BI__builtin_ia32_shuf_f64x2_256:
1858 case X86::BI__builtin_ia32_shuf_i32x4_256:
1859 case X86::BI__builtin_ia32_shuf_i64x2_256:
1860 case X86::BI__builtin_ia32_shuf_f32x4:
1861 case X86::BI__builtin_ia32_shuf_f64x2:
1862 case X86::BI__builtin_ia32_shuf_i32x4:
1863 case X86::BI__builtin_ia32_shuf_i64x2: {
1866 unsigned NumElts = Ty->getNumElements();
1867 unsigned NumLanes = Ty->getPrimitiveSizeInBits() == 512 ? 4 : 2;
1868 unsigned NumLaneElts = NumElts / NumLanes;
1871 for (
unsigned l = 0; l != NumElts; l += NumLaneElts) {
1872 unsigned Index = (Imm % NumLanes) * NumLaneElts;
1874 if (l >= (NumElts / 2))
1876 for (
unsigned i = 0; i != NumLaneElts; ++i) {
1877 Indices[l + i] = Index + i;
1881 return Builder.CreateShuffleVector(Ops[0], Ops[1],
1882 ArrayRef(Indices, NumElts),
"shuf");
1885 case X86::BI__builtin_ia32_vperm2f128_pd256:
1886 case X86::BI__builtin_ia32_vperm2f128_ps256:
1887 case X86::BI__builtin_ia32_vperm2f128_si256:
1888 case X86::BI__builtin_ia32_permti256: {
1900 for (
unsigned l = 0; l != 2; ++l) {
1902 if (Imm & (1 << ((l * 4) + 3)))
1903 OutOps[l] = llvm::ConstantAggregateZero::get(Ops[0]->
getType());
1904 else if (Imm & (1 << ((l * 4) + 1)))
1909 for (
unsigned i = 0; i != NumElts/2; ++i) {
1911 unsigned Idx = (l * NumElts) + i;
1914 if (Imm & (1 << (l * 4)))
1916 Indices[(l * (NumElts/2)) + i] = Idx;
1920 return Builder.CreateShuffleVector(OutOps[0], OutOps[1],
1921 ArrayRef(Indices, NumElts),
"vperm");
1924 case X86::BI__builtin_ia32_pslldqi128_byteshift:
1925 case X86::BI__builtin_ia32_pslldqi256_byteshift:
1926 case X86::BI__builtin_ia32_pslldqi512_byteshift: {
1930 unsigned NumElts = VecTy->getNumElements();
1931 Value *
Zero = llvm::Constant::getNullValue(VecTy);
1939 for (
unsigned l = 0; l != NumElts; l += 16) {
1940 for (
unsigned i = 0; i != 16; ++i) {
1941 unsigned Idx = NumElts + i - ShiftVal;
1943 Idx -= NumElts - 16;
1944 Indices[l + i] = Idx + l;
1950 case X86::BI__builtin_ia32_psrldqi128_byteshift:
1951 case X86::BI__builtin_ia32_psrldqi256_byteshift:
1952 case X86::BI__builtin_ia32_psrldqi512_byteshift: {
1956 unsigned NumElts = VecTy->getNumElements();
1957 Value *
Zero = llvm::Constant::getNullValue(VecTy);
1965 for (
unsigned l = 0; l != NumElts; l += 16) {
1966 for (
unsigned i = 0; i != 16; ++i) {
1967 unsigned Idx = i + ShiftVal;
1969 Idx += NumElts - 16;
1970 Indices[l + i] = Idx + l;
1976 case X86::BI__builtin_ia32_kshiftliqi:
1977 case X86::BI__builtin_ia32_kshiftlihi:
1978 case X86::BI__builtin_ia32_kshiftlisi:
1979 case X86::BI__builtin_ia32_kshiftlidi: {
1981 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
1983 if (ShiftVal >= NumElts)
1984 return llvm::Constant::getNullValue(Ops[0]->
getType());
1989 for (
unsigned i = 0; i != NumElts; ++i)
1990 Indices[i] = NumElts + i - ShiftVal;
1992 Value *
Zero = llvm::Constant::getNullValue(In->getType());
1997 case X86::BI__builtin_ia32_kshiftriqi:
1998 case X86::BI__builtin_ia32_kshiftrihi:
1999 case X86::BI__builtin_ia32_kshiftrisi:
2000 case X86::BI__builtin_ia32_kshiftridi: {
2002 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
2004 if (ShiftVal >= NumElts)
2005 return llvm::Constant::getNullValue(Ops[0]->
getType());
2010 for (
unsigned i = 0; i != NumElts; ++i)
2011 Indices[i] = i + ShiftVal;
2013 Value *
Zero = llvm::Constant::getNullValue(In->getType());
2018 case X86::BI__builtin_ia32_movnti:
2019 case X86::BI__builtin_ia32_movnti64:
2020 case X86::BI__builtin_ia32_movntsd:
2021 case X86::BI__builtin_ia32_movntss: {
2022 llvm::MDNode *Node = llvm::MDNode::get(
2025 Value *Ptr = Ops[0];
2026 Value *Src = Ops[1];
2029 if (BuiltinID == X86::BI__builtin_ia32_movntsd ||
2030 BuiltinID == X86::BI__builtin_ia32_movntss)
2031 Src =
Builder.CreateExtractElement(Src, (uint64_t)0,
"extract");
2034 StoreInst *SI =
Builder.CreateDefaultAlignedStore(Src, Ptr);
2035 SI->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2036 SI->setAlignment(llvm::Align(1));
2040 case X86::BI__builtin_ia32_vprotbi:
2041 case X86::BI__builtin_ia32_vprotwi:
2042 case X86::BI__builtin_ia32_vprotdi:
2043 case X86::BI__builtin_ia32_vprotqi:
2044 case X86::BI__builtin_ia32_prold128:
2045 case X86::BI__builtin_ia32_prold256:
2046 case X86::BI__builtin_ia32_prold512:
2047 case X86::BI__builtin_ia32_prolq128:
2048 case X86::BI__builtin_ia32_prolq256:
2049 case X86::BI__builtin_ia32_prolq512:
2051 case X86::BI__builtin_ia32_prord128:
2052 case X86::BI__builtin_ia32_prord256:
2053 case X86::BI__builtin_ia32_prord512:
2054 case X86::BI__builtin_ia32_prorq128:
2055 case X86::BI__builtin_ia32_prorq256:
2056 case X86::BI__builtin_ia32_prorq512:
2058 case X86::BI__builtin_ia32_selectb_128:
2059 case X86::BI__builtin_ia32_selectb_256:
2060 case X86::BI__builtin_ia32_selectb_512:
2061 case X86::BI__builtin_ia32_selectw_128:
2062 case X86::BI__builtin_ia32_selectw_256:
2063 case X86::BI__builtin_ia32_selectw_512:
2064 case X86::BI__builtin_ia32_selectd_128:
2065 case X86::BI__builtin_ia32_selectd_256:
2066 case X86::BI__builtin_ia32_selectd_512:
2067 case X86::BI__builtin_ia32_selectq_128:
2068 case X86::BI__builtin_ia32_selectq_256:
2069 case X86::BI__builtin_ia32_selectq_512:
2070 case X86::BI__builtin_ia32_selectph_128:
2071 case X86::BI__builtin_ia32_selectph_256:
2072 case X86::BI__builtin_ia32_selectph_512:
2073 case X86::BI__builtin_ia32_selectpbf_128:
2074 case X86::BI__builtin_ia32_selectpbf_256:
2075 case X86::BI__builtin_ia32_selectpbf_512:
2076 case X86::BI__builtin_ia32_selectps_128:
2077 case X86::BI__builtin_ia32_selectps_256:
2078 case X86::BI__builtin_ia32_selectps_512:
2079 case X86::BI__builtin_ia32_selectpd_128:
2080 case X86::BI__builtin_ia32_selectpd_256:
2081 case X86::BI__builtin_ia32_selectpd_512:
2083 case X86::BI__builtin_ia32_selectsh_128:
2084 case X86::BI__builtin_ia32_selectsbf_128:
2085 case X86::BI__builtin_ia32_selectss_128:
2086 case X86::BI__builtin_ia32_selectsd_128: {
2087 Value *A =
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
2088 Value *B =
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
2090 return Builder.CreateInsertElement(Ops[1], A, (uint64_t)0);
2092 case X86::BI__builtin_ia32_cmpb128_mask:
2093 case X86::BI__builtin_ia32_cmpb256_mask:
2094 case X86::BI__builtin_ia32_cmpb512_mask:
2095 case X86::BI__builtin_ia32_cmpw128_mask:
2096 case X86::BI__builtin_ia32_cmpw256_mask:
2097 case X86::BI__builtin_ia32_cmpw512_mask:
2098 case X86::BI__builtin_ia32_cmpd128_mask:
2099 case X86::BI__builtin_ia32_cmpd256_mask:
2100 case X86::BI__builtin_ia32_cmpd512_mask:
2101 case X86::BI__builtin_ia32_cmpq128_mask:
2102 case X86::BI__builtin_ia32_cmpq256_mask:
2103 case X86::BI__builtin_ia32_cmpq512_mask: {
2107 case X86::BI__builtin_ia32_ucmpb128_mask:
2108 case X86::BI__builtin_ia32_ucmpb256_mask:
2109 case X86::BI__builtin_ia32_ucmpb512_mask:
2110 case X86::BI__builtin_ia32_ucmpw128_mask:
2111 case X86::BI__builtin_ia32_ucmpw256_mask:
2112 case X86::BI__builtin_ia32_ucmpw512_mask:
2113 case X86::BI__builtin_ia32_ucmpd128_mask:
2114 case X86::BI__builtin_ia32_ucmpd256_mask:
2115 case X86::BI__builtin_ia32_ucmpd512_mask:
2116 case X86::BI__builtin_ia32_ucmpq128_mask:
2117 case X86::BI__builtin_ia32_ucmpq256_mask:
2118 case X86::BI__builtin_ia32_ucmpq512_mask: {
2122 case X86::BI__builtin_ia32_vpcomb:
2123 case X86::BI__builtin_ia32_vpcomw:
2124 case X86::BI__builtin_ia32_vpcomd:
2125 case X86::BI__builtin_ia32_vpcomq:
2127 case X86::BI__builtin_ia32_vpcomub:
2128 case X86::BI__builtin_ia32_vpcomuw:
2129 case X86::BI__builtin_ia32_vpcomud:
2130 case X86::BI__builtin_ia32_vpcomuq:
2133 case X86::BI__builtin_ia32_kortestcqi:
2134 case X86::BI__builtin_ia32_kortestchi:
2135 case X86::BI__builtin_ia32_kortestcsi:
2136 case X86::BI__builtin_ia32_kortestcdi: {
2138 Value *
C = llvm::Constant::getAllOnesValue(Ops[0]->
getType());
2142 case X86::BI__builtin_ia32_kortestzqi:
2143 case X86::BI__builtin_ia32_kortestzhi:
2144 case X86::BI__builtin_ia32_kortestzsi:
2145 case X86::BI__builtin_ia32_kortestzdi: {
2152 case X86::BI__builtin_ia32_ktestcqi:
2153 case X86::BI__builtin_ia32_ktestzqi:
2154 case X86::BI__builtin_ia32_ktestchi:
2155 case X86::BI__builtin_ia32_ktestzhi:
2156 case X86::BI__builtin_ia32_ktestcsi:
2157 case X86::BI__builtin_ia32_ktestzsi:
2158 case X86::BI__builtin_ia32_ktestcdi:
2159 case X86::BI__builtin_ia32_ktestzdi: {
2161 switch (BuiltinID) {
2162 default: llvm_unreachable(
"Unsupported intrinsic!");
2163 case X86::BI__builtin_ia32_ktestcqi:
2164 IID = Intrinsic::x86_avx512_ktestc_b;
2166 case X86::BI__builtin_ia32_ktestzqi:
2167 IID = Intrinsic::x86_avx512_ktestz_b;
2169 case X86::BI__builtin_ia32_ktestchi:
2170 IID = Intrinsic::x86_avx512_ktestc_w;
2172 case X86::BI__builtin_ia32_ktestzhi:
2173 IID = Intrinsic::x86_avx512_ktestz_w;
2175 case X86::BI__builtin_ia32_ktestcsi:
2176 IID = Intrinsic::x86_avx512_ktestc_d;
2178 case X86::BI__builtin_ia32_ktestzsi:
2179 IID = Intrinsic::x86_avx512_ktestz_d;
2181 case X86::BI__builtin_ia32_ktestcdi:
2182 IID = Intrinsic::x86_avx512_ktestc_q;
2184 case X86::BI__builtin_ia32_ktestzdi:
2185 IID = Intrinsic::x86_avx512_ktestz_q;
2189 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
2193 return Builder.CreateCall(Intr, {LHS, RHS});
2196 case X86::BI__builtin_ia32_kaddqi:
2197 case X86::BI__builtin_ia32_kaddhi:
2198 case X86::BI__builtin_ia32_kaddsi:
2199 case X86::BI__builtin_ia32_kadddi: {
2201 switch (BuiltinID) {
2202 default: llvm_unreachable(
"Unsupported intrinsic!");
2203 case X86::BI__builtin_ia32_kaddqi:
2204 IID = Intrinsic::x86_avx512_kadd_b;
2206 case X86::BI__builtin_ia32_kaddhi:
2207 IID = Intrinsic::x86_avx512_kadd_w;
2209 case X86::BI__builtin_ia32_kaddsi:
2210 IID = Intrinsic::x86_avx512_kadd_d;
2212 case X86::BI__builtin_ia32_kadddi:
2213 IID = Intrinsic::x86_avx512_kadd_q;
2217 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
2224 case X86::BI__builtin_ia32_kandqi:
2225 case X86::BI__builtin_ia32_kandhi:
2226 case X86::BI__builtin_ia32_kandsi:
2227 case X86::BI__builtin_ia32_kanddi:
2229 case X86::BI__builtin_ia32_kandnqi:
2230 case X86::BI__builtin_ia32_kandnhi:
2231 case X86::BI__builtin_ia32_kandnsi:
2232 case X86::BI__builtin_ia32_kandndi:
2234 case X86::BI__builtin_ia32_korqi:
2235 case X86::BI__builtin_ia32_korhi:
2236 case X86::BI__builtin_ia32_korsi:
2237 case X86::BI__builtin_ia32_kordi:
2239 case X86::BI__builtin_ia32_kxnorqi:
2240 case X86::BI__builtin_ia32_kxnorhi:
2241 case X86::BI__builtin_ia32_kxnorsi:
2242 case X86::BI__builtin_ia32_kxnordi:
2244 case X86::BI__builtin_ia32_kxorqi:
2245 case X86::BI__builtin_ia32_kxorhi:
2246 case X86::BI__builtin_ia32_kxorsi:
2247 case X86::BI__builtin_ia32_kxordi:
2249 case X86::BI__builtin_ia32_knotqi:
2250 case X86::BI__builtin_ia32_knothi:
2251 case X86::BI__builtin_ia32_knotsi:
2252 case X86::BI__builtin_ia32_knotdi: {
2253 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
2258 case X86::BI__builtin_ia32_kmovb:
2259 case X86::BI__builtin_ia32_kmovw:
2260 case X86::BI__builtin_ia32_kmovd:
2261 case X86::BI__builtin_ia32_kmovq: {
2265 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
2270 case X86::BI__builtin_ia32_kunpckdi:
2271 case X86::BI__builtin_ia32_kunpcksi:
2272 case X86::BI__builtin_ia32_kunpckhi: {
2273 unsigned NumElts = Ops[0]->getType()->getIntegerBitWidth();
2277 for (
unsigned i = 0; i != NumElts; ++i)
2282 LHS =
Builder.CreateShuffleVector(LHS, LHS,
ArrayRef(Indices, NumElts / 2));
2283 RHS =
Builder.CreateShuffleVector(RHS, RHS,
ArrayRef(Indices, NumElts / 2));
2291 case X86::BI__builtin_ia32_sqrtsh_round_mask:
2292 case X86::BI__builtin_ia32_sqrtsd_round_mask:
2293 case X86::BI__builtin_ia32_sqrtss_round_mask: {
2300 switch (BuiltinID) {
2302 llvm_unreachable(
"Unsupported intrinsic!");
2303 case X86::BI__builtin_ia32_sqrtsh_round_mask:
2304 IID = Intrinsic::x86_avx512fp16_mask_sqrt_sh;
2306 case X86::BI__builtin_ia32_sqrtsd_round_mask:
2307 IID = Intrinsic::x86_avx512_mask_sqrt_sd;
2309 case X86::BI__builtin_ia32_sqrtss_round_mask:
2310 IID = Intrinsic::x86_avx512_mask_sqrt_ss;
2313 return Builder.CreateCall(
CGM.getIntrinsic(IID), Ops);
2315 Value *A =
Builder.CreateExtractElement(Ops[1], (uint64_t)0);
2317 if (
Builder.getIsFPConstrained()) {
2319 F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_sqrt,
2321 A =
Builder.CreateConstrainedFPCall(F, A);
2323 F =
CGM.getIntrinsic(Intrinsic::sqrt, A->
getType());
2326 Value *Src =
Builder.CreateExtractElement(Ops[2], (uint64_t)0);
2328 return Builder.CreateInsertElement(Ops[0], A, (uint64_t)0);
2330 case X86::BI__builtin_ia32_sqrtph512:
2331 case X86::BI__builtin_ia32_sqrtps512:
2332 case X86::BI__builtin_ia32_sqrtpd512: {
2339 switch (BuiltinID) {
2341 llvm_unreachable(
"Unsupported intrinsic!");
2342 case X86::BI__builtin_ia32_sqrtph512:
2343 IID = Intrinsic::x86_avx512fp16_sqrt_ph_512;
2345 case X86::BI__builtin_ia32_sqrtps512:
2346 IID = Intrinsic::x86_avx512_sqrt_ps_512;
2348 case X86::BI__builtin_ia32_sqrtpd512:
2349 IID = Intrinsic::x86_avx512_sqrt_pd_512;
2352 return Builder.CreateCall(
CGM.getIntrinsic(IID), Ops);
2354 if (
Builder.getIsFPConstrained()) {
2356 Function *F =
CGM.getIntrinsic(Intrinsic::experimental_constrained_sqrt,
2358 return Builder.CreateConstrainedFPCall(F, Ops[0]);
2361 return Builder.CreateCall(F, Ops[0]);
2365 case X86::BI__builtin_ia32_pmulhw128:
2366 case X86::BI__builtin_ia32_pmulhw256:
2367 case X86::BI__builtin_ia32_pmulhw512: {
2369 return Builder.CreateCall(F, {Ops[0], Ops[1]});
2372 case X86::BI__builtin_ia32_pmulhuw128:
2373 case X86::BI__builtin_ia32_pmulhuw256:
2374 case X86::BI__builtin_ia32_pmulhuw512: {
2376 return Builder.CreateCall(F, {Ops[0], Ops[1]});
2379 case X86::BI__builtin_ia32_pmuludq128:
2380 case X86::BI__builtin_ia32_pmuludq256:
2381 case X86::BI__builtin_ia32_pmuludq512:
2384 case X86::BI__builtin_ia32_pmuldq128:
2385 case X86::BI__builtin_ia32_pmuldq256:
2386 case X86::BI__builtin_ia32_pmuldq512:
2389 case X86::BI__builtin_ia32_pternlogd512_mask:
2390 case X86::BI__builtin_ia32_pternlogq512_mask:
2391 case X86::BI__builtin_ia32_pternlogd128_mask:
2392 case X86::BI__builtin_ia32_pternlogd256_mask:
2393 case X86::BI__builtin_ia32_pternlogq128_mask:
2394 case X86::BI__builtin_ia32_pternlogq256_mask:
2397 case X86::BI__builtin_ia32_pternlogd512_maskz:
2398 case X86::BI__builtin_ia32_pternlogq512_maskz:
2399 case X86::BI__builtin_ia32_pternlogd128_maskz:
2400 case X86::BI__builtin_ia32_pternlogd256_maskz:
2401 case X86::BI__builtin_ia32_pternlogq128_maskz:
2402 case X86::BI__builtin_ia32_pternlogq256_maskz:
2405 case X86::BI__builtin_ia32_vpshldd128:
2406 case X86::BI__builtin_ia32_vpshldd256:
2407 case X86::BI__builtin_ia32_vpshldd512:
2408 case X86::BI__builtin_ia32_vpshldq128:
2409 case X86::BI__builtin_ia32_vpshldq256:
2410 case X86::BI__builtin_ia32_vpshldq512:
2411 case X86::BI__builtin_ia32_vpshldw128:
2412 case X86::BI__builtin_ia32_vpshldw256:
2413 case X86::BI__builtin_ia32_vpshldw512:
2416 case X86::BI__builtin_ia32_vpshrdd128:
2417 case X86::BI__builtin_ia32_vpshrdd256:
2418 case X86::BI__builtin_ia32_vpshrdd512:
2419 case X86::BI__builtin_ia32_vpshrdq128:
2420 case X86::BI__builtin_ia32_vpshrdq256:
2421 case X86::BI__builtin_ia32_vpshrdq512:
2422 case X86::BI__builtin_ia32_vpshrdw128:
2423 case X86::BI__builtin_ia32_vpshrdw256:
2424 case X86::BI__builtin_ia32_vpshrdw512:
2429 case X86::BI__builtin_ia32_reduce_fadd_pd512:
2430 case X86::BI__builtin_ia32_reduce_fadd_ps512:
2431 case X86::BI__builtin_ia32_reduce_fadd_ph512:
2432 case X86::BI__builtin_ia32_reduce_fadd_ph256:
2433 case X86::BI__builtin_ia32_reduce_fadd_ph128: {
2435 CGM.getIntrinsic(Intrinsic::vector_reduce_fadd, Ops[1]->
getType());
2436 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2437 Builder.getFastMathFlags().setAllowReassoc();
2438 return Builder.CreateCall(F, {Ops[0], Ops[1]});
2440 case X86::BI__builtin_ia32_reduce_fmul_pd512:
2441 case X86::BI__builtin_ia32_reduce_fmul_ps512:
2442 case X86::BI__builtin_ia32_reduce_fmul_ph512:
2443 case X86::BI__builtin_ia32_reduce_fmul_ph256:
2444 case X86::BI__builtin_ia32_reduce_fmul_ph128: {
2446 CGM.getIntrinsic(Intrinsic::vector_reduce_fmul, Ops[1]->
getType());
2447 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2448 Builder.getFastMathFlags().setAllowReassoc();
2449 return Builder.CreateCall(F, {Ops[0], Ops[1]});
2451 case X86::BI__builtin_ia32_reduce_fmax_pd512:
2452 case X86::BI__builtin_ia32_reduce_fmax_ps512:
2453 case X86::BI__builtin_ia32_reduce_fmax_ph512:
2454 case X86::BI__builtin_ia32_reduce_fmax_ph256:
2455 case X86::BI__builtin_ia32_reduce_fmax_ph128: {
2457 CGM.getIntrinsic(Intrinsic::vector_reduce_fmax, Ops[0]->
getType());
2458 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2459 Builder.getFastMathFlags().setNoNaNs();
2460 return Builder.CreateCall(F, {Ops[0]});
2462 case X86::BI__builtin_ia32_reduce_fmin_pd512:
2463 case X86::BI__builtin_ia32_reduce_fmin_ps512:
2464 case X86::BI__builtin_ia32_reduce_fmin_ph512:
2465 case X86::BI__builtin_ia32_reduce_fmin_ph256:
2466 case X86::BI__builtin_ia32_reduce_fmin_ph128: {
2468 CGM.getIntrinsic(Intrinsic::vector_reduce_fmin, Ops[0]->
getType());
2469 IRBuilder<>::FastMathFlagGuard FMFGuard(
Builder);
2470 Builder.getFastMathFlags().setNoNaNs();
2471 return Builder.CreateCall(F, {Ops[0]});
2474 case X86::BI__builtin_ia32_rdrand16_step:
2475 case X86::BI__builtin_ia32_rdrand32_step:
2476 case X86::BI__builtin_ia32_rdrand64_step:
2477 case X86::BI__builtin_ia32_rdseed16_step:
2478 case X86::BI__builtin_ia32_rdseed32_step:
2479 case X86::BI__builtin_ia32_rdseed64_step: {
2481 switch (BuiltinID) {
2482 default: llvm_unreachable(
"Unsupported intrinsic!");
2483 case X86::BI__builtin_ia32_rdrand16_step:
2484 ID = Intrinsic::x86_rdrand_16;
2486 case X86::BI__builtin_ia32_rdrand32_step:
2487 ID = Intrinsic::x86_rdrand_32;
2489 case X86::BI__builtin_ia32_rdrand64_step:
2490 ID = Intrinsic::x86_rdrand_64;
2492 case X86::BI__builtin_ia32_rdseed16_step:
2493 ID = Intrinsic::x86_rdseed_16;
2495 case X86::BI__builtin_ia32_rdseed32_step:
2496 ID = Intrinsic::x86_rdseed_32;
2498 case X86::BI__builtin_ia32_rdseed64_step:
2499 ID = Intrinsic::x86_rdseed_64;
2508 case X86::BI__builtin_ia32_addcarryx_u32:
2509 case X86::BI__builtin_ia32_addcarryx_u64:
2510 case X86::BI__builtin_ia32_subborrow_u32:
2511 case X86::BI__builtin_ia32_subborrow_u64: {
2513 switch (BuiltinID) {
2514 default: llvm_unreachable(
"Unsupported intrinsic!");
2515 case X86::BI__builtin_ia32_addcarryx_u32:
2516 IID = Intrinsic::x86_addcarry_32;
2518 case X86::BI__builtin_ia32_addcarryx_u64:
2519 IID = Intrinsic::x86_addcarry_64;
2521 case X86::BI__builtin_ia32_subborrow_u32:
2522 IID = Intrinsic::x86_subborrow_32;
2524 case X86::BI__builtin_ia32_subborrow_u64:
2525 IID = Intrinsic::x86_subborrow_64;
2530 { Ops[0], Ops[1], Ops[2] });
2536 case X86::BI__builtin_ia32_fpclassps128_mask:
2537 case X86::BI__builtin_ia32_fpclassps256_mask:
2538 case X86::BI__builtin_ia32_fpclassps512_mask:
2539 case X86::BI__builtin_ia32_vfpclassbf16128_mask:
2540 case X86::BI__builtin_ia32_vfpclassbf16256_mask:
2541 case X86::BI__builtin_ia32_vfpclassbf16512_mask:
2542 case X86::BI__builtin_ia32_fpclassph128_mask:
2543 case X86::BI__builtin_ia32_fpclassph256_mask:
2544 case X86::BI__builtin_ia32_fpclassph512_mask:
2545 case X86::BI__builtin_ia32_fpclasspd128_mask:
2546 case X86::BI__builtin_ia32_fpclasspd256_mask:
2547 case X86::BI__builtin_ia32_fpclasspd512_mask: {
2550 Value *MaskIn = Ops[2];
2554 switch (BuiltinID) {
2555 default: llvm_unreachable(
"Unsupported intrinsic!");
2556 case X86::BI__builtin_ia32_vfpclassbf16128_mask:
2557 ID = Intrinsic::x86_avx10_fpclass_bf16_128;
2559 case X86::BI__builtin_ia32_vfpclassbf16256_mask:
2560 ID = Intrinsic::x86_avx10_fpclass_bf16_256;
2562 case X86::BI__builtin_ia32_vfpclassbf16512_mask:
2563 ID = Intrinsic::x86_avx10_fpclass_bf16_512;
2565 case X86::BI__builtin_ia32_fpclassph128_mask:
2566 ID = Intrinsic::x86_avx512fp16_fpclass_ph_128;
2568 case X86::BI__builtin_ia32_fpclassph256_mask:
2569 ID = Intrinsic::x86_avx512fp16_fpclass_ph_256;
2571 case X86::BI__builtin_ia32_fpclassph512_mask:
2572 ID = Intrinsic::x86_avx512fp16_fpclass_ph_512;
2574 case X86::BI__builtin_ia32_fpclassps128_mask:
2575 ID = Intrinsic::x86_avx512_fpclass_ps_128;
2577 case X86::BI__builtin_ia32_fpclassps256_mask:
2578 ID = Intrinsic::x86_avx512_fpclass_ps_256;
2580 case X86::BI__builtin_ia32_fpclassps512_mask:
2581 ID = Intrinsic::x86_avx512_fpclass_ps_512;
2583 case X86::BI__builtin_ia32_fpclasspd128_mask:
2584 ID = Intrinsic::x86_avx512_fpclass_pd_128;
2586 case X86::BI__builtin_ia32_fpclasspd256_mask:
2587 ID = Intrinsic::x86_avx512_fpclass_pd_256;
2589 case X86::BI__builtin_ia32_fpclasspd512_mask:
2590 ID = Intrinsic::x86_avx512_fpclass_pd_512;
2598 case X86::BI__builtin_ia32_vp2intersect_q_512:
2599 case X86::BI__builtin_ia32_vp2intersect_q_256:
2600 case X86::BI__builtin_ia32_vp2intersect_q_128:
2601 case X86::BI__builtin_ia32_vp2intersect_d_512:
2602 case X86::BI__builtin_ia32_vp2intersect_d_256:
2603 case X86::BI__builtin_ia32_vp2intersect_d_128: {
2608 switch (BuiltinID) {
2609 default: llvm_unreachable(
"Unsupported intrinsic!");
2610 case X86::BI__builtin_ia32_vp2intersect_q_512:
2611 ID = Intrinsic::x86_avx512_vp2intersect_q_512;
2613 case X86::BI__builtin_ia32_vp2intersect_q_256:
2614 ID = Intrinsic::x86_avx512_vp2intersect_q_256;
2616 case X86::BI__builtin_ia32_vp2intersect_q_128:
2617 ID = Intrinsic::x86_avx512_vp2intersect_q_128;
2619 case X86::BI__builtin_ia32_vp2intersect_d_512:
2620 ID = Intrinsic::x86_avx512_vp2intersect_d_512;
2622 case X86::BI__builtin_ia32_vp2intersect_d_256:
2623 ID = Intrinsic::x86_avx512_vp2intersect_d_256;
2625 case X86::BI__builtin_ia32_vp2intersect_d_128:
2626 ID = Intrinsic::x86_avx512_vp2intersect_d_128;
2640 case X86::BI__builtin_ia32_vpmultishiftqb128:
2641 case X86::BI__builtin_ia32_vpmultishiftqb256:
2642 case X86::BI__builtin_ia32_vpmultishiftqb512: {
2644 switch (BuiltinID) {
2645 default: llvm_unreachable(
"Unsupported intrinsic!");
2646 case X86::BI__builtin_ia32_vpmultishiftqb128:
2647 ID = Intrinsic::x86_avx512_pmultishift_qb_128;
2649 case X86::BI__builtin_ia32_vpmultishiftqb256:
2650 ID = Intrinsic::x86_avx512_pmultishift_qb_256;
2652 case X86::BI__builtin_ia32_vpmultishiftqb512:
2653 ID = Intrinsic::x86_avx512_pmultishift_qb_512;
2657 return Builder.CreateCall(
CGM.getIntrinsic(ID), Ops);
2660 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
2661 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
2662 case X86::BI__builtin_ia32_vpshufbitqmb512_mask: {
2665 Value *MaskIn = Ops[2];
2669 switch (BuiltinID) {
2670 default: llvm_unreachable(
"Unsupported intrinsic!");
2671 case X86::BI__builtin_ia32_vpshufbitqmb128_mask:
2672 ID = Intrinsic::x86_avx512_vpshufbitqmb_128;
2674 case X86::BI__builtin_ia32_vpshufbitqmb256_mask:
2675 ID = Intrinsic::x86_avx512_vpshufbitqmb_256;
2677 case X86::BI__builtin_ia32_vpshufbitqmb512_mask:
2678 ID = Intrinsic::x86_avx512_vpshufbitqmb_512;
2687 case X86::BI__builtin_ia32_cmpeqps:
2688 case X86::BI__builtin_ia32_cmpeqpd:
2689 return getVectorFCmpIR(CmpInst::FCMP_OEQ,
false);
2690 case X86::BI__builtin_ia32_cmpltps:
2691 case X86::BI__builtin_ia32_cmpltpd:
2692 return getVectorFCmpIR(CmpInst::FCMP_OLT,
true);
2693 case X86::BI__builtin_ia32_cmpleps:
2694 case X86::BI__builtin_ia32_cmplepd:
2695 return getVectorFCmpIR(CmpInst::FCMP_OLE,
true);
2696 case X86::BI__builtin_ia32_cmpunordps:
2697 case X86::BI__builtin_ia32_cmpunordpd:
2698 return getVectorFCmpIR(CmpInst::FCMP_UNO,
false);
2699 case X86::BI__builtin_ia32_cmpneqps:
2700 case X86::BI__builtin_ia32_cmpneqpd:
2701 return getVectorFCmpIR(CmpInst::FCMP_UNE,
false);
2702 case X86::BI__builtin_ia32_cmpnltps:
2703 case X86::BI__builtin_ia32_cmpnltpd:
2704 return getVectorFCmpIR(CmpInst::FCMP_UGE,
true);
2705 case X86::BI__builtin_ia32_cmpnleps:
2706 case X86::BI__builtin_ia32_cmpnlepd:
2707 return getVectorFCmpIR(CmpInst::FCMP_UGT,
true);
2708 case X86::BI__builtin_ia32_cmpordps:
2709 case X86::BI__builtin_ia32_cmpordpd:
2710 return getVectorFCmpIR(CmpInst::FCMP_ORD,
false);
2711 case X86::BI__builtin_ia32_cmpph128_mask:
2712 case X86::BI__builtin_ia32_cmpph256_mask:
2713 case X86::BI__builtin_ia32_cmpph512_mask:
2714 case X86::BI__builtin_ia32_cmpps128_mask:
2715 case X86::BI__builtin_ia32_cmpps256_mask:
2716 case X86::BI__builtin_ia32_cmpps512_mask:
2717 case X86::BI__builtin_ia32_cmppd128_mask:
2718 case X86::BI__builtin_ia32_cmppd256_mask:
2719 case X86::BI__builtin_ia32_cmppd512_mask:
2720 case X86::BI__builtin_ia32_vcmpbf16512_mask:
2721 case X86::BI__builtin_ia32_vcmpbf16256_mask:
2722 case X86::BI__builtin_ia32_vcmpbf16128_mask:
2725 case X86::BI__builtin_ia32_cmpps:
2726 case X86::BI__builtin_ia32_cmpps256:
2727 case X86::BI__builtin_ia32_cmppd:
2728 case X86::BI__builtin_ia32_cmppd256: {
2741 FCmpInst::Predicate Pred;
2746 case 0x00: Pred = FCmpInst::FCMP_OEQ; IsSignaling =
false;
break;
2747 case 0x01: Pred = FCmpInst::FCMP_OLT; IsSignaling =
true;
break;
2748 case 0x02: Pred = FCmpInst::FCMP_OLE; IsSignaling =
true;
break;
2749 case 0x03: Pred = FCmpInst::FCMP_UNO; IsSignaling =
false;
break;
2750 case 0x04: Pred = FCmpInst::FCMP_UNE; IsSignaling =
false;
break;
2751 case 0x05: Pred = FCmpInst::FCMP_UGE; IsSignaling =
true;
break;
2752 case 0x06: Pred = FCmpInst::FCMP_UGT; IsSignaling =
true;
break;
2753 case 0x07: Pred = FCmpInst::FCMP_ORD; IsSignaling =
false;
break;
2754 case 0x08: Pred = FCmpInst::FCMP_UEQ; IsSignaling =
false;
break;
2755 case 0x09: Pred = FCmpInst::FCMP_ULT; IsSignaling =
true;
break;
2756 case 0x0a: Pred = FCmpInst::FCMP_ULE; IsSignaling =
true;
break;
2757 case 0x0b: Pred = FCmpInst::FCMP_FALSE; IsSignaling =
false;
break;
2758 case 0x0c: Pred = FCmpInst::FCMP_ONE; IsSignaling =
false;
break;
2759 case 0x0d: Pred = FCmpInst::FCMP_OGE; IsSignaling =
true;
break;
2760 case 0x0e: Pred = FCmpInst::FCMP_OGT; IsSignaling =
true;
break;
2761 case 0x0f: Pred = FCmpInst::FCMP_TRUE; IsSignaling =
false;
break;
2762 default: llvm_unreachable(
"Unhandled CC");
2767 IsSignaling = !IsSignaling;
2774 if (
Builder.getIsFPConstrained() &&
2775 (Pred == FCmpInst::FCMP_TRUE || Pred == FCmpInst::FCMP_FALSE ||
2779 switch (BuiltinID) {
2780 default: llvm_unreachable(
"Unexpected builtin");
2781 case X86::BI__builtin_ia32_cmpps:
2782 IID = Intrinsic::x86_sse_cmp_ps;
2784 case X86::BI__builtin_ia32_cmpps256:
2785 IID = Intrinsic::x86_avx_cmp_ps_256;
2787 case X86::BI__builtin_ia32_cmppd:
2788 IID = Intrinsic::x86_sse2_cmp_pd;
2790 case X86::BI__builtin_ia32_cmppd256:
2791 IID = Intrinsic::x86_avx_cmp_pd_256;
2793 case X86::BI__builtin_ia32_cmpph128_mask:
2794 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_128;
2796 case X86::BI__builtin_ia32_cmpph256_mask:
2797 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_256;
2799 case X86::BI__builtin_ia32_cmpph512_mask:
2800 IID = Intrinsic::x86_avx512fp16_mask_cmp_ph_512;
2802 case X86::BI__builtin_ia32_cmpps512_mask:
2803 IID = Intrinsic::x86_avx512_mask_cmp_ps_512;
2805 case X86::BI__builtin_ia32_cmppd512_mask:
2806 IID = Intrinsic::x86_avx512_mask_cmp_pd_512;
2808 case X86::BI__builtin_ia32_cmpps128_mask:
2809 IID = Intrinsic::x86_avx512_mask_cmp_ps_128;
2811 case X86::BI__builtin_ia32_cmpps256_mask:
2812 IID = Intrinsic::x86_avx512_mask_cmp_ps_256;
2814 case X86::BI__builtin_ia32_cmppd128_mask:
2815 IID = Intrinsic::x86_avx512_mask_cmp_pd_128;
2817 case X86::BI__builtin_ia32_cmppd256_mask:
2818 IID = Intrinsic::x86_avx512_mask_cmp_pd_256;
2831 return Builder.CreateCall(Intr, Ops);
2845 Cmp =
Builder.CreateFCmpS(Pred, Ops[0], Ops[1]);
2847 Cmp =
Builder.CreateFCmp(Pred, Ops[0], Ops[1]);
2851 return getVectorFCmpIR(Pred, IsSignaling);
2855 case X86::BI__builtin_ia32_cmpeqss:
2856 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 0);
2857 case X86::BI__builtin_ia32_cmpltss:
2858 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 1);
2859 case X86::BI__builtin_ia32_cmpless:
2860 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 2);
2861 case X86::BI__builtin_ia32_cmpunordss:
2862 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 3);
2863 case X86::BI__builtin_ia32_cmpneqss:
2864 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 4);
2865 case X86::BI__builtin_ia32_cmpnltss:
2866 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 5);
2867 case X86::BI__builtin_ia32_cmpnless:
2868 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 6);
2869 case X86::BI__builtin_ia32_cmpordss:
2870 return getCmpIntrinsicCall(Intrinsic::x86_sse_cmp_ss, 7);
2871 case X86::BI__builtin_ia32_cmpeqsd:
2872 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 0);
2873 case X86::BI__builtin_ia32_cmpltsd:
2874 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 1);
2875 case X86::BI__builtin_ia32_cmplesd:
2876 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 2);
2877 case X86::BI__builtin_ia32_cmpunordsd:
2878 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 3);
2879 case X86::BI__builtin_ia32_cmpneqsd:
2880 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 4);
2881 case X86::BI__builtin_ia32_cmpnltsd:
2882 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 5);
2883 case X86::BI__builtin_ia32_cmpnlesd:
2884 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 6);
2885 case X86::BI__builtin_ia32_cmpordsd:
2886 return getCmpIntrinsicCall(Intrinsic::x86_sse2_cmp_sd, 7);
2889 case X86::BI__builtin_ia32_vcvtph2ps_mask:
2890 case X86::BI__builtin_ia32_vcvtph2ps256_mask:
2891 case X86::BI__builtin_ia32_vcvtph2ps512_mask: {
2897 case X86::BI__builtin_ia32_cvtneps2bf16_128_mask: {
2901 Intrinsic::ID IID = Intrinsic::x86_avx512bf16_mask_cvtneps2bf16_128;
2902 return Builder.CreateCall(
CGM.getIntrinsic(IID), Ops);
2905 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
2906 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask: {
2908 switch (BuiltinID) {
2909 default: llvm_unreachable(
"Unsupported intrinsic!");
2910 case X86::BI__builtin_ia32_cvtneps2bf16_256_mask:
2911 IID = Intrinsic::x86_avx512bf16_cvtneps2bf16_256;
2913 case X86::BI__builtin_ia32_cvtneps2bf16_512_mask:
2914 IID = Intrinsic::x86_avx512bf16_cvtneps2bf16_512;
2921 case X86::BI__cpuid:
2922 case X86::BI__cpuidex: {
2924 Value *SubFuncId = BuiltinID == X86::BI__cpuidex
2926 : llvm::ConstantInt::get(
Int32Ty, 0);
2928 llvm::StructType *CpuidRetTy =
2930 llvm::FunctionType *FTy =
2933 StringRef
Asm, Constraints;
2936 Constraints =
"={ax},={bx},={cx},={dx},{ax},{cx}";
2939 Asm =
"xchgq %rbx, ${1:q}\n"
2941 "xchgq %rbx, ${1:q}";
2942 Constraints =
"={ax},=r,={cx},={dx},0,2";
2945 llvm::InlineAsm *IA = llvm::InlineAsm::get(FTy,
Asm, Constraints,
2947 Value *IACall =
Builder.CreateCall(IA, {FuncId, SubFuncId});
2949 Value *Store =
nullptr;
2950 for (
unsigned i = 0; i < 4; i++) {
2951 Value *Extracted =
Builder.CreateExtractValue(IACall, i);
2962 case X86::BI__emulu: {
2964 bool isSigned = (BuiltinID == X86::BI__emul);
2967 return Builder.CreateMul(LHS, RHS,
"", !isSigned, isSigned);
2970 case X86::BI__umulh:
2971 case X86::BI_mul128:
2972 case X86::BI_umul128: {
2974 llvm::Type *Int128Ty = llvm::IntegerType::get(
getLLVMContext(), 128);
2976 bool IsSigned = (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI_mul128);
2977 Value *LHS =
Builder.CreateIntCast(Ops[0], Int128Ty, IsSigned);
2978 Value *RHS =
Builder.CreateIntCast(Ops[1], Int128Ty, IsSigned);
2980 Value *MulResult, *HigherBits;
2982 MulResult =
Builder.CreateNSWMul(LHS, RHS);
2983 HigherBits =
Builder.CreateAShr(MulResult, 64);
2985 MulResult =
Builder.CreateNUWMul(LHS, RHS);
2986 HigherBits =
Builder.CreateLShr(MulResult, 64);
2988 HigherBits =
Builder.CreateIntCast(HigherBits, ResType, IsSigned);
2990 if (BuiltinID == X86::BI__mulh || BuiltinID == X86::BI__umulh)
2994 Builder.CreateStore(HigherBits, HighBitsAddress);
2995 return Builder.CreateIntCast(MulResult, ResType, IsSigned);
2998 case X86::BI__faststorefence: {
2999 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
3000 llvm::SyncScope::System);
3002 case X86::BI__shiftleft128:
3003 case X86::BI__shiftright128: {
3004 llvm::Function *F =
CGM.getIntrinsic(
3005 BuiltinID == X86::BI__shiftleft128 ? Intrinsic::fshl : Intrinsic::fshr,
3010 std::swap(Ops[0], Ops[1]);
3012 return Builder.CreateCall(F, Ops);
3014 case X86::BI_ReadWriteBarrier:
3015 case X86::BI_ReadBarrier:
3016 case X86::BI_WriteBarrier: {
3017 return Builder.CreateFence(llvm::AtomicOrdering::SequentiallyConsistent,
3018 llvm::SyncScope::SingleThread);
3021 case X86::BI_AddressOfReturnAddress: {
3026 case X86::BI__stosb: {
3029 return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], Align(1),
true);
3034 case X86::BI__int2c: {
3036 llvm::FunctionType *FTy = llvm::FunctionType::get(
VoidTy,
false);
3037 llvm::InlineAsm *IA =
3038 llvm::InlineAsm::get(FTy,
"int $$0x2c",
"",
true);
3039 llvm::AttributeList NoReturnAttr = llvm::AttributeList::get(
3041 llvm::Attribute::NoReturn);
3042 llvm::CallInst *CI =
Builder.CreateCall(IA);
3043 CI->setAttributes(NoReturnAttr);
3046 case X86::BI__readfsbyte:
3047 case X86::BI__readfsword:
3048 case X86::BI__readfsdword:
3049 case X86::BI__readfsqword: {
3053 LoadInst *Load =
Builder.CreateAlignedLoad(
3055 Load->setVolatile(
true);
3058 case X86::BI__readgsbyte:
3059 case X86::BI__readgsword:
3060 case X86::BI__readgsdword:
3061 case X86::BI__readgsqword: {
3065 LoadInst *Load =
Builder.CreateAlignedLoad(
3067 Load->setVolatile(
true);
3070 case X86::BI__builtin_ia32_encodekey128_u32: {
3071 Intrinsic::ID IID = Intrinsic::x86_encodekey128;
3075 for (
int i = 0; i < 3; ++i) {
3078 Builder.CreateAlignedStore(Extract, Ptr, Align(1));
3083 case X86::BI__builtin_ia32_encodekey256_u32: {
3084 Intrinsic::ID IID = Intrinsic::x86_encodekey256;
3087 Builder.CreateCall(
CGM.getIntrinsic(IID), {Ops[0], Ops[1], Ops[2]});
3089 for (
int i = 0; i < 4; ++i) {
3092 Builder.CreateAlignedStore(Extract, Ptr, Align(1));
3097 case X86::BI__builtin_ia32_aesenc128kl_u8:
3098 case X86::BI__builtin_ia32_aesdec128kl_u8:
3099 case X86::BI__builtin_ia32_aesenc256kl_u8:
3100 case X86::BI__builtin_ia32_aesdec256kl_u8: {
3102 StringRef BlockName;
3103 switch (BuiltinID) {
3105 llvm_unreachable(
"Unexpected builtin");
3106 case X86::BI__builtin_ia32_aesenc128kl_u8:
3107 IID = Intrinsic::x86_aesenc128kl;
3108 BlockName =
"aesenc128kl";
3110 case X86::BI__builtin_ia32_aesdec128kl_u8:
3111 IID = Intrinsic::x86_aesdec128kl;
3112 BlockName =
"aesdec128kl";
3114 case X86::BI__builtin_ia32_aesenc256kl_u8:
3115 IID = Intrinsic::x86_aesenc256kl;
3116 BlockName =
"aesenc256kl";
3118 case X86::BI__builtin_ia32_aesdec256kl_u8:
3119 IID = Intrinsic::x86_aesdec256kl;
3120 BlockName =
"aesdec256kl";
3126 BasicBlock *NoError =
3136 Builder.SetInsertPoint(NoError);
3137 Builder.CreateDefaultAlignedStore(Out, Ops[0]);
3141 Constant *
Zero = llvm::Constant::getNullValue(Out->getType());
3148 case X86::BI__builtin_ia32_aesencwide128kl_u8:
3149 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
3150 case X86::BI__builtin_ia32_aesencwide256kl_u8:
3151 case X86::BI__builtin_ia32_aesdecwide256kl_u8: {
3153 StringRef BlockName;
3154 switch (BuiltinID) {
3155 case X86::BI__builtin_ia32_aesencwide128kl_u8:
3156 IID = Intrinsic::x86_aesencwide128kl;
3157 BlockName =
"aesencwide128kl";
3159 case X86::BI__builtin_ia32_aesdecwide128kl_u8:
3160 IID = Intrinsic::x86_aesdecwide128kl;
3161 BlockName =
"aesdecwide128kl";
3163 case X86::BI__builtin_ia32_aesencwide256kl_u8:
3164 IID = Intrinsic::x86_aesencwide256kl;
3165 BlockName =
"aesencwide256kl";
3167 case X86::BI__builtin_ia32_aesdecwide256kl_u8:
3168 IID = Intrinsic::x86_aesdecwide256kl;
3169 BlockName =
"aesdecwide256kl";
3173 llvm::Type *Ty = FixedVectorType::get(
Builder.getInt64Ty(), 2);
3176 for (
int i = 0; i != 8; ++i) {
3177 Value *Ptr =
Builder.CreateConstGEP1_32(Ty, Ops[1], i);
3178 InOps[i + 1] =
Builder.CreateAlignedLoad(Ty, Ptr, Align(16));
3183 BasicBlock *NoError =
3192 Builder.SetInsertPoint(NoError);
3193 for (
int i = 0; i != 8; ++i) {
3195 Value *Ptr =
Builder.CreateConstGEP1_32(Ty, Ops[0], i);
3196 Builder.CreateAlignedStore(Extract, Ptr, Align(16));
3201 for (
int i = 0; i != 8; ++i) {
3203 Value *Ptr =
Builder.CreateConstGEP1_32(Ty, Ops[0], i);
3211 case X86::BI__builtin_ia32_vfcmaddcph512_mask:
3214 case X86::BI__builtin_ia32_vfmaddcph512_mask: {
3215 Intrinsic::ID IID = IsConjFMA
3216 ? Intrinsic::x86_avx512fp16_mask_vfcmadd_cph_512
3217 : Intrinsic::x86_avx512fp16_mask_vfmadd_cph_512;
3221 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask:
3224 case X86::BI__builtin_ia32_vfmaddcsh_round_mask: {
3225 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx512fp16_mask_vfcmadd_csh
3226 : Intrinsic::x86_avx512fp16_mask_vfmadd_csh;
3231 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3:
3234 case X86::BI__builtin_ia32_vfmaddcsh_round_mask3: {
3235 Intrinsic::ID IID = IsConjFMA ? Intrinsic::x86_avx512fp16_mask_vfcmadd_csh
3236 : Intrinsic::x86_avx512fp16_mask_vfmadd_csh;
3238 static constexpr int Mask[] = {0, 5, 6, 7};
3239 return Builder.CreateShuffleVector(
Call, Ops[2], Mask);
3241 case X86::BI__builtin_ia32_prefetchi:
3243 CGM.getIntrinsic(Intrinsic::prefetch, Ops[0]->getType()),
3244 {Ops[0], llvm::ConstantInt::get(Int32Ty, 0), Ops[1],
3245 llvm::ConstantInt::get(Int32Ty, 0)});