[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512bw-mask-op.ll
blob92c126475fc57eaecad08e02e11bee8af383bdba
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(i32* %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, i32* %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, i32* %ptr, align 4
53   ret void
56 define void @mask64_mem(i64* %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, i64* %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, i64* %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:    movl %edi, %ecx
83 ; CHECK-NEXT:    andl %esi, %ecx
84 ; CHECK-NEXT:    xorl %esi, %eax
85 ; CHECK-NEXT:    orl %ecx, %eax
86 ; CHECK-NEXT:    retq
87   %ma = bitcast i32 %x to <32 x i1>
88   %mb = bitcast i32 %y to <32 x i1>
89   %mc = and <32 x i1> %ma, %mb
90   %md = xor <32 x i1> %ma, %mb
91   %me = or <32 x i1> %mc, %md
92   %ret = bitcast <32 x i1> %me to i32
93   ret i32 %ret
96 define i32 @mand32_mem(<32 x i1>* %x, <32 x i1>* %y) {
97 ; CHECK-LABEL: mand32_mem:
98 ; CHECK:       ## %bb.0:
99 ; CHECK-NEXT:    kmovd (%rdi), %k0
100 ; CHECK-NEXT:    kmovd (%rsi), %k1
101 ; CHECK-NEXT:    kandd %k1, %k0, %k2
102 ; CHECK-NEXT:    kxord %k1, %k0, %k0
103 ; CHECK-NEXT:    kord %k0, %k2, %k0
104 ; CHECK-NEXT:    kmovd %k0, %eax
105 ; CHECK-NEXT:    retq
106   %ma = load <32 x i1>, <32 x i1>* %x
107   %mb = load <32 x i1>, <32 x i1>* %y
108   %mc = and <32 x i1> %ma, %mb
109   %md = xor <32 x i1> %ma, %mb
110   %me = or <32 x i1> %mc, %md
111   %ret = bitcast <32 x i1> %me to i32
112   ret i32 %ret
115 define i64 @mand64(i64 %x, i64 %y) {
116 ; CHECK-LABEL: mand64:
117 ; CHECK:       ## %bb.0:
118 ; CHECK-NEXT:    movq %rdi, %rax
119 ; CHECK-NEXT:    movq %rdi, %rcx
120 ; CHECK-NEXT:    andq %rsi, %rcx
121 ; CHECK-NEXT:    xorq %rsi, %rax
122 ; CHECK-NEXT:    orq %rcx, %rax
123 ; CHECK-NEXT:    retq
124   %ma = bitcast i64 %x to <64 x i1>
125   %mb = bitcast i64 %y to <64 x i1>
126   %mc = and <64 x i1> %ma, %mb
127   %md = xor <64 x i1> %ma, %mb
128   %me = or <64 x i1> %mc, %md
129   %ret = bitcast <64 x i1> %me to i64
130   ret i64 %ret
133 define i64 @mand64_mem(<64 x i1>* %x, <64 x i1>* %y) {
134 ; CHECK-LABEL: mand64_mem:
135 ; CHECK:       ## %bb.0:
136 ; CHECK-NEXT:    kmovq (%rdi), %k0
137 ; CHECK-NEXT:    kmovq (%rsi), %k1
138 ; CHECK-NEXT:    kandq %k1, %k0, %k2
139 ; CHECK-NEXT:    kxorq %k1, %k0, %k0
140 ; CHECK-NEXT:    korq %k0, %k2, %k0
141 ; CHECK-NEXT:    kmovq %k0, %rax
142 ; CHECK-NEXT:    retq
143   %ma = load <64 x i1>, <64 x i1>* %x
144   %mb = load <64 x i1>, <64 x i1>* %y
145   %mc = and <64 x i1> %ma, %mb
146   %md = xor <64 x i1> %ma, %mb
147   %me = or <64 x i1> %mc, %md
148   %ret = bitcast <64 x i1> %me to i64
149   ret i64 %ret
152 define i32 @test_v32i1_add(i32 %x, i32 %y) {
153 ; CHECK-LABEL: test_v32i1_add:
154 ; CHECK:       ## %bb.0:
155 ; CHECK-NEXT:    movl %edi, %eax
156 ; CHECK-NEXT:    xorl %esi, %eax
157 ; CHECK-NEXT:    retq
158   %m0 = bitcast i32 %x to <32 x i1>
159   %m1 = bitcast i32 %y to <32 x i1>
160   %m2 = add <32 x i1> %m0,  %m1
161   %ret = bitcast <32 x i1> %m2 to i32
162   ret i32 %ret
165 define i32 @test_v32i1_sub(i32 %x, i32 %y) {
166 ; CHECK-LABEL: test_v32i1_sub:
167 ; CHECK:       ## %bb.0:
168 ; CHECK-NEXT:    movl %edi, %eax
169 ; CHECK-NEXT:    xorl %esi, %eax
170 ; CHECK-NEXT:    retq
171   %m0 = bitcast i32 %x to <32 x i1>
172   %m1 = bitcast i32 %y to <32 x i1>
173   %m2 = sub <32 x i1> %m0,  %m1
174   %ret = bitcast <32 x i1> %m2 to i32
175   ret i32 %ret
178 define i32 @test_v32i1_mul(i32 %x, i32 %y) {
179 ; CHECK-LABEL: test_v32i1_mul:
180 ; CHECK:       ## %bb.0:
181 ; CHECK-NEXT:    movl %edi, %eax
182 ; CHECK-NEXT:    andl %esi, %eax
183 ; CHECK-NEXT:    retq
184   %m0 = bitcast i32 %x to <32 x i1>
185   %m1 = bitcast i32 %y to <32 x i1>
186   %m2 = mul <32 x i1> %m0,  %m1
187   %ret = bitcast <32 x i1> %m2 to i32
188   ret i32 %ret
191 define i64 @test_v64i1_add(i64 %x, i64 %y) {
192 ; CHECK-LABEL: test_v64i1_add:
193 ; CHECK:       ## %bb.0:
194 ; CHECK-NEXT:    movq %rdi, %rax
195 ; CHECK-NEXT:    xorq %rsi, %rax
196 ; CHECK-NEXT:    retq
197   %m0 = bitcast i64 %x to <64 x i1>
198   %m1 = bitcast i64 %y to <64 x i1>
199   %m2 = add <64 x i1> %m0,  %m1
200   %ret = bitcast <64 x i1> %m2 to i64
201   ret i64 %ret
204 define i64 @test_v64i1_sub(i64 %x, i64 %y) {
205 ; CHECK-LABEL: test_v64i1_sub:
206 ; CHECK:       ## %bb.0:
207 ; CHECK-NEXT:    movq %rdi, %rax
208 ; CHECK-NEXT:    xorq %rsi, %rax
209 ; CHECK-NEXT:    retq
210   %m0 = bitcast i64 %x to <64 x i1>
211   %m1 = bitcast i64 %y to <64 x i1>
212   %m2 = sub <64 x i1> %m0,  %m1
213   %ret = bitcast <64 x i1> %m2 to i64
214   ret i64 %ret
217 define i64 @test_v64i1_mul(i64 %x, i64 %y) {
218 ; CHECK-LABEL: test_v64i1_mul:
219 ; CHECK:       ## %bb.0:
220 ; CHECK-NEXT:    movq %rdi, %rax
221 ; CHECK-NEXT:    andq %rsi, %rax
222 ; CHECK-NEXT:    retq
223   %m0 = bitcast i64 %x to <64 x i1>
224   %m1 = bitcast i64 %y to <64 x i1>
225   %m2 = mul <64 x i1> %m0,  %m1
226   %ret = bitcast <64 x i1> %m2 to i64
227   ret i64 %ret
230 define <32 x i1> @bitcast_f32_to_v32i1(float %x) {
231 ; CHECK-LABEL: bitcast_f32_to_v32i1:
232 ; CHECK:       ## %bb.0:
233 ; CHECK-NEXT:    vmovd %xmm0, %eax
234 ; CHECK-NEXT:    kmovd %eax, %k0
235 ; CHECK-NEXT:    vpmovm2b %k0, %ymm0
236 ; CHECK-NEXT:    retq
237   %a = bitcast float %x to <32 x i1>
238   ret <32 x i1> %a
241 define <64 x i1> @bitcast_f64_to_v64i1(double %x) {
242 ; CHECK-LABEL: bitcast_f64_to_v64i1:
243 ; CHECK:       ## %bb.0:
244 ; CHECK-NEXT:    vmovq %xmm0, %rax
245 ; CHECK-NEXT:    kmovq %rax, %k0
246 ; CHECK-NEXT:    vpmovm2b %k0, %zmm0
247 ; CHECK-NEXT:    retq
248   %a = bitcast double %x to <64 x i1>
249   ret <64 x i1> %a
252 define float @bitcast_v32i1_to_f32(<32 x i1> %x) {
253 ; CHECK-LABEL: bitcast_v32i1_to_f32:
254 ; CHECK:       ## %bb.0:
255 ; CHECK-NEXT:    vpsllw $7, %ymm0, %ymm0
256 ; CHECK-NEXT:    vpmovmskb %ymm0, %eax
257 ; CHECK-NEXT:    vmovd %eax, %xmm0
258 ; CHECK-NEXT:    vzeroupper
259 ; CHECK-NEXT:    retq
260   %a = bitcast <32 x i1> %x to float
261   ret float %a
264 define double @bitcast_v64i1_to_f64(<64 x i1> %x) {
265 ; CHECK-LABEL: bitcast_v64i1_to_f64:
266 ; CHECK:       ## %bb.0:
267 ; CHECK-NEXT:    vpsllw $7, %zmm0, %zmm0
268 ; CHECK-NEXT:    vpmovb2m %zmm0, %k0
269 ; CHECK-NEXT:    kmovq %k0, %rax
270 ; CHECK-NEXT:    vmovq %rax, %xmm0
271 ; CHECK-NEXT:    vzeroupper
272 ; CHECK-NEXT:    retq
273   %a = bitcast <64 x i1> %x to double
274   ret double %a