xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/min.ll (revision 2b78303e3f78c1eeb4b1362933290c490ce5fff6)
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
5
6define double @minf64(double, double) {
7; CHECK-LABEL: minf64:
8; CHECK:       # %bb.0:
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)
13;
14; OPT-LABEL: minf64:
15; OPT:       # %bb.0:
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
20  ret double %4
21}
22
23define double @min2f64(double, double) {
24; CHECK-LABEL: min2f64:
25; CHECK:       # %bb.0:
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)
30;
31; OPT-LABEL: min2f64:
32; OPT:       # %bb.0:
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
37  ret double %4
38}
39
40define double @minuf64(double, double) {
41; CHECK-LABEL: minuf64:
42; CHECK:       # %bb.0:
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)
47;
48; OPT-LABEL: minuf64:
49; OPT:       # %bb.0:
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
54  ret double %4
55}
56
57define double @min2uf64(double, double) {
58; CHECK-LABEL: min2uf64:
59; CHECK:       # %bb.0:
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)
64;
65; OPT-LABEL: min2uf64:
66; OPT:       # %bb.0:
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
71  ret double %4
72}
73
74define float @minf32(float, float) {
75; CHECK-LABEL: minf32:
76; CHECK:       # %bb.0:
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)
81;
82; OPT-LABEL: minf32:
83; OPT:       # %bb.0:
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
88  ret float %4
89}
90
91define float @min2f32(float, float) {
92; CHECK-LABEL: min2f32:
93; CHECK:       # %bb.0:
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)
98;
99; OPT-LABEL: min2f32:
100; OPT:       # %bb.0:
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
105  ret float %4
106}
107
108define float @minuf32(float, float) {
109; CHECK-LABEL: minuf32:
110; CHECK:       # %bb.0:
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)
115;
116; OPT-LABEL: minuf32:
117; OPT:       # %bb.0:
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
122  ret float %4
123}
124
125define float @min2uf32(float, float) {
126; CHECK-LABEL: min2uf32:
127; CHECK:       # %bb.0:
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)
132;
133; OPT-LABEL: min2uf32:
134; OPT:       # %bb.0:
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
139  ret float %4
140}
141
142define i64 @mini64(i64, i64) {
143; CHECK-LABEL: mini64:
144; CHECK:       # %bb.0:
145; CHECK-NEXT:    mins.l %s0, %s0, %s1
146; CHECK-NEXT:    b.l.t (, %s10)
147;
148; OPT-LABEL: mini64:
149; OPT:       # %bb.0:
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
154  ret i64 %4
155}
156
157define i64 @min2i64(i64, i64) {
158; CHECK-LABEL: min2i64:
159; CHECK:       # %bb.0:
160; CHECK-NEXT:    mins.l %s0, %s0, %s1
161; CHECK-NEXT:    b.l.t (, %s10)
162;
163; OPT-LABEL: min2i64:
164; OPT:       # %bb.0:
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
169  ret i64 %4
170}
171
172define i64 @minu64(i64, i64) {
173; CHECK-LABEL: minu64:
174; CHECK:       # %bb.0:
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)
179;
180; OPT-LABEL: minu64:
181; OPT:       # %bb.0:
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
188  ret i64 %4
189}
190
191define i64 @min2u64(i64, i64) {
192; CHECK-LABEL: min2u64:
193; CHECK:       # %bb.0:
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)
198;
199; OPT-LABEL: min2u64:
200; OPT:       # %bb.0:
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
207  ret i64 %4
208}
209
210define i32 @mini32(i32, i32) {
211; CHECK-LABEL: mini32:
212; CHECK:       # %bb.0:
213; CHECK-NEXT:    mins.w.sx %s0, %s0, %s1
214; CHECK-NEXT:    b.l.t (, %s10)
215;
216; OPT-LABEL: mini32:
217; OPT:       # %bb.0:
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
222  ret i32 %4
223}
224
225define i32 @min2i32(i32, i32) {
226; CHECK-LABEL: min2i32:
227; CHECK:       # %bb.0:
228; CHECK-NEXT:    mins.w.sx %s0, %s0, %s1
229; CHECK-NEXT:    b.l.t (, %s10)
230;
231; OPT-LABEL: min2i32:
232; OPT:       # %bb.0:
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
237  ret i32 %4
238}
239
240define i32 @minu32(i32, i32) {
241; CHECK-LABEL: minu32:
242; CHECK:       # %bb.0:
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)
247;
248; OPT-LABEL: minu32:
249; OPT:       # %bb.0:
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
256  ret i32 %4
257}
258
259define i32 @min2u32(i32, i32) {
260; CHECK-LABEL: min2u32:
261; CHECK:       # %bb.0:
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)
266;
267; OPT-LABEL: min2u32:
268; OPT:       # %bb.0:
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
275  ret i32 %4
276}
277
278define zeroext i1 @mini1(i1 zeroext, i1 zeroext) {
279; CHECK-LABEL: mini1:
280; CHECK:       # %bb.0:
281; CHECK-NEXT:    and %s0, %s0, (32)0
282; CHECK-NEXT:    and %s2, %s1, %s0
283; CHECK-NEXT:    cmov.w.ne %s2, %s1, %s0
284; CHECK-NEXT:    adds.w.zx %s0, %s2, (0)1
285; CHECK-NEXT:    b.l.t (, %s10)
286;
287; OPT-LABEL: mini1:
288; OPT:       # %bb.0:
289; OPT-NEXT:    and %s0, %s0, (32)0
290; OPT-NEXT:    and %s2, %s1, %s0
291; OPT-NEXT:    cmov.w.ne %s2, %s1, %s0
292; OPT-NEXT:    adds.w.zx %s0, %s2, (0)1
293; OPT-NEXT:    b.l.t (, %s10)
294  %3 = xor i1 %0, true
295  %4 = and i1 %3, %1
296  %5 = select i1 %4, i1 %0, i1 %1
297  ret i1 %5
298}
299