• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s
2
3define i32 @mask32(i32 %x) {
4  %m0 = bitcast i32 %x to <32 x i1>
5  %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
6                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
7                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
8                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
9  %ret = bitcast <32 x i1> %m1 to i32
10  ret i32 %ret
11; CHECK-LABEL: mask32
12; CHECK: kmovd
13; CHECK-NEXT: knotd
14; CHECK-NEXT: kmovd
15; CHECK_NEXT: ret
16}
17
18define i64 @mask64(i64 %x) {
19  %m0 = bitcast i64 %x to <64 x i1>
20  %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
21                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
22                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
23                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
24                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
25                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
26                            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  %ret = bitcast <64 x i1> %m1 to i64
29  ret i64 %ret
30; CHECK-LABEL: mask64
31; CHECK: kmovq
32; CHECK-NEXT: knotq
33; CHECK-NEXT: kmovq
34; CHECK_NEXT: ret
35}
36
37define void @mask32_mem(i32* %ptr) {
38  %x = load i32, i32* %ptr, align 4
39  %m0 = bitcast i32 %x to <32 x i1>
40  %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
41                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
42                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
43                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
44  %ret = bitcast <32 x i1> %m1 to i32
45  store i32 %ret, i32* %ptr, align 4
46  ret void
47; CHECK-LABEL: mask32_mem
48; CHECK: kmovd ([[ARG1:%rdi|%rcx]]), %k{{[0-7]}}
49; CHECK-NEXT: knotd
50; CHECK-NEXT: kmovd %k{{[0-7]}}, ([[ARG1]])
51; CHECK_NEXT: ret
52}
53
54define void @mask64_mem(i64* %ptr) {
55  %x = load i64, i64* %ptr, align 4
56  %m0 = bitcast i64 %x to <64 x i1>
57  %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
58                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
59                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
60                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
61                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
62                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
63                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
64                            i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
65  %ret = bitcast <64 x i1> %m1 to i64
66  store i64 %ret, i64* %ptr, align 4
67  ret void
68; CHECK-LABEL: mask64_mem
69; CHECK: kmovq ([[ARG1]]), %k{{[0-7]}}
70; CHECK-NEXT: knotq
71; CHECK-NEXT: kmovq %k{{[0-7]}}, ([[ARG1]])
72; CHECK_NEXT: ret
73}
74
75define i32 @mand32(i32 %x, i32 %y) {
76  %ma = bitcast i32 %x to <32 x i1>
77  %mb = bitcast i32 %y to <32 x i1>
78  %mc = and <32 x i1> %ma, %mb
79  %md = xor <32 x i1> %ma, %mb
80  %me = or <32 x i1> %mc, %md
81  %ret = bitcast <32 x i1> %me to i32
82; CHECK: kandd
83; CHECK: kxord
84; CHECK: kord
85  ret i32 %ret
86}
87
88define i64 @mand64(i64 %x, i64 %y) {
89  %ma = bitcast i64 %x to <64 x i1>
90  %mb = bitcast i64 %y to <64 x i1>
91  %mc = and <64 x i1> %ma, %mb
92  %md = xor <64 x i1> %ma, %mb
93  %me = or <64 x i1> %mc, %md
94  %ret = bitcast <64 x i1> %me to i64
95; CHECK: kandq
96; CHECK: kxorq
97; CHECK: korq
98  ret i64 %ret
99}
100