Skip to content

Commit 1c02d3d

Browse files
committed
Upstream scatter from ClangIR incubator
1 parent e0f3302 commit 1c02d3d

File tree

2 files changed

+256
-1
lines changed

2 files changed

+256
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,94 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
685685
case X86::BI__builtin_ia32_scattersiv4sf:
686686
case X86::BI__builtin_ia32_scattersiv4si:
687687
case X86::BI__builtin_ia32_scattersiv8sf:
688-
case X86::BI__builtin_ia32_scattersiv8si:
688+
case X86::BI__builtin_ia32_scattersiv8si: {
689+
llvm::StringRef intrinsicName;
690+
switch (builtinID) {
691+
default:
692+
llvm_unreachable("Unexpected builtin");
693+
case X86::BI__builtin_ia32_scattersiv8df:
694+
intrinsicName = "x86.avx512.mask.scatter.dpd.512";
695+
break;
696+
case X86::BI__builtin_ia32_scattersiv16sf:
697+
intrinsicName = "x86.avx512.mask.scatter.dps.512";
698+
break;
699+
case X86::BI__builtin_ia32_scatterdiv8df:
700+
intrinsicName = "x86.avx512.mask.scatter.qpd.512";
701+
break;
702+
case X86::BI__builtin_ia32_scatterdiv16sf:
703+
intrinsicName = "x86.avx512.mask.scatter.qps.512";
704+
break;
705+
case X86::BI__builtin_ia32_scattersiv8di:
706+
intrinsicName = "x86.avx512.mask.scatter.dpq.512";
707+
break;
708+
case X86::BI__builtin_ia32_scattersiv16si:
709+
intrinsicName = "x86.avx512.mask.scatter.dpi.512";
710+
break;
711+
case X86::BI__builtin_ia32_scatterdiv8di:
712+
intrinsicName = "x86.avx512.mask.scatter.qpq.512";
713+
break;
714+
case X86::BI__builtin_ia32_scatterdiv16si:
715+
intrinsicName = "x86.avx512.mask.scatter.qpi.512";
716+
break;
717+
case X86::BI__builtin_ia32_scatterdiv2df:
718+
intrinsicName = "x86.avx512.mask.scatterdiv2.df";
719+
break;
720+
case X86::BI__builtin_ia32_scatterdiv2di:
721+
intrinsicName = "x86.avx512.mask.scatterdiv2.di";
722+
break;
723+
case X86::BI__builtin_ia32_scatterdiv4df:
724+
intrinsicName = "x86.avx512.mask.scatterdiv4.df";
725+
break;
726+
case X86::BI__builtin_ia32_scatterdiv4di:
727+
intrinsicName = "x86.avx512.mask.scatterdiv4.di";
728+
break;
729+
case X86::BI__builtin_ia32_scatterdiv4sf:
730+
intrinsicName = "x86.avx512.mask.scatterdiv4.sf";
731+
break;
732+
case X86::BI__builtin_ia32_scatterdiv4si:
733+
intrinsicName = "x86.avx512.mask.scatterdiv4.si";
734+
break;
735+
case X86::BI__builtin_ia32_scatterdiv8sf:
736+
intrinsicName = "x86.avx512.mask.scatterdiv8.sf";
737+
break;
738+
case X86::BI__builtin_ia32_scatterdiv8si:
739+
intrinsicName = "x86.avx512.mask.scatterdiv8.si";
740+
break;
741+
case X86::BI__builtin_ia32_scattersiv2df:
742+
intrinsicName = "x86.avx512.mask.scattersiv2.df";
743+
break;
744+
case X86::BI__builtin_ia32_scattersiv2di:
745+
intrinsicName = "x86.avx512.mask.scattersiv2.di";
746+
break;
747+
case X86::BI__builtin_ia32_scattersiv4df:
748+
intrinsicName = "x86.avx512.mask.scattersiv4.df";
749+
break;
750+
case X86::BI__builtin_ia32_scattersiv4di:
751+
intrinsicName = "x86.avx512.mask.scattersiv4.di";
752+
break;
753+
case X86::BI__builtin_ia32_scattersiv4sf:
754+
intrinsicName = "x86.avx512.mask.scattersiv4.sf";
755+
break;
756+
case X86::BI__builtin_ia32_scattersiv4si:
757+
intrinsicName = "x86.avx512.mask.scattersiv4.si";
758+
break;
759+
case X86::BI__builtin_ia32_scattersiv8sf:
760+
intrinsicName = "x86.avx512.mask.scattersiv8.sf";
761+
break;
762+
case X86::BI__builtin_ia32_scattersiv8si:
763+
intrinsicName = "x86.avx512.mask.scattersiv8.si";
764+
break;
765+
}
766+
767+
mlir::Location loc = getLoc(expr->getExprLoc());
768+
unsigned minElts =
769+
std::min(cast<cir::VectorType>(ops[2].getType()).getSize(),
770+
cast<cir::VectorType>(ops[3].getType()).getSize());
771+
ops[1] = getMaskVecValue(builder, loc, ops[1], minElts);
772+
773+
return emitIntrinsicCallOp(builder, loc, intrinsicName.str(),
774+
convertType(expr->getType()), ops);
775+
}
689776
case X86::BI__builtin_ia32_vextractf128_pd256:
690777
case X86::BI__builtin_ia32_vextractf128_ps256:
691778
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
@@ -446,3 +446,171 @@ __m512i test_mm512_mask_i32gather_epi64(__m512i __v1_old, __mmask8 __mask, __m25
446446
// OGCG: call <8 x i64> @llvm.x86.avx512.mask.gather.dpq.512
447447
return _mm512_mask_i32gather_epi64(__v1_old, __mask, __index, __addr, 2);
448448
}
449+
450+
void test_mm512_i32scatter_pd(void *__addr, __m256i __index, __m512d __v1) {
451+
// CIR-LABEL: test_mm512_i32scatter_pd
452+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpd.512"
453+
454+
// LLVM-LABEL: test_mm512_i32scatter_pd
455+
// LLVM: @llvm.x86.avx512.mask.scatter.dpd.512
456+
457+
// OGCG-LABEL: test_mm512_i32scatter_pd
458+
// OGCG: @llvm.x86.avx512.mask.scatter.dpd.512
459+
return _mm512_i32scatter_pd(__addr, __index, __v1, 2);
460+
}
461+
462+
void test_mm512_mask_i32scatter_pd(void *__addr, __mmask8 __mask, __m256i __index, __m512d __v1) {
463+
// CIR-LABEL: test_mm512_mask_i32scatter_pd
464+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpd.512"
465+
466+
// LLVM-LABEL: test_mm512_mask_i32scatter_pd
467+
// LLVM: @llvm.x86.avx512.mask.scatter.dpd.512
468+
469+
// OGCG-LABEL: test_mm512_mask_i32scatter_pd
470+
// OGCG: @llvm.x86.avx512.mask.scatter.dpd.512
471+
return _mm512_mask_i32scatter_pd(__addr, __mask, __index, __v1, 2);
472+
}
473+
474+
void test_mm512_i32scatter_ps(void *__addr, __m512i __index, __m512 __v1) {
475+
// CIR-LABEL: test_mm512_i32scatter_ps
476+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dps.512"
477+
478+
// LLVM-LABEL: test_mm512_i32scatter_ps
479+
// LLVM: @llvm.x86.avx512.mask.scatter.dps.512
480+
481+
// OGCG-LABEL: test_mm512_i32scatter_ps
482+
// OGCG: @llvm.x86.avx512.mask.scatter.dps.512
483+
return _mm512_i32scatter_ps(__addr, __index, __v1, 2);
484+
}
485+
486+
void test_mm512_mask_i32scatter_ps(void *__addr, __mmask16 __mask, __m512i __index, __m512 __v1) {
487+
// CIR-LABEL: test_mm512_mask_i32scatter_ps
488+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dps.512"
489+
490+
// LLVM-LABEL: test_mm512_mask_i32scatter_ps
491+
// LLVM: @llvm.x86.avx512.mask.scatter.dps.512
492+
493+
// OGCG-LABEL: test_mm512_mask_i32scatter_ps
494+
// OGCG: @llvm.x86.avx512.mask.scatter.dps.512
495+
return _mm512_mask_i32scatter_ps(__addr, __mask, __index, __v1, 2);
496+
}
497+
498+
void test_mm512_i64scatter_pd(void *__addr, __m512i __index, __m512d __v1) {
499+
// CIR-LABEL: test_mm512_i64scatter_pd
500+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpd.512"
501+
502+
// LLVM-LABEL: test_mm512_i64scatter_pd
503+
// LLVM: @llvm.x86.avx512.mask.scatter.qpd.512
504+
505+
// OGCG-LABEL: test_mm512_i64scatter_pd
506+
// OGCG: @llvm.x86.avx512.mask.scatter.qpd.512
507+
return _mm512_i64scatter_pd(__addr, __index, __v1, 2);
508+
}
509+
510+
void test_mm512_mask_i64scatter_pd(void *__addr, __mmask8 __mask, __m512i __index, __m512d __v1) {
511+
// CIR-LABEL: test_mm512_mask_i64scatter_pd
512+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpd.512"
513+
514+
// LLVM-LABEL: test_mm512_mask_i64scatter_pd
515+
// LLVM: @llvm.x86.avx512.mask.scatter.qpd.512
516+
517+
// OGCG-LABEL: test_mm512_mask_i64scatter_pd
518+
// OGCG: @llvm.x86.avx512.mask.scatter.qpd.512
519+
return _mm512_mask_i64scatter_pd(__addr, __mask, __index, __v1, 2);
520+
}
521+
522+
void test_mm512_i64scatter_ps(void *__addr, __m512i __index, __m256 __v1) {
523+
// CIR-LABEL: test_mm512_i64scatter_ps
524+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qps.512"
525+
526+
// LLVM-LABEL: test_mm512_i64scatter_ps
527+
// LLVM: @llvm.x86.avx512.mask.scatter.qps.512
528+
529+
// OGCG-LABEL: test_mm512_i64scatter_ps
530+
// OGCG: @llvm.x86.avx512.mask.scatter.qps.512
531+
return _mm512_i64scatter_ps(__addr, __index, __v1, 2);
532+
}
533+
534+
void test_mm512_mask_i64scatter_ps(void *__addr, __mmask8 __mask, __m512i __index, __m256 __v1) {
535+
// CIR-LABEL: test_mm512_mask_i64scatter_ps
536+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qps.512"
537+
538+
// LLVM-LABEL: test_mm512_mask_i64scatter_ps
539+
// LLVM: @llvm.x86.avx512.mask.scatter.qps.512
540+
541+
// OGCG-LABEL: test_mm512_mask_i64scatter_ps
542+
// OGCG: @llvm.x86.avx512.mask.scatter.qps.512
543+
return _mm512_mask_i64scatter_ps(__addr, __mask, __index, __v1, 2);
544+
}
545+
546+
void test_mm512_i32scatter_epi32(void *__addr, __m512i __index, __m512i __v1) {
547+
// CIR-LABEL: test_mm512_i32scatter_epi32
548+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpi.512"
549+
550+
// LLVM-LABEL: test_mm512_i32scatter_epi32
551+
// LLVM: @llvm.x86.avx512.mask.scatter.dpi.512
552+
553+
// OGCG-LABEL: test_mm512_i32scatter_epi32
554+
// OGCG: @llvm.x86.avx512.mask.scatter.dpi.512
555+
return _mm512_i32scatter_epi32(__addr, __index, __v1, 2);
556+
}
557+
558+
void test_mm512_mask_i32scatter_epi32(void *__addr, __mmask16 __mask, __m512i __index, __m512i __v1) {
559+
// CIR-LABEL: test_mm512_mask_i32scatter_epi32
560+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.dpi.512"
561+
562+
// LLVM-LABEL: test_mm512_mask_i32scatter_epi32
563+
// LLVM: @llvm.x86.avx512.mask.scatter.dpi.512
564+
565+
// OGCG-LABEL: test_mm512_mask_i32scatter_epi32
566+
// OGCG: @llvm.x86.avx512.mask.scatter.dpi.512
567+
return _mm512_mask_i32scatter_epi32(__addr, __mask, __index, __v1, 2);
568+
}
569+
570+
void test_mm512_i64scatter_epi64(void *__addr, __m512i __index, __m512i __v1) {
571+
// CIR-LABEL: test_mm512_i64scatter_epi64
572+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpq.512"
573+
574+
// LLVM-LABEL: test_mm512_i64scatter_epi64
575+
// LLVM: @llvm.x86.avx512.mask.scatter.qpq.512
576+
577+
// OGCG-LABEL: test_mm512_i64scatter_epi64
578+
// OGCG: @llvm.x86.avx512.mask.scatter.qpq.512
579+
return _mm512_i64scatter_epi64(__addr, __index, __v1, 2);
580+
}
581+
582+
void test_mm512_mask_i64scatter_epi64(void *__addr, __mmask8 __mask, __m512i __index, __m512i __v1) {
583+
// CIR-LABEL: test_mm512_mask_i64scatter_epi64
584+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpq.512"
585+
586+
// LLVM-LABEL: test_mm512_mask_i64scatter_epi64
587+
// LLVM: @llvm.x86.avx512.mask.scatter.qpq.512
588+
589+
// OGCG-LABEL: test_mm512_mask_i64scatter_epi64
590+
// OGCG: @llvm.x86.avx512.mask.scatter.qpq.512
591+
return _mm512_mask_i64scatter_epi64(__addr, __mask, __index, __v1, 2);
592+
}
593+
594+
void test_mm512_i64scatter_epi32(void *__addr, __m512i __index, __m256i __v1) {
595+
// CIR-LABEL: test_mm512_i64scatter_epi32
596+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpi.512"
597+
598+
// LLVM-LABEL: test_mm512_i64scatter_epi32
599+
// LLVM: @llvm.x86.avx512.mask.scatter.qpi.512
600+
601+
// OGCG-LABEL: test_mm512_i64scatter_epi32
602+
// OGCG: @llvm.x86.avx512.mask.scatter.qpi.512
603+
return _mm512_i64scatter_epi32(__addr, __index, __v1, 2);
604+
}
605+
606+
void test_mm512_mask_i64scatter_epi32(void *__addr, __mmask8 __mask, __m512i __index, __m256i __v1) {
607+
// CIR-LABEL: test_mm512_mask_i64scatter_epi32
608+
// CIR: cir.call_llvm_intrinsic "x86.avx512.mask.scatter.qpi.512"
609+
610+
// LLVM-LABEL: test_mm512_mask_i64scatter_epi32
611+
// LLVM: @llvm.x86.avx512.mask.scatter.qpi.512
612+
613+
// OGCG-LABEL: test_mm512_mask_i64scatter_epi32
614+
// OGCG: @llvm.x86.avx512.mask.scatter.qpi.512
615+
return _mm512_mask_i64scatter_epi32(__addr, __mask, __index, __v1, 2);
616+
}

0 commit comments

Comments
 (0)