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:    kmovd %edi, %k0
8; CHECK-NEXT:    knotd %k0, %k0
9; CHECK-NEXT:    kmovd %k0, %eax
10; CHECK-NEXT:    retq
11  %m0 = bitcast i32 %x to <32 x i1>
12  %m1 = xor <32 x i1> %m0, <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                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
16  %ret = bitcast <32 x i1> %m1 to i32
17  ret i32 %ret
18}
19
20define i64 @mask64(i64 %x) {
21; CHECK-LABEL: mask64:
22; CHECK:       ## BB#0:
23; CHECK-NEXT:    kmovq %rdi, %k0
24; CHECK-NEXT:    knotq %k0, %k0
25; CHECK-NEXT:    kmovq %k0, %rax
26; CHECK-NEXT:    retq
27  %m0 = bitcast i64 %x to <64 x i1>
28  %m1 = xor <64 x i1> %m0, <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                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
35                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
36  %ret = bitcast <64 x i1> %m1 to i64
37  ret i64 %ret
38}
39
40define void @mask32_mem(i32* %ptr) {
41; CHECK-LABEL: mask32_mem:
42; CHECK:       ## BB#0:
43; CHECK-NEXT:    kmovd (%rdi), %k0
44; CHECK-NEXT:    knotd %k0, %k0
45; CHECK-NEXT:    kmovd %k0, (%rdi)
46; CHECK-NEXT:    retq
47  %x = load i32, i32* %ptr, align 4
48  %m0 = bitcast i32 %x to <32 x i1>
49  %m1 = xor <32 x i1> %m0, <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                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
52                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
53  %ret = bitcast <32 x i1> %m1 to i32
54  store i32 %ret, i32* %ptr, align 4
55  ret void
56}
57
58define void @mask64_mem(i64* %ptr) {
59; CHECK-LABEL: mask64_mem:
60; CHECK:       ## BB#0:
61; CHECK-NEXT:    kmovq (%rdi), %k0
62; CHECK-NEXT:    knotq %k0, %k0
63; CHECK-NEXT:    kmovq %k0, (%rdi)
64; CHECK-NEXT:    retq
65  %x = load i64, i64* %ptr, align 4
66  %m0 = bitcast i64 %x to <64 x i1>
67  %m1 = xor <64 x i1> %m0, <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                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
74                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
75  %ret = bitcast <64 x i1> %m1 to i64
76  store i64 %ret, i64* %ptr, align 4
77  ret void
78}
79
80define i32 @mand32(i32 %x, i32 %y) {
81; CHECK-LABEL: mand32:
82; CHECK:       ## BB#0:
83; CHECK-NEXT:    movl %edi, %eax
84; CHECK-NEXT:    andl %esi, %eax
85; CHECK-NEXT:    xorl %esi, %edi
86; CHECK-NEXT:    orl %eax, %edi
87; CHECK-NEXT:    movl %edi, %eax
88; CHECK-NEXT:    retq
89  %ma = bitcast i32 %x to <32 x i1>
90  %mb = bitcast i32 %y to <32 x i1>
91  %mc = and <32 x i1> %ma, %mb
92  %md = xor <32 x i1> %ma, %mb
93  %me = or <32 x i1> %mc, %md
94  %ret = bitcast <32 x i1> %me to i32
95  ret i32 %ret
96}
97
98define i32 @mand32_mem(<32 x i1>* %x, <32 x i1>* %y) {
99; CHECK-LABEL: mand32_mem:
100; CHECK:       ## BB#0:
101; CHECK-NEXT:    kmovd (%rdi), %k0
102; CHECK-NEXT:    kmovd (%rsi), %k1
103; CHECK-NEXT:    kandd %k1, %k0, %k2
104; CHECK-NEXT:    kxord %k1, %k0, %k0
105; CHECK-NEXT:    kord %k0, %k2, %k0
106; CHECK-NEXT:    kmovd %k0, %eax
107; CHECK-NEXT:    retq
108  %ma = load <32 x i1>, <32 x i1>* %x
109  %mb = load <32 x i1>, <32 x i1>* %y
110  %mc = and <32 x i1> %ma, %mb
111  %md = xor <32 x i1> %ma, %mb
112  %me = or <32 x i1> %mc, %md
113  %ret = bitcast <32 x i1> %me to i32
114  ret i32 %ret
115}
116
117define i64 @mand64(i64 %x, i64 %y) {
118; CHECK-LABEL: mand64:
119; CHECK:       ## BB#0:
120; CHECK-NEXT:    movq %rdi, %rax
121; CHECK-NEXT:    andq %rsi, %rax
122; CHECK-NEXT:    xorq %rsi, %rdi
123; CHECK-NEXT:    orq %rax, %rdi
124; CHECK-NEXT:    movq %rdi, %rax
125; CHECK-NEXT:    retq
126  %ma = bitcast i64 %x to <64 x i1>
127  %mb = bitcast i64 %y to <64 x i1>
128  %mc = and <64 x i1> %ma, %mb
129  %md = xor <64 x i1> %ma, %mb
130  %me = or <64 x i1> %mc, %md
131  %ret = bitcast <64 x i1> %me to i64
132  ret i64 %ret
133}
134
135define i64 @mand64_mem(<64 x i1>* %x, <64 x i1>* %y) {
136; CHECK-LABEL: mand64_mem:
137; CHECK:       ## BB#0:
138; CHECK-NEXT:    kmovq (%rdi), %k0
139; CHECK-NEXT:    kmovq (%rsi), %k1
140; CHECK-NEXT:    kandq %k1, %k0, %k2
141; CHECK-NEXT:    kxorq %k1, %k0, %k0
142; CHECK-NEXT:    korq %k0, %k2, %k0
143; CHECK-NEXT:    kmovq %k0, %rax
144; CHECK-NEXT:    retq
145  %ma = load <64 x i1>, <64 x i1>* %x
146  %mb = load <64 x i1>, <64 x i1>* %y
147  %mc = and <64 x i1> %ma, %mb
148  %md = xor <64 x i1> %ma, %mb
149  %me = or <64 x i1> %mc, %md
150  %ret = bitcast <64 x i1> %me to i64
151  ret i64 %ret
152}
153