121
|
1 ; Test that a vector select with a logic combination of two compares do not
|
|
2 ; produce any unnecessary pack, unpack or shift instructions.
|
|
3 ; And, Or and Xor are tested.
|
|
4 ;
|
|
5 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
|
|
6 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s -check-prefix=CHECK-Z14
|
|
7
|
|
8 define <2 x i8> @fun0(<2 x i8> %val1, <2 x i8> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i8> %val5, <2 x i8> %val6) {
|
|
9 ; CHECK-LABEL: fun0:
|
|
10 ; CHECK: # BB#0:
|
|
11 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26
|
|
12 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v28, %v30
|
|
13 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]]
|
|
14 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
15 ; CHECK-NEXT: br %r14
|
|
16 %cmp0 = icmp eq <2 x i8> %val1, %val2
|
|
17 %cmp1 = icmp eq <2 x i8> %val3, %val4
|
|
18 %and = and <2 x i1> %cmp0, %cmp1
|
|
19 %sel = select <2 x i1> %and, <2 x i8> %val5, <2 x i8> %val6
|
|
20 ret <2 x i8> %sel
|
|
21 }
|
|
22
|
|
23 define <2 x i16> @fun1(<2 x i8> %val1, <2 x i8> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i16> %val5, <2 x i16> %val6) {
|
|
24 ; CHECK-LABEL: fun1:
|
|
25 ; CHECK: # BB#0:
|
|
26 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26
|
|
27 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v28, %v30
|
|
28 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]]
|
|
29 ; CHECK-NEXT: vuphb %v0, %v0
|
|
30 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
31 ; CHECK-NEXT: br %r14
|
|
32 %cmp0 = icmp eq <2 x i8> %val1, %val2
|
|
33 %cmp1 = icmp eq <2 x i8> %val3, %val4
|
|
34 %and = and <2 x i1> %cmp0, %cmp1
|
|
35 %sel = select <2 x i1> %and, <2 x i16> %val5, <2 x i16> %val6
|
|
36 ret <2 x i16> %sel
|
|
37 }
|
|
38
|
|
39 define <16 x i8> @fun2(<16 x i8> %val1, <16 x i8> %val2, <16 x i16> %val3, <16 x i16> %val4, <16 x i8> %val5, <16 x i8> %val6) {
|
|
40 ; CHECK-LABEL: fun2:
|
|
41 ; CHECK: # BB#0:
|
|
42 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v30, %v27
|
|
43 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v25
|
|
44 ; CHECK-DAG: vceqb [[REG2:%v[0-9]+]], %v24, %v26
|
|
45 ; CHECK-DAG: vpkh [[REG3:%v[0-9]+]], [[REG1]], [[REG0]]
|
|
46 ; CHECK-NEXT: vo %v0, [[REG2]], [[REG3]]
|
|
47 ; CHECK-NEXT: vsel %v24, %v29, %v31, %v0
|
|
48 ; CHECK-NEXT: br %r14
|
|
49 %cmp0 = icmp eq <16 x i8> %val1, %val2
|
|
50 %cmp1 = icmp eq <16 x i16> %val3, %val4
|
|
51 %and = or <16 x i1> %cmp0, %cmp1
|
|
52 %sel = select <16 x i1> %and, <16 x i8> %val5, <16 x i8> %val6
|
|
53 ret <16 x i8> %sel
|
|
54 }
|
|
55
|
|
56 define <16 x i16> @fun3(<16 x i8> %val1, <16 x i8> %val2, <16 x i16> %val3, <16 x i16> %val4, <16 x i16> %val5, <16 x i16> %val6) {
|
|
57 ; CHECK-LABEL: fun3:
|
|
58 ; CHECK: # BB#0:
|
|
59 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26
|
|
60 ; CHECK-DAG: vuphb [[REG2:%v[0-9]+]], [[REG0]]
|
|
61 ; CHECK-DAG: vmrlg [[REG1:%v[0-9]+]], [[REG0]], [[REG0]]
|
|
62 ; CHECK-DAG: vuphb [[REG1]], [[REG1]]
|
|
63 ; CHECK-DAG: vceqh [[REG3:%v[0-9]+]], %v28, %v25
|
|
64 ; CHECK-DAG: vceqh [[REG4:%v[0-9]+]], %v30, %v27
|
|
65 ; CHECK-DAG: vl [[REG5:%v[0-9]+]], 176(%r15)
|
|
66 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 160(%r15)
|
|
67 ; CHECK-DAG: vo [[REG7:%v[0-9]+]], %v2, [[REG4]]
|
|
68 ; CHECK-DAG: vo [[REG8:%v[0-9]+]], [[REG2]], [[REG3]]
|
|
69 ; CHECK-DAG: vsel %v24, %v29, [[REG6]], [[REG8]]
|
|
70 ; CHECK-DAG: vsel %v26, %v31, [[REG5]], [[REG7]]
|
|
71 ; CHECK-NEXT: br %r14
|
|
72 %cmp0 = icmp eq <16 x i8> %val1, %val2
|
|
73 %cmp1 = icmp eq <16 x i16> %val3, %val4
|
|
74 %and = or <16 x i1> %cmp0, %cmp1
|
|
75 %sel = select <16 x i1> %and, <16 x i16> %val5, <16 x i16> %val6
|
|
76 ret <16 x i16> %sel
|
|
77 }
|
|
78
|
|
79 define <32 x i8> @fun4(<32 x i8> %val1, <32 x i8> %val2, <32 x i8> %val3, <32 x i8> %val4, <32 x i8> %val5, <32 x i8> %val6) {
|
|
80 ; CHECK-LABEL: fun4:
|
|
81 ; CHECK: # BB#0:
|
|
82 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v28
|
|
83 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v26, %v30
|
|
84 ; CHECK-DAG: vceqb [[REG2:%v[0-9]+]], %v25, %v29
|
|
85 ; CHECK-DAG: vceqb [[REG3:%v[0-9]+]], %v27, %v31
|
|
86 ; CHECK-DAG: vl [[REG4:%v[0-9]+]], 208(%r15)
|
|
87 ; CHECK-DAG: vl [[REG5:%v[0-9]+]], 176(%r15)
|
|
88 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 192(%r15)
|
|
89 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15)
|
|
90 ; CHECK-DAG: vx [[REG8:%v[0-9]+]], [[REG1]], [[REG3]]
|
|
91 ; CHECK-DAG: vx [[REG9:%v[0-9]+]], [[REG0]], [[REG2]]
|
|
92 ; CHECK-DAG: vsel %v24, [[REG7]], [[REG6]], [[REG9]]
|
|
93 ; CHECK-DAG: vsel %v26, [[REG5]], [[REG4]], [[REG8]]
|
|
94 ; CHECK-NEXT: br %r14
|
|
95 %cmp0 = icmp eq <32 x i8> %val1, %val2
|
|
96 %cmp1 = icmp eq <32 x i8> %val3, %val4
|
|
97 %and = xor <32 x i1> %cmp0, %cmp1
|
|
98 %sel = select <32 x i1> %and, <32 x i8> %val5, <32 x i8> %val6
|
|
99 ret <32 x i8> %sel
|
|
100 }
|
|
101
|
|
102 define <2 x i8> @fun5(<2 x i16> %val1, <2 x i16> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i8> %val5, <2 x i8> %val6) {
|
|
103 ; CHECK-LABEL: fun5:
|
|
104 ; CHECK: # BB#0:
|
|
105 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26
|
|
106 ; CHECK-DAG: vpkh [[REG1:%v[0-9]+]], [[REG0]], [[REG0]]
|
|
107 ; CHECK-DAG: vceqb [[REG2:%v[0-9]+]], %v28, %v30
|
|
108 ; CHECK-DAG: vo %v0, [[REG1]], [[REG2]]
|
|
109 ; CHECK-DAG: vsel %v24, %v25, %v27, %v0
|
|
110 ; CHECK-NEXT: br %r14
|
|
111 %cmp0 = icmp eq <2 x i16> %val1, %val2
|
|
112 %cmp1 = icmp eq <2 x i8> %val3, %val4
|
|
113 %and = or <2 x i1> %cmp0, %cmp1
|
|
114 %sel = select <2 x i1> %and, <2 x i8> %val5, <2 x i8> %val6
|
|
115 ret <2 x i8> %sel
|
|
116 }
|
|
117
|
|
118 define <2 x i16> @fun6(<2 x i16> %val1, <2 x i16> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i16> %val5, <2 x i16> %val6) {
|
|
119 ; CHECK-LABEL: fun6:
|
|
120 ; CHECK: # BB#0:
|
|
121 ; CHECK-NEXT: vceqb %v1, %v28, %v30
|
|
122 ; CHECK-NEXT: vceqh %v0, %v24, %v26
|
|
123 ; CHECK-NEXT: vuphb %v1, %v1
|
|
124 ; CHECK-NEXT: vo %v0, %v0, %v1
|
|
125 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
126 ; CHECK-NEXT: br %r14
|
|
127 %cmp0 = icmp eq <2 x i16> %val1, %val2
|
|
128 %cmp1 = icmp eq <2 x i8> %val3, %val4
|
|
129 %and = or <2 x i1> %cmp0, %cmp1
|
|
130 %sel = select <2 x i1> %and, <2 x i16> %val5, <2 x i16> %val6
|
|
131 ret <2 x i16> %sel
|
|
132 }
|
|
133
|
|
134 define <2 x i32> @fun7(<2 x i16> %val1, <2 x i16> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x i32> %val5, <2 x i32> %val6) {
|
|
135 ; CHECK-LABEL: fun7:
|
|
136 ; CHECK: # BB#0:
|
|
137 ; CHECK-NEXT: vceqb %v1, %v28, %v30
|
|
138 ; CHECK-NEXT: vceqh %v0, %v24, %v26
|
|
139 ; CHECK-NEXT: vuphb %v1, %v1
|
|
140 ; CHECK-NEXT: vo %v0, %v0, %v1
|
|
141 ; CHECK-NEXT: vuphh %v0, %v0
|
|
142 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
143 ; CHECK-NEXT: br %r14
|
|
144 %cmp0 = icmp eq <2 x i16> %val1, %val2
|
|
145 %cmp1 = icmp eq <2 x i8> %val3, %val4
|
|
146 %and = or <2 x i1> %cmp0, %cmp1
|
|
147 %sel = select <2 x i1> %and, <2 x i32> %val5, <2 x i32> %val6
|
|
148 ret <2 x i32> %sel
|
|
149 }
|
|
150
|
|
151 define <8 x i8> @fun8(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3, <8 x i16> %val4, <8 x i8> %val5, <8 x i8> %val6) {
|
|
152 ; CHECK-LABEL: fun8:
|
|
153 ; CHECK: # BB#0:
|
|
154 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26
|
|
155 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v30
|
|
156 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]]
|
|
157 ; CHECK-NEXT: vpkh %v0, %v0, %v0
|
|
158 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
159 ; CHECK-NEXT: br %r14
|
|
160 %cmp0 = icmp eq <8 x i16> %val1, %val2
|
|
161 %cmp1 = icmp eq <8 x i16> %val3, %val4
|
|
162 %and = xor <8 x i1> %cmp0, %cmp1
|
|
163 %sel = select <8 x i1> %and, <8 x i8> %val5, <8 x i8> %val6
|
|
164 ret <8 x i8> %sel
|
|
165 }
|
|
166
|
|
167 define <8 x i16> @fun9(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3, <8 x i16> %val4, <8 x i16> %val5, <8 x i16> %val6) {
|
|
168 ; CHECK-LABEL: fun9:
|
|
169 ; CHECK: # BB#0:
|
|
170 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26
|
|
171 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v30
|
|
172 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]]
|
|
173 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
174 ; CHECK-NEXT: br %r14
|
|
175 %cmp0 = icmp eq <8 x i16> %val1, %val2
|
|
176 %cmp1 = icmp eq <8 x i16> %val3, %val4
|
|
177 %and = xor <8 x i1> %cmp0, %cmp1
|
|
178 %sel = select <8 x i1> %and, <8 x i16> %val5, <8 x i16> %val6
|
|
179 ret <8 x i16> %sel
|
|
180 }
|
|
181
|
|
182 define <8 x i32> @fun10(<8 x i16> %val1, <8 x i16> %val2, <8 x i16> %val3, <8 x i16> %val4, <8 x i32> %val5, <8 x i32> %val6) {
|
|
183 ; CHECK-LABEL: fun10:
|
|
184 ; CHECK: # BB#0:
|
|
185 ; CHECK-DAG: vceqh [[REG0:%v[0-9]+]], %v24, %v26
|
|
186 ; CHECK-DAG: vceqh [[REG1:%v[0-9]+]], %v28, %v30
|
|
187 ; CHECK-NEXT: vx [[REG2:%v[0-9]+]], [[REG0]], [[REG1]]
|
|
188 ; CHECK-DAG: vuphh [[REG3:%v[0-9]+]], [[REG2]]
|
|
189 ; CHECK-DAG: vmrlg [[REG4:%v[0-9]+]], [[REG2]], [[REG2]]
|
|
190 ; CHECK-DAG: vuphh [[REG5:%v[0-9]+]], [[REG4]]
|
|
191 ; CHECK-NEXT: vsel %v24, %v25, %v29, [[REG3]]
|
|
192 ; CHECK-NEXT: vsel %v26, %v27, %v31, [[REG5]]
|
|
193 ; CHECK-NEXT: br %r14
|
|
194 %cmp0 = icmp eq <8 x i16> %val1, %val2
|
|
195 %cmp1 = icmp eq <8 x i16> %val3, %val4
|
|
196 %and = xor <8 x i1> %cmp0, %cmp1
|
|
197 %sel = select <8 x i1> %and, <8 x i32> %val5, <8 x i32> %val6
|
|
198 ret <8 x i32> %sel
|
|
199 }
|
|
200
|
|
201 define <16 x i8> @fun11(<16 x i16> %val1, <16 x i16> %val2, <16 x i32> %val3, <16 x i32> %val4, <16 x i8> %val5, <16 x i8> %val6) {
|
|
202 ; CHECK-LABEL: fun11:
|
|
203 ; CHECK: # BB#0:
|
|
204 ; CHECK-DAG: vl [[REG0:%v[0-9]+]], 192(%r15)
|
|
205 ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 208(%r15)
|
|
206 ; CHECK-DAG: vl [[REG2:%v[0-9]+]], 160(%r15)
|
|
207 ; CHECK-DAG: vl [[REG3:%v[0-9]+]], 176(%r15)
|
|
208 ; CHECK-DAG: vceqf [[REG4:%v[0-9]+]], %v27, [[REG3]]
|
|
209 ; CHECK-DAG: vceqf [[REG5:%v[0-9]+]], %v25, [[REG2]]
|
|
210 ; CHECK-DAG: vceqf [[REG6:%v[0-9]+]], %v31, [[REG1]]
|
|
211 ; CHECK-DAG: vceqf [[REG7:%v[0-9]+]], %v29, [[REG0]]
|
|
212 ; CHECK-DAG: vceqh [[REG8:%v[0-9]+]], %v24, %v28
|
|
213 ; CHECK-DAG: vceqh [[REG9:%v[0-9]+]], %v26, %v30
|
|
214 ; CHECK-DAG: vpkf [[REG10:%v[0-9]+]], [[REG5]], [[REG4]]
|
|
215 ; CHECK-DAG: vpkf [[REG11:%v[0-9]+]], [[REG7]], [[REG6]]
|
|
216 ; CHECK-DAG: vn [[REG12:%v[0-9]+]], [[REG9]], [[REG11]]
|
|
217 ; CHECK-DAG: vn [[REG13:%v[0-9]+]], [[REG8]], [[REG10]]
|
|
218 ; CHECK-DAG: vl [[REG14:%v[0-9]+]], 240(%r15)
|
|
219 ; CHECK-DAG: vl [[REG15:%v[0-9]+]], 224(%r15)
|
|
220 ; CHECK-DAG: vpkh [[REG16:%v[0-9]+]], [[REG13]], [[REG12]]
|
|
221 ; CHECK-NEXT: vsel %v24, [[REG15]], [[REG14]], [[REG16]]
|
|
222 ; CHECK-NEXT: br %r14
|
|
223 %cmp0 = icmp eq <16 x i16> %val1, %val2
|
|
224 %cmp1 = icmp eq <16 x i32> %val3, %val4
|
|
225 %and = and <16 x i1> %cmp0, %cmp1
|
|
226 %sel = select <16 x i1> %and, <16 x i8> %val5, <16 x i8> %val6
|
|
227 ret <16 x i8> %sel
|
|
228 }
|
|
229
|
|
230 define <16 x i16> @fun12(<16 x i16> %val1, <16 x i16> %val2, <16 x i32> %val3, <16 x i32> %val4, <16 x i16> %val5, <16 x i16> %val6) {
|
|
231 ; CHECK-LABEL: fun12:
|
|
232 ; CHECK: # BB#0:
|
|
233 ; CHECK-DAG: vl [[REG0:%v[0-9]+]], 192(%r15)
|
|
234 ; CHECK-DAG: vl [[REG1:%v[0-9]+]], 208(%r15)
|
|
235 ; CHECK-DAG: vl [[REG2:%v[0-9]+]], 160(%r15)
|
|
236 ; CHECK-DAG: vl [[REG3:%v[0-9]+]], 176(%r15)
|
|
237 ; CHECK-DAG: vceqf [[REG4:%v[0-9]+]], %v27, [[REG3]]
|
|
238 ; CHECK-DAG: vceqf [[REG5:%v[0-9]+]], %v25, [[REG2]]
|
|
239 ; CHECK-DAG: vceqf [[REG6:%v[0-9]+]], %v31, [[REG1]]
|
|
240 ; CHECK-DAG: vceqf [[REG7:%v[0-9]+]], %v29, [[REG0]]
|
|
241 ; CHECK-DAG: vceqh [[REG8:%v[0-9]+]], %v24, %v28
|
|
242 ; CHECK-DAG: vceqh [[REG9:%v[0-9]+]], %v26, %v30
|
|
243 ; CHECK-DAG: vpkf [[REG10:%v[0-9]+]], [[REG5]], [[REG4]]
|
|
244 ; CHECK-DAG: vpkf [[REG11:%v[0-9]+]], [[REG7]], [[REG6]]
|
|
245 ; CHECK-DAG: vl [[REG12:%v[0-9]+]], 272(%r15)
|
|
246 ; CHECK-DAG: vl [[REG13:%v[0-9]+]], 240(%r15)
|
|
247 ; CHECK-DAG: vl [[REG14:%v[0-9]+]], 256(%r15)
|
|
248 ; CHECK-DAG: vl [[REG15:%v[0-9]+]], 224(%r15)
|
|
249 ; CHECK-DAG: vn [[REG16:%v[0-9]+]], [[REG9]], [[REG11]]
|
|
250 ; CHECK-DAG: vn [[REG17:%v[0-9]+]], [[REG8]], [[REG10]]
|
|
251 ; CHECK-DAG: vsel %v24, [[REG15]], [[REG14]], [[REG17]]
|
|
252 ; CHECK-DAG: vsel %v26, [[REG13]], [[REG12]], [[REG16]]
|
|
253 ; CHECK-NEXT: br %r14
|
|
254 %cmp0 = icmp eq <16 x i16> %val1, %val2
|
|
255 %cmp1 = icmp eq <16 x i32> %val3, %val4
|
|
256 %and = and <16 x i1> %cmp0, %cmp1
|
|
257 %sel = select <16 x i1> %and, <16 x i16> %val5, <16 x i16> %val6
|
|
258 ret <16 x i16> %sel
|
|
259 }
|
|
260
|
|
261 define <2 x i16> @fun13(<2 x i32> %val1, <2 x i32> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i16> %val5, <2 x i16> %val6) {
|
|
262 ; CHECK-LABEL: fun13:
|
|
263 ; CHECK: # BB#0:
|
|
264 ; CHECK-NEXT: vceqg %v1, %v28, %v30
|
|
265 ; CHECK-NEXT: vceqf %v0, %v24, %v26
|
|
266 ; CHECK-NEXT: vpkg %v1, %v1, %v1
|
|
267 ; CHECK-NEXT: vx %v0, %v0, %v1
|
|
268 ; CHECK-NEXT: vpkf %v0, %v0, %v0
|
|
269 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
270 ; CHECK-NEXT: br %r14
|
|
271 %cmp0 = icmp eq <2 x i32> %val1, %val2
|
|
272 %cmp1 = icmp eq <2 x i64> %val3, %val4
|
|
273 %and = xor <2 x i1> %cmp0, %cmp1
|
|
274 %sel = select <2 x i1> %and, <2 x i16> %val5, <2 x i16> %val6
|
|
275 ret <2 x i16> %sel
|
|
276 }
|
|
277
|
|
278 define <2 x i32> @fun14(<2 x i32> %val1, <2 x i32> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i32> %val5, <2 x i32> %val6) {
|
|
279 ; CHECK-LABEL: fun14:
|
|
280 ; CHECK: # BB#0:
|
|
281 ; CHECK-NEXT: vceqg %v1, %v28, %v30
|
|
282 ; CHECK-NEXT: vceqf %v0, %v24, %v26
|
|
283 ; CHECK-NEXT: vpkg %v1, %v1, %v1
|
|
284 ; CHECK-NEXT: vx %v0, %v0, %v1
|
|
285 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
286 ; CHECK-NEXT: br %r14
|
|
287 %cmp0 = icmp eq <2 x i32> %val1, %val2
|
|
288 %cmp1 = icmp eq <2 x i64> %val3, %val4
|
|
289 %and = xor <2 x i1> %cmp0, %cmp1
|
|
290 %sel = select <2 x i1> %and, <2 x i32> %val5, <2 x i32> %val6
|
|
291 ret <2 x i32> %sel
|
|
292 }
|
|
293
|
|
294 define <2 x i64> @fun15(<2 x i32> %val1, <2 x i32> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i64> %val5, <2 x i64> %val6) {
|
|
295 ; CHECK-LABEL: fun15:
|
|
296 ; CHECK: # BB#0:
|
|
297 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v26
|
|
298 ; CHECK-DAG: vuphf [[REG1:%v[0-9]+]], [[REG0]]
|
|
299 ; CHECK-DAG: vceqg [[REG2:%v[0-9]+]], %v28, %v30
|
|
300 ; CHECK-NEXT: vx %v0, [[REG1]], [[REG2]]
|
|
301 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
302 ; CHECK-NEXT: br %r14
|
|
303 %cmp0 = icmp eq <2 x i32> %val1, %val2
|
|
304 %cmp1 = icmp eq <2 x i64> %val3, %val4
|
|
305 %and = xor <2 x i1> %cmp0, %cmp1
|
|
306 %sel = select <2 x i1> %and, <2 x i64> %val5, <2 x i64> %val6
|
|
307 ret <2 x i64> %sel
|
|
308 }
|
|
309
|
|
310 define <4 x i16> @fun16(<4 x i32> %val1, <4 x i32> %val2, <4 x i16> %val3, <4 x i16> %val4, <4 x i16> %val5, <4 x i16> %val6) {
|
|
311 ; CHECK-LABEL: fun16:
|
|
312 ; CHECK: # BB#0:
|
|
313 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v26
|
|
314 ; CHECK-DAG: vpkf [[REG1:%v[0-9]+]], [[REG0]], [[REG0]]
|
|
315 ; CHECK-DAG: vceqh [[REG2:%v[0-9]+]], %v28, %v30
|
|
316 ; CHECK-NEXT: vn %v0, [[REG1]], [[REG2]]
|
|
317 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
318 ; CHECK-NEXT: br %r14
|
|
319 %cmp0 = icmp eq <4 x i32> %val1, %val2
|
|
320 %cmp1 = icmp eq <4 x i16> %val3, %val4
|
|
321 %and = and <4 x i1> %cmp0, %cmp1
|
|
322 %sel = select <4 x i1> %and, <4 x i16> %val5, <4 x i16> %val6
|
|
323 ret <4 x i16> %sel
|
|
324 }
|
|
325
|
|
326 define <4 x i32> @fun17(<4 x i32> %val1, <4 x i32> %val2, <4 x i16> %val3, <4 x i16> %val4, <4 x i32> %val5, <4 x i32> %val6) {
|
|
327 ; CHECK-LABEL: fun17:
|
|
328 ; CHECK: # BB#0:
|
|
329 ; CHECK-NEXT: vceqh %v1, %v28, %v30
|
|
330 ; CHECK-NEXT: vceqf %v0, %v24, %v26
|
|
331 ; CHECK-NEXT: vuphh %v1, %v1
|
|
332 ; CHECK-NEXT: vn %v0, %v0, %v1
|
|
333 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
334 ; CHECK-NEXT: br %r14
|
|
335 %cmp0 = icmp eq <4 x i32> %val1, %val2
|
|
336 %cmp1 = icmp eq <4 x i16> %val3, %val4
|
|
337 %and = and <4 x i1> %cmp0, %cmp1
|
|
338 %sel = select <4 x i1> %and, <4 x i32> %val5, <4 x i32> %val6
|
|
339 ret <4 x i32> %sel
|
|
340 }
|
|
341
|
|
342 define <4 x i64> @fun18(<4 x i32> %val1, <4 x i32> %val2, <4 x i16> %val3, <4 x i16> %val4, <4 x i64> %val5, <4 x i64> %val6) {
|
|
343 ; CHECK-LABEL: fun18:
|
|
344 ; CHECK: # BB#0:
|
|
345 ; CHECK-NEXT: vceqh %v1, %v28, %v30
|
|
346 ; CHECK-NEXT: vceqf %v0, %v24, %v26
|
|
347 ; CHECK-NEXT: vuphh %v1, %v1
|
|
348 ; CHECK-NEXT: vn %v0, %v0, %v1
|
|
349 ; CHECK-DAG: vuphf [[REG0:%v[0-9]+]], %v0
|
|
350 ; CHECK-DAG: vmrlg [[REG1:%v[0-9]+]], %v0, %v0
|
|
351 ; CHECK-DAG: vuphf [[REG2:%v[0-9]+]], [[REG1]]
|
|
352 ; CHECK-NEXT: vsel %v24, %v25, %v29, [[REG0]]
|
|
353 ; CHECK-NEXT: vsel %v26, %v27, %v31, [[REG2]]
|
|
354 ; CHECK-NEXT: br %r14
|
|
355 %cmp0 = icmp eq <4 x i32> %val1, %val2
|
|
356 %cmp1 = icmp eq <4 x i16> %val3, %val4
|
|
357 %and = and <4 x i1> %cmp0, %cmp1
|
|
358 %sel = select <4 x i1> %and, <4 x i64> %val5, <4 x i64> %val6
|
|
359 ret <4 x i64> %sel
|
|
360 }
|
|
361
|
|
362 define <8 x i16> @fun19(<8 x i32> %val1, <8 x i32> %val2, <8 x i32> %val3, <8 x i32> %val4, <8 x i16> %val5, <8 x i16> %val6) {
|
|
363 ; CHECK-LABEL: fun19:
|
|
364 ; CHECK: # BB#0:
|
|
365 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v28
|
|
366 ; CHECK-DAG: vceqf [[REG1:%v[0-9]+]], %v26, %v30
|
|
367 ; CHECK-DAG: vceqf [[REG2:%v[0-9]+]], %v25, %v29
|
|
368 ; CHECK-DAG: vceqf [[REG3:%v[0-9]+]], %v27, %v31
|
|
369 ; CHECK-DAG: vo [[REG4:%v[0-9]+]], [[REG1]], [[REG3]]
|
|
370 ; CHECK-DAG: vo [[REG5:%v[0-9]+]], [[REG0]], [[REG2]]
|
|
371 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 176(%r15)
|
|
372 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15)
|
|
373 ; CHECK-DAG: vpkf [[REG8:%v[0-9]+]], [[REG5]], [[REG4]]
|
|
374 ; CHECK-NEXT: vsel %v24, [[REG7]], [[REG6]], [[REG8]]
|
|
375 ; CHECK-NEXT: br %r14
|
|
376 %cmp0 = icmp eq <8 x i32> %val1, %val2
|
|
377 %cmp1 = icmp eq <8 x i32> %val3, %val4
|
|
378 %and = or <8 x i1> %cmp0, %cmp1
|
|
379 %sel = select <8 x i1> %and, <8 x i16> %val5, <8 x i16> %val6
|
|
380 ret <8 x i16> %sel
|
|
381 }
|
|
382
|
|
383 define <8 x i32> @fun20(<8 x i32> %val1, <8 x i32> %val2, <8 x i32> %val3, <8 x i32> %val4, <8 x i32> %val5, <8 x i32> %val6) {
|
|
384 ; CHECK-LABEL: fun20:
|
|
385 ; CHECK: # BB#0:
|
|
386 ; CHECK-DAG: vceqf [[REG0:%v[0-9]+]], %v24, %v28
|
|
387 ; CHECK-DAG: vceqf [[REG1:%v[0-9]+]], %v26, %v30
|
|
388 ; CHECK-DAG: vceqf [[REG2:%v[0-9]+]], %v25, %v29
|
|
389 ; CHECK-DAG: vceqf [[REG3:%v[0-9]+]], %v27, %v31
|
|
390 ; CHECK-DAG: vl [[REG4:%v[0-9]+]], 208(%r15)
|
|
391 ; CHECK-DAG: vl [[REG5:%v[0-9]+]], 176(%r15)
|
|
392 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 192(%r15)
|
|
393 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15)
|
|
394 ; CHECK-DAG: vo [[REG8:%v[0-9]+]], [[REG1]], [[REG3]]
|
|
395 ; CHECK-DAG: vo [[REG9:%v[0-9]+]], [[REG0]], [[REG2]]
|
|
396 ; CHECK-DAG: vsel %v24, [[REG7]], [[REG6]], [[REG9]]
|
|
397 ; CHECK-DAG: vsel %v26, [[REG5]], [[REG4]], [[REG8]]
|
|
398 ; CHECK-NEXT: br %r14
|
|
399 %cmp0 = icmp eq <8 x i32> %val1, %val2
|
|
400 %cmp1 = icmp eq <8 x i32> %val3, %val4
|
|
401 %and = or <8 x i1> %cmp0, %cmp1
|
|
402 %sel = select <8 x i1> %and, <8 x i32> %val5, <8 x i32> %val6
|
|
403 ret <8 x i32> %sel
|
|
404 }
|
|
405
|
|
406 define <2 x i32> @fun21(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i32> %val5, <2 x i32> %val6) {
|
|
407 ; CHECK-LABEL: fun21:
|
|
408 ; CHECK: # BB#0:
|
|
409 ; CHECK-DAG: vceqg [[REG0:%v[0-9]+]], %v24, %v26
|
|
410 ; CHECK-DAG: vceqg [[REG1:%v[0-9]+]], %v28, %v30
|
|
411 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]]
|
|
412 ; CHECK-NEXT: vpkg %v0, %v0, %v0
|
|
413 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
414 ; CHECK-NEXT: br %r14
|
|
415 %cmp0 = icmp eq <2 x i64> %val1, %val2
|
|
416 %cmp1 = icmp eq <2 x i64> %val3, %val4
|
|
417 %and = and <2 x i1> %cmp0, %cmp1
|
|
418 %sel = select <2 x i1> %and, <2 x i32> %val5, <2 x i32> %val6
|
|
419 ret <2 x i32> %sel
|
|
420 }
|
|
421
|
|
422 define <2 x i64> @fun22(<2 x i64> %val1, <2 x i64> %val2, <2 x i64> %val3, <2 x i64> %val4, <2 x i64> %val5, <2 x i64> %val6) {
|
|
423 ; CHECK-LABEL: fun22:
|
|
424 ; CHECK: # BB#0:
|
|
425 ; CHECK-DAG: vceqg [[REG0:%v[0-9]+]], %v24, %v26
|
|
426 ; CHECK-DAG: vceqg [[REG1:%v[0-9]+]], %v28, %v30
|
|
427 ; CHECK-NEXT: vn %v0, [[REG0]], [[REG1]]
|
|
428 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
429 ; CHECK-NEXT: br %r14
|
|
430 %cmp0 = icmp eq <2 x i64> %val1, %val2
|
|
431 %cmp1 = icmp eq <2 x i64> %val3, %val4
|
|
432 %and = and <2 x i1> %cmp0, %cmp1
|
|
433 %sel = select <2 x i1> %and, <2 x i64> %val5, <2 x i64> %val6
|
|
434 ret <2 x i64> %sel
|
|
435 }
|
|
436
|
|
437 define <4 x i32> @fun23(<4 x i64> %val1, <4 x i64> %val2, <4 x i32> %val3, <4 x i32> %val4, <4 x i32> %val5, <4 x i32> %val6) {
|
|
438 ; CHECK-LABEL: fun23:
|
|
439 ; CHECK: # BB#0:
|
|
440 ; CHECK-NEXT: vceqg %v0, %v26, %v30
|
|
441 ; CHECK-NEXT: vceqg %v1, %v24, %v28
|
|
442 ; CHECK-NEXT: vpkg %v0, %v1, %v0
|
|
443 ; CHECK-NEXT: vceqf %v1, %v25, %v27
|
|
444 ; CHECK-NEXT: vx %v0, %v0, %v1
|
|
445 ; CHECK-NEXT: vsel %v24, %v29, %v31, %v0
|
|
446 ; CHECK-NEXT: br %r14
|
|
447 %cmp0 = icmp eq <4 x i64> %val1, %val2
|
|
448 %cmp1 = icmp eq <4 x i32> %val3, %val4
|
|
449 %and = xor <4 x i1> %cmp0, %cmp1
|
|
450 %sel = select <4 x i1> %and, <4 x i32> %val5, <4 x i32> %val6
|
|
451 ret <4 x i32> %sel
|
|
452 }
|
|
453
|
|
454 define <4 x i64> @fun24(<4 x i64> %val1, <4 x i64> %val2, <4 x i32> %val3, <4 x i32> %val4, <4 x i64> %val5, <4 x i64> %val6) {
|
|
455 ; CHECK-LABEL: fun24:
|
|
456 ; CHECK: # BB#0:
|
|
457 ; CHECK-NEXT: vceqf [[REG0:%v[0-9]+]], %v25, %v27
|
|
458 ; CHECK-NEXT: vuphf [[REG1:%v[0-9]+]], [[REG0]]
|
|
459 ; CHECK-NEXT: vmrlg [[REG2:%v[0-9]+]], [[REG0]], [[REG0]]
|
|
460 ; CHECK-NEXT: vceqg [[REG3:%v[0-9]+]], %v24, %v28
|
|
461 ; CHECK-NEXT: vceqg [[REG4:%v[0-9]+]], %v26, %v30
|
|
462 ; CHECK-NEXT: vuphf [[REG5:%v[0-9]+]], [[REG2]]
|
|
463 ; CHECK-DAG: vl [[REG6:%v[0-9]+]], 176(%r15)
|
|
464 ; CHECK-DAG: vl [[REG7:%v[0-9]+]], 160(%r15)
|
|
465 ; CHECK-DAG: vx [[REG8:%v[0-9]+]], [[REG4]], [[REG5]]
|
|
466 ; CHECK-DAG: vx [[REG9:%v[0-9]+]], [[REG3]], [[REG1]]
|
|
467 ; CHECK-DAG: vsel %v24, %v29, [[REG7]], [[REG9]]
|
|
468 ; CHECK-DAG: vsel %v26, %v31, [[REG6]], [[REG8]]
|
|
469 ; CHECK-NEXT: br %r14
|
|
470 %cmp0 = icmp eq <4 x i64> %val1, %val2
|
|
471 %cmp1 = icmp eq <4 x i32> %val3, %val4
|
|
472 %and = xor <4 x i1> %cmp0, %cmp1
|
|
473 %sel = select <4 x i1> %and, <4 x i64> %val5, <4 x i64> %val6
|
|
474 ret <4 x i64> %sel
|
|
475 }
|
|
476
|
|
477 define <2 x float> @fun25(<2 x float> %val1, <2 x float> %val2, <2 x double> %val3, <2 x double> %val4, <2 x float> %val5, <2 x float> %val6) {
|
|
478 ; CHECK-LABEL: fun25:
|
|
479 ; CHECK: # BB#0:
|
|
480 ; CHECK-NEXT: vmrlf %v0, %v26, %v26
|
|
481 ; CHECK-NEXT: vmrlf %v1, %v24, %v24
|
|
482 ; CHECK-NEXT: vldeb %v0, %v0
|
|
483 ; CHECK-NEXT: vldeb %v1, %v1
|
|
484 ; CHECK-NEXT: vfchdb %v0, %v1, %v0
|
|
485 ; CHECK-NEXT: vmrhf %v1, %v26, %v26
|
|
486 ; CHECK-NEXT: vmrhf %v2, %v24, %v24
|
|
487 ; CHECK-NEXT: vldeb %v1, %v1
|
|
488 ; CHECK-NEXT: vldeb %v2, %v2
|
|
489 ; CHECK-NEXT: vfchdb %v1, %v2, %v1
|
|
490 ; CHECK-NEXT: vpkg %v0, %v1, %v0
|
|
491 ; CHECK-NEXT: vfchdb %v1, %v28, %v30
|
|
492 ; CHECK-NEXT: vpkg %v1, %v1, %v1
|
|
493 ; CHECK-NEXT: vo %v0, %v0, %v1
|
|
494 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
495 ; CHECK-NEXT: br %r14
|
|
496 ;
|
|
497 ; CHECK-Z14-LABEL: fun25:
|
|
498 ; CHECK-Z14: # BB#0:
|
|
499 ; CHECK-Z14-NEXT: vfchdb %v1, %v28, %v30
|
|
500 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26
|
|
501 ; CHECK-Z14-NEXT: vpkg %v1, %v1, %v1
|
|
502 ; CHECK-Z14-NEXT: vo %v0, %v0, %v1
|
|
503 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v27, %v0
|
|
504 ; CHECK-Z14-NEXT: br %r14
|
|
505 %cmp0 = fcmp ogt <2 x float> %val1, %val2
|
|
506 %cmp1 = fcmp ogt <2 x double> %val3, %val4
|
|
507 %and = or <2 x i1> %cmp0, %cmp1
|
|
508 %sel = select <2 x i1> %and, <2 x float> %val5, <2 x float> %val6
|
|
509 ret <2 x float> %sel
|
|
510 }
|
|
511
|
|
512 define <2 x double> @fun26(<2 x float> %val1, <2 x float> %val2, <2 x double> %val3, <2 x double> %val4, <2 x double> %val5, <2 x double> %val6) {
|
|
513 ; CHECK-LABEL: fun26:
|
|
514 ; CHECK: # BB#0:
|
|
515 ; CHECK-NEXT: vmrlf %v0, %v26, %v26
|
|
516 ; CHECK-NEXT: vmrlf %v1, %v24, %v24
|
|
517 ; CHECK-NEXT: vldeb %v0, %v0
|
|
518 ; CHECK-NEXT: vldeb %v1, %v1
|
|
519 ; CHECK-NEXT: vfchdb %v0, %v1, %v0
|
|
520 ; CHECK-NEXT: vmrhf %v1, %v26, %v26
|
|
521 ; CHECK-NEXT: vmrhf %v2, %v24, %v24
|
|
522 ; CHECK-NEXT: vldeb %v1, %v1
|
|
523 ; CHECK-NEXT: vldeb %v2, %v2
|
|
524 ; CHECK-NEXT: vfchdb %v1, %v2, %v1
|
|
525 ; CHECK-NEXT: vpkg %v0, %v1, %v0
|
|
526 ; CHECK-NEXT: vuphf %v0, %v0
|
|
527 ; CHECK-NEXT: vfchdb %v1, %v28, %v30
|
|
528 ; CHECK-NEXT: vo %v0, %v0, %v1
|
|
529 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
530 ; CHECK-NEXT: br %r14
|
|
531 ;
|
|
532 ; CHECK-Z14-LABEL: fun26:
|
|
533 ; CHECK-Z14: # BB#0:
|
|
534 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26
|
|
535 ; CHECK-Z14-NEXT: vuphf %v0, %v0
|
|
536 ; CHECK-Z14-NEXT: vfchdb %v1, %v28, %v30
|
|
537 ; CHECK-Z14-NEXT: vo %v0, %v0, %v1
|
|
538 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v27, %v0
|
|
539 ; CHECK-Z14-NEXT: br %r14
|
|
540 %cmp0 = fcmp ogt <2 x float> %val1, %val2
|
|
541 %cmp1 = fcmp ogt <2 x double> %val3, %val4
|
|
542 %and = or <2 x i1> %cmp0, %cmp1
|
|
543 %sel = select <2 x i1> %and, <2 x double> %val5, <2 x double> %val6
|
|
544 ret <2 x double> %sel
|
|
545 }
|
|
546
|
|
547 ; Also check a widening select of a vector of floats
|
|
548 define <2 x float> @fun27(<2 x i8> %val1, <2 x i8> %val2, <2 x i8> %val3, <2 x i8> %val4, <2 x float> %val5, <2 x float> %val6) {
|
|
549 ; CHECK-LABEL: fun27:
|
|
550 ; CHECK: # BB#0:
|
|
551 ; CHECK-DAG: vceqb [[REG0:%v[0-9]+]], %v24, %v26
|
|
552 ; CHECK-DAG: vceqb [[REG1:%v[0-9]+]], %v28, %v30
|
|
553 ; CHECK-NEXT: vo %v0, [[REG0]], [[REG1]]
|
|
554 ; CHECK-NEXT: vuphb %v0, %v0
|
|
555 ; CHECK-NEXT: vuphh %v0, %v0
|
|
556 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
557 ; CHECK-NEXT: br %r14
|
|
558 %cmp0 = icmp eq <2 x i8> %val1, %val2
|
|
559 %cmp1 = icmp eq <2 x i8> %val3, %val4
|
|
560 %and = or <2 x i1> %cmp0, %cmp1
|
|
561 %sel = select <2 x i1> %and, <2 x float> %val5, <2 x float> %val6
|
|
562 ret <2 x float> %sel
|
|
563 }
|
|
564
|
|
565 define <4 x float> @fun28(<4 x float> %val1, <4 x float> %val2, <4 x float> %val3, <4 x float> %val4, <4 x float> %val5, <4 x float> %val6) {
|
|
566 ; CHECK-LABEL: fun28:
|
|
567 ; CHECK: # BB#0:
|
|
568 ; CHECK-DAG: vmrlf [[REG0:%v[0-9]+]], %v26, %v26
|
|
569 ; CHECK-DAG: vmrlf [[REG1:%v[0-9]+]], %v24, %v24
|
|
570 ; CHECK-DAG: vldeb [[REG2:%v[0-9]+]], [[REG0]]
|
|
571 ; CHECK-DAG: vldeb [[REG3:%v[0-9]+]], [[REG1]]
|
|
572 ; CHECK-DAG: vfchdb [[REG4:%v[0-9]+]], [[REG3]], [[REG2]]
|
|
573 ; CHECK-DAG: vmrhf [[REG5:%v[0-9]+]], %v26, %v26
|
|
574 ; CHECK-DAG: vmrhf [[REG6:%v[0-9]+]], %v24, %v24
|
|
575 ; CHECK-DAG: vldeb [[REG7:%v[0-9]+]], [[REG5]]
|
|
576 ; CHECK-DAG: vmrhf [[REG8:%v[0-9]+]], %v28, %v28
|
|
577 ; CHECK-DAG: vldeb [[REG9:%v[0-9]+]], [[REG6]]
|
|
578 ; CHECK-DAG: vfchdb [[REG10:%v[0-9]+]], [[REG9]], [[REG7]]
|
|
579 ; CHECK-DAG: vpkg [[REG11:%v[0-9]+]], [[REG10]], [[REG4]]
|
|
580 ; CHECK-DAG: vmrlf [[REG12:%v[0-9]+]], %v30, %v30
|
|
581 ; CHECK-DAG: vmrlf [[REG13:%v[0-9]+]], %v28, %v28
|
|
582 ; CHECK-DAG: vldeb [[REG14:%v[0-9]+]], [[REG12]]
|
|
583 ; CHECK-DAG: vldeb [[REG15:%v[0-9]+]], [[REG13]]
|
|
584 ; CHECK-DAG: vfchdb [[REG16:%v[0-9]+]], [[REG15]], [[REG14]]
|
|
585 ; CHECK-DAG: vmrhf [[REG17:%v[0-9]+]], %v30, %v30
|
|
586 ; CHECK-DAG: vldeb [[REG19:%v[0-9]+]], [[REG17]]
|
|
587 ; CHECK-DAG: vldeb [[REG20:%v[0-9]+]], [[REG8]]
|
|
588 ; CHECK-NEXT: vfchdb %v2, [[REG20]], [[REG19]]
|
|
589 ; CHECK-NEXT: vpkg [[REG21:%v[0-9]+]], %v2, [[REG16]]
|
|
590 ; CHECK-NEXT: vx %v0, [[REG11]], [[REG21]]
|
|
591 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
592 ; CHECK-NEXT: br %r14
|
|
593 ;
|
|
594 ; CHECK-Z14-LABEL: fun28:
|
|
595 ; CHECK-Z14: # BB#0:
|
|
596 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26
|
|
597 ; CHECK-Z14-NEXT: vfchsb %v1, %v28, %v30
|
|
598 ; CHECK-Z14-NEXT: vx %v0, %v0, %v1
|
|
599 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v27, %v0
|
|
600 ; CHECK-Z14-NEXT: br %r14
|
|
601 %cmp0 = fcmp ogt <4 x float> %val1, %val2
|
|
602 %cmp1 = fcmp ogt <4 x float> %val3, %val4
|
|
603 %and = xor <4 x i1> %cmp0, %cmp1
|
|
604 %sel = select <4 x i1> %and, <4 x float> %val5, <4 x float> %val6
|
|
605 ret <4 x float> %sel
|
|
606 }
|
|
607
|
|
608 define <4 x double> @fun29(<4 x float> %val1, <4 x float> %val2, <4 x float> %val3, <4 x float> %val4, <4 x double> %val5, <4 x double> %val6) {
|
|
609 ; CHECK-LABEL: fun29:
|
|
610 ; CHECK: # BB#0:
|
|
611 ; CHECK-NEXT: vmrlf %v0, %v26, %v26
|
|
612 ; CHECK-NEXT: vmrlf %v1, %v24, %v24
|
|
613 ; CHECK-NEXT: vldeb %v0, %v0
|
|
614 ; CHECK-NEXT: vldeb %v1, %v1
|
|
615 ; CHECK-NEXT: vfchdb %v0, %v1, %v0
|
|
616 ; CHECK-NEXT: vmrhf %v1, %v26, %v26
|
|
617 ; CHECK-NEXT: vmrhf %v2, %v24, %v24
|
|
618 ; CHECK-NEXT: vldeb %v1, %v1
|
|
619 ; CHECK-NEXT: vmrhf %v3, %v28, %v28
|
|
620 ; CHECK-NEXT: vldeb %v2, %v2
|
|
621 ; CHECK-NEXT: vfchdb %v1, %v2, %v1
|
|
622 ; CHECK-NEXT: vpkg %v0, %v1, %v0
|
|
623 ; CHECK-NEXT: vmrlf %v1, %v30, %v30
|
|
624 ; CHECK-NEXT: vmrlf %v2, %v28, %v28
|
|
625 ; CHECK-NEXT: vldeb %v1, %v1
|
|
626 ; CHECK-NEXT: vldeb %v2, %v2
|
|
627 ; CHECK-NEXT: vfchdb %v1, %v2, %v1
|
|
628 ; CHECK-NEXT: vmrhf %v2, %v30, %v30
|
|
629 ; CHECK-NEXT: vldeb %v2, %v2
|
|
630 ; CHECK-NEXT: vldeb %v3, %v3
|
|
631 ; CHECK-NEXT: vfchdb %v2, %v3, %v2
|
|
632 ; CHECK-NEXT: vpkg %v1, %v2, %v1
|
|
633 ; CHECK-NEXT: vx %v0, %v0, %v1
|
|
634 ; CHECK-NEXT: vmrlg %v1, %v0, %v0
|
|
635 ; CHECK-NEXT: vuphf %v1, %v1
|
|
636 ; CHECK-NEXT: vuphf %v0, %v0
|
|
637 ; CHECK-NEXT: vsel %v24, %v25, %v29, %v0
|
|
638 ; CHECK-NEXT: vsel %v26, %v27, %v31, %v1
|
|
639 ; CHECK-NEXT: br %r14
|
|
640 ;
|
|
641 ; CHECK-Z14-LABEL: fun29:
|
|
642 ; CHECK-Z14: # BB#0:
|
|
643 ; CHECK-Z14-NEXT: vfchsb %v0, %v24, %v26
|
|
644 ; CHECK-Z14-NEXT: vfchsb %v1, %v28, %v30
|
|
645 ; CHECK-Z14-NEXT: vx %v0, %v0, %v1
|
|
646 ; CHECK-Z14-NEXT: vmrlg %v1, %v0, %v0
|
|
647 ; CHECK-Z14-NEXT: vuphf %v1, %v1
|
|
648 ; CHECK-Z14-NEXT: vuphf %v0, %v0
|
|
649 ; CHECK-Z14-NEXT: vsel %v24, %v25, %v29, %v0
|
|
650 ; CHECK-Z14-NEXT: vsel %v26, %v27, %v31, %v1
|
|
651 ; CHECK-Z14-NEXT: br %r14
|
|
652 %cmp0 = fcmp ogt <4 x float> %val1, %val2
|
|
653 %cmp1 = fcmp ogt <4 x float> %val3, %val4
|
|
654 %and = xor <4 x i1> %cmp0, %cmp1
|
|
655 %sel = select <4 x i1> %and, <4 x double> %val5, <4 x double> %val6
|
|
656 ret <4 x double> %sel
|
|
657 }
|
|
658
|
|
659 define <8 x float> @fun30(<8 x float> %val1, <8 x float> %val2, <8 x double> %val3, <8 x double> %val4, <8 x float> %val5, <8 x float> %val6) {
|
|
660 ; CHECK-LABEL: fun30:
|
|
661 ; CHECK: # BB#0:
|
|
662 ; CHECK-NEXT: vmrlf %v16, %v28, %v28
|
|
663 ; CHECK-NEXT: vmrlf %v17, %v24, %v24
|
|
664 ; CHECK-NEXT: vldeb %v16, %v16
|
|
665 ; CHECK-NEXT: vldeb %v17, %v17
|
|
666 ; CHECK-NEXT: vfchdb %v16, %v17, %v16
|
|
667 ; CHECK-NEXT: vmrhf %v17, %v28, %v28
|
|
668 ; CHECK-NEXT: vmrhf %v18, %v24, %v24
|
|
669 ; CHECK-NEXT: vldeb %v17, %v17
|
|
670 ; CHECK-NEXT: vl %v4, 192(%r15)
|
|
671 ; CHECK-NEXT: vldeb %v18, %v18
|
|
672 ; CHECK-NEXT: vl %v5, 208(%r15)
|
|
673 ; CHECK-NEXT: vl %v6, 160(%r15)
|
|
674 ; CHECK-NEXT: vl %v7, 176(%r15)
|
|
675 ; CHECK-NEXT: vl %v0, 272(%r15)
|
|
676 ; CHECK-NEXT: vl %v1, 240(%r15)
|
|
677 ; CHECK-NEXT: vfchdb %v17, %v18, %v17
|
|
678 ; CHECK-NEXT: vl %v2, 256(%r15)
|
|
679 ; CHECK-NEXT: vl %v3, 224(%r15)
|
|
680 ; CHECK-NEXT: vpkg %v16, %v17, %v16
|
|
681 ; CHECK-NEXT: vmrlf %v17, %v30, %v30
|
|
682 ; CHECK-NEXT: vmrlf %v18, %v26, %v26
|
|
683 ; CHECK-NEXT: vmrhf %v19, %v26, %v26
|
|
684 ; CHECK-NEXT: vfchdb %v7, %v27, %v7
|
|
685 ; CHECK-NEXT: vfchdb %v6, %v25, %v6
|
|
686 ; CHECK-NEXT: vfchdb %v5, %v31, %v5
|
|
687 ; CHECK-NEXT: vfchdb %v4, %v29, %v4
|
|
688 ; CHECK-NEXT: vpkg %v6, %v6, %v7
|
|
689 ; CHECK-NEXT: vpkg %v4, %v4, %v5
|
|
690 ; CHECK-NEXT: vn %v5, %v16, %v6
|
|
691 ; CHECK-NEXT: vsel %v24, %v3, %v2, %v5
|
|
692 ; CHECK-NEXT: vldeb %v17, %v17
|
|
693 ; CHECK-NEXT: vldeb %v18, %v18
|
|
694 ; CHECK-NEXT: vfchdb %v17, %v18, %v17
|
|
695 ; CHECK-NEXT: vmrhf %v18, %v30, %v30
|
|
696 ; CHECK-NEXT: vldeb %v18, %v18
|
|
697 ; CHECK-NEXT: vldeb %v19, %v19
|
|
698 ; CHECK-NEXT: vfchdb %v18, %v19, %v18
|
|
699 ; CHECK-NEXT: vpkg %v17, %v18, %v17
|
|
700 ; CHECK-NEXT: vn %v4, %v17, %v4
|
|
701 ; CHECK-NEXT: vsel %v26, %v1, %v0, %v4
|
|
702 ; CHECK-NEXT: br %r14
|
|
703 ;
|
|
704 ; CHECK-Z14-LABEL: fun30:
|
|
705 ; CHECK-Z14: # BB#0:
|
|
706 ; CHECK-Z14-NEXT: vl %v4, 192(%r15)
|
|
707 ; CHECK-Z14-NEXT: vl %v5, 208(%r15)
|
|
708 ; CHECK-Z14-NEXT: vl %v6, 160(%r15)
|
|
709 ; CHECK-Z14-NEXT: vl %v7, 176(%r15)
|
|
710 ; CHECK-Z14-NEXT: vfchdb %v7, %v27, %v7
|
|
711 ; CHECK-Z14-NEXT: vfchdb %v6, %v25, %v6
|
|
712 ; CHECK-Z14-NEXT: vfchdb %v5, %v31, %v5
|
|
713 ; CHECK-Z14-NEXT: vfchdb %v4, %v29, %v4
|
|
714 ; CHECK-Z14-NEXT: vfchsb %v16, %v24, %v28
|
|
715 ; CHECK-Z14-NEXT: vfchsb %v17, %v26, %v30
|
|
716 ; CHECK-Z14-NEXT: vpkg %v6, %v6, %v7
|
|
717 ; CHECK-Z14-NEXT: vpkg %v4, %v4, %v5
|
|
718 ; CHECK-Z14-NEXT: vl %v0, 272(%r15)
|
|
719 ; CHECK-Z14-NEXT: vl %v1, 240(%r15)
|
|
720 ; CHECK-Z14-NEXT: vl %v2, 256(%r15)
|
|
721 ; CHECK-Z14-NEXT: vl %v3, 224(%r15)
|
|
722 ; CHECK-Z14-NEXT: vn %v4, %v17, %v4
|
|
723 ; CHECK-Z14-NEXT: vn %v5, %v16, %v6
|
|
724 ; CHECK-Z14-NEXT: vsel %v24, %v3, %v2, %v5
|
|
725 ; CHECK-Z14-NEXT: vsel %v26, %v1, %v0, %v4
|
|
726 ; CHECK-Z14-NEXT: br %r14
|
|
727 %cmp0 = fcmp ogt <8 x float> %val1, %val2
|
|
728 %cmp1 = fcmp ogt <8 x double> %val3, %val4
|
|
729 %and = and <8 x i1> %cmp0, %cmp1
|
|
730 %sel = select <8 x i1> %and, <8 x float> %val5, <8 x float> %val6
|
|
731 ret <8 x float> %sel
|
|
732 }
|
|
733
|
|
734 define <2 x float> @fun31(<2 x double> %val1, <2 x double> %val2, <2 x double> %val3, <2 x double> %val4, <2 x float> %val5, <2 x float> %val6) {
|
|
735 ; CHECK-LABEL: fun31:
|
|
736 ; CHECK: # BB#0:
|
|
737 ; CHECK-DAG: vfchdb [[REG0:%v[0-9]+]], %v24, %v26
|
|
738 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v30
|
|
739 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]]
|
|
740 ; CHECK-NEXT: vpkg %v0, %v0, %v0
|
|
741 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
742 ; CHECK-NEXT: br %r14
|
|
743 %cmp0 = fcmp ogt <2 x double> %val1, %val2
|
|
744 %cmp1 = fcmp ogt <2 x double> %val3, %val4
|
|
745 %and = xor <2 x i1> %cmp0, %cmp1
|
|
746 %sel = select <2 x i1> %and, <2 x float> %val5, <2 x float> %val6
|
|
747 ret <2 x float> %sel
|
|
748 }
|
|
749
|
|
750 define <2 x double> @fun32(<2 x double> %val1, <2 x double> %val2, <2 x double> %val3, <2 x double> %val4, <2 x double> %val5, <2 x double> %val6) {
|
|
751 ; CHECK-LABEL: fun32:
|
|
752 ; CHECK: # BB#0:
|
|
753 ; CHECK-DAG: vfchdb [[REG0:%v[0-9]+]], %v24, %v26
|
|
754 ; CHECK-DAG: vfchdb [[REG1:%v[0-9]+]], %v28, %v30
|
|
755 ; CHECK-NEXT: vx %v0, [[REG0]], [[REG1]]
|
|
756 ; CHECK-NEXT: vsel %v24, %v25, %v27, %v0
|
|
757 ; CHECK-NEXT: br %r14
|
|
758 %cmp0 = fcmp ogt <2 x double> %val1, %val2
|
|
759 %cmp1 = fcmp ogt <2 x double> %val3, %val4
|
|
760 %and = xor <2 x i1> %cmp0, %cmp1
|
|
761 %sel = select <2 x i1> %and, <2 x double> %val5, <2 x double> %val6
|
|
762 ret <2 x double> %sel
|
|
763 }
|
|
764
|
|
765 define <4 x float> @fun33(<4 x double> %val1, <4 x double> %val2, <4 x float> %val3, <4 x float> %val4, <4 x float> %val5, <4 x float> %val6) {
|
|
766 ; CHECK-LABEL: fun33:
|
|
767 ; CHECK: # BB#0:
|
|
768 ; CHECK-NEXT: vfchdb %v0, %v26, %v30
|
|
769 ; CHECK-NEXT: vfchdb %v1, %v24, %v28
|
|
770 ; CHECK-NEXT: vpkg %v0, %v1, %v0
|
|
771 ; CHECK-NEXT: vmrlf %v1, %v27, %v27
|
|
772 ; CHECK-NEXT: vmrlf %v2, %v25, %v25
|
|
773 ; CHECK-NEXT: vldeb %v1, %v1
|
|
774 ; CHECK-NEXT: vldeb %v2, %v2
|
|
775 ; CHECK-NEXT: vfchdb %v1, %v2, %v1
|
|
776 ; CHECK-NEXT: vmrhf %v2, %v27, %v27
|
|
777 ; CHECK-NEXT: vmrhf %v3, %v25, %v25
|
|
778 ; CHECK-NEXT: vldeb %v2, %v2
|
|
779 ; CHECK-NEXT: vldeb %v3, %v3
|
|
780 ; CHECK-NEXT: vfchdb %v2, %v3, %v2
|
|
781 ; CHECK-NEXT: vpkg %v1, %v2, %v1
|
|
782 ; CHECK-NEXT: vn %v0, %v0, %v1
|
|
783 ; CHECK-NEXT: vsel %v24, %v29, %v31, %v0
|
|
784 ; CHECK-NEXT: br %r14
|
|
785 ;
|
|
786 ; CHECK-Z14-LABEL: fun33:
|
|
787 ; CHECK-Z14: # BB#0:
|
|
788 ; CHECK-Z14-NEXT: vfchdb %v0, %v26, %v30
|
|
789 ; CHECK-Z14-NEXT: vfchdb %v1, %v24, %v28
|
|
790 ; CHECK-Z14-NEXT: vpkg %v0, %v1, %v0
|
|
791 ; CHECK-Z14-NEXT: vfchsb %v1, %v25, %v27
|
|
792 ; CHECK-Z14-NEXT: vn %v0, %v0, %v1
|
|
793 ; CHECK-Z14-NEXT: vsel %v24, %v29, %v31, %v0
|
|
794 ; CHECK-Z14-NEXT: br %r14
|
|
795 %cmp0 = fcmp ogt <4 x double> %val1, %val2
|
|
796 %cmp1 = fcmp ogt <4 x float> %val3, %val4
|
|
797 %and = and <4 x i1> %cmp0, %cmp1
|
|
798 %sel = select <4 x i1> %and, <4 x float> %val5, <4 x float> %val6
|
|
799 ret <4 x float> %sel
|
|
800 }
|
|
801
|
|
802 define <4 x double> @fun34(<4 x double> %val1, <4 x double> %val2, <4 x float> %val3, <4 x float> %val4, <4 x double> %val5, <4 x double> %val6) {
|
|
803 ; CHECK-LABEL: fun34:
|
|
804 ; CHECK: # BB#0:
|
|
805 ; CHECK-NEXT: vmrlf [[REG0:%v[0-9]+]], %v27, %v27
|
|
806 ; CHECK-NEXT: vmrlf [[REG1:%v[0-9]+]], %v25, %v25
|
|
807 ; CHECK-NEXT: vldeb [[REG2:%v[0-9]+]], [[REG0]]
|
|
808 ; CHECK-NEXT: vldeb [[REG3:%v[0-9]+]], [[REG1]]
|
|
809 ; CHECK-NEXT: vfchdb [[REG4:%v[0-9]+]], [[REG3]], [[REG2]]
|
|
810 ; CHECK-NEXT: vmrhf [[REG5:%v[0-9]+]], %v27, %v27
|
|
811 ; CHECK-NEXT: vmrhf [[REG6:%v[0-9]+]], %v25, %v25
|
|
812 ; CHECK-DAG: vldeb [[REG7:%v[0-9]+]], [[REG5]]
|
|
813 ; CHECK-DAG: vl [[REG8:%v[0-9]+]], 176(%r15)
|
|
814 ; CHECK-DAG: vldeb [[REG9:%v[0-9]+]], [[REG6]]
|
|
815 ; CHECK-DAG: vl [[REG10:%v[0-9]+]], 160(%r15)
|
|
816 ; CHECK-DAG: vfchdb [[REG11:%v[0-9]+]], [[REG9]], [[REG7]]
|
|
817 ; CHECK-DAG: vpkg [[REG12:%v[0-9]+]], [[REG11]], [[REG4]]
|
|
818 ; CHECK-DAG: vuphf [[REG13:%v[0-9]+]], [[REG12]]
|
|
819 ; CHECK-DAG: vmrlg [[REG14:%v[0-9]+]], [[REG12]], [[REG12]]
|
|
820 ; CHECK-NEXT: vfchdb [[REG15:%v[0-9]+]], %v24, %v28
|
|
821 ; CHECK-NEXT: vfchdb [[REG16:%v[0-9]+]], %v26, %v30
|
|
822 ; CHECK-NEXT: vuphf [[REG17:%v[0-9]+]], [[REG14]]
|
|
823 ; CHECK-NEXT: vn [[REG18:%v[0-9]+]], [[REG16]], [[REG17]]
|
|
824 ; CHECK-NEXT: vn [[REG19:%v[0-9]+]], [[REG15]], [[REG13]]
|
|
825 ; CHECK-NEXT: vsel %v24, %v29, [[REG10]], [[REG19]]
|
|
826 ; CHECK-NEXT: vsel %v26, %v31, [[REG8]], [[REG18]]
|
|
827 ; CHECK-NEXT: br %r14
|
|
828 ;
|
|
829 ; CHECK-Z14-LABEL: fun34:
|
|
830 ; CHECK-Z14: # BB#0:
|
|
831 ; CHECK-Z14-NEXT: vfchsb %v4, %v25, %v27
|
|
832 ; CHECK-Z14-NEXT: vuphf %v5, %v4
|
|
833 ; CHECK-Z14-NEXT: vmrlg %v4, %v4, %v4
|
|
834 ; CHECK-Z14-NEXT: vfchdb %v2, %v24, %v28
|
|
835 ; CHECK-Z14-NEXT: vfchdb %v3, %v26, %v30
|
|
836 ; CHECK-Z14-NEXT: vuphf %v4, %v4
|
|
837 ; CHECK-Z14-NEXT: vl %v0, 176(%r15)
|
|
838 ; CHECK-Z14-NEXT: vl %v1, 160(%r15)
|
|
839 ; CHECK-Z14-NEXT: vn %v3, %v3, %v4
|
|
840 ; CHECK-Z14-NEXT: vn %v2, %v2, %v5
|
|
841 ; CHECK-Z14-NEXT: vsel %v24, %v29, %v1, %v2
|
|
842 ; CHECK-Z14-NEXT: vsel %v26, %v31, %v0, %v3
|
|
843 ; CHECK-Z14-NEXT: br %r14
|
|
844 %cmp0 = fcmp ogt <4 x double> %val1, %val2
|
|
845 %cmp1 = fcmp ogt <4 x float> %val3, %val4
|
|
846 %and = and <4 x i1> %cmp0, %cmp1
|
|
847 %sel = select <4 x i1> %and, <4 x double> %val5, <4 x double> %val6
|
|
848 ret <4 x double> %sel
|
|
849 }
|