[X86] combineTargetShuffle - commute VPERMV3 shuffles so any load is on the RHS
[llvm-project.git] / llvm / test / CodeGen / SystemZ / vec-strict-cmp-01.ll
blobdc8d0090db2d3e103eea9fab689810b0dbf0af40
1 ; Test strict v4f32 comparisons.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 | FileCheck %s
5 ; Test oeq.
6 define <4 x i32> @f1(<4 x float> %val1, <4 x float> %val2) #0 {
7 ; CHECK-LABEL: f1:
8 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
9 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
10 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
11 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
12 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
13 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
14 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
15 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
16 ; CHECK-DAG: vfcedb [[HIGHRES:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
17 ; CHECK-DAG: vfcedb [[LOWRES:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
18 ; CHECK: vpkg %v24, [[HIGHRES]], [[LOWRES]]
19 ; CHECK-NEXT: br %r14
20   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
21                                                <4 x float> %val1, <4 x float> %val2,
22                                                metadata !"oeq",
23                                                metadata !"fpexcept.strict") #0
24   %ret = sext <4 x i1> %cmp to <4 x i32>
25   ret <4 x i32> %ret
28 ; Test one.
29 define <4 x i32> @f2(<4 x float> %val1, <4 x float> %val2) #0 {
30 ; CHECK-LABEL: f2:
31 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
32 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
33 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
34 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
35 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
36 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
37 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
38 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
39 ; CHECK-DAG: vfchdb [[HIGHRES0:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
40 ; CHECK-DAG: vfchdb [[LOWRES0:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
41 ; CHECK-DAG: vfchdb [[HIGHRES1:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
42 ; CHECK-DAG: vfchdb [[LOWRES1:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
43 ; CHECK-DAG: vpkg [[RES0:%v[0-9]+]], [[HIGHRES0]], [[LOWRES0]]
44 ; CHECK-DAG: vpkg [[RES1:%v[0-9]+]], [[HIGHRES1]], [[LOWRES1]]
45 ; CHECK: vo %v24, [[RES1]], [[RES0]]
46 ; CHECK-NEXT: br %r14
47   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
48                                                <4 x float> %val1, <4 x float> %val2,
49                                                metadata !"one",
50                                                metadata !"fpexcept.strict") #0
51   %ret = sext <4 x i1> %cmp to <4 x i32>
52   ret <4 x i32> %ret
55 ; Test ogt.
56 define <4 x i32> @f3(<4 x float> %val1, <4 x float> %val2) #0 {
57 ; CHECK-LABEL: f3:
58 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
59 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
60 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
61 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
62 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
63 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
64 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
65 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
66 ; CHECK-DAG: vfchdb [[HIGHRES:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
67 ; CHECK-DAG: vfchdb [[LOWRES:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
68 ; CHECK: vpkg %v24, [[HIGHRES]], [[LOWRES]]
69 ; CHECK-NEXT: br %r14
70   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
71                                                <4 x float> %val1, <4 x float> %val2,
72                                                metadata !"ogt",
73                                                metadata !"fpexcept.strict") #0
74   %ret = sext <4 x i1> %cmp to <4 x i32>
75   ret <4 x i32> %ret
78 ; Test oge.
79 define <4 x i32> @f4(<4 x float> %val1, <4 x float> %val2) #0 {
80 ; CHECK-LABEL: f4:
81 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
82 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
83 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
84 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
85 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
86 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
87 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
88 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
89 ; CHECK-DAG: vfchedb [[HIGHRES:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
90 ; CHECK-DAG: vfchedb [[LOWRES:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
91 ; CHECK: vpkg %v24, [[HIGHRES]], [[LOWRES]]
92 ; CHECK-NEXT: br %r14
93   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
94                                                <4 x float> %val1, <4 x float> %val2,
95                                                metadata !"oge",
96                                                metadata !"fpexcept.strict") #0
97   %ret = sext <4 x i1> %cmp to <4 x i32>
98   ret <4 x i32> %ret
101 ; Test ole.
102 define <4 x i32> @f5(<4 x float> %val1, <4 x float> %val2) #0 {
103 ; CHECK-LABEL: f5:
104 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
105 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
106 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
107 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
108 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
109 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
110 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
111 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
112 ; CHECK-DAG: vfchedb [[HIGHRES:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
113 ; CHECK-DAG: vfchedb [[LOWRES:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
114 ; CHECK: vpkg %v24, [[HIGHRES]], [[LOWRES]]
115 ; CHECK-NEXT: br %r14
116   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
117                                                <4 x float> %val1, <4 x float> %val2,
118                                                metadata !"ole",
119                                                metadata !"fpexcept.strict") #0
120   %ret = sext <4 x i1> %cmp to <4 x i32>
121   ret <4 x i32> %ret
124 ; Test olt.
125 define <4 x i32> @f6(<4 x float> %val1, <4 x float> %val2) #0 {
126 ; CHECK-LABEL: f6:
127 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
128 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
129 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
130 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
131 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
132 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
133 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
134 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
135 ; CHECK-DAG: vfchdb [[HIGHRES:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
136 ; CHECK-DAG: vfchdb [[LOWRES:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
137 ; CHECK: vpkg %v24, [[HIGHRES]], [[LOWRES]]
138 ; CHECK-NEXT: br %r14
139   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
140                                                <4 x float> %val1, <4 x float> %val2,
141                                                metadata !"olt",
142                                                metadata !"fpexcept.strict") #0
143   %ret = sext <4 x i1> %cmp to <4 x i32>
144   ret <4 x i32> %ret
147 ; Test ueq.
148 define <4 x i32> @f7(<4 x float> %val1, <4 x float> %val2) #0 {
149 ; CHECK-LABEL: f7:
150 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
151 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
152 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
153 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
154 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
155 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
156 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
157 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
158 ; CHECK-DAG: vfchdb [[HIGHRES0:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
159 ; CHECK-DAG: vfchdb [[LOWRES0:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
160 ; CHECK-DAG: vfchdb [[HIGHRES1:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
161 ; CHECK-DAG: vfchdb [[LOWRES1:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
162 ; CHECK-DAG: vpkg [[RES0:%v[0-9]+]], [[HIGHRES0]], [[LOWRES0]]
163 ; CHECK-DAG: vpkg [[RES1:%v[0-9]+]], [[HIGHRES1]], [[LOWRES1]]
164 ; CHECK: vno %v24, [[RES1]], [[RES0]]
165 ; CHECK-NEXT: br %r14
166   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
167                                                <4 x float> %val1, <4 x float> %val2,
168                                                metadata !"ueq",
169                                                metadata !"fpexcept.strict") #0
170   %ret = sext <4 x i1> %cmp to <4 x i32>
171   ret <4 x i32> %ret
174 ; Test une.
175 define <4 x i32> @f8(<4 x float> %val1, <4 x float> %val2) #0 {
176 ; CHECK-LABEL: f8:
177 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
178 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
179 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
180 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
181 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
182 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
183 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
184 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
185 ; CHECK-DAG: vfcedb [[HIGHRES:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
186 ; CHECK-DAG: vfcedb [[LOWRES:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
187 ; CHECK: vpkg [[RES:%v[0-9]+]], [[HIGHRES]], [[LOWRES]]
188 ; CHECK-NEXT: vno %v24, [[RES]], [[RES]]
189 ; CHECK-NEXT: br %r14
190   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
191                                                <4 x float> %val1, <4 x float> %val2,
192                                                metadata !"une",
193                                                metadata !"fpexcept.strict") #0
194   %ret = sext <4 x i1> %cmp to <4 x i32>
195   ret <4 x i32> %ret
198 ; Test ugt.
199 define <4 x i32> @f9(<4 x float> %val1, <4 x float> %val2) #0 {
200 ; CHECK-LABEL: f9:
201 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
202 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
203 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
204 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
205 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
206 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
207 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
208 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
209 ; CHECK-DAG: vfchedb [[HIGHRES:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
210 ; CHECK-DAG: vfchedb [[LOWRES:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
211 ; CHECK: vpkg [[RES:%v[0-9]+]], [[HIGHRES]], [[LOWRES]]
212 ; CHECK-NEXT: vno %v24, [[RES]], [[RES]]
213 ; CHECK-NEXT: br %r14
214   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
215                                                <4 x float> %val1, <4 x float> %val2,
216                                                metadata !"ugt",
217                                                metadata !"fpexcept.strict") #0
218   %ret = sext <4 x i1> %cmp to <4 x i32>
219   ret <4 x i32> %ret
222 ; Test uge.
223 define <4 x i32> @f10(<4 x float> %val1, <4 x float> %val2) #0 {
224 ; CHECK-LABEL: f10:
225 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
226 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
227 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
228 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
229 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
230 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
231 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
232 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
233 ; CHECK-DAG: vfchdb [[HIGHRES:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
234 ; CHECK-DAG: vfchdb [[LOWRES:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
235 ; CHECK: vpkg [[RES:%v[0-9]+]], [[HIGHRES]], [[LOWRES]]
236 ; CHECK-NEXT: vno %v24, [[RES]], [[RES]]
237 ; CHECK-NEXT: br %r14
238   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
239                                                <4 x float> %val1, <4 x float> %val2,
240                                                metadata !"uge",
241                                                metadata !"fpexcept.strict") #0
242   %ret = sext <4 x i1> %cmp to <4 x i32>
243   ret <4 x i32> %ret
246 ; Test ule.
247 define <4 x i32> @f11(<4 x float> %val1, <4 x float> %val2) #0 {
248 ; CHECK-LABEL: f11:
249 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
250 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
251 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
252 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
253 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
254 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
255 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
256 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
257 ; CHECK-DAG: vfchdb [[HIGHRES:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
258 ; CHECK-DAG: vfchdb [[LOWRES:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
259 ; CHECK: vpkg [[RES:%v[0-9]+]], [[HIGHRES]], [[LOWRES]]
260 ; CHECK-NEXT: vno %v24, [[RES]], [[RES]]
261 ; CHECK-NEXT: br %r14
262   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
263                                                <4 x float> %val1, <4 x float> %val2,
264                                                metadata !"ule",
265                                                metadata !"fpexcept.strict") #0
266   %ret = sext <4 x i1> %cmp to <4 x i32>
267   ret <4 x i32> %ret
270 ; Test ult.
271 define <4 x i32> @f12(<4 x float> %val1, <4 x float> %val2) #0 {
272 ; CHECK-LABEL: f12:
273 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
274 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
275 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
276 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
277 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
278 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
279 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
280 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
281 ; CHECK-DAG: vfchedb [[HIGHRES:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
282 ; CHECK-DAG: vfchedb [[LOWRES:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
283 ; CHECK: vpkg [[RES:%v[0-9]+]], [[HIGHRES]], [[LOWRES]]
284 ; CHECK-NEXT: vno %v24, [[RES]], [[RES]]
285 ; CHECK-NEXT: br %r14
286   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
287                                                <4 x float> %val1, <4 x float> %val2,
288                                                metadata !"ult",
289                                                metadata !"fpexcept.strict") #0
290   %ret = sext <4 x i1> %cmp to <4 x i32>
291   ret <4 x i32> %ret
294 ; Test ord.
295 define <4 x i32> @f13(<4 x float> %val1, <4 x float> %val2) #0 {
296 ; CHECK-LABEL: f13:
297 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
298 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
299 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
300 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
301 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
302 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
303 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
304 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
305 ; CHECK-DAG: vfchedb [[HIGHRES0:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
306 ; CHECK-DAG: vfchedb [[LOWRES0:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
307 ; CHECK-DAG: vfchdb [[HIGHRES1:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
308 ; CHECK-DAG: vfchdb [[LOWRES1:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
309 ; CHECK-DAG: vpkg [[RES0:%v[0-9]+]], [[HIGHRES0]], [[LOWRES0]]
310 ; CHECK-DAG: vpkg [[RES1:%v[0-9]+]], [[HIGHRES1]], [[LOWRES1]]
311 ; CHECK: vo %v24, [[RES1]], [[RES0]]
312 ; CHECK-NEXT: br %r14
313   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
314                                                <4 x float> %val1, <4 x float> %val2,
315                                                metadata !"ord",
316                                                metadata !"fpexcept.strict") #0
317   %ret = sext <4 x i1> %cmp to <4 x i32>
318   ret <4 x i32> %ret
321 ; Test uno.
322 define <4 x i32> @f14(<4 x float> %val1, <4 x float> %val2) #0 {
323 ; CHECK-LABEL: f14:
324 ; CHECK-DAG: vmrhf [[HIGH0E:%v[0-9]+]], %v24, %v24
325 ; CHECK-DAG: vmrlf [[LOW0E:%v[0-9]+]], %v24, %v24
326 ; CHECK-DAG: vmrhf [[HIGH1E:%v[0-9]+]], %v26, %v26
327 ; CHECK-DAG: vmrlf [[LOW1E:%v[0-9]+]], %v26, %v26
328 ; CHECK-DAG: vldeb [[HIGH0D:%v[0-9]+]], [[HIGH0E]]
329 ; CHECK-DAG: vldeb [[HIGH1D:%v[0-9]+]], [[HIGH1E]]
330 ; CHECK-DAG: vldeb [[LOW0D:%v[0-9]+]], [[LOW0E]]
331 ; CHECK-DAG: vldeb [[LOW1D:%v[0-9]+]], [[LOW1E]]
332 ; CHECK-DAG: vfchedb [[HIGHRES0:%v[0-9]+]], [[HIGH0D]], [[HIGH1D]]
333 ; CHECK-DAG: vfchedb [[LOWRES0:%v[0-9]+]], [[LOW0D]], [[LOW1D]]
334 ; CHECK-DAG: vfchdb [[HIGHRES1:%v[0-9]+]], [[HIGH1D]], [[HIGH0D]]
335 ; CHECK-DAG: vfchdb [[LOWRES1:%v[0-9]+]], [[LOW1D]], [[LOW0D]]
336 ; CHECK-DAG: vpkg [[RES0:%v[0-9]+]], [[HIGHRES0]], [[LOWRES0]]
337 ; CHECK-DAG: vpkg [[RES1:%v[0-9]+]], [[HIGHRES1]], [[LOWRES1]]
338 ; CHECK: vno %v24, [[RES1]], [[RES0]]
339 ; CHECK-NEXT: br %r14
340   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
341                                                <4 x float> %val1, <4 x float> %val2,
342                                                metadata !"uno",
343                                                metadata !"fpexcept.strict") #0
344   %ret = sext <4 x i1> %cmp to <4 x i32>
345   ret <4 x i32> %ret
348 ; Test oeq selects.
349 define <4 x float> @f15(<4 x float> %val1, <4 x float> %val2,
350                         <4 x float> %val3, <4 x float> %val4) #0 {
351 ; CHECK-LABEL: f15:
352 ; CHECK: vpkg [[REG:%v[0-9]+]],
353 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
354 ; CHECK-NEXT: br %r14
355   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
356                                                <4 x float> %val1, <4 x float> %val2,
357                                                metadata !"oeq",
358                                                metadata !"fpexcept.strict") #0
359   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
360   ret <4 x float> %ret
363 ; Test one selects.
364 define <4 x float> @f16(<4 x float> %val1, <4 x float> %val2,
365                         <4 x float> %val3, <4 x float> %val4) #0 {
366 ; CHECK-LABEL: f16:
367 ; CHECK: vo [[REG:%v[0-9]+]],
368 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
369 ; CHECK-NEXT: br %r14
370   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
371                                                <4 x float> %val1, <4 x float> %val2,
372                                                metadata !"one",
373                                                metadata !"fpexcept.strict") #0
374   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
375   ret <4 x float> %ret
378 ; Test ogt selects.
379 define <4 x float> @f17(<4 x float> %val1, <4 x float> %val2,
380                         <4 x float> %val3, <4 x float> %val4) #0 {
381 ; CHECK-LABEL: f17:
382 ; CHECK: vpkg [[REG:%v[0-9]+]],
383 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
384 ; CHECK-NEXT: br %r14
385   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
386                                                <4 x float> %val1, <4 x float> %val2,
387                                                metadata !"ogt",
388                                                metadata !"fpexcept.strict") #0
389   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
390   ret <4 x float> %ret
393 ; Test oge selects.
394 define <4 x float> @f18(<4 x float> %val1, <4 x float> %val2,
395                         <4 x float> %val3, <4 x float> %val4) #0 {
396 ; CHECK-LABEL: f18:
397 ; CHECK: vpkg [[REG:%v[0-9]+]],
398 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
399 ; CHECK-NEXT: br %r14
400   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
401                                                <4 x float> %val1, <4 x float> %val2,
402                                                metadata !"oge",
403                                                metadata !"fpexcept.strict") #0
404   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
405   ret <4 x float> %ret
408 ; Test ole selects.
409 define <4 x float> @f19(<4 x float> %val1, <4 x float> %val2,
410                         <4 x float> %val3, <4 x float> %val4) #0 {
411 ; CHECK-LABEL: f19:
412 ; CHECK: vpkg [[REG:%v[0-9]+]],
413 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
414 ; CHECK-NEXT: br %r14
415   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
416                                                <4 x float> %val1, <4 x float> %val2,
417                                                metadata !"ole",
418                                                metadata !"fpexcept.strict") #0
419   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
420   ret <4 x float> %ret
423 ; Test olt selects.
424 define <4 x float> @f20(<4 x float> %val1, <4 x float> %val2,
425                         <4 x float> %val3, <4 x float> %val4) #0 {
426 ; CHECK-LABEL: f20:
427 ; CHECK: vpkg [[REG:%v[0-9]+]],
428 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
429 ; CHECK-NEXT: br %r14
430   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
431                                                <4 x float> %val1, <4 x float> %val2,
432                                                metadata !"olt",
433                                                metadata !"fpexcept.strict") #0
434   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
435   ret <4 x float> %ret
438 ; Test ueq selects.
439 define <4 x float> @f21(<4 x float> %val1, <4 x float> %val2,
440                         <4 x float> %val3, <4 x float> %val4) #0 {
441 ; CHECK-LABEL: f21:
442 ; CHECK: vo [[REG:%v[0-9]+]],
443 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
444 ; CHECK-NEXT: br %r14
445   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
446                                                <4 x float> %val1, <4 x float> %val2,
447                                                metadata !"ueq",
448                                                metadata !"fpexcept.strict") #0
449   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
450   ret <4 x float> %ret
453 ; Test une selects.
454 define <4 x float> @f22(<4 x float> %val1, <4 x float> %val2,
455                         <4 x float> %val3, <4 x float> %val4) #0 {
456 ; CHECK-LABEL: f22:
457 ; CHECK: vpkg [[REG:%v[0-9]+]],
458 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
459 ; CHECK-NEXT: br %r14
460   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
461                                                <4 x float> %val1, <4 x float> %val2,
462                                                metadata !"une",
463                                                metadata !"fpexcept.strict") #0
464   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
465   ret <4 x float> %ret
468 ; Test ugt selects.
469 define <4 x float> @f23(<4 x float> %val1, <4 x float> %val2,
470                         <4 x float> %val3, <4 x float> %val4) #0 {
471 ; CHECK-LABEL: f23:
472 ; CHECK: vpkg [[REG:%v[0-9]+]],
473 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
474 ; CHECK-NEXT: br %r14
475   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
476                                                <4 x float> %val1, <4 x float> %val2,
477                                                metadata !"ugt",
478                                                metadata !"fpexcept.strict") #0
479   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
480   ret <4 x float> %ret
483 ; Test uge selects.
484 define <4 x float> @f24(<4 x float> %val1, <4 x float> %val2,
485                         <4 x float> %val3, <4 x float> %val4) #0 {
486 ; CHECK-LABEL: f24:
487 ; CHECK: vpkg [[REG:%v[0-9]+]],
488 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
489 ; CHECK-NEXT: br %r14
490   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
491                                                <4 x float> %val1, <4 x float> %val2,
492                                                metadata !"uge",
493                                                metadata !"fpexcept.strict") #0
494   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
495   ret <4 x float> %ret
498 ; Test ule selects.
499 define <4 x float> @f25(<4 x float> %val1, <4 x float> %val2,
500                         <4 x float> %val3, <4 x float> %val4) #0 {
501 ; CHECK-LABEL: f25:
502 ; CHECK: vpkg [[REG:%v[0-9]+]],
503 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
504 ; CHECK-NEXT: br %r14
505   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
506                                                <4 x float> %val1, <4 x float> %val2,
507                                                metadata !"ule",
508                                                metadata !"fpexcept.strict") #0
509   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
510   ret <4 x float> %ret
513 ; Test ult selects.
514 define <4 x float> @f26(<4 x float> %val1, <4 x float> %val2,
515                         <4 x float> %val3, <4 x float> %val4) #0 {
516 ; CHECK-LABEL: f26:
517 ; CHECK: vpkg [[REG:%v[0-9]+]],
518 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
519 ; CHECK-NEXT: br %r14
520   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
521                                                <4 x float> %val1, <4 x float> %val2,
522                                                metadata !"ult",
523                                                metadata !"fpexcept.strict") #0
524   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
525   ret <4 x float> %ret
528 ; Test ord selects.
529 define <4 x float> @f27(<4 x float> %val1, <4 x float> %val2,
530                         <4 x float> %val3, <4 x float> %val4) #0 {
531 ; CHECK-LABEL: f27:
532 ; CHECK: vo [[REG:%v[0-9]+]],
533 ; CHECK-NEXT: vsel %v24, %v28, %v30, [[REG]]
534 ; CHECK-NEXT: br %r14
535   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
536                                                <4 x float> %val1, <4 x float> %val2,
537                                                metadata !"ord",
538                                                metadata !"fpexcept.strict") #0
539   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
540   ret <4 x float> %ret
543 ; Test uno selects.
544 define <4 x float> @f28(<4 x float> %val1, <4 x float> %val2,
545                         <4 x float> %val3, <4 x float> %val4) #0 {
546 ; CHECK-LABEL: f28:
547 ; CHECK: vo [[REG:%v[0-9]+]],
548 ; CHECK-NEXT: vsel %v24, %v30, %v28, [[REG]]
549 ; CHECK-NEXT: br %r14
550   %cmp = call <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(
551                                                <4 x float> %val1, <4 x float> %val2,
552                                                metadata !"uno",
553                                                metadata !"fpexcept.strict") #0
554   %ret = select <4 x i1> %cmp, <4 x float> %val3, <4 x float> %val4
555   ret <4 x float> %ret
558 attributes #0 = { strictfp }
560 declare <4 x i1> @llvm.experimental.constrained.fcmp.v4f32(<4 x float>, <4 x float>, metadata, metadata)