[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / avx512bw-mask-op.ll
blobc6a2da131a052ec99b0fde803403c37c26cefde0
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:    kmovd %edi, %k0
156 ; CHECK-NEXT:    kmovd %esi, %k1
157 ; CHECK-NEXT:    kxord %k1, %k0, %k0
158 ; CHECK-NEXT:    kmovd %k0, %eax
159 ; CHECK-NEXT:    retq
160   %m0 = bitcast i32 %x to <32 x i1>
161   %m1 = bitcast i32 %y to <32 x i1>
162   %m2 = add <32 x i1> %m0,  %m1
163   %ret = bitcast <32 x i1> %m2 to i32
164   ret i32 %ret
167 define i32 @test_v32i1_sub(i32 %x, i32 %y) {
168 ; CHECK-LABEL: test_v32i1_sub:
169 ; CHECK:       ## %bb.0:
170 ; CHECK-NEXT:    kmovd %edi, %k0
171 ; CHECK-NEXT:    kmovd %esi, %k1
172 ; CHECK-NEXT:    kxord %k1, %k0, %k0
173 ; CHECK-NEXT:    kmovd %k0, %eax
174 ; CHECK-NEXT:    retq
175   %m0 = bitcast i32 %x to <32 x i1>
176   %m1 = bitcast i32 %y to <32 x i1>
177   %m2 = sub <32 x i1> %m0,  %m1
178   %ret = bitcast <32 x i1> %m2 to i32
179   ret i32 %ret
182 define i32 @test_v32i1_mul(i32 %x, i32 %y) {
183 ; CHECK-LABEL: test_v32i1_mul:
184 ; CHECK:       ## %bb.0:
185 ; CHECK-NEXT:    kmovd %edi, %k0
186 ; CHECK-NEXT:    kmovd %esi, %k1
187 ; CHECK-NEXT:    kandd %k1, %k0, %k0
188 ; CHECK-NEXT:    kmovd %k0, %eax
189 ; CHECK-NEXT:    retq
190   %m0 = bitcast i32 %x to <32 x i1>
191   %m1 = bitcast i32 %y to <32 x i1>
192   %m2 = mul <32 x i1> %m0,  %m1
193   %ret = bitcast <32 x i1> %m2 to i32
194   ret i32 %ret
197 define i64 @test_v64i1_add(i64 %x, i64 %y) {
198 ; CHECK-LABEL: test_v64i1_add:
199 ; CHECK:       ## %bb.0:
200 ; CHECK-NEXT:    kmovq %rdi, %k0
201 ; CHECK-NEXT:    kmovq %rsi, %k1
202 ; CHECK-NEXT:    kxorq %k1, %k0, %k0
203 ; CHECK-NEXT:    kmovq %k0, %rax
204 ; CHECK-NEXT:    retq
205   %m0 = bitcast i64 %x to <64 x i1>
206   %m1 = bitcast i64 %y to <64 x i1>
207   %m2 = add <64 x i1> %m0,  %m1
208   %ret = bitcast <64 x i1> %m2 to i64
209   ret i64 %ret
212 define i64 @test_v64i1_sub(i64 %x, i64 %y) {
213 ; CHECK-LABEL: test_v64i1_sub:
214 ; CHECK:       ## %bb.0:
215 ; CHECK-NEXT:    kmovq %rdi, %k0
216 ; CHECK-NEXT:    kmovq %rsi, %k1
217 ; CHECK-NEXT:    kxorq %k1, %k0, %k0
218 ; CHECK-NEXT:    kmovq %k0, %rax
219 ; CHECK-NEXT:    retq
220   %m0 = bitcast i64 %x to <64 x i1>
221   %m1 = bitcast i64 %y to <64 x i1>
222   %m2 = sub <64 x i1> %m0,  %m1
223   %ret = bitcast <64 x i1> %m2 to i64
224   ret i64 %ret
227 define i64 @test_v64i1_mul(i64 %x, i64 %y) {
228 ; CHECK-LABEL: test_v64i1_mul:
229 ; CHECK:       ## %bb.0:
230 ; CHECK-NEXT:    kmovq %rdi, %k0
231 ; CHECK-NEXT:    kmovq %rsi, %k1
232 ; CHECK-NEXT:    kandq %k1, %k0, %k0
233 ; CHECK-NEXT:    kmovq %k0, %rax
234 ; CHECK-NEXT:    retq
235   %m0 = bitcast i64 %x to <64 x i1>
236   %m1 = bitcast i64 %y to <64 x i1>
237   %m2 = mul <64 x i1> %m0,  %m1
238   %ret = bitcast <64 x i1> %m2 to i64
239   ret i64 %ret