Skip to content

Commit 61c61c5

Browse files
committed
[CIR][CIRGen][Builtin][X86] Lower avx512 gather intrinsics
1 parent 942008c commit 61c61c5

File tree

3 files changed

+368
-2
lines changed

3 files changed

+368
-2
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -746,8 +746,95 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
746746
case X86::BI__builtin_ia32_gathersiv8di:
747747
case X86::BI__builtin_ia32_gathersiv16si:
748748
case X86::BI__builtin_ia32_gatherdiv8di:
749-
case X86::BI__builtin_ia32_gatherdiv16si:
750-
llvm_unreachable("gather3div2df NYI");
749+
case X86::BI__builtin_ia32_gatherdiv16si: {
750+
StringRef intrinsicName;
751+
switch (BuiltinID) {
752+
default:
753+
llvm_unreachable("Unexpected builtin");
754+
case X86::BI__builtin_ia32_gather3div2df:
755+
intrinsicName = "x86.avx512.mask.gather3div2.df";
756+
break;
757+
case X86::BI__builtin_ia32_gather3div2di:
758+
intrinsicName = "x86.avx512.mask.gather3div2.di";
759+
break;
760+
case X86::BI__builtin_ia32_gather3div4df:
761+
intrinsicName = "x86.avx512.mask.gather3div4.df";
762+
break;
763+
case X86::BI__builtin_ia32_gather3div4di:
764+
intrinsicName = "x86.avx512.mask.gather3div4.di";
765+
break;
766+
case X86::BI__builtin_ia32_gather3div4sf:
767+
intrinsicName = "x86.avx512.mask.gather3div4.sf";
768+
break;
769+
case X86::BI__builtin_ia32_gather3div4si:
770+
intrinsicName = "x86.avx512.mask.gather3div4.si";
771+
break;
772+
case X86::BI__builtin_ia32_gather3div8sf:
773+
intrinsicName = "x86.avx512.mask.gather3div8.sf";
774+
break;
775+
case X86::BI__builtin_ia32_gather3div8si:
776+
intrinsicName = "x86.avx512.mask.gather3div8.si";
777+
break;
778+
case X86::BI__builtin_ia32_gather3siv2df:
779+
intrinsicName = "x86.avx512.mask.gather3siv2.df";
780+
break;
781+
case X86::BI__builtin_ia32_gather3siv2di:
782+
intrinsicName = "x86.avx512.mask.gather3siv2.di";
783+
break;
784+
case X86::BI__builtin_ia32_gather3siv4df:
785+
intrinsicName = "x86.avx512.mask.gather3siv4.df";
786+
break;
787+
case X86::BI__builtin_ia32_gather3siv4di:
788+
intrinsicName = "x86.avx512.mask.gather3siv4.di";
789+
break;
790+
case X86::BI__builtin_ia32_gather3siv4sf:
791+
intrinsicName = "x86.avx512.mask.gather3siv4.sf";
792+
break;
793+
case X86::BI__builtin_ia32_gather3siv4si:
794+
intrinsicName = "x86.avx512.mask.gather3siv4.si";
795+
break;
796+
case X86::BI__builtin_ia32_gather3siv8sf:
797+
intrinsicName = "x86.avx512.mask.gather3siv8.sf";
798+
break;
799+
case X86::BI__builtin_ia32_gather3siv8si:
800+
intrinsicName = "x86.avx512.mask.gather3siv8.si";
801+
break;
802+
case X86::BI__builtin_ia32_gathersiv8df:
803+
intrinsicName = "x86.avx512.mask.gather.dpd.512";
804+
break;
805+
case X86::BI__builtin_ia32_gathersiv16sf:
806+
intrinsicName = "x86.avx512.mask.gather.dps.512";
807+
break;
808+
case X86::BI__builtin_ia32_gatherdiv8df:
809+
intrinsicName = "x86.avx512.mask.gather.qpd.512";
810+
break;
811+
case X86::BI__builtin_ia32_gatherdiv16sf:
812+
intrinsicName = "x86.avx512.mask.gather.qps.512";
813+
break;
814+
case X86::BI__builtin_ia32_gathersiv8di:
815+
intrinsicName = "x86.avx512.mask.gather.dpq.512";
816+
break;
817+
case X86::BI__builtin_ia32_gathersiv16si:
818+
intrinsicName = "x86.avx512.mask.gather.dpi.512";
819+
break;
820+
case X86::BI__builtin_ia32_gatherdiv8di:
821+
intrinsicName = "x86.avx512.mask.gather.qpq.512";
822+
break;
823+
case X86::BI__builtin_ia32_gatherdiv16si:
824+
intrinsicName = "x86.avx512.mask.gather.qpi.512";
825+
break;
826+
}
827+
828+
unsigned minElts =
829+
std::min(cast<cir::VectorType>(Ops[0].getType()).getSize(),
830+
cast<cir::VectorType>(Ops[2].getType()).getSize());
831+
Ops[3] = getMaskVecValue(*this, Ops[3], minElts, getLoc(E->getExprLoc()));
832+
return builder
833+
.create<cir::LLVMIntrinsicCallOp>(
834+
getLoc(E->getExprLoc()), builder.getStringAttr(intrinsicName.str()),
835+
convertType(E->getType()), Ops)
836+
.getResult();
837+
}
751838
case X86::BI__builtin_ia32_scattersiv8df:
752839
case X86::BI__builtin_ia32_scattersiv16sf:
753840
case X86::BI__builtin_ia32_scatterdiv8df:

clang/test/CIR/CodeGen/X86/avx512f-builtins.c

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,138 @@ __m512i test_mm512_maskz_expandloadu_epi32(__mmask16 __U, void const *__P) {
337337
// LLVM: @llvm.masked.expandload.v16i32(ptr %{{.*}}, <16 x i1> %{{.*}}, <16 x i32> %{{.*}})
338338
return _mm512_maskz_expandloadu_epi32(__U, __P);
339339
}
340+
341+
__m512d test_mm512_i32gather_pd(__m256i __index, void const *__addr) {
342+
// CIR-LABEL: _mm512_i32gather_pd
343+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.dpd.512"
344+
345+
// LLVM-LABEL: test_mm512_i32gather_pd
346+
// LLVM: @llvm.x86.avx512.mask.gather.dpd.512
347+
return _mm512_i32gather_pd(__index, __addr, 2);
348+
}
349+
350+
__m512d test_mm512_mask_i32gather_pd(__m512d __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
351+
// CIR-LABEL: _mm512_mask_i32gather_pd
352+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.dpd.512"
353+
354+
// LLVM-LABEL: test_mm512_mask_i32gather_pd
355+
// LLVM: @llvm.x86.avx512.mask.gather.dpd.512
356+
return _mm512_mask_i32gather_pd(__v1_old, __mask, __index, __addr, 2);
357+
}
358+
359+
__m512 test_mm512_i32gather_ps(__m512i __index, void const *__addr) {
360+
// CIR-LABEL: _mm512_i32gather_ps
361+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.dps.512"
362+
363+
// LLVM-LABEL: test_mm512_i32gather_ps
364+
// LLVM: @llvm.x86.avx512.mask.gather.dps.512
365+
return _mm512_i32gather_ps(__index, __addr, 2);
366+
}
367+
368+
__m512d test_mm512_i64gather_pd(__m512i __index, void const *__addr) {
369+
// CIR-LABEL: _mm512_i64gather_pd
370+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qpd.512"
371+
372+
// LLVM-LABEL: test_mm512_i64gather_pd
373+
// CHECK: @llvm.x86.avx512.mask.gather.qpd.512
374+
return _mm512_i64gather_pd(__index, __addr, 2);
375+
}
376+
377+
__m512d test_mm512_mask_i64gather_pd(__m512d __v1_old, __mmask8 __mask, __m512i __index, void const *__addr) {
378+
// CIR-LABEL: _mm512_mask_i64gather_pd
379+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qpd.512"
380+
381+
// LLVM-LABEL: test_mm512_mask_i64gather_pd
382+
// CHECK: @llvm.x86.avx512.mask.gather.qpd.512
383+
return _mm512_mask_i64gather_pd(__v1_old, __mask, __index, __addr, 2);
384+
}
385+
386+
__m256 test_mm512_i64gather_ps(__m512i __index, void const *__addr) {
387+
// CIR-LABEL: _mm512_i64gather_ps
388+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qps.512"
389+
390+
// LLVM-LABEL: test_mm512_i64gather_ps
391+
// LLVM: @llvm.x86.avx512.mask.gather.qps.512
392+
return _mm512_i64gather_ps(__index, __addr, 2);
393+
}
394+
395+
__m256 test_mm512_mask_i64gather_ps(__m256 __v1_old, __mmask8 __mask, __m512i __index, void const *__addr) {
396+
// CIR-LABEL: _mm512_mask_i64gather_ps
397+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qps.512"
398+
399+
// LLVM-LABEL: test_mm512_mask_i64gather_ps
400+
// LLVM: @llvm.x86.avx512.mask.gather.qps.512
401+
return _mm512_mask_i64gather_ps(__v1_old, __mask, __index, __addr, 2);
402+
}
403+
404+
__m512i test_mm512_i32gather_epi64(__m256i __index, void const *__addr) {
405+
// CIR-LABEL: _mm512_i32gather_epi64
406+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.dpq.512"
407+
408+
// LLVM-LABEL: test_mm512_i32gather_epi64
409+
// LLVM: @llvm.x86.avx512.mask.gather.dpq.512
410+
return _mm512_i32gather_epi64(__index, __addr, 2);
411+
}
412+
413+
__m512i test_mm512_mask_i32gather_epi64(__m512i __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
414+
// CIR-LABEL: _mm512_mask_i32gather_epi64
415+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.dpq.512"
416+
417+
// LLVM-LABEL: test_mm512_mask_i32gather_epi64
418+
// LLVM: @llvm.x86.avx512.mask.gather.dpq.512
419+
return _mm512_mask_i32gather_epi64(__v1_old, __mask, __index, __addr, 2);
420+
}
421+
422+
__m512i test_mm512_i32gather_epi32(__m512i __index, void const *__addr) {
423+
// CIR-LABEL: _mm512_i32gather_epi32
424+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.dpi.512"
425+
426+
// LLVM-LABEL: test_mm512_i32gather_epi32
427+
// LLVM: @llvm.x86.avx512.mask.gather.dpi.512
428+
return _mm512_i32gather_epi32(__index, __addr, 2);
429+
}
430+
431+
__m512i test_mm512_mask_i32gather_epi32(__m512i __v1_old, __mmask16 __mask, __m512i __index, void const *__addr) {
432+
// CIR-LABEL: _mm512_mask_i32gather_epi32
433+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.dpi.512"
434+
435+
// LLVM-LABEL: test_mm512_mask_i32gather_epi32
436+
// LLVM: @llvm.x86.avx512.mask.gather.dpi.512
437+
return _mm512_mask_i32gather_epi32(__v1_old, __mask, __index, __addr, 2);
438+
}
439+
440+
__m512i test_mm512_i64gather_epi64(__m512i __index, void const *__addr) {
441+
// CIR-LABEL: _mm512_i64gather_epi64
442+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qpq.512"
443+
444+
// LLVM-LABEL: test_mm512_i64gather_epi64
445+
// LLVM: @llvm.x86.avx512.mask.gather.qpq.512
446+
return _mm512_i64gather_epi64(__index, __addr, 2);
447+
}
448+
449+
__m512i test_mm512_mask_i64gather_epi64(__m512i __v1_old, __mmask8 __mask, __m512i __index, void const *__addr) {
450+
// CIR-LABEL: _mm512_mask_i64gather_epi64
451+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qpq.512"
452+
453+
// LLVM-LABEL: test_mm512_mask_i64gather_epi64
454+
// LLVM: @llvm.x86.avx512.mask.gather.qpq.512
455+
return _mm512_mask_i64gather_epi64(__v1_old, __mask, __index, __addr, 2);
456+
}
457+
458+
__m256i test_mm512_i64gather_epi32(__m512i __index, void const *__addr) {
459+
// CIR-LABEL: _mm512_i64gather_epi32
460+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qpi.512"
461+
462+
// LLVM-LABEL: test_mm512_i64gather_epi32
463+
// LLVM: @llvm.x86.avx512.mask.gather.qpi.512
464+
return _mm512_i64gather_epi32(__index, __addr, 2);
465+
}
466+
467+
__m256i test_mm512_mask_i64gather_epi32(__m256i __v1_old, __mmask8 __mask, __m512i __index, void const *__addr) {
468+
// CIR-LABEL: _mm512_mask_i64gather_epi32
469+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather.qpi.512"
470+
471+
// LLVM-LABEL: test_mm512_mask_i64gather_epi32
472+
// LLVM: @llvm.x86.avx512.mask.gather.qpi.512
473+
return _mm512_mask_i64gather_epi32(__v1_old, __mask, __index, __addr, 2);
474+
}

clang/test/CIR/CodeGen/X86/avx512vl-builtins.c

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,3 +527,147 @@ __m256i test_mm256_maskz_expandloadu_epi32(__mmask8 __U, void const *__P) {
527527
// LLVM: @llvm.masked.expandload.v8i32(ptr %{{.*}}, <8 x i1> %{{.*}}, <8 x i32> %{{.*}})
528528
return _mm256_maskz_expandloadu_epi32(__U,__P);
529529
}
530+
531+
__m128d test_mm_mmask_i64gather_pd(__m128d __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
532+
// CIR-LABEL: test_mm_mmask_i64gather_pd
533+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div2.df"
534+
535+
// LLVM-LABEL: @test_mm_mmask_i64gather_pd
536+
// LLVM: @llvm.x86.avx512.mask.gather3div2.df
537+
return _mm_mmask_i64gather_pd(__v1_old, __mask, __index, __addr, 2);
538+
}
539+
540+
__m128i test_mm_mmask_i64gather_epi64(__m128i __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
541+
// CIR-LABEL: test_mm_mmask_i64gather_epi64
542+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div2.di"
543+
544+
// LLVM-LABEL: @test_mm_mmask_i64gather_epi64
545+
// LLVM: @llvm.x86.avx512.mask.gather3div2.di
546+
return _mm_mmask_i64gather_epi64(__v1_old, __mask, __index, __addr, 2);
547+
}
548+
549+
__m256d test_mm256_mmask_i64gather_pd(__m256d __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
550+
// CIR-LABEL: test_mm256_mmask_i64gather_pd
551+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div4.df"
552+
553+
// LLVM-LABEL: @test_mm256_mmask_i64gather_pd
554+
// LLVM: @llvm.x86.avx512.mask.gather3div4.df
555+
return _mm256_mmask_i64gather_pd(__v1_old, __mask, __index, __addr, 2);
556+
}
557+
558+
__m256i test_mm256_mmask_i64gather_epi64(__m256i __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
559+
// CIR-LABEL: test_mm256_mmask_i64gather_epi64
560+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div4.di"
561+
562+
// LLVM-LABEL: @test_mm256_mmask_i64gather_epi64
563+
// LLVM: @llvm.x86.avx512.mask.gather3div4.di
564+
return _mm256_mmask_i64gather_epi64(__v1_old, __mask, __index, __addr, 2);
565+
}
566+
567+
__m128 test_mm_mmask_i64gather_ps(__m128 __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
568+
// CIR-LABEL: test_mm_mmask_i64gather_ps
569+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div4.sf"
570+
571+
// LLVM-LABEL: @test_mm_mmask_i64gather_ps
572+
// LLVM: @llvm.x86.avx512.mask.gather3div4.sf
573+
return _mm_mmask_i64gather_ps(__v1_old, __mask, __index, __addr, 2);
574+
}
575+
576+
__m128i test_mm_mmask_i64gather_epi32(__m128i __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
577+
// CIR-LABEL: test_mm_mmask_i64gather_epi32
578+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div4.si"
579+
580+
// LLVM-LABEL: @test_mm_mmask_i64gather_epi32
581+
// LLVM: @llvm.x86.avx512.mask.gather3div4.si
582+
return _mm_mmask_i64gather_epi32(__v1_old, __mask, __index, __addr, 2);
583+
}
584+
585+
__m128 test_mm256_mmask_i64gather_ps(__m128 __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
586+
// CIR-LABEL: test_mm256_mmask_i64gather_ps
587+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div8.sf"
588+
589+
// LLVM-LABEL: @test_mm256_mmask_i64gather_ps
590+
// LLVM: @llvm.x86.avx512.mask.gather3div8.sf
591+
return _mm256_mmask_i64gather_ps(__v1_old, __mask, __index, __addr, 2);
592+
}
593+
594+
__m128i test_mm256_mmask_i64gather_epi32(__m128i __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
595+
// CIR-LABEL: test_mm256_mmask_i64gather_epi32
596+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3div8.si"
597+
598+
// LLVM-LABEL: @test_mm256_mmask_i64gather_epi32
599+
// LLVM: @llvm.x86.avx512.mask.gather3div8.si
600+
return _mm256_mmask_i64gather_epi32(__v1_old, __mask, __index, __addr, 2);
601+
}
602+
603+
__m128d test_mm_mask_i32gather_pd(__m128d __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
604+
// CIR-LABEL: test_mm_mask_i32gather_pd
605+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv2.df"
606+
607+
// LLVM-LABEL: @test_mm_mask_i32gather_pd
608+
// LLVM: @llvm.x86.avx512.mask.gather3siv2.df
609+
return _mm_mmask_i32gather_pd(__v1_old, __mask, __index, __addr, 2);
610+
}
611+
612+
__m128i test_mm_mask_i32gather_epi64(__m128i __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
613+
// CIR-LABEL: test_mm_mask_i32gather_epi64
614+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv2.di"
615+
616+
// LLVM-LABEL: @test_mm_mask_i32gather_epi64
617+
// LLVM: @llvm.x86.avx512.mask.gather3siv2.di
618+
return _mm_mmask_i32gather_epi64(__v1_old, __mask, __index, __addr, 2);
619+
}
620+
621+
__m256d test_mm256_mask_i32gather_pd(__m256d __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
622+
// CIR-LABEL: test_mm256_mask_i32gather_pd
623+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv4.df"
624+
625+
// LLVM-LABEL: @test_mm256_mask_i32gather_pd
626+
// LLVM: @llvm.x86.avx512.mask.gather3siv4.df
627+
return _mm256_mmask_i32gather_pd(__v1_old, __mask, __index, __addr, 2);
628+
}
629+
630+
__m256i test_mm256_mask_i32gather_epi64(__m256i __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
631+
// CIR-LABEL: test_mm256_mask_i32gather_epi64
632+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv4.di"
633+
634+
// LLVM-LABEL: @test_mm256_mask_i32gather_epi64
635+
// LLVM: @llvm.x86.avx512.mask.gather3siv4.di
636+
return _mm256_mmask_i32gather_epi64(__v1_old, __mask, __index, __addr, 2);
637+
}
638+
639+
__m128 test_mm_mask_i32gather_ps(__m128 __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
640+
// CIR-LABEL: test_mm_mask_i32gather_ps
641+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv4.sf"
642+
643+
// LLVM-LABEL: @test_mm_mask_i32gather_ps
644+
// LLVM: @llvm.x86.avx512.mask.gather3siv4.sf
645+
return _mm_mmask_i32gather_ps(__v1_old, __mask, __index, __addr, 2);
646+
}
647+
648+
__m128i test_mm_mask_i32gather_epi32(__m128i __v1_old, __mmask8 __mask, __m128i __index, void const *__addr) {
649+
// CIR-LABEL: test_mm_mask_i32gather_epi32
650+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv4.si"
651+
652+
// LLVM-LABEL: @test_mm_mask_i32gather_epi32
653+
// LLVM: @llvm.x86.avx512.mask.gather3siv4.si
654+
return _mm_mmask_i32gather_epi32(__v1_old, __mask, __index, __addr, 2);
655+
}
656+
657+
__m256 test_mm256_mask_i32gather_ps(__m256 __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
658+
// CIR-LABEL: test_mm256_mask_i32gather_ps
659+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv8.sf"
660+
661+
// LLVM-LABEL: @test_mm256_mask_i32gather_ps
662+
// LLVM: @llvm.x86.avx512.mask.gather3siv8.sf
663+
return _mm256_mmask_i32gather_ps(__v1_old, __mask, __index, __addr, 2);
664+
}
665+
666+
__m256i test_mm256_mask_i32gather_epi32(__m256i __v1_old, __mmask8 __mask, __m256i __index, void const *__addr) {
667+
// CIR-LABEL: test_mm256_mask_i32gather_epi32
668+
// CIR: cir.llvm.intrinsic "x86.avx512.mask.gather3siv8.si"
669+
670+
// LLVM-LABEL: @test_mm256_mask_i32gather_epi32
671+
// LLVM: @llvm.x86.avx512.mask.gather3siv8.si
672+
return _mm256_mmask_i32gather_epi32(__v1_old, __mask, __index, __addr, 2);
673+
}

0 commit comments

Comments
 (0)