Skip to content

Commit 83da585

Browse files
authored
[CIR][CIRGen][Builtin][X86] Lower AVX generic masked store instrinsics (#1760)
1 parent d423af4 commit 83da585

File tree

3 files changed

+103
-1
lines changed

3 files changed

+103
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,10 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
568568
case X86::BI__builtin_ia32_movdqa64store512_mask:
569569
case X86::BI__builtin_ia32_storeaps512_mask:
570570
case X86::BI__builtin_ia32_storeapd512_mask:
571-
llvm_unreachable("vfmaddsubph256_round_mask3 NYI");
571+
return emitX86MaskedStore(
572+
*this, Ops,
573+
getContext().getTypeAlignInChars(E->getArg(1)->getType()).getAsAlign(),
574+
getLoc(E->getExprLoc()));
572575

573576
case X86::BI__builtin_ia32_loadups128_mask:
574577
case X86::BI__builtin_ia32_loadups256_mask:

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,39 @@ void test_mm_mask_store_sd(double * __P, __mmask8 __U, __m128d __A){
4646
// LLVM: call void @llvm.masked.store.v2f64.p0(<2 x double> %{{.*}}, ptr %{{.*}}, i32 1, <2 x i1> %{{.*}})
4747
_mm_mask_store_sd(__P, __U, __A);
4848
}
49+
50+
void test_mm512_mask_store_pd(void *p, __m512d a, __mmask8 m){
51+
// CIR-LABEL: _mm512_mask_store_pd
52+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.double x 8>, !cir.ptr<!cir.vector<!cir.double x 8>>, !u32i, !cir.vector<!cir.int<s, 1> x 8>) -> !void
53+
54+
// LLVM-LABEL: test_mm512_mask_store_pd
55+
// LLVM: @llvm.masked.store.v8f64.p0(<8 x double> %{{.*}}, ptr %{{.*}}, i32 64, <8 x i1> %{{.*}})
56+
_mm512_mask_store_pd(p, m, a);
57+
}
58+
59+
void test_mm512_mask_store_epi32(void *__P, __mmask16 __U, __m512i __A) {
60+
// CIR-LABEL: _mm512_mask_store_epi32
61+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s32i x 16>, !cir.ptr<!cir.vector<!s32i x 16>>, !u32i, !cir.vector<!cir.int<s, 1> x 16>) -> !void
62+
63+
// LLVM-LABEL: test_mm512_mask_store_epi32
64+
// LLVM: @llvm.masked.store.v16i32.p0(<16 x i32> %{{.*}}, ptr %{{.*}}, i32 64, <16 x i1> %{{.*}})
65+
return _mm512_mask_store_epi32(__P, __U, __A);
66+
}
67+
68+
void test_mm512_mask_store_epi64(void *__P, __mmask8 __U, __m512i __A) {
69+
// CIR-LABEL: _mm512_mask_store_epi64
70+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s64i x 8>, !cir.ptr<!cir.vector<!s64i x 8>>, !u32i, !cir.vector<!cir.int<s, 1> x 8>) -> !void
71+
72+
// LLVM-LABEL: test_mm512_mask_store_epi64
73+
// LLVM: @llvm.masked.store.v8i64.p0(<8 x i64> %{{.*}}, ptr %{{.*}}, i32 64, <8 x i1> %{{.*}})
74+
return _mm512_mask_store_epi64(__P, __U, __A);
75+
}
76+
77+
void test_mm512_mask_store_ps(void *p, __m512 a, __mmask16 m){
78+
// CIR-LABEL: _mm512_mask_store_ps
79+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.float x 16>, !cir.ptr<!cir.vector<!cir.float x 16>>, !u32i, !cir.vector<!cir.int<s, 1> x 16>) -> !void
80+
81+
// LLVM-LABEL: test_mm512_mask_store_ps
82+
// LLVM: @llvm.masked.store.v16f32.p0(<16 x float> %{{.*}}, ptr %{{.*}}, i32 64, <16 x i1> %{{.*}})
83+
_mm512_mask_store_ps(p, m, a);
84+
}

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,66 @@ void test_mm256_mask_storeu_ps(void *__P, __mmask8 __U, __m256 __A) {
6868
// LLVM: @llvm.masked.store.v8f32.p0(<8 x float> %{{.*}}, ptr %{{.*}}, i32 1, <8 x i1> %{{.*}})
6969
return _mm256_mask_storeu_ps(__P, __U, __A);
7070
}
71+
72+
void test_mm_mask_store_epi64(void *__P, __mmask8 __U, __m128i __A) {
73+
// CIR-LABEL: _mm_mask_store_epi64
74+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s64i x 2>, !cir.ptr<!cir.vector<!s64i x 2>>, !u32i, !cir.vector<!cir.int<s, 1> x 2>) -> !void
75+
76+
// LLVM-LABEL: @test_mm_mask_store_epi64
77+
// LLVM: @llvm.masked.store.v2i64.p0(<2 x i64> %{{.*}}, ptr %{{.*}}, i32 16, <2 x i1> %{{.*}})
78+
return _mm_mask_store_epi64(__P, __U, __A);
79+
}
80+
81+
void test_mm_mask_store_ps(void *__P, __mmask8 __U, __m128 __A) {
82+
// CIR-LABEL: _mm_mask_store_ps
83+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.float x 4>, !cir.ptr<!cir.vector<!cir.float x 4>>, !u32i, !cir.vector<!cir.int<s, 1> x 4>) -> !void
84+
85+
// LLVM-LABEL: @test_mm_mask_store_ps
86+
// LLVM: @llvm.masked.store.v4f32.p0(<4 x float> %{{.*}}, ptr %{{.*}}, i32 16, <4 x i1> %{{.*}})
87+
return _mm_mask_store_ps(__P, __U, __A);
88+
}
89+
90+
void test_mm_mask_store_pd(void *__P, __mmask8 __U, __m128d __A) {
91+
// CIR-LABEL: _mm_mask_store_pd
92+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.double x 2>, !cir.ptr<!cir.vector<!cir.double x 2>>, !u32i, !cir.vector<!cir.int<s, 1> x 2>) -> !void
93+
94+
// LLVM-LABEL: @test_mm_mask_store_pd
95+
// LLVM: @llvm.masked.store.v2f64.p0(<2 x double> %{{.*}}, ptr %{{.*}}, i32 16, <2 x i1> %{{.*}})
96+
return _mm_mask_store_pd(__P, __U, __A);
97+
}
98+
99+
void test_mm256_mask_store_epi32(void *__P, __mmask8 __U, __m256i __A) {
100+
// CIR-LABEL: _mm256_mask_store_epi32
101+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s32i x 8>, !cir.ptr<!cir.vector<!s32i x 8>>, !u32i, !cir.vector<!cir.int<s, 1> x 8>) -> !void
102+
103+
// LLVM-LABEL: @test_mm256_mask_store_epi32
104+
// LLVM: @llvm.masked.store.v8i32.p0(<8 x i32> %{{.*}}, ptr %{{.*}}, i32 32, <8 x i1> %{{.*}})
105+
return _mm256_mask_store_epi32(__P, __U, __A);
106+
}
107+
108+
void test_mm256_mask_store_epi64(void *__P, __mmask8 __U, __m256i __A) {
109+
// CIR-LABEL: _mm256_mask_store_epi64
110+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!s64i x 4>, !cir.ptr<!cir.vector<!s64i x 4>>, !u32i, !cir.vector<!cir.int<s, 1> x 4>) -> !void
111+
112+
// LLVM-LABEL: @test_mm256_mask_store_epi64
113+
// LLVM: @llvm.masked.store.v4i64.p0(<4 x i64> %{{.*}}, ptr %{{.*}}, i32 32, <4 x i1> %{{.*}})
114+
return _mm256_mask_store_epi64(__P, __U, __A);
115+
}
116+
117+
void test_mm256_mask_store_ps(void *__P, __mmask8 __U, __m256 __A) {
118+
// CIR-LABEL: _mm256_mask_store_ps
119+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.float x 8>, !cir.ptr<!cir.vector<!cir.float x 8>>, !u32i, !cir.vector<!cir.int<s, 1> x 8>) -> !void
120+
121+
// LLVM-LABEL: @test_mm256_mask_store_ps
122+
// LLVM: @llvm.masked.store.v8f32.p0(<8 x float> %{{.*}}, ptr %{{.*}}, i32 32, <8 x i1> %{{.*}})
123+
return _mm256_mask_store_ps(__P, __U, __A);
124+
}
125+
126+
void test_mm256_mask_store_pd(void *__P, __mmask8 __U, __m256d __A) {
127+
// CIR-LABEL: _mm256_mask_store_pd
128+
// CIR: %{{.*}} = cir.llvm.intrinsic "masked.store" %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : (!cir.vector<!cir.double x 4>, !cir.ptr<!cir.vector<!cir.double x 4>>, !u32i, !cir.vector<!cir.int<s, 1> x 4>) -> !void
129+
130+
// LLVM-LABEL: @test_mm256_mask_store_pd
131+
// LLVM: @llvm.masked.store.v4f64.p0(<4 x double> %{{.*}}, ptr %{{.*}}, i32 32, <4 x i1> %{{.*}})
132+
return _mm256_mask_store_pd(__P, __U, __A);
133+
}

0 commit comments

Comments
 (0)