[WebAssembly] Fix import statement
[oota-llvm.git] / test / CodeGen / SystemZ / vec-abs-01.ll
1 ; Test v16i8 absolute.
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
4
5 ; Test with slt.
6 define <16 x i8> @f1(<16 x i8> %val) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: vlpb %v24, %v24
9 ; CHECK: br %r14
10   %cmp = icmp slt <16 x i8> %val, zeroinitializer
11   %neg = sub <16 x i8> zeroinitializer, %val
12   %ret = select <16 x i1> %cmp, <16 x i8> %neg, <16 x i8> %val
13   ret <16 x i8> %ret
14 }
15
16 ; Test with sle.
17 define <16 x i8> @f2(<16 x i8> %val) {
18 ; CHECK-LABEL: f2:
19 ; CHECK: vlpb %v24, %v24
20 ; CHECK: br %r14
21   %cmp = icmp sle <16 x i8> %val, zeroinitializer
22   %neg = sub <16 x i8> zeroinitializer, %val
23   %ret = select <16 x i1> %cmp, <16 x i8> %neg, <16 x i8> %val
24   ret <16 x i8> %ret
25 }
26
27 ; Test with sgt.
28 define <16 x i8> @f3(<16 x i8> %val) {
29 ; CHECK-LABEL: f3:
30 ; CHECK: vlpb %v24, %v24
31 ; CHECK: br %r14
32   %cmp = icmp sgt <16 x i8> %val, zeroinitializer
33   %neg = sub <16 x i8> zeroinitializer, %val
34   %ret = select <16 x i1> %cmp, <16 x i8> %val, <16 x i8> %neg
35   ret <16 x i8> %ret
36 }
37
38 ; Test with sge.
39 define <16 x i8> @f4(<16 x i8> %val) {
40 ; CHECK-LABEL: f4:
41 ; CHECK: vlpb %v24, %v24
42 ; CHECK: br %r14
43   %cmp = icmp sge <16 x i8> %val, zeroinitializer
44   %neg = sub <16 x i8> zeroinitializer, %val
45   %ret = select <16 x i1> %cmp, <16 x i8> %val, <16 x i8> %neg
46   ret <16 x i8> %ret
47 }
48
49 ; Test that negative absolute uses VLPB too.  There is no vector equivalent
50 ; of LOAD NEGATIVE.
51 define <16 x i8> @f5(<16 x i8> %val) {
52 ; CHECK-LABEL: f5:
53 ; CHECK: vlpb [[REG:%v[0-9]+]], %v24
54 ; CHECK: vlcb %v24, [[REG]]
55 ; CHECK: br %r14
56   %cmp = icmp slt <16 x i8> %val, zeroinitializer
57   %neg = sub <16 x i8> zeroinitializer, %val
58   %abs = select <16 x i1> %cmp, <16 x i8> %neg, <16 x i8> %val
59   %ret = sub <16 x i8> zeroinitializer, %abs
60   ret <16 x i8> %ret
61 }
62
63 ; Try another form of negative absolute (slt version).
64 define <16 x i8> @f6(<16 x i8> %val) {
65 ; CHECK-LABEL: f6:
66 ; CHECK: vlpb [[REG:%v[0-9]+]], %v24
67 ; CHECK: vlcb %v24, [[REG]]
68 ; CHECK: br %r14
69   %cmp = icmp slt <16 x i8> %val, zeroinitializer
70   %neg = sub <16 x i8> zeroinitializer, %val
71   %ret = select <16 x i1> %cmp, <16 x i8> %val, <16 x i8> %neg
72   ret <16 x i8> %ret
73 }
74
75 ; Test with sle.
76 define <16 x i8> @f7(<16 x i8> %val) {
77 ; CHECK-LABEL: f7:
78 ; CHECK: vlpb [[REG:%v[0-9]+]], %v24
79 ; CHECK: vlcb %v24, [[REG]]
80 ; CHECK: br %r14
81   %cmp = icmp sle <16 x i8> %val, zeroinitializer
82   %neg = sub <16 x i8> zeroinitializer, %val
83   %ret = select <16 x i1> %cmp, <16 x i8> %val, <16 x i8> %neg
84   ret <16 x i8> %ret
85 }
86
87 ; Test with sgt.
88 define <16 x i8> @f8(<16 x i8> %val) {
89 ; CHECK-LABEL: f8:
90 ; CHECK: vlpb [[REG:%v[0-9]+]], %v24
91 ; CHECK: vlcb %v24, [[REG]]
92 ; CHECK: br %r14
93   %cmp = icmp sgt <16 x i8> %val, zeroinitializer
94   %neg = sub <16 x i8> zeroinitializer, %val
95   %ret = select <16 x i1> %cmp, <16 x i8> %neg, <16 x i8> %val
96   ret <16 x i8> %ret
97 }
98
99 ; Test with sge.
100 define <16 x i8> @f9(<16 x i8> %val) {
101 ; CHECK-LABEL: f9:
102 ; CHECK: vlpb [[REG:%v[0-9]+]], %v24
103 ; CHECK: vlcb %v24, [[REG]]
104 ; CHECK: br %r14
105   %cmp = icmp sge <16 x i8> %val, zeroinitializer
106   %neg = sub <16 x i8> zeroinitializer, %val
107   %ret = select <16 x i1> %cmp, <16 x i8> %neg, <16 x i8> %val
108   ret <16 x i8> %ret
109 }
110
111 ; Test with an SRA-based boolean vector.
112 define <16 x i8> @f10(<16 x i8> %val) {
113 ; CHECK-LABEL: f10:
114 ; CHECK: vlpb %v24, %v24
115 ; CHECK: br %r14
116   %shr = ashr <16 x i8> %val,
117               <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,
118                i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
119   %neg = sub <16 x i8> zeroinitializer, %val
120   %and1 = and <16 x i8> %shr, %neg
121   %not = xor <16 x i8> %shr,
122              <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
123               i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
124   %and2 = and <16 x i8> %not, %val
125   %ret = or <16 x i8> %and1, %and2
126   ret <16 x i8> %ret
127 }
128
129 ; ...and again in reverse
130 define <16 x i8> @f11(<16 x i8> %val) {
131 ; CHECK-LABEL: f11:
132 ; CHECK: vlpb [[REG:%v[0-9]+]], %v24
133 ; CHECK: vlcb %v24, [[REG]]
134 ; CHECK: br %r14
135   %shr = ashr <16 x i8> %val,
136               <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,
137                i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
138   %and1 = and <16 x i8> %shr, %val
139   %not = xor <16 x i8> %shr,
140              <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
141               i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
142   %neg = sub <16 x i8> zeroinitializer, %val
143   %and2 = and <16 x i8> %not, %neg
144   %ret = or <16 x i8> %and1, %and2
145   ret <16 x i8> %ret
146 }