diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp index aa1a9d7be9cc..38ba28ba7291 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp @@ -134,6 +134,21 @@ static mlir::Value emitX86ExpandLoad(CIRGenFunction &cgf, .getResult(); } +static mlir::Value emitX86CompressStore(CIRGenFunction &cgf, + ArrayRef ops, + mlir::Location loc) { + auto resultTy = cast(ops[1].getType()); + mlir::Value ptr = ops[0]; + + mlir::Value maskVec = getMaskVecValue(cgf, ops[2], resultTy.getSize(), loc); + + return cgf.getBuilder() + .create( + loc, cgf.getBuilder().getStringAttr("masked.compressstore"), + cgf.getBuilder().getVoidTy(), mlir::ValueRange{ops[1], ptr, maskVec}) + .getResult(); +} + static mlir::Value emitX86SExtMask(CIRGenFunction &cgf, mlir::Value op, mlir::Type dstTy, mlir::Location loc) { unsigned numberOfElements = cast(dstTy).getSize(); @@ -645,7 +660,7 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_compressstoreqi128_mask: case X86::BI__builtin_ia32_compressstoreqi256_mask: case X86::BI__builtin_ia32_compressstoreqi512_mask: - llvm_unreachable("compress*_mask NYI"); + return emitX86CompressStore(*this, Ops, getLoc(E->getExprLoc())); case X86::BI__builtin_ia32_expanddf128_mask: case X86::BI__builtin_ia32_expanddf256_mask: diff --git a/clang/test/CIR/CodeGen/X86/avx512f-builtins.c b/clang/test/CIR/CodeGen/X86/avx512f-builtins.c index e2c37dd47a99..7a89758d8140 100644 --- a/clang/test/CIR/CodeGen/X86/avx512f-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512f-builtins.c @@ -337,3 +337,39 @@ __m512i test_mm512_maskz_expandloadu_epi32(__mmask16 __U, void const *__P) { // LLVM: @llvm.masked.expandload.v16i32(ptr %{{.*}}, <16 x i1> %{{.*}}, <16 x i32> %{{.*}}) return _mm512_maskz_expandloadu_epi32(__U, __P); } + +void test_mm512_mask_compressstoreu_pd(void *__P, __mmask8 __U, __m512d __A) { + // CIR-LABEL: _mm512_mask_compressstoreu_pd + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 8>) -> !void + + // LLVM-LABEL: test_mm512_mask_compressstoreu_pd + // LLVM: @llvm.masked.compressstore.v8f64(<8 x double> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}}) + return _mm512_mask_compressstoreu_pd(__P, __U, __A); +} + +void test_mm512_mask_compressstoreu_ps(void *__P, __mmask16 __U, __m512 __A) { + // CIR-LABEL: _mm512_mask_compressstoreu_ps + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 16>) -> !void + + // LLVM-LABEL: test_mm512_mask_compressstoreu_ps + // LLVM: @llvm.masked.compressstore.v16f32(<16 x float> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}}) + return _mm512_mask_compressstoreu_ps(__P, __U, __A); +} + +void test_mm512_mask_compressstoreu_epi64(void *__P, __mmask8 __U, __m512i __A) { + // CIR-LABEL: _mm512_mask_compressstoreu_epi64 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 8>) -> !void + + // LLVM-LABEL: test_mm512_mask_compressstoreu_epi64 + // LLVM: @llvm.masked.compressstore.v8i64(<8 x i64> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}}) + return _mm512_mask_compressstoreu_epi64(__P, __U, __A); +} + +void test_mm512_mask_compressstoreu_epi32(void *__P, __mmask16 __U, __m512i __A) { + // CIR-LABEL: _mm512_mask_compressstoreu_epi32 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 16>) -> !void + + // LLVM-LABEL: test_mm512_mask_compressstoreu_epi32 + // LLVM: @llvm.masked.compressstore.v16i32(<16 x i32> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}}) + return _mm512_mask_compressstoreu_epi32(__P, __U, __A); +} \ No newline at end of file diff --git a/clang/test/CIR/CodeGen/X86/avx512vbmi2-builtins.c b/clang/test/CIR/CodeGen/X86/avx512vbmi2-builtins.c index a46ae8b543e7..bb9aa5d1f1c1 100644 --- a/clang/test/CIR/CodeGen/X86/avx512vbmi2-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512vbmi2-builtins.c @@ -40,3 +40,21 @@ __m512i test_mm512_maskz_expandloadu_epi8(__mmask64 __U, void const* __P) { // LLVM: @llvm.masked.expandload.v64i8(ptr %{{.*}}, <64 x i1> %{{.*}}, <64 x i8> %{{.*}}) return _mm512_maskz_expandloadu_epi8(__U, __P); } + +void test_mm512_mask_compressstoreu_epi16(void *__P, __mmask32 __U, __m512i __D) { + // CIR-LABEL: _mm512_mask_compressstoreu_epi16 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 32>) -> !void + + // LLVM-LABEL: @test_mm512_mask_compressstoreu_epi16 + // LLVM: @llvm.masked.compressstore.v32i16(<32 x i16> %{{.*}}, ptr %{{.*}}, <32 x i1> %{{.*}}) + _mm512_mask_compressstoreu_epi16(__P, __U, __D); +} + +void test_mm512_mask_compressstoreu_epi8(void *__P, __mmask64 __U, __m512i __D) { + // CIR-LABEL: _mm512_mask_compressstoreu_epi8 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 64>) -> !void + + // LLVM-LABEL: @test_mm512_mask_compressstoreu_epi8 + // LLVM: @llvm.masked.compressstore.v64i8(<64 x i8> %{{.*}}, ptr %{{.*}}, <64 x i1> %{{.*}}) + _mm512_mask_compressstoreu_epi8(__P, __U, __D); +} diff --git a/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c b/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c index 10cf8a48b113..8e4027e2503f 100644 --- a/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c @@ -527,3 +527,74 @@ __m256i test_mm256_maskz_expandloadu_epi32(__mmask8 __U, void const *__P) { // LLVM: @llvm.masked.expandload.v8i32(ptr %{{.*}}, <8 x i1> %{{.*}}, <8 x i32> %{{.*}}) return _mm256_maskz_expandloadu_epi32(__U,__P); } + +void test_mm_mask_compressstoreu_pd(void *__P, __mmask8 __U, __m128d __A) { + // CIR-LABEL: _mm_mask_compressstoreu_pd + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 2>) -> !void + + // LLVM-LABEL: @test_mm_mask_compressstoreu_pd + // LLVM: @llvm.masked.compressstore.v2f64(<2 x double> %{{.*}}, ptr %{{.*}}, <2 x i1> %{{.*}}) + return _mm_mask_compressstoreu_pd(__P,__U,__A); +} + +void test_mm256_mask_compressstoreu_pd(void *__P, __mmask8 __U, __m256d __A) { + // CIR-LABEL: _mm256_mask_compressstoreu_pd + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 4>) -> !void + + // LLVM-LABEL: @test_mm256_mask_compressstoreu_pd + // LLVM: @llvm.masked.compressstore.v4f64(<4 x double> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}}) + return _mm256_mask_compressstoreu_pd(__P,__U,__A); +} +void test_mm_mask_compressstoreu_ps(void *__P, __mmask8 __U, __m128 __A) { + // CIR-LABEL: _mm_mask_compressstoreu_ps + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 4>) -> !void + + // LLVM-LABEL: @test_mm_mask_compressstoreu_ps + // LLVM: @llvm.masked.compressstore.v4f32(<4 x float> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}}) + return _mm_mask_compressstoreu_ps(__P,__U,__A); +} + +void test_mm256_mask_compressstoreu_ps(void *__P, __mmask8 __U, __m256 __A) { + // CIR-LABEL: _mm256_mask_compressstoreu_ps + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 8>) -> !void + + // LLVM-LABEL: @test_mm256_mask_compressstoreu_ps + // LLVM: @llvm.masked.compressstore.v8f32(<8 x float> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}}) + return _mm256_mask_compressstoreu_ps(__P,__U,__A); +} + +void test_mm_mask_compressstoreu_epi64(void *__P, __mmask8 __U, __m128i __A) { + // CIR-LABEL: _mm_mask_compressstoreu_epi64 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 2>) -> !void + + // LLVM-LABEL: @test_mm_mask_compressstoreu_epi64 + // LLVM: @llvm.masked.compressstore.v2i64(<2 x i64> %{{.*}}, ptr %{{.*}}, <2 x i1> %{{.*}}) + return _mm_mask_compressstoreu_epi64(__P,__U,__A); +} + +void test_mm256_mask_compressstoreu_epi64(void *__P, __mmask8 __U, __m256i __A) { + // CIR-LABEL: _mm256_mask_compressstoreu_epi64 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 4>) -> !void + + // LLVM-LABEL: @test_mm256_mask_compressstoreu_epi64 + // LLVM: @llvm.masked.compressstore.v4i64(<4 x i64> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}}) + return _mm256_mask_compressstoreu_epi64(__P,__U,__A); +} + +void test_mm_mask_compressstoreu_epi32(void *__P, __mmask8 __U, __m128i __A) { + // CIR-LABEL: _mm_mask_compressstoreu_epi32 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 4>) -> !void + + // LLVM-LABEL: @test_mm_mask_compressstoreu_epi32 + // LLVM: @llvm.masked.compressstore.v4i32(<4 x i32> %{{.*}}, ptr %{{.*}}, <4 x i1> %{{.*}}) + return _mm_mask_compressstoreu_epi32(__P,__U,__A); +} + +void test_mm256_mask_compressstoreu_epi32(void *__P, __mmask8 __U, __m256i __A) { + // CIR-LABEL: _mm256_mask_compressstoreu_epi32 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 8>) -> !void + + // LLVM-LABEL: @test_mm256_mask_compressstoreu_epi32 + // LLVM: @llvm.masked.compressstore.v8i32(<8 x i32> %{{.*}}, ptr %{{.*}}, <8 x i1> %{{.*}}) + return _mm256_mask_compressstoreu_epi32(__P,__U,__A); +} \ No newline at end of file diff --git a/clang/test/CIR/CodeGen/X86/avx512vlvbmi2-builtins.c b/clang/test/CIR/CodeGen/X86/avx512vlvbmi2-builtins.c index fee3335882bf..6dc1e299c7f2 100644 --- a/clang/test/CIR/CodeGen/X86/avx512vlvbmi2-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512vlvbmi2-builtins.c @@ -76,3 +76,30 @@ __m256i test_mm256_maskz_expandloadu_epi8(__mmask32 __U, void const* __P) { // LLVM: @llvm.masked.expandload.v32i8(ptr %{{.*}}, <32 x i1> %{{.*}}, <32 x i8> %{{.*}}) return _mm256_maskz_expandloadu_epi8(__U, __P); } + +void test_mm256_mask_compressstoreu_epi16(void *__P, __mmask16 __U, __m256i __D) { + // CIR-LABEL: _mm256_mask_compressstoreu_epi16 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 16>) -> !void + + // LLVM-LABEL: @test_mm256_mask_compressstoreu_epi16 + // LLVM: @llvm.masked.compressstore.v16i16(<16 x i16> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}}) + _mm256_mask_compressstoreu_epi16(__P, __U, __D); +} + +void test_mm_mask_compressstoreu_epi8(void *__P, __mmask16 __U, __m128i __D) { + // CIR-LABEL: _mm_mask_compressstoreu_epi8 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 16>) -> !void + + // LLVM-LABEL: @test_mm_mask_compressstoreu_epi8 + // LLVM: @llvm.masked.compressstore.v16i8(<16 x i8> %{{.*}}, ptr %{{.*}}, <16 x i1> %{{.*}}) + _mm_mask_compressstoreu_epi8(__P, __U, __D); +} + +void test_mm256_mask_compressstoreu_epi8(void *__P, __mmask32 __U, __m256i __D) { + // CIR-LABEL: _mm256_mask_compressstoreu_epi8 + // CIR: cir.llvm.intrinsic "masked.compressstore" %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector, !cir.ptr>, !cir.vector x 32>) -> !void + + // LLVM-LABEL: @test_mm256_mask_compressstoreu_epi8 + // LLVM: @llvm.masked.compressstore.v32i8(<32 x i8> %{{.*}}, ptr %{{.*}}, <32 x i1> %{{.*}}) + _mm256_mask_compressstoreu_epi8(__P, __U, __D); +} \ No newline at end of file