Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512bw-mask-op.ll
blob2a262644836135b86a97912f8b257e367250ed33
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
4 define 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
19 define 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
38 define 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
56 define 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
78 define 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
93 define 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
110 define 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
125 define 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
142 define 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
155 define 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
168 define 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
181 define 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
194 define 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
207 define 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
220 define <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
231 define <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
242 define 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
254 define 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