• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(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
54}
55
56define 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
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:    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
94}
95
96define 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
113}
114
115define 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
131}
132
133define 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
150}
151
152define 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
165}
166
167define 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
180}
181
182define 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
195}
196
197define 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
210}
211
212define 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
225}
226
227define 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
240}
241
242define <32 x i1> @bitcast_f32_to_v32i1(float %x) {
243; CHECK-LABEL: bitcast_f32_to_v32i1:
244; CHECK:       ## %bb.0:
245; CHECK-NEXT:    vmovd %xmm0, %eax
246; CHECK-NEXT:    kmovd %eax, %k0
247; CHECK-NEXT:    vpmovm2b %k0, %ymm0
248; CHECK-NEXT:    retq
249  %a = bitcast float %x to <32 x i1>
250  ret <32 x i1> %a
251}
252
253define <64 x i1> @bitcast_f64_to_v64i1(double %x) {
254; CHECK-LABEL: bitcast_f64_to_v64i1:
255; CHECK:       ## %bb.0:
256; CHECK-NEXT:    vmovq %xmm0, %rax
257; CHECK-NEXT:    kmovq %rax, %k0
258; CHECK-NEXT:    vpmovm2b %k0, %zmm0
259; CHECK-NEXT:    retq
260  %a = bitcast double %x to <64 x i1>
261  ret <64 x i1> %a
262}
263
264define float @bitcast_v32i1_to_f32(<32 x i1> %x) {
265; CHECK-LABEL: bitcast_v32i1_to_f32:
266; CHECK:       ## %bb.0:
267; CHECK-NEXT:    vpsllw $7, %ymm0, %ymm0
268; CHECK-NEXT:    vpmovmskb %ymm0, %eax
269; CHECK-NEXT:    vmovd %eax, %xmm0
270; CHECK-NEXT:    vzeroupper
271; CHECK-NEXT:    retq
272  %a = bitcast <32 x i1> %x to float
273  ret float %a
274}
275
276define double @bitcast_v64i1_to_f64(<64 x i1> %x) {
277; CHECK-LABEL: bitcast_v64i1_to_f64:
278; CHECK:       ## %bb.0:
279; CHECK-NEXT:    vpsllw $7, %zmm0, %zmm0
280; CHECK-NEXT:    vpmovb2m %zmm0, %k0
281; CHECK-NEXT:    kmovq %k0, %rax
282; CHECK-NEXT:    vmovq %rax, %xmm0
283; CHECK-NEXT:    vzeroupper
284; CHECK-NEXT:    retq
285  %a = bitcast <64 x i1> %x to double
286  ret double %a
287}
288
289