1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
3 ; RUN: llc < %s -mtriple=ve-unknown-unknown -enable-no-signed-zeros-fp-math \
4 ; RUN: -enable-no-nans-fp-math | FileCheck %s -check-prefix=OPT
6 define double @minf64(double, double) {
9 ; CHECK-NEXT: fcmp.d %s2, %s0, %s1
10 ; CHECK-NEXT: cmov.d.lt %s1, %s0, %s2
11 ; CHECK-NEXT: or %s0, 0, %s1
12 ; CHECK-NEXT: b.l.t (, %s10)
16 ; OPT-NEXT: fmin.d %s0, %s0, %s1
17 ; OPT-NEXT: b.l.t (, %s10)
18 %3 = fcmp olt double %0, %1
19 %4 = select i1 %3, double %0, double %1
23 define double @min2f64(double, double) {
24 ; CHECK-LABEL: min2f64:
26 ; CHECK-NEXT: fcmp.d %s2, %s0, %s1
27 ; CHECK-NEXT: cmov.d.le %s1, %s0, %s2
28 ; CHECK-NEXT: or %s0, 0, %s1
29 ; CHECK-NEXT: b.l.t (, %s10)
33 ; OPT-NEXT: fmin.d %s0, %s0, %s1
34 ; OPT-NEXT: b.l.t (, %s10)
35 %3 = fcmp ole double %0, %1
36 %4 = select i1 %3, double %0, double %1
40 define double @minuf64(double, double) {
41 ; CHECK-LABEL: minuf64:
43 ; CHECK-NEXT: fcmp.d %s2, %s0, %s1
44 ; CHECK-NEXT: cmov.d.ltnan %s1, %s0, %s2
45 ; CHECK-NEXT: or %s0, 0, %s1
46 ; CHECK-NEXT: b.l.t (, %s10)
50 ; OPT-NEXT: fmin.d %s0, %s0, %s1
51 ; OPT-NEXT: b.l.t (, %s10)
52 %3 = fcmp ult double %0, %1
53 %4 = select i1 %3, double %0, double %1
57 define double @min2uf64(double, double) {
58 ; CHECK-LABEL: min2uf64:
60 ; CHECK-NEXT: fcmp.d %s2, %s0, %s1
61 ; CHECK-NEXT: cmov.d.lenan %s1, %s0, %s2
62 ; CHECK-NEXT: or %s0, 0, %s1
63 ; CHECK-NEXT: b.l.t (, %s10)
65 ; OPT-LABEL: min2uf64:
67 ; OPT-NEXT: fmin.d %s0, %s0, %s1
68 ; OPT-NEXT: b.l.t (, %s10)
69 %3 = fcmp ule double %0, %1
70 %4 = select i1 %3, double %0, double %1
74 define float @minf32(float, float) {
75 ; CHECK-LABEL: minf32:
77 ; CHECK-NEXT: fcmp.s %s2, %s0, %s1
78 ; CHECK-NEXT: cmov.s.lt %s1, %s0, %s2
79 ; CHECK-NEXT: or %s0, 0, %s1
80 ; CHECK-NEXT: b.l.t (, %s10)
84 ; OPT-NEXT: fmin.s %s0, %s0, %s1
85 ; OPT-NEXT: b.l.t (, %s10)
86 %3 = fcmp olt float %0, %1
87 %4 = select i1 %3, float %0, float %1
91 define float @min2f32(float, float) {
92 ; CHECK-LABEL: min2f32:
94 ; CHECK-NEXT: fcmp.s %s2, %s0, %s1
95 ; CHECK-NEXT: cmov.s.le %s1, %s0, %s2
96 ; CHECK-NEXT: or %s0, 0, %s1
97 ; CHECK-NEXT: b.l.t (, %s10)
101 ; OPT-NEXT: fmin.s %s0, %s0, %s1
102 ; OPT-NEXT: b.l.t (, %s10)
103 %3 = fcmp ole float %0, %1
104 %4 = select i1 %3, float %0, float %1
108 define float @minuf32(float, float) {
109 ; CHECK-LABEL: minuf32:
111 ; CHECK-NEXT: fcmp.s %s2, %s0, %s1
112 ; CHECK-NEXT: cmov.s.ltnan %s1, %s0, %s2
113 ; CHECK-NEXT: or %s0, 0, %s1
114 ; CHECK-NEXT: b.l.t (, %s10)
116 ; OPT-LABEL: minuf32:
118 ; OPT-NEXT: fmin.s %s0, %s0, %s1
119 ; OPT-NEXT: b.l.t (, %s10)
120 %3 = fcmp ult float %0, %1
121 %4 = select i1 %3, float %0, float %1
125 define float @min2uf32(float, float) {
126 ; CHECK-LABEL: min2uf32:
128 ; CHECK-NEXT: fcmp.s %s2, %s0, %s1
129 ; CHECK-NEXT: cmov.s.lenan %s1, %s0, %s2
130 ; CHECK-NEXT: or %s0, 0, %s1
131 ; CHECK-NEXT: b.l.t (, %s10)
133 ; OPT-LABEL: min2uf32:
135 ; OPT-NEXT: fmin.s %s0, %s0, %s1
136 ; OPT-NEXT: b.l.t (, %s10)
137 %3 = fcmp ule float %0, %1
138 %4 = select i1 %3, float %0, float %1
142 define i64 @mini64(i64, i64) {
143 ; CHECK-LABEL: mini64:
145 ; CHECK-NEXT: mins.l %s0, %s0, %s1
146 ; CHECK-NEXT: b.l.t (, %s10)
150 ; OPT-NEXT: mins.l %s0, %s0, %s1
151 ; OPT-NEXT: b.l.t (, %s10)
152 %3 = icmp slt i64 %0, %1
153 %4 = select i1 %3, i64 %0, i64 %1
157 define i64 @min2i64(i64, i64) {
158 ; CHECK-LABEL: min2i64:
160 ; CHECK-NEXT: mins.l %s0, %s0, %s1
161 ; CHECK-NEXT: b.l.t (, %s10)
163 ; OPT-LABEL: min2i64:
165 ; OPT-NEXT: mins.l %s0, %s0, %s1
166 ; OPT-NEXT: b.l.t (, %s10)
167 %3 = icmp sle i64 %0, %1
168 %4 = select i1 %3, i64 %0, i64 %1
172 define i64 @minu64(i64, i64) {
173 ; CHECK-LABEL: minu64:
175 ; CHECK-NEXT: cmpu.l %s2, %s0, %s1
176 ; CHECK-NEXT: cmov.l.lt %s1, %s0, %s2
177 ; CHECK-NEXT: or %s0, 0, %s1
178 ; CHECK-NEXT: b.l.t (, %s10)
182 ; OPT-NEXT: cmpu.l %s2, %s0, %s1
183 ; OPT-NEXT: cmov.l.lt %s1, %s0, %s2
184 ; OPT-NEXT: or %s0, 0, %s1
185 ; OPT-NEXT: b.l.t (, %s10)
186 %3 = icmp ult i64 %0, %1
187 %4 = select i1 %3, i64 %0, i64 %1
191 define i64 @min2u64(i64, i64) {
192 ; CHECK-LABEL: min2u64:
194 ; CHECK-NEXT: cmpu.l %s2, %s0, %s1
195 ; CHECK-NEXT: cmov.l.le %s1, %s0, %s2
196 ; CHECK-NEXT: or %s0, 0, %s1
197 ; CHECK-NEXT: b.l.t (, %s10)
199 ; OPT-LABEL: min2u64:
201 ; OPT-NEXT: cmpu.l %s2, %s0, %s1
202 ; OPT-NEXT: cmov.l.le %s1, %s0, %s2
203 ; OPT-NEXT: or %s0, 0, %s1
204 ; OPT-NEXT: b.l.t (, %s10)
205 %3 = icmp ule i64 %0, %1
206 %4 = select i1 %3, i64 %0, i64 %1
210 define i32 @mini32(i32, i32) {
211 ; CHECK-LABEL: mini32:
213 ; CHECK-NEXT: mins.w.sx %s0, %s0, %s1
214 ; CHECK-NEXT: b.l.t (, %s10)
218 ; OPT-NEXT: mins.w.sx %s0, %s0, %s1
219 ; OPT-NEXT: b.l.t (, %s10)
220 %3 = icmp slt i32 %0, %1
221 %4 = select i1 %3, i32 %0, i32 %1
225 define i32 @min2i32(i32, i32) {
226 ; CHECK-LABEL: min2i32:
228 ; CHECK-NEXT: mins.w.sx %s0, %s0, %s1
229 ; CHECK-NEXT: b.l.t (, %s10)
231 ; OPT-LABEL: min2i32:
233 ; OPT-NEXT: mins.w.sx %s0, %s0, %s1
234 ; OPT-NEXT: b.l.t (, %s10)
235 %3 = icmp sle i32 %0, %1
236 %4 = select i1 %3, i32 %0, i32 %1
240 define i32 @minu32(i32, i32) {
241 ; CHECK-LABEL: minu32:
243 ; CHECK-NEXT: cmpu.w %s2, %s0, %s1
244 ; CHECK-NEXT: cmov.w.lt %s1, %s0, %s2
245 ; CHECK-NEXT: or %s0, 0, %s1
246 ; CHECK-NEXT: b.l.t (, %s10)
250 ; OPT-NEXT: cmpu.w %s2, %s0, %s1
251 ; OPT-NEXT: cmov.w.lt %s1, %s0, %s2
252 ; OPT-NEXT: or %s0, 0, %s1
253 ; OPT-NEXT: b.l.t (, %s10)
254 %3 = icmp ult i32 %0, %1
255 %4 = select i1 %3, i32 %0, i32 %1
259 define i32 @min2u32(i32, i32) {
260 ; CHECK-LABEL: min2u32:
262 ; CHECK-NEXT: cmpu.w %s2, %s0, %s1
263 ; CHECK-NEXT: cmov.w.le %s1, %s0, %s2
264 ; CHECK-NEXT: or %s0, 0, %s1
265 ; CHECK-NEXT: b.l.t (, %s10)
267 ; OPT-LABEL: min2u32:
269 ; OPT-NEXT: cmpu.w %s2, %s0, %s1
270 ; OPT-NEXT: cmov.w.le %s1, %s0, %s2
271 ; OPT-NEXT: or %s0, 0, %s1
272 ; OPT-NEXT: b.l.t (, %s10)
273 %3 = icmp ule i32 %0, %1
274 %4 = select i1 %3, i32 %0, i32 %1
278 define zeroext i1 @mini1(i1 zeroext, i1 zeroext) {
279 ; CHECK-LABEL: mini1:
281 ; CHECK-NEXT: and %s2, %s1, %s0
282 ; CHECK-NEXT: cmov.w.ne %s2, %s1, %s0
283 ; CHECK-NEXT: adds.w.zx %s0, %s2, (0)1
284 ; CHECK-NEXT: b.l.t (, %s10)
288 ; OPT-NEXT: and %s2, %s1, %s0
289 ; OPT-NEXT: cmov.w.ne %s2, %s1, %s0
290 ; OPT-NEXT: adds.w.zx %s0, %s2, (0)1
291 ; OPT-NEXT: b.l.t (, %s10)
294 %5 = select i1 %4, i1 %0, i1 %1