Skip to content

Commit 80716b1

Browse files
committed
[CIR][CIRGen][Builtin][X86] Lower compressstore x86 intrinsics
1 parent aed448e commit 80716b1

File tree

5 files changed

+168
-1
lines changed

5 files changed

+168
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,21 @@ static mlir::Value emitX86ExpandLoad(CIRGenFunction &cgf,
134134
.getResult();
135135
}
136136

137+
static mlir::Value emitX86CompressStore(CIRGenFunction &cgf,
138+
ArrayRef<mlir::Value> ops,
139+
mlir::Location loc) {
140+
auto resultTy = cast<cir::VectorType>(ops[1].getType());
141+
mlir::Value ptr = ops[0];
142+
143+
mlir::Value maskVec = getMaskVecValue(cgf, ops[2], resultTy.getSize(), loc);
144+
145+
return cgf.getBuilder()
146+
.create<cir::LLVMIntrinsicCallOp>(
147+
loc, cgf.getBuilder().getStringAttr("masked.compressstore"),
148+
cgf.getBuilder().getVoidTy(), mlir::ValueRange{ops[1], ptr, maskVec})
149+
.getResult();
150+
}
151+
137152
static mlir::Value emitX86SExtMask(CIRGenFunction &cgf, mlir::Value op,
138153
mlir::Type dstTy, mlir::Location loc) {
139154
unsigned numberOfElements = cast<cir::VectorType>(dstTy).getSize();
@@ -645,7 +660,7 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
645660
case X86::BI__builtin_ia32_compressstoreqi128_mask:
646661
case X86::BI__builtin_ia32_compressstoreqi256_mask:
647662
case X86::BI__builtin_ia32_compressstoreqi512_mask:
648-
llvm_unreachable("compress*_mask NYI");
663+
return emitX86CompressStore(*this, Ops, getLoc(E->getExprLoc()));
649664

650665
case X86::BI__builtin_ia32_expanddf128_mask:
651666
case X86::BI__builtin_ia32_expanddf256_mask:

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,39 @@ __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+
void test_mm512_mask_compressstoreu_pd(void *__P, __mmask8 __U, __m512d __A) {
342+
// CIR-LABEL: _mm512_mask_compressstoreu_pd
343+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.double x 8>, !cir.ptr<!cir.vector<!cir.double x 8>>, !cir.vector<!cir.int<s, 1> x 8>) -> !void
344+
345+
// LLVM-LABEL: test_mm512_mask_compressstoreu_pd
346+
// LLVM: @llvm.masked.compressstore.v8f64(<8 x double> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}})
347+
return _mm512_mask_compressstoreu_pd(__P, __U, __A);
348+
}
349+
350+
void test_mm512_mask_compressstoreu_ps(void *__P, __mmask16 __U, __m512 __A) {
351+
// CIR-LABEL: _mm512_mask_compressstoreu_ps
352+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.float x 16>, !cir.ptr<!cir.vector<!cir.float x 16>>, !cir.vector<!cir.int<s, 1> x 16>) -> !void
353+
354+
// LLVM-LABEL: test_mm512_mask_compressstoreu_ps
355+
// LLVM: @llvm.masked.compressstore.v16f32(<16 x float> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}})
356+
return _mm512_mask_compressstoreu_ps(__P, __U, __A);
357+
}
358+
359+
void test_mm512_mask_compressstoreu_epi64(void *__P, __mmask8 __U, __m512i __A) {
360+
// CIR-LABEL: _mm512_mask_compressstoreu_epi64
361+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s64i x 8>, !cir.ptr<!cir.vector<!s64i x 8>>, !cir.vector<!cir.int<s, 1> x 8>) -> !void
362+
363+
// LLVM-LABEL: test_mm512_mask_compressstoreu_epi64
364+
// LLVM: @llvm.masked.compressstore.v8i64(<8 x i64> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}})
365+
return _mm512_mask_compressstoreu_epi64(__P, __U, __A);
366+
}
367+
368+
void test_mm512_mask_compressstoreu_epi32(void *__P, __mmask16 __U, __m512i __A) {
369+
// CIR-LABEL: _mm512_mask_compressstoreu_epi32
370+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s32i x 16>, !cir.ptr<!cir.vector<!s32i x 16>>, !cir.vector<!cir.int<s, 1> x 16>) -> !void
371+
372+
// LLVM-LABEL: test_mm512_mask_compressstoreu_epi32
373+
// LLVM: @llvm.masked.compressstore.v16i32(<16 x i32> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}})
374+
return _mm512_mask_compressstoreu_epi32(__P, __U, __A);
375+
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,21 @@ __m512i test_mm512_maskz_expandloadu_epi8(__mmask64 __U, void const* __P) {
4040
// LLVM: @llvm.masked.expandload.v64i8(ptr %{{.*}}, <64 x i1> %{{.*}}, <64 x i8> %{{.*}})
4141
return _mm512_maskz_expandloadu_epi8(__U, __P);
4242
}
43+
44+
void test_mm512_mask_compressstoreu_epi16(void *__P, __mmask32 __U, __m512i __D) {
45+
// CIR-LABEL: _mm512_mask_compressstoreu_epi16
46+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s16i x 32>, !cir.ptr<!cir.vector<!s16i x 32>>, !cir.vector<!cir.int<s, 1> x 32>) -> !void
47+
48+
// LLVM-LABEL: @test_mm512_mask_compressstoreu_epi16
49+
// LLVM: @llvm.masked.compressstore.v32i16(<32 x i16> %{{.*}}, ptr %{{.*}}, <32 x i1> %{{.*}})
50+
_mm512_mask_compressstoreu_epi16(__P, __U, __D);
51+
}
52+
53+
void test_mm512_mask_compressstoreu_epi8(void *__P, __mmask64 __U, __m512i __D) {
54+
// CIR-LABEL: _mm512_mask_compressstoreu_epi8
55+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s8i x 64>, !cir.ptr<!cir.vector<!s8i x 64>>, !cir.vector<!cir.int<s, 1> x 64>) -> !void
56+
57+
// LLVM-LABEL: @test_mm512_mask_compressstoreu_epi8
58+
// LLVM: @llvm.masked.compressstore.v64i8(<64 x i8> %{{.*}}, ptr %{{.*}}, <64 x i1> %{{.*}})
59+
_mm512_mask_compressstoreu_epi8(__P, __U, __D);
60+
}

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

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,3 +527,74 @@ __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+
void test_mm_mask_compressstoreu_pd(void *__P, __mmask8 __U, __m128d __A) {
532+
// CIR-LABEL: _mm_mask_compressstoreu_pd
533+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.double x 2>, !cir.ptr<!cir.vector<!cir.double x 2>>, !cir.vector<!cir.int<s, 1> x 2>) -> !void
534+
535+
// LLVM-LABEL: @test_mm_mask_compressstoreu_pd
536+
// LLVM: @llvm.masked.compressstore.v2f64(<2 x double> %{{.*}}, ptr %{{.*}}, <2 x i1> %{{.*}})
537+
return _mm_mask_compressstoreu_pd(__P,__U,__A);
538+
}
539+
540+
void test_mm256_mask_compressstoreu_pd(void *__P, __mmask8 __U, __m256d __A) {
541+
// CIR-LABEL: _mm256_mask_compressstoreu_pd
542+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.double x 4>, !cir.ptr<!cir.vector<!cir.double x 4>>, !cir.vector<!cir.int<s, 1> x 4>) -> !void
543+
544+
// LLVM-LABEL: @test_mm256_mask_compressstoreu_pd
545+
// LLVM: @llvm.masked.compressstore.v4f64(<4 x double> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}})
546+
return _mm256_mask_compressstoreu_pd(__P,__U,__A);
547+
}
548+
void test_mm_mask_compressstoreu_ps(void *__P, __mmask8 __U, __m128 __A) {
549+
// CIR-LABEL: _mm_mask_compressstoreu_ps
550+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.float x 4>, !cir.ptr<!cir.vector<!cir.float x 4>>, !cir.vector<!cir.int<s, 1> x 4>) -> !void
551+
552+
// LLVM-LABEL: @test_mm_mask_compressstoreu_ps
553+
// LLVM: @llvm.masked.compressstore.v4f32(<4 x float> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}})
554+
return _mm_mask_compressstoreu_ps(__P,__U,__A);
555+
}
556+
557+
void test_mm256_mask_compressstoreu_ps(void *__P, __mmask8 __U, __m256 __A) {
558+
// CIR-LABEL: _mm256_mask_compressstoreu_ps
559+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.float x 8>, !cir.ptr<!cir.vector<!cir.float x 8>>, !cir.vector<!cir.int<s, 1> x 8>) -> !void
560+
561+
// LLVM-LABEL: @test_mm256_mask_compressstoreu_ps
562+
// LLVM: @llvm.masked.compressstore.v8f32(<8 x float> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}})
563+
return _mm256_mask_compressstoreu_ps(__P,__U,__A);
564+
}
565+
566+
void test_mm_mask_compressstoreu_epi64(void *__P, __mmask8 __U, __m128i __A) {
567+
// CIR-LABEL: _mm_mask_compressstoreu_epi64
568+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s64i x 2>, !cir.ptr<!cir.vector<!s64i x 2>>, !cir.vector<!cir.int<s, 1> x 2>) -> !void
569+
570+
// LLVM-LABEL: @test_mm_mask_compressstoreu_epi64
571+
// LLVM: @llvm.masked.compressstore.v2i64(<2 x i64> %{{.*}}, ptr %{{.*}}, <2 x i1> %{{.*}})
572+
return _mm_mask_compressstoreu_epi64(__P,__U,__A);
573+
}
574+
575+
void test_mm256_mask_compressstoreu_epi64(void *__P, __mmask8 __U, __m256i __A) {
576+
// CIR-LABEL: _mm256_mask_compressstoreu_epi64
577+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s64i x 4>, !cir.ptr<!cir.vector<!s64i x 4>>, !cir.vector<!cir.int<s, 1> x 4>) -> !void
578+
579+
// LLVM-LABEL: @test_mm256_mask_compressstoreu_epi64
580+
// LLVM: @llvm.masked.compressstore.v4i64(<4 x i64> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}})
581+
return _mm256_mask_compressstoreu_epi64(__P,__U,__A);
582+
}
583+
584+
void test_mm_mask_compressstoreu_epi32(void *__P, __mmask8 __U, __m128i __A) {
585+
// CIR-LABEL: _mm_mask_compressstoreu_epi32
586+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s32i x 4>, !cir.ptr<!cir.vector<!s32i x 4>>, !cir.vector<!cir.int<s, 1> x 4>) -> !void
587+
588+
// LLVM-LABEL: @test_mm_mask_compressstoreu_epi32
589+
// LLVM: @llvm.masked.compressstore.v4i32(<4 x i32> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}})
590+
return _mm_mask_compressstoreu_epi32(__P,__U,__A);
591+
}
592+
593+
void test_mm256_mask_compressstoreu_epi32(void *__P, __mmask8 __U, __m256i __A) {
594+
// CIR-LABEL: _mm256_mask_compressstoreu_epi32
595+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s32i x 8>, !cir.ptr<!cir.vector<!s32i x 8>>, !cir.vector<!cir.int<s, 1> x 8>) -> !void
596+
597+
// LLVM-LABEL: @test_mm256_mask_compressstoreu_epi32
598+
// LLVM: @llvm.masked.compressstore.v8i32(<8 x i32> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}})
599+
return _mm256_mask_compressstoreu_epi32(__P,__U,__A);
600+
}

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,30 @@ __m256i test_mm256_maskz_expandloadu_epi8(__mmask32 __U, void const* __P) {
7676
// LLVM: @llvm.masked.expandload.v32i8(ptr %{{.*}}, <32 x i1> %{{.*}}, <32 x i8> %{{.*}})
7777
return _mm256_maskz_expandloadu_epi8(__U, __P);
7878
}
79+
80+
void test_mm256_mask_compressstoreu_epi16(void *__P, __mmask16 __U, __m256i __D) {
81+
// CIR-LABEL: _mm256_mask_compressstoreu_epi16
82+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s16i x 16>, !cir.ptr<!cir.vector<!s16i x 16>>, !cir.vector<!cir.int<s, 1> x 16>) -> !void
83+
84+
// LLVM-LABEL: @test_mm256_mask_compressstoreu_epi16
85+
// LLVM: @llvm.masked.compressstore.v16i16(<16 x i16> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}})
86+
_mm256_mask_compressstoreu_epi16(__P, __U, __D);
87+
}
88+
89+
void test_mm_mask_compressstoreu_epi8(void *__P, __mmask16 __U, __m128i __D) {
90+
// CIR-LABEL: _mm_mask_compressstoreu_epi8
91+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s8i x 16>, !cir.ptr<!cir.vector<!s8i x 16>>, !cir.vector<!cir.int<s, 1> x 16>) -> !void
92+
93+
// LLVM-LABEL: @test_mm_mask_compressstoreu_epi8
94+
// LLVM: @llvm.masked.compressstore.v16i8(<16 x i8> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}})
95+
_mm_mask_compressstoreu_epi8(__P, __U, __D);
96+
}
97+
98+
void test_mm256_mask_compressstoreu_epi8(void *__P, __mmask32 __U, __m256i __D) {
99+
// CIR-LABEL: _mm256_mask_compressstoreu_epi8
100+
// CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s8i x 32>, !cir.ptr<!cir.vector<!s8i x 32>>, !cir.vector<!cir.int<s, 1> x 32>) -> !void
101+
102+
// LLVM-LABEL: @test_mm256_mask_compressstoreu_epi8
103+
// LLVM: @llvm.masked.compressstore.v32i8(<32 x i8> %{{.*}}, ptr %{{.*}}, <32 x i1> %{{.*}})
104+
_mm256_mask_compressstoreu_epi8(__P, __U, __D);
105+
}

0 commit comments

Comments
 (0)