c4e62517eb054968ce247c50352f97d6114f5ff2
[oota-llvm.git] / test / CodeGen / X86 / avx512-mask-op.ll
1 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s --check-prefix=KNL --check-prefix=CHECK
2 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s --check-prefix=SKX --check-prefix=CHECK
3
4 ; CHECK-LABEL: mask16
5 ; CHECK: kmovw
6 ; CHECK-NEXT: knotw
7 ; CHECK-NEXT: kmovw
8 define i16 @mask16(i16 %x) {
9   %m0 = bitcast i16 %x to <16 x i1>
10   %m1 = xor <16 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
11   %ret = bitcast <16 x i1> %m1 to i16
12   ret i16 %ret
13 }
14
15 ; CHECK-LABEL: mask8
16 ; KNL: kmovw
17 ; KNL-NEXT: knotw
18 ; KNL-NEXT: kmovw
19 ; SKX: kmovb
20 ; SKX-NEXT: knotb
21 ; SKX-NEXT: kmovb
22
23 define i8 @mask8(i8 %x) {
24   %m0 = bitcast i8 %x to <8 x i1>
25   %m1 = xor <8 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
26   %ret = bitcast <8 x i1> %m1 to i8
27   ret i8 %ret
28 }
29
30 ; CHECK-LABEL: mask16_mem
31 ; CHECK: kmovw ([[ARG1:%rdi|%rcx]]), %k{{[0-7]}}
32 ; CHECK-NEXT: knotw
33 ; CHECK-NEXT: kmovw %k{{[0-7]}}, ([[ARG1]])
34 ; CHECK: ret
35
36 define void @mask16_mem(i16* %ptr) {
37   %x = load i16, i16* %ptr, align 4
38   %m0 = bitcast i16 %x to <16 x i1>
39   %m1 = xor <16 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
40   %ret = bitcast <16 x i1> %m1 to i16
41   store i16 %ret, i16* %ptr, align 4
42   ret void
43 }
44
45 ; CHECK-LABEL: mask8_mem
46 ; KNL: kmovw ([[ARG1]]), %k{{[0-7]}}
47 ; KNL-NEXT: knotw
48 ; KNL-NEXT: kmovw %k{{[0-7]}}, ([[ARG1]])
49 ; SKX: kmovb ([[ARG1]]), %k{{[0-7]}}
50 ; SKX-NEXT: knotb
51 ; SKX-NEXT: kmovb %k{{[0-7]}}, ([[ARG1]])
52
53 define void @mask8_mem(i8* %ptr) {
54   %x = load i8, i8* %ptr, align 4
55   %m0 = bitcast i8 %x to <8 x i1>
56   %m1 = xor <8 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
57   %ret = bitcast <8 x i1> %m1 to i8
58   store i8 %ret, i8* %ptr, align 4
59   ret void
60 }
61
62 ; CHECK-LABEL: mand16
63 ; CHECK: kandw
64 ; CHECK: kxorw
65 ; CHECK: korw
66 define i16 @mand16(i16 %x, i16 %y) {
67   %ma = bitcast i16 %x to <16 x i1>
68   %mb = bitcast i16 %y to <16 x i1>
69   %mc = and <16 x i1> %ma, %mb
70   %md = xor <16 x i1> %ma, %mb
71   %me = or <16 x i1> %mc, %md
72   %ret = bitcast <16 x i1> %me to i16
73   ret i16 %ret
74 }
75
76 ; CHECK-LABEL: shuf_test1
77 ; CHECK: kshiftrw        $8
78 define i8 @shuf_test1(i16 %v) nounwind {
79    %v1 = bitcast i16 %v to <16 x i1>
80    %mask = shufflevector <16 x i1> %v1, <16 x i1> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
81    %mask1 = bitcast <8 x i1> %mask to i8
82    ret i8 %mask1
83 }
84
85 ; CHECK-LABEL: zext_test1
86 ; CHECK: kshiftlw
87 ; CHECK: kshiftrw
88 ; CHECK: kmovw
89
90 define i32 @zext_test1(<16 x i32> %a, <16 x i32> %b) {
91   %cmp_res = icmp ugt <16 x i32> %a, %b
92   %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5
93   %res = zext i1 %cmp_res.i1 to i32
94   ret i32 %res
95 }
96
97 ; CHECK-LABEL: zext_test2
98 ; CHECK: kshiftlw
99 ; CHECK: kshiftrw
100 ; CHECK: kmovw
101
102 define i16 @zext_test2(<16 x i32> %a, <16 x i32> %b) {
103   %cmp_res = icmp ugt <16 x i32> %a, %b
104   %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5
105   %res = zext i1 %cmp_res.i1 to i16
106   ret i16 %res
107 }
108
109 ; CHECK-LABEL: zext_test3
110 ; CHECK: kshiftlw
111 ; CHECK: kshiftrw
112 ; CHECK: kmovw
113
114 define i8 @zext_test3(<16 x i32> %a, <16 x i32> %b) {
115   %cmp_res = icmp ugt <16 x i32> %a, %b
116   %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5
117   %res = zext i1 %cmp_res.i1 to i8
118   ret i8 %res
119 }
120
121 ; CHECK-LABEL: conv1
122 ; KNL: kmovw   %k0, %eax
123 ; KNL: movb    %al, (%rdi)
124 ; SKX: kmovb   %k0, (%rdi)
125 define i8 @conv1(<8 x i1>* %R) {
126 entry:
127   store <8 x i1> <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, <8 x i1>* %R
128
129   %maskPtr = alloca <8 x i1>
130   store <8 x i1> <i1 0, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, <8 x i1>* %maskPtr
131   %mask = load <8 x i1>, <8 x i1>* %maskPtr
132   %mask_convert = bitcast <8 x i1> %mask to i8
133   ret i8 %mask_convert
134 }