[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / gpr-to-mask.ll
blob842faaae9b1d7bdb7291b0b0dd759c4602019bab
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512dq < %s | FileCheck %s
4 define void @test_fcmp_storefloat(i1 %cond, float* %fptr, float %f1, float %f2, float %f3, float %f4, float %f5, float %f6) {
5 ; CHECK-LABEL: test_fcmp_storefloat:
6 ; CHECK:       # BB#0: # %entry
7 ; CHECK-NEXT:    testb $1, %dil
8 ; CHECK-NEXT:    je .LBB0_2
9 ; CHECK-NEXT:  # BB#1: # %if
10 ; CHECK-NEXT:    vcmpeqss %xmm3, %xmm2, %k1
11 ; CHECK-NEXT:    jmp .LBB0_3
12 ; CHECK-NEXT:  .LBB0_2: # %else
13 ; CHECK-NEXT:    vcmpeqss %xmm5, %xmm4, %k1
14 ; CHECK-NEXT:  .LBB0_3: # %exit
15 ; CHECK-NEXT:    vmovss %xmm0, %xmm0, %xmm1 {%k1}
16 ; CHECK-NEXT:    vmovss %xmm1, (%rsi)
17 ; CHECK-NEXT:    retq
18 entry:
19   br i1 %cond, label %if, label %else
21 if:
22   %cmp1 = fcmp oeq float %f3, %f4
23   br label %exit
25 else:
26   %cmp2 = fcmp oeq float %f5, %f6
27   br label %exit
29 exit:
30   %val = phi i1 [%cmp1, %if], [%cmp2, %else]
31   %selected = select i1 %val, float %f1, float %f2
32   store float %selected, float* %fptr
33   ret void
36 define void @test_fcmp_storei1(i1 %cond, float* %fptr, i1* %iptr, float %f1, float %f2, float %f3, float %f4) {
37 ; CHECK-LABEL: test_fcmp_storei1:
38 ; CHECK:       # BB#0: # %entry
39 ; CHECK-NEXT:    testb $1, %dil
40 ; CHECK-NEXT:    je .LBB1_2
41 ; CHECK-NEXT:  # BB#1: # %if
42 ; CHECK-NEXT:    vcmpeqss %xmm1, %xmm0, %k0
43 ; CHECK-NEXT:    jmp .LBB1_3
44 ; CHECK-NEXT:  .LBB1_2: # %else
45 ; CHECK-NEXT:    vcmpeqss %xmm3, %xmm2, %k0
46 ; CHECK-NEXT:  .LBB1_3: # %exit
47 ; CHECK-NEXT:    kmovd %k0, %eax
48 ; CHECK-NEXT:    andb $1, %al
49 ; CHECK-NEXT:    movb %al, (%rdx)
50 ; CHECK-NEXT:    retq
51 entry:
52   br i1 %cond, label %if, label %else
54 if:
55   %cmp1 = fcmp oeq float %f1, %f2
56   br label %exit
58 else:
59   %cmp2 = fcmp oeq float %f3, %f4
60   br label %exit
62 exit:
63   %val = phi i1 [%cmp1, %if], [%cmp2, %else]
64   store i1 %val, i1* %iptr
65   ret void
68 define void @test_load_add(i1 %cond, float* %fptr, i1* %iptr1, i1* %iptr2, float %f1, float %f2)  {
69 ; CHECK-LABEL: test_load_add:
70 ; CHECK:       # BB#0: # %entry
71 ; CHECK-NEXT:    testb $1, %dil
72 ; CHECK-NEXT:    je .LBB2_2
73 ; CHECK-NEXT:  # BB#1: # %if
74 ; CHECK-NEXT:    kmovb (%rdx), %k0
75 ; CHECK-NEXT:    kmovb (%rcx), %k1
76 ; CHECK-NEXT:    kaddb %k1, %k0, %k1
77 ; CHECK-NEXT:    jmp .LBB2_3
78 ; CHECK-NEXT:  .LBB2_2: # %else
79 ; CHECK-NEXT:    kmovb (%rcx), %k1
80 ; CHECK-NEXT:  .LBB2_3: # %exit
81 ; CHECK-NEXT:    vmovss %xmm0, %xmm0, %xmm1 {%k1}
82 ; CHECK-NEXT:    vmovss %xmm1, (%rsi)
83 ; CHECK-NEXT:    retq
84 entry:
85   br i1 %cond, label %if, label %else
87 if:
88   %loaded1 = load i1, i1* %iptr1
89   %loaded2if = load i1, i1* %iptr2
90   %added = add i1 %loaded1, %loaded2if
91   br label %exit
93 else:
94   %loaded2else = load i1, i1* %iptr2
95   br label %exit
97 exit:
98   %val = phi i1 [%added, %if], [%loaded2else, %else]
99   %selected = select i1 %val, float %f1, float %f2
100   store float %selected, float* %fptr
101   ret void
104 define void @test_load_i1(i1 %cond, float* %fptr, i1* %iptr1, i1* %iptr2, float %f1, float %f2)  {
105 ; CHECK-LABEL: test_load_i1:
106 ; CHECK:       # BB#0: # %entry
107 ; CHECK-NEXT:    testb $1, %dil
108 ; CHECK-NEXT:    je .LBB3_2
109 ; CHECK-NEXT:  # BB#1: # %if
110 ; CHECK-NEXT:    kmovb (%rdx), %k1
111 ; CHECK-NEXT:    jmp .LBB3_3
112 ; CHECK-NEXT:  .LBB3_2: # %else
113 ; CHECK-NEXT:    kmovb (%rcx), %k1
114 ; CHECK-NEXT:  .LBB3_3: # %exit
115 ; CHECK-NEXT:    vmovss %xmm0, %xmm0, %xmm1 {%k1}
116 ; CHECK-NEXT:    vmovss %xmm1, (%rsi)
117 ; CHECK-NEXT:    retq
118 entry:
119   br i1 %cond, label %if, label %else
122   %loaded1 = load i1, i1* %iptr1
123   br label %exit
125 else:
126   %loaded2 = load i1, i1* %iptr2
127   br label %exit
129 exit:
130   %val = phi i1 [%loaded1, %if], [%loaded2, %else]
131   %selected = select i1 %val, float %f1, float %f2
132   store float %selected, float* %fptr
133   ret void
136 define void @test_loadi1_storei1(i1 %cond, i1* %iptr1, i1* %iptr2, i1* %iptr3)  {
137 ; CHECK-LABEL: test_loadi1_storei1:
138 ; CHECK:       # BB#0: # %entry
139 ; CHECK-NEXT:    testb $1, %dil
140 ; CHECK-NEXT:    je .LBB4_2
141 ; CHECK-NEXT:  # BB#1: # %if
142 ; CHECK-NEXT:    movb (%rsi), %al
143 ; CHECK-NEXT:    jmp .LBB4_3
144 ; CHECK-NEXT:  .LBB4_2: # %else
145 ; CHECK-NEXT:    movb (%rdx), %al
146 ; CHECK-NEXT:  .LBB4_3: # %exit
147 ; CHECK-NEXT:    andb $1, %al
148 ; CHECK-NEXT:    movb %al, (%rcx)
149 ; CHECK-NEXT:    retq
150 entry:
151   br i1 %cond, label %if, label %else
154   %loaded1 = load i1, i1* %iptr1
155   br label %exit
157 else:
158   %loaded2 = load i1, i1* %iptr2
159   br label %exit
161 exit:
162   %val = phi i1 [%loaded1, %if], [%loaded2, %else]
163   store i1 %val, i1* %iptr3
164   ret void
167 define void @test_shl1(i1 %cond, i8* %ptr1, i8* %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, <8 x float>* %fptrvec) {
168 ; CHECK-LABEL: test_shl1:
169 ; CHECK:       # BB#0: # %entry
170 ; CHECK-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
171 ; CHECK-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
172 ; CHECK-NEXT:    testb $1, %dil
173 ; CHECK-NEXT:    je .LBB5_2
174 ; CHECK-NEXT:  # BB#1: # %if
175 ; CHECK-NEXT:    kmovb (%rsi), %k0
176 ; CHECK-NEXT:    kaddb %k0, %k0, %k1
177 ; CHECK-NEXT:    jmp .LBB5_3
178 ; CHECK-NEXT:  .LBB5_2: # %else
179 ; CHECK-NEXT:    kmovb (%rdx), %k1
180 ; CHECK-NEXT:  .LBB5_3: # %exit
181 ; CHECK-NEXT:    vmovaps %zmm0, %zmm1 {%k1}
182 ; CHECK-NEXT:    vmovaps %ymm1, (%rcx)
183 ; CHECK-NEXT:    vzeroupper
184 ; CHECK-NEXT:    retq
185 entry:
186   br i1 %cond, label %if, label %else
189   %loaded1 = load i8, i8* %ptr1
190   %shifted = shl i8 %loaded1, 1
191   br label %exit
193 else:
194   %loaded2 = load i8, i8* %ptr2
195   br label %exit
197 exit:
198   %val = phi i8 [%shifted, %if], [%loaded2, %else]
199   %mask = bitcast i8 %val to <8 x i1>
200   %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2
201   store <8 x float> %selected, <8 x float>* %fptrvec
202   ret void
205 define void @test_shr1(i1 %cond, i8* %ptr1, i8* %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, <8 x float>* %fptrvec) {
206 ; CHECK-LABEL: test_shr1:
207 ; CHECK:       # BB#0: # %entry
208 ; CHECK-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
209 ; CHECK-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
210 ; CHECK-NEXT:    testb $1, %dil
211 ; CHECK-NEXT:    je .LBB6_2
212 ; CHECK-NEXT:  # BB#1: # %if
213 ; CHECK-NEXT:    movb (%rsi), %al
214 ; CHECK-NEXT:    shrb %al
215 ; CHECK-NEXT:    jmp .LBB6_3
216 ; CHECK-NEXT:  .LBB6_2: # %else
217 ; CHECK-NEXT:    movb (%rdx), %al
218 ; CHECK-NEXT:  .LBB6_3: # %exit
219 ; CHECK-NEXT:    kmovd %eax, %k1
220 ; CHECK-NEXT:    vmovaps %zmm0, %zmm1 {%k1}
221 ; CHECK-NEXT:    vmovaps %ymm1, (%rcx)
222 ; CHECK-NEXT:    vzeroupper
223 ; CHECK-NEXT:    retq
224 entry:
225   br i1 %cond, label %if, label %else
228   %loaded1 = load i8, i8* %ptr1
229   %shifted = lshr i8 %loaded1, 1
230   br label %exit
232 else:
233   %loaded2 = load i8, i8* %ptr2
234   br label %exit
236 exit:
237   %val = phi i8 [%shifted, %if], [%loaded2, %else]
238   %mask = bitcast i8 %val to <8 x i1>
239   %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2
240   store <8 x float> %selected, <8 x float>* %fptrvec
241   ret void
244 define void @test_shr2(i1 %cond, i8* %ptr1, i8* %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, <8 x float>* %fptrvec) {
245 ; CHECK-LABEL: test_shr2:
246 ; CHECK:       # BB#0: # %entry
247 ; CHECK-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
248 ; CHECK-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
249 ; CHECK-NEXT:    testb $1, %dil
250 ; CHECK-NEXT:    je .LBB7_2
251 ; CHECK-NEXT:  # BB#1: # %if
252 ; CHECK-NEXT:    kmovb (%rsi), %k0
253 ; CHECK-NEXT:    kshiftrb $2, %k0, %k1
254 ; CHECK-NEXT:    jmp .LBB7_3
255 ; CHECK-NEXT:  .LBB7_2: # %else
256 ; CHECK-NEXT:    kmovb (%rdx), %k1
257 ; CHECK-NEXT:  .LBB7_3: # %exit
258 ; CHECK-NEXT:    vmovaps %zmm0, %zmm1 {%k1}
259 ; CHECK-NEXT:    vmovaps %ymm1, (%rcx)
260 ; CHECK-NEXT:    vzeroupper
261 ; CHECK-NEXT:    retq
262 entry:
263   br i1 %cond, label %if, label %else
266   %loaded1 = load i8, i8* %ptr1
267   %shifted = lshr i8 %loaded1, 2
268   br label %exit
270 else:
271   %loaded2 = load i8, i8* %ptr2
272   br label %exit
274 exit:
275   %val = phi i8 [%shifted, %if], [%loaded2, %else]
276   %mask = bitcast i8 %val to <8 x i1>
277   %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2
278   store <8 x float> %selected, <8 x float>* %fptrvec
279   ret void
282 define void @test_shl(i1 %cond, i8* %ptr1, i8* %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, <8 x float>* %fptrvec) {
283 ; CHECK-LABEL: test_shl:
284 ; CHECK:       # BB#0: # %entry
285 ; CHECK-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
286 ; CHECK-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
287 ; CHECK-NEXT:    testb $1, %dil
288 ; CHECK-NEXT:    je .LBB8_2
289 ; CHECK-NEXT:  # BB#1: # %if
290 ; CHECK-NEXT:    kmovb (%rsi), %k0
291 ; CHECK-NEXT:    kshiftlb $6, %k0, %k1
292 ; CHECK-NEXT:    jmp .LBB8_3
293 ; CHECK-NEXT:  .LBB8_2: # %else
294 ; CHECK-NEXT:    kmovb (%rdx), %k1
295 ; CHECK-NEXT:  .LBB8_3: # %exit
296 ; CHECK-NEXT:    vmovaps %zmm0, %zmm1 {%k1}
297 ; CHECK-NEXT:    vmovaps %ymm1, (%rcx)
298 ; CHECK-NEXT:    vzeroupper
299 ; CHECK-NEXT:    retq
300 entry:
301   br i1 %cond, label %if, label %else
304   %loaded1 = load i8, i8* %ptr1
305   %shifted = shl i8 %loaded1, 6
306   br label %exit
308 else:
309   %loaded2 = load i8, i8* %ptr2
310   br label %exit
312 exit:
313   %val = phi i8 [%shifted, %if], [%loaded2, %else]
314   %mask = bitcast i8 %val to <8 x i1>
315   %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2
316   store <8 x float> %selected, <8 x float>* %fptrvec
317   ret void
320 define void @test_add(i1 %cond, i8* %ptr1, i8* %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, <8 x float>* %fptrvec) {
321 ; CHECK-LABEL: test_add:
322 ; CHECK:       # BB#0: # %entry
323 ; CHECK-NEXT:    # kill: %ymm1<def> %ymm1<kill> %zmm1<def>
324 ; CHECK-NEXT:    # kill: %ymm0<def> %ymm0<kill> %zmm0<def>
325 ; CHECK-NEXT:    kmovb (%rsi), %k0
326 ; CHECK-NEXT:    kmovb (%rdx), %k1
327 ; CHECK-NEXT:    testb $1, %dil
328 ; CHECK-NEXT:    je .LBB9_2
329 ; CHECK-NEXT:  # BB#1: # %if
330 ; CHECK-NEXT:    kandb %k1, %k0, %k1
331 ; CHECK-NEXT:    jmp .LBB9_3
332 ; CHECK-NEXT:  .LBB9_2: # %else
333 ; CHECK-NEXT:    kaddb %k1, %k0, %k1
334 ; CHECK-NEXT:  .LBB9_3: # %exit
335 ; CHECK-NEXT:    vmovaps %zmm0, %zmm1 {%k1}
336 ; CHECK-NEXT:    vmovaps %ymm1, (%rcx)
337 ; CHECK-NEXT:    vzeroupper
338 ; CHECK-NEXT:    retq
339 entry:
340   %loaded1 = load i8, i8* %ptr1
341   %loaded2 = load i8, i8* %ptr2
342   br i1 %cond, label %if, label %else
345   %and = and i8 %loaded1, %loaded2
346   br label %exit
348 else:
349   %add = add i8 %loaded1, %loaded2
350   br label %exit
352 exit:
353   %val = phi i8 [%and, %if], [%add, %else]
354   %mask = bitcast i8 %val to <8 x i1>
355   %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2
356   store <8 x float> %selected, <8 x float>* %fptrvec
357   ret void