xref: /llvm-project/llvm/test/CodeGen/X86/avx512bw-mask-op.ll (revision cdb7b804f665f4d250f6bad3941bcea68024e0a7)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s
3
4define i32 @mask32(i32 %x) {
5; CHECK-LABEL: mask32:
6; CHECK:       ## %bb.0:
7; CHECK-NEXT:    movl %edi, %eax
8; CHECK-NEXT:    notl %eax
9; CHECK-NEXT:    retq
10  %m0 = bitcast i32 %x to <32 x i1>
11  %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
12                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
13                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
14                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
15  %ret = bitcast <32 x i1> %m1 to i32
16  ret i32 %ret
17}
18
19define i64 @mask64(i64 %x) {
20; CHECK-LABEL: mask64:
21; CHECK:       ## %bb.0:
22; CHECK-NEXT:    movq %rdi, %rax
23; CHECK-NEXT:    notq %rax
24; CHECK-NEXT:    retq
25  %m0 = bitcast i64 %x to <64 x i1>
26  %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
27                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
28                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
29                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
30                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
31                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
32                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
33                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
34  %ret = bitcast <64 x i1> %m1 to i64
35  ret i64 %ret
36}
37
38define void @mask32_mem(ptr %ptr) {
39; CHECK-LABEL: mask32_mem:
40; CHECK:       ## %bb.0:
41; CHECK-NEXT:    kmovd (%rdi), %k0
42; CHECK-NEXT:    knotd %k0, %k0
43; CHECK-NEXT:    kmovd %k0, (%rdi)
44; CHECK-NEXT:    retq
45  %x = load i32, ptr %ptr, align 4
46  %m0 = bitcast i32 %x to <32 x i1>
47  %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
48                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
49                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
50                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
51  %ret = bitcast <32 x i1> %m1 to i32
52  store i32 %ret, ptr %ptr, align 4
53  ret void
54}
55
56define void @mask64_mem(ptr %ptr) {
57; CHECK-LABEL: mask64_mem:
58; CHECK:       ## %bb.0:
59; CHECK-NEXT:    kmovq (%rdi), %k0
60; CHECK-NEXT:    knotq %k0, %k0
61; CHECK-NEXT:    kmovq %k0, (%rdi)
62; CHECK-NEXT:    retq
63  %x = load i64, ptr %ptr, align 4
64  %m0 = bitcast i64 %x to <64 x i1>
65  %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
66                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
67                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
68                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
69                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
70                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
71                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
72                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
73  %ret = bitcast <64 x i1> %m1 to i64
74  store i64 %ret, ptr %ptr, align 4
75  ret void
76}
77
78define i32 @mand32(i32 %x, i32 %y) {
79; CHECK-LABEL: mand32:
80; CHECK:       ## %bb.0:
81; CHECK-NEXT:    movl %edi, %eax
82; CHECK-NEXT:    orl %esi, %eax
83; CHECK-NEXT:    retq
84  %ma = bitcast i32 %x to <32 x i1>
85  %mb = bitcast i32 %y to <32 x i1>
86  %mc = and <32 x i1> %ma, %mb
87  %md = xor <32 x i1> %ma, %mb
88  %me = or <32 x i1> %mc, %md
89  %ret = bitcast <32 x i1> %me to i32
90  ret i32 %ret
91}
92
93define i32 @mand32_mem(ptr %x, ptr %y) {
94; CHECK-LABEL: mand32_mem:
95; CHECK:       ## %bb.0:
96; CHECK-NEXT:    kmovd (%rdi), %k0
97; CHECK-NEXT:    kmovd (%rsi), %k1
98; CHECK-NEXT:    kord %k1, %k0, %k0
99; CHECK-NEXT:    kmovd %k0, %eax
100; CHECK-NEXT:    retq
101  %ma = load <32 x i1>, ptr %x
102  %mb = load <32 x i1>, ptr %y
103  %mc = and <32 x i1> %ma, %mb
104  %md = xor <32 x i1> %ma, %mb
105  %me = or <32 x i1> %mc, %md
106  %ret = bitcast <32 x i1> %me to i32
107  ret i32 %ret
108}
109
110define i64 @mand64(i64 %x, i64 %y) {
111; CHECK-LABEL: mand64:
112; CHECK:       ## %bb.0:
113; CHECK-NEXT:    movq %rdi, %rax
114; CHECK-NEXT:    orq %rsi, %rax
115; CHECK-NEXT:    retq
116  %ma = bitcast i64 %x to <64 x i1>
117  %mb = bitcast i64 %y to <64 x i1>
118  %mc = and <64 x i1> %ma, %mb
119  %md = xor <64 x i1> %ma, %mb
120  %me = or <64 x i1> %mc, %md
121  %ret = bitcast <64 x i1> %me to i64
122  ret i64 %ret
123}
124
125define i64 @mand64_mem(ptr %x, ptr %y) {
126; CHECK-LABEL: mand64_mem:
127; CHECK:       ## %bb.0:
128; CHECK-NEXT:    kmovq (%rdi), %k0
129; CHECK-NEXT:    kmovq (%rsi), %k1
130; CHECK-NEXT:    korq %k1, %k0, %k0
131; CHECK-NEXT:    kmovq %k0, %rax
132; CHECK-NEXT:    retq
133  %ma = load <64 x i1>, ptr %x
134  %mb = load <64 x i1>, ptr %y
135  %mc = and <64 x i1> %ma, %mb
136  %md = xor <64 x i1> %ma, %mb
137  %me = or <64 x i1> %mc, %md
138  %ret = bitcast <64 x i1> %me to i64
139  ret i64 %ret
140}
141
142define i32 @test_v32i1_add(i32 %x, i32 %y) {
143; CHECK-LABEL: test_v32i1_add:
144; CHECK:       ## %bb.0:
145; CHECK-NEXT:    movl %edi, %eax
146; CHECK-NEXT:    xorl %esi, %eax
147; CHECK-NEXT:    retq
148  %m0 = bitcast i32 %x to <32 x i1>
149  %m1 = bitcast i32 %y to <32 x i1>
150  %m2 = add <32 x i1> %m0,  %m1
151  %ret = bitcast <32 x i1> %m2 to i32
152  ret i32 %ret
153}
154
155define i32 @test_v32i1_sub(i32 %x, i32 %y) {
156; CHECK-LABEL: test_v32i1_sub:
157; CHECK:       ## %bb.0:
158; CHECK-NEXT:    movl %edi, %eax
159; CHECK-NEXT:    xorl %esi, %eax
160; CHECK-NEXT:    retq
161  %m0 = bitcast i32 %x to <32 x i1>
162  %m1 = bitcast i32 %y to <32 x i1>
163  %m2 = sub <32 x i1> %m0,  %m1
164  %ret = bitcast <32 x i1> %m2 to i32
165  ret i32 %ret
166}
167
168define i32 @test_v32i1_mul(i32 %x, i32 %y) {
169; CHECK-LABEL: test_v32i1_mul:
170; CHECK:       ## %bb.0:
171; CHECK-NEXT:    movl %edi, %eax
172; CHECK-NEXT:    andl %esi, %eax
173; CHECK-NEXT:    retq
174  %m0 = bitcast i32 %x to <32 x i1>
175  %m1 = bitcast i32 %y to <32 x i1>
176  %m2 = mul <32 x i1> %m0,  %m1
177  %ret = bitcast <32 x i1> %m2 to i32
178  ret i32 %ret
179}
180
181define i64 @test_v64i1_add(i64 %x, i64 %y) {
182; CHECK-LABEL: test_v64i1_add:
183; CHECK:       ## %bb.0:
184; CHECK-NEXT:    movq %rdi, %rax
185; CHECK-NEXT:    xorq %rsi, %rax
186; CHECK-NEXT:    retq
187  %m0 = bitcast i64 %x to <64 x i1>
188  %m1 = bitcast i64 %y to <64 x i1>
189  %m2 = add <64 x i1> %m0,  %m1
190  %ret = bitcast <64 x i1> %m2 to i64
191  ret i64 %ret
192}
193
194define i64 @test_v64i1_sub(i64 %x, i64 %y) {
195; CHECK-LABEL: test_v64i1_sub:
196; CHECK:       ## %bb.0:
197; CHECK-NEXT:    movq %rdi, %rax
198; CHECK-NEXT:    xorq %rsi, %rax
199; CHECK-NEXT:    retq
200  %m0 = bitcast i64 %x to <64 x i1>
201  %m1 = bitcast i64 %y to <64 x i1>
202  %m2 = sub <64 x i1> %m0,  %m1
203  %ret = bitcast <64 x i1> %m2 to i64
204  ret i64 %ret
205}
206
207define i64 @test_v64i1_mul(i64 %x, i64 %y) {
208; CHECK-LABEL: test_v64i1_mul:
209; CHECK:       ## %bb.0:
210; CHECK-NEXT:    movq %rdi, %rax
211; CHECK-NEXT:    andq %rsi, %rax
212; CHECK-NEXT:    retq
213  %m0 = bitcast i64 %x to <64 x i1>
214  %m1 = bitcast i64 %y to <64 x i1>
215  %m2 = mul <64 x i1> %m0,  %m1
216  %ret = bitcast <64 x i1> %m2 to i64
217  ret i64 %ret
218}
219
220define <32 x i1> @bitcast_f32_to_v32i1(float %x) {
221; CHECK-LABEL: bitcast_f32_to_v32i1:
222; CHECK:       ## %bb.0:
223; CHECK-NEXT:    vmovd %xmm0, %eax
224; CHECK-NEXT:    kmovd %eax, %k0
225; CHECK-NEXT:    vpmovm2b %k0, %ymm0
226; CHECK-NEXT:    retq
227  %a = bitcast float %x to <32 x i1>
228  ret <32 x i1> %a
229}
230
231define <64 x i1> @bitcast_f64_to_v64i1(double %x) {
232; CHECK-LABEL: bitcast_f64_to_v64i1:
233; CHECK:       ## %bb.0:
234; CHECK-NEXT:    vmovq %xmm0, %rax
235; CHECK-NEXT:    kmovq %rax, %k0
236; CHECK-NEXT:    vpmovm2b %k0, %zmm0
237; CHECK-NEXT:    retq
238  %a = bitcast double %x to <64 x i1>
239  ret <64 x i1> %a
240}
241
242define float @bitcast_v32i1_to_f32(<32 x i1> %x) {
243; CHECK-LABEL: bitcast_v32i1_to_f32:
244; CHECK:       ## %bb.0:
245; CHECK-NEXT:    vpsllw $7, %ymm0, %ymm0
246; CHECK-NEXT:    vpmovmskb %ymm0, %eax
247; CHECK-NEXT:    vmovd %eax, %xmm0
248; CHECK-NEXT:    vzeroupper
249; CHECK-NEXT:    retq
250  %a = bitcast <32 x i1> %x to float
251  ret float %a
252}
253
254define double @bitcast_v64i1_to_f64(<64 x i1> %x) {
255; CHECK-LABEL: bitcast_v64i1_to_f64:
256; CHECK:       ## %bb.0:
257; CHECK-NEXT:    vpsllw $7, %zmm0, %zmm0
258; CHECK-NEXT:    vpmovb2m %zmm0, %k0
259; CHECK-NEXT:    kmovq %k0, %rax
260; CHECK-NEXT:    vmovq %rax, %xmm0
261; CHECK-NEXT:    vzeroupper
262; CHECK-NEXT:    retq
263  %a = bitcast <64 x i1> %x to double
264  ret double %a
265}
266
267