Skip to content

Commit 0006cd6

Browse files
authored
[CIR] Upstream builtin scatter from ClangIR incubator (llvm#170353)
Part of [llvm#167752](llvm#167752)
1 parent 94232f9 commit 0006cd6

File tree

2 files changed

+257
-2
lines changed

2 files changed

+257
-2
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
758758
std::min(cast<cir::VectorType>(ops[0].getType()).getSize(),
759759
cast<cir::VectorType>(ops[2].getType()).getSize());
760760
ops[3] = getMaskVecValue(builder, loc, ops[3], minElts);
761-
return emitIntrinsicCallOp(builder, loc, intrinsicName.str(),
761+
return emitIntrinsicCallOp(builder, loc, intrinsicName,
762762
convertType(expr->getType()), ops);
763763
}
764764
case X86::BI__builtin_ia32_scattersiv8df:
@@ -784,7 +784,94 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
784784
case X86::BI__builtin_ia32_scattersiv4sf:
785785
case X86::BI__builtin_ia32_scattersiv4si:
786786
case X86::BI__builtin_ia32_scattersiv8sf:
787-
case X86::BI__builtin_ia32_scattersiv8si:
787+
case X86::BI__builtin_ia32_scattersiv8si: {
788+
llvm::StringRef intrinsicName;
789+
switch (builtinID) {
790+
default:
791+
llvm_unreachable("Unexpected builtin");
792+
case X86::BI__builtin_ia32_scattersiv8df:
793+
intrinsicName = "x86.avx512.mask.scatter.dpd.512";
794+
break;
795+
case X86::BI__builtin_ia32_scattersiv16sf:
796+
intrinsicName = "x86.avx512.mask.scatter.dps.512";
797+
break;
798+
case X86::BI__builtin_ia32_scatterdiv8df:
799+
intrinsicName = "x86.avx512.mask.scatter.qpd.512";
800+
break;
801+
case X86::BI__builtin_ia32_scatterdiv16sf:
802+
intrinsicName = "x86.avx512.mask.scatter.qps.512";
803+
break;
804+
case X86::BI__builtin_ia32_scattersiv8di:
805+
intrinsicName = "x86.avx512.mask.scatter.dpq.512";
806+
break;
807+
case X86::BI__builtin_ia32_scattersiv16si:
808+
intrinsicName = "x86.avx512.mask.scatter.dpi.512";
809+
break;
810+
case X86::BI__builtin_ia32_scatterdiv8di:
811+
intrinsicName = "x86.avx512.mask.scatter.qpq.512";
812+
break;
813+
case X86::BI__builtin_ia32_scatterdiv16si:
814+
intrinsicName = "x86.avx512.mask.scatter.qpi.512";
815+
break;
816+
case X86::BI__builtin_ia32_scatterdiv2df:
817+
intrinsicName = "x86.avx512.mask.scatterdiv2.df";
818+
break;
819+
case X86::BI__builtin_ia32_scatterdiv2di:
820+
intrinsicName = "x86.avx512.mask.scatterdiv2.di";
821+
break;
822+
case X86::BI__builtin_ia32_scatterdiv4df:
823+
intrinsicName = "x86.avx512.mask.scatterdiv4.df";
824+
break;
825+
case X86::BI__builtin_ia32_scatterdiv4di:
826+
intrinsicName = "x86.avx512.mask.scatterdiv4.di";
827+
break;
828+
case X86::BI__builtin_ia32_scatterdiv4sf:
829+
intrinsicName = "x86.avx512.mask.scatterdiv4.sf";
830+
break;
831+
case X86::BI__builtin_ia32_scatterdiv4si:
832+
intrinsicName = "x86.avx512.mask.scatterdiv4.si";
833+
break;
834+
case X86::BI__builtin_ia32_scatterdiv8sf:
835+
intrinsicName = "x86.avx512.mask.scatterdiv8.sf";
836+
break;
837+
case X86::BI__builtin_ia32_scatterdiv8si:
838+
intrinsicName = "x86.avx512.mask.scatterdiv8.si";
839+
break;
840+
case X86::BI__builtin_ia32_scattersiv2df:
841+
intrinsicName = "x86.avx512.mask.scattersiv2.df";
842+
break;
843+
case X86::BI__builtin_ia32_scattersiv2di:
844+
intrinsicName = "x86.avx512.mask.scattersiv2.di";
845+
break;
846+
case X86::BI__builtin_ia32_scattersiv4df:
847+
intrinsicName = "x86.avx512.mask.scattersiv4.df";
848+
break;
849+
case X86::BI__builtin_ia32_scattersiv4di:
850+
intrinsicName = "x86.avx512.mask.scattersiv4.di";
851+
break;
852+
case X86::BI__builtin_ia32_scattersiv4sf:
853+
intrinsicName = "x86.avx512.mask.scattersiv4.sf";
854+
break;
855+
case X86::BI__builtin_ia32_scattersiv4si:
856+
intrinsicName = "x86.avx512.mask.scattersiv4.si";
857+
break;
858+
case X86::BI__builtin_ia32_scattersiv8sf:
859+
intrinsicName = "x86.avx512.mask.scattersiv8.sf";
860+
break;
861+
case X86::BI__builtin_ia32_scattersiv8si:
862+
intrinsicName = "x86.avx512.mask.scattersiv8.si";
863+
break;
864+
}
865+
866+
mlir::Location loc = getLoc(expr->getExprLoc());
867+
unsigned minElts =
868+
std::min(cast<cir::VectorType>(ops[2].getType()).getSize(),
869+
cast<cir::VectorType>(ops[3].getType()).getSize());
870+
ops[1] = getMaskVecValue(builder, loc, ops[1], minElts);
871+
872+
return emitIntrinsicCallOp(builder, loc, intrinsicName,
873+
convertType(expr->getType()), ops);
874+
}
788875
case X86::BI__builtin_ia32_vextractf128_pd256:
789876
case X86::BI__builtin_ia32_vextractf128_ps256:
790877
case X86::BI__builtin_ia32_vextractf128_si256:

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

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,3 +527,171 @@ __m512i test_mm512_ror_epi64(__m512i __A) {
527527
// OGCG: call <8 x i64> @llvm.fshr.v8i64(<8 x i64> %[[VAR]], <8 x i64> %[[VAR]], <8 x i64> splat (i64 5))
528528
return _mm512_ror_epi64(__A, 5);
529529
}
530+
531+
void test_mm512_i32scatter_pd(void *__addr, __m256i __index, __m512d __v1) {
532+
// CIR-LABEL: test_mm512_i32scatter_pd
533+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpd.512"
534+
535+
// LLVM-LABEL: test_mm512_i32scatter_pd
536+
// LLVM: @llvm.x86.avx512.mask.scatter.dpd.512
537+
538+
// OGCG-LABEL: test_mm512_i32scatter_pd
539+
// OGCG: @llvm.x86.avx512.mask.scatter.dpd.512
540+
return _mm512_i32scatter_pd(__addr, __index, __v1, 2);
541+
}
542+
543+
void test_mm512_mask_i32scatter_pd(void *__addr, __mmask8 __mask, __m256i __index, __m512d __v1) {
544+
// CIR-LABEL: test_mm512_mask_i32scatter_pd
545+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpd.512"
546+
547+
// LLVM-LABEL: test_mm512_mask_i32scatter_pd
548+
// LLVM: @llvm.x86.avx512.mask.scatter.dpd.512
549+
550+
// OGCG-LABEL: test_mm512_mask_i32scatter_pd
551+
// OGCG: @llvm.x86.avx512.mask.scatter.dpd.512
552+
return _mm512_mask_i32scatter_pd(__addr, __mask, __index, __v1, 2);
553+
}
554+
555+
void test_mm512_i32scatter_ps(void *__addr, __m512i __index, __m512 __v1) {
556+
// CIR-LABEL: test_mm512_i32scatter_ps
557+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dps.512"
558+
559+
// LLVM-LABEL: test_mm512_i32scatter_ps
560+
// LLVM: @llvm.x86.avx512.mask.scatter.dps.512
561+
562+
// OGCG-LABEL: test_mm512_i32scatter_ps
563+
// OGCG: @llvm.x86.avx512.mask.scatter.dps.512
564+
return _mm512_i32scatter_ps(__addr, __index, __v1, 2);
565+
}
566+
567+
void test_mm512_mask_i32scatter_ps(void *__addr, __mmask16 __mask, __m512i __index, __m512 __v1) {
568+
// CIR-LABEL: test_mm512_mask_i32scatter_ps
569+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dps.512"
570+
571+
// LLVM-LABEL: test_mm512_mask_i32scatter_ps
572+
// LLVM: @llvm.x86.avx512.mask.scatter.dps.512
573+
574+
// OGCG-LABEL: test_mm512_mask_i32scatter_ps
575+
// OGCG: @llvm.x86.avx512.mask.scatter.dps.512
576+
return _mm512_mask_i32scatter_ps(__addr, __mask, __index, __v1, 2);
577+
}
578+
579+
void test_mm512_i64scatter_pd(void *__addr, __m512i __index, __m512d __v1) {
580+
// CIR-LABEL: test_mm512_i64scatter_pd
581+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpd.512"
582+
583+
// LLVM-LABEL: test_mm512_i64scatter_pd
584+
// LLVM: @llvm.x86.avx512.mask.scatter.qpd.512
585+
586+
// OGCG-LABEL: test_mm512_i64scatter_pd
587+
// OGCG: @llvm.x86.avx512.mask.scatter.qpd.512
588+
return _mm512_i64scatter_pd(__addr, __index, __v1, 2);
589+
}
590+
591+
void test_mm512_mask_i64scatter_pd(void *__addr, __mmask8 __mask, __m512i __index, __m512d __v1) {
592+
// CIR-LABEL: test_mm512_mask_i64scatter_pd
593+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpd.512"
594+
595+
// LLVM-LABEL: test_mm512_mask_i64scatter_pd
596+
// LLVM: @llvm.x86.avx512.mask.scatter.qpd.512
597+
598+
// OGCG-LABEL: test_mm512_mask_i64scatter_pd
599+
// OGCG: @llvm.x86.avx512.mask.scatter.qpd.512
600+
return _mm512_mask_i64scatter_pd(__addr, __mask, __index, __v1, 2);
601+
}
602+
603+
void test_mm512_i64scatter_ps(void *__addr, __m512i __index, __m256 __v1) {
604+
// CIR-LABEL: test_mm512_i64scatter_ps
605+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qps.512"
606+
607+
// LLVM-LABEL: test_mm512_i64scatter_ps
608+
// LLVM: @llvm.x86.avx512.mask.scatter.qps.512
609+
610+
// OGCG-LABEL: test_mm512_i64scatter_ps
611+
// OGCG: @llvm.x86.avx512.mask.scatter.qps.512
612+
return _mm512_i64scatter_ps(__addr, __index, __v1, 2);
613+
}
614+
615+
void test_mm512_mask_i64scatter_ps(void *__addr, __mmask8 __mask, __m512i __index, __m256 __v1) {
616+
// CIR-LABEL: test_mm512_mask_i64scatter_ps
617+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qps.512"
618+
619+
// LLVM-LABEL: test_mm512_mask_i64scatter_ps
620+
// LLVM: @llvm.x86.avx512.mask.scatter.qps.512
621+
622+
// OGCG-LABEL: test_mm512_mask_i64scatter_ps
623+
// OGCG: @llvm.x86.avx512.mask.scatter.qps.512
624+
return _mm512_mask_i64scatter_ps(__addr, __mask, __index, __v1, 2);
625+
}
626+
627+
void test_mm512_i32scatter_epi32(void *__addr, __m512i __index, __m512i __v1) {
628+
// CIR-LABEL: test_mm512_i32scatter_epi32
629+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpi.512"
630+
631+
// LLVM-LABEL: test_mm512_i32scatter_epi32
632+
// LLVM: @llvm.x86.avx512.mask.scatter.dpi.512
633+
634+
// OGCG-LABEL: test_mm512_i32scatter_epi32
635+
// OGCG: @llvm.x86.avx512.mask.scatter.dpi.512
636+
return _mm512_i32scatter_epi32(__addr, __index, __v1, 2);
637+
}
638+
639+
void test_mm512_mask_i32scatter_epi32(void *__addr, __mmask16 __mask, __m512i __index, __m512i __v1) {
640+
// CIR-LABEL: test_mm512_mask_i32scatter_epi32
641+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpi.512"
642+
643+
// LLVM-LABEL: test_mm512_mask_i32scatter_epi32
644+
// LLVM: @llvm.x86.avx512.mask.scatter.dpi.512
645+
646+
// OGCG-LABEL: test_mm512_mask_i32scatter_epi32
647+
// OGCG: @llvm.x86.avx512.mask.scatter.dpi.512
648+
return _mm512_mask_i32scatter_epi32(__addr, __mask, __index, __v1, 2);
649+
}
650+
651+
void test_mm512_i64scatter_epi64(void *__addr, __m512i __index, __m512i __v1) {
652+
// CIR-LABEL: test_mm512_i64scatter_epi64
653+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpq.512"
654+
655+
// LLVM-LABEL: test_mm512_i64scatter_epi64
656+
// LLVM: @llvm.x86.avx512.mask.scatter.qpq.512
657+
658+
// OGCG-LABEL: test_mm512_i64scatter_epi64
659+
// OGCG: @llvm.x86.avx512.mask.scatter.qpq.512
660+
return _mm512_i64scatter_epi64(__addr, __index, __v1, 2);
661+
}
662+
663+
void test_mm512_mask_i64scatter_epi64(void *__addr, __mmask8 __mask, __m512i __index, __m512i __v1) {
664+
// CIR-LABEL: test_mm512_mask_i64scatter_epi64
665+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpq.512"
666+
667+
// LLVM-LABEL: test_mm512_mask_i64scatter_epi64
668+
// LLVM: @llvm.x86.avx512.mask.scatter.qpq.512
669+
670+
// OGCG-LABEL: test_mm512_mask_i64scatter_epi64
671+
// OGCG: @llvm.x86.avx512.mask.scatter.qpq.512
672+
return _mm512_mask_i64scatter_epi64(__addr, __mask, __index, __v1, 2);
673+
}
674+
675+
void test_mm512_i64scatter_epi32(void *__addr, __m512i __index, __m256i __v1) {
676+
// CIR-LABEL: test_mm512_i64scatter_epi32
677+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpi.512"
678+
679+
// LLVM-LABEL: test_mm512_i64scatter_epi32
680+
// LLVM: @llvm.x86.avx512.mask.scatter.qpi.512
681+
682+
// OGCG-LABEL: test_mm512_i64scatter_epi32
683+
// OGCG: @llvm.x86.avx512.mask.scatter.qpi.512
684+
return _mm512_i64scatter_epi32(__addr, __index, __v1, 2);
685+
}
686+
687+
void test_mm512_mask_i64scatter_epi32(void *__addr, __mmask8 __mask, __m512i __index, __m256i __v1) {
688+
// CIR-LABEL: test_mm512_mask_i64scatter_epi32
689+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpi.512"
690+
691+
// LLVM-LABEL: test_mm512_mask_i64scatter_epi32
692+
// LLVM: @llvm.x86.avx512.mask.scatter.qpi.512
693+
694+
// OGCG-LABEL: test_mm512_mask_i64scatter_epi32
695+
// OGCG: @llvm.x86.avx512.mask.scatter.qpi.512
696+
return _mm512_mask_i64scatter_epi32(__addr, __mask, __index, __v1, 2);
697+
}

0 commit comments

Comments
 (0)