@@ -115,6 +115,21 @@ static mlir::Value emitX86MaskLogic(CIRGenBuilderTy &builder,
115115 ops[0 ].getType ());
116116}
117117
118+ static mlir::Value emitVecInsert (CIRGenBuilderTy &builder, mlir::Location loc,
119+ mlir::Value vec, mlir::Value value,
120+ mlir::Value indexOp) {
121+ unsigned numElts = cast<cir::VectorType>(vec.getType ()).getSize ();
122+
123+ uint64_t index =
124+ indexOp.getDefiningOp <cir::ConstantOp>().getIntValue ().getZExtValue ();
125+
126+ index &= numElts - 1 ;
127+
128+ cir::ConstantOp indexVal = builder.getUInt64 (index, loc);
129+
130+ return cir::VecInsertOp::create (builder, loc, vec, value, indexVal);
131+ }
132+
118133mlir::Value CIRGenFunction::emitX86BuiltinExpr (unsigned builtinID,
119134 const CallExpr *expr) {
120135 if (builtinID == Builtin::BI__builtin_cpu_is) {
@@ -238,11 +253,11 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
238253 case X86::BI__builtin_ia32_vec_set_v32qi:
239254 case X86::BI__builtin_ia32_vec_set_v16hi:
240255 case X86::BI__builtin_ia32_vec_set_v8si:
241- case X86::BI__builtin_ia32_vec_set_v4di:
242- cgm. errorNYI ( expr->getSourceRange () ,
243- std::string ( " unimplemented X86 builtin call: " ) +
244- getContext (). BuiltinInfo . getName (builtinID));
245- return {};
256+ case X86::BI__builtin_ia32_vec_set_v4di: {
257+ return emitVecInsert (builder, getLoc ( expr->getExprLoc ()), ops[ 0 ], ops[ 1 ] ,
258+ ops[ 2 ]);
259+ }
260+
246261 case X86::BI_mm_setcsr:
247262 case X86::BI__builtin_ia32_ldmxcsr: {
248263 mlir::Location loc = getLoc (expr->getExprLoc ());
@@ -487,6 +502,10 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
487502 case X86::BI__builtin_ia32_compressqi128_mask:
488503 case X86::BI__builtin_ia32_compressqi256_mask:
489504 case X86::BI__builtin_ia32_compressqi512_mask:
505+ cgm.errorNYI (expr->getSourceRange (),
506+ std::string (" unimplemented X86 builtin call: " ) +
507+ getContext ().BuiltinInfo .getName (builtinID));
508+ return {};
490509 case X86::BI__builtin_ia32_gather3div2df:
491510 case X86::BI__builtin_ia32_gather3div2di:
492511 case X86::BI__builtin_ia32_gather3div4df:
@@ -510,7 +529,93 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
510529 case X86::BI__builtin_ia32_gathersiv8di:
511530 case X86::BI__builtin_ia32_gathersiv16si:
512531 case X86::BI__builtin_ia32_gatherdiv8di:
513- case X86::BI__builtin_ia32_gatherdiv16si:
532+ case X86::BI__builtin_ia32_gatherdiv16si: {
533+ StringRef intrinsicName;
534+ switch (builtinID) {
535+ default :
536+ llvm_unreachable (" Unexpected builtin" );
537+ case X86::BI__builtin_ia32_gather3div2df:
538+ intrinsicName = " x86.avx512.mask.gather3div2.df" ;
539+ break ;
540+ case X86::BI__builtin_ia32_gather3div2di:
541+ intrinsicName = " x86.avx512.mask.gather3div2.di" ;
542+ break ;
543+ case X86::BI__builtin_ia32_gather3div4df:
544+ intrinsicName = " x86.avx512.mask.gather3div4.df" ;
545+ break ;
546+ case X86::BI__builtin_ia32_gather3div4di:
547+ intrinsicName = " x86.avx512.mask.gather3div4.di" ;
548+ break ;
549+ case X86::BI__builtin_ia32_gather3div4sf:
550+ intrinsicName = " x86.avx512.mask.gather3div4.sf" ;
551+ break ;
552+ case X86::BI__builtin_ia32_gather3div4si:
553+ intrinsicName = " x86.avx512.mask.gather3div4.si" ;
554+ break ;
555+ case X86::BI__builtin_ia32_gather3div8sf:
556+ intrinsicName = " x86.avx512.mask.gather3div8.sf" ;
557+ break ;
558+ case X86::BI__builtin_ia32_gather3div8si:
559+ intrinsicName = " x86.avx512.mask.gather3div8.si" ;
560+ break ;
561+ case X86::BI__builtin_ia32_gather3siv2df:
562+ intrinsicName = " x86.avx512.mask.gather3siv2.df" ;
563+ break ;
564+ case X86::BI__builtin_ia32_gather3siv2di:
565+ intrinsicName = " x86.avx512.mask.gather3siv2.di" ;
566+ break ;
567+ case X86::BI__builtin_ia32_gather3siv4df:
568+ intrinsicName = " x86.avx512.mask.gather3siv4.df" ;
569+ break ;
570+ case X86::BI__builtin_ia32_gather3siv4di:
571+ intrinsicName = " x86.avx512.mask.gather3siv4.di" ;
572+ break ;
573+ case X86::BI__builtin_ia32_gather3siv4sf:
574+ intrinsicName = " x86.avx512.mask.gather3siv4.sf" ;
575+ break ;
576+ case X86::BI__builtin_ia32_gather3siv4si:
577+ intrinsicName = " x86.avx512.mask.gather3siv4.si" ;
578+ break ;
579+ case X86::BI__builtin_ia32_gather3siv8sf:
580+ intrinsicName = " x86.avx512.mask.gather3siv8.sf" ;
581+ break ;
582+ case X86::BI__builtin_ia32_gather3siv8si:
583+ intrinsicName = " x86.avx512.mask.gather3siv8.si" ;
584+ break ;
585+ case X86::BI__builtin_ia32_gathersiv8df:
586+ intrinsicName = " x86.avx512.mask.gather.dpd.512" ;
587+ break ;
588+ case X86::BI__builtin_ia32_gathersiv16sf:
589+ intrinsicName = " x86.avx512.mask.gather.dps.512" ;
590+ break ;
591+ case X86::BI__builtin_ia32_gatherdiv8df:
592+ intrinsicName = " x86.avx512.mask.gather.qpd.512" ;
593+ break ;
594+ case X86::BI__builtin_ia32_gatherdiv16sf:
595+ intrinsicName = " x86.avx512.mask.gather.qps.512" ;
596+ break ;
597+ case X86::BI__builtin_ia32_gathersiv8di:
598+ intrinsicName = " x86.avx512.mask.gather.dpq.512" ;
599+ break ;
600+ case X86::BI__builtin_ia32_gathersiv16si:
601+ intrinsicName = " x86.avx512.mask.gather.dpi.512" ;
602+ break ;
603+ case X86::BI__builtin_ia32_gatherdiv8di:
604+ intrinsicName = " x86.avx512.mask.gather.qpq.512" ;
605+ break ;
606+ case X86::BI__builtin_ia32_gatherdiv16si:
607+ intrinsicName = " x86.avx512.mask.gather.qpi.512" ;
608+ break ;
609+ }
610+
611+ mlir::Location loc = getLoc (expr->getExprLoc ());
612+ unsigned minElts =
613+ std::min (cast<cir::VectorType>(ops[0 ].getType ()).getSize (),
614+ cast<cir::VectorType>(ops[2 ].getType ()).getSize ());
615+ ops[3 ] = getMaskVecValue (builder, loc, ops[3 ], minElts);
616+ return emitIntrinsicCallOp (builder, loc, intrinsicName.str (),
617+ convertType (expr->getType ()), ops);
618+ }
514619 case X86::BI__builtin_ia32_scattersiv8df:
515620 case X86::BI__builtin_ia32_scattersiv16sf:
516621 case X86::BI__builtin_ia32_scatterdiv8df:
0 commit comments