xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/max.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 @maxf64(double, double) {
7; CHECK-LABEL: maxf64:
8; CHECK:       # %bb.0:
9; CHECK-NEXT:    fcmp.d %s2, %s0, %s1
10; CHECK-NEXT:    cmov.d.gt %s1, %s0, %s2
11; CHECK-NEXT:    or %s0, 0, %s1
12; CHECK-NEXT:    b.l.t (, %s10)
13;
14; OPT-LABEL: maxf64:
15; OPT:       # %bb.0:
16; OPT-NEXT:    fmax.d %s0, %s0, %s1
17; OPT-NEXT:    b.l.t (, %s10)
18  %3 = fcmp ogt double %0, %1
19  %4 = select i1 %3, double %0, double %1
20  ret double %4
21}
22
23define double @max2f64(double, double) {
24; CHECK-LABEL: max2f64:
25; CHECK:       # %bb.0:
26; CHECK-NEXT:    fcmp.d %s2, %s0, %s1
27; CHECK-NEXT:    cmov.d.ge %s1, %s0, %s2
28; CHECK-NEXT:    or %s0, 0, %s1
29; CHECK-NEXT:    b.l.t (, %s10)
30;
31; OPT-LABEL: max2f64:
32; OPT:       # %bb.0:
33; OPT-NEXT:    fmax.d %s0, %s0, %s1
34; OPT-NEXT:    b.l.t (, %s10)
35  %3 = fcmp oge double %0, %1
36  %4 = select i1 %3, double %0, double %1
37  ret double %4
38}
39
40; VE has no max for unordered comparison
41define double @maxuf64(double, double) {
42; CHECK-LABEL: maxuf64:
43; CHECK:       # %bb.0:
44; CHECK-NEXT:    fcmp.d %s2, %s0, %s1
45; CHECK-NEXT:    cmov.d.gtnan %s1, %s0, %s2
46; CHECK-NEXT:    or %s0, 0, %s1
47; CHECK-NEXT:    b.l.t (, %s10)
48;
49; OPT-LABEL: maxuf64:
50; OPT:       # %bb.0:
51; OPT-NEXT:    fmax.d %s0, %s0, %s1
52; OPT-NEXT:    b.l.t (, %s10)
53  %3 = fcmp ugt double %0, %1
54  %4 = select i1 %3, double %0, double %1
55  ret double %4
56}
57
58; VE has no max for unordered comparison
59define double @max2uf64(double, double) {
60; CHECK-LABEL: max2uf64:
61; CHECK:       # %bb.0:
62; CHECK-NEXT:    fcmp.d %s2, %s0, %s1
63; CHECK-NEXT:    cmov.d.genan %s1, %s0, %s2
64; CHECK-NEXT:    or %s0, 0, %s1
65; CHECK-NEXT:    b.l.t (, %s10)
66;
67; OPT-LABEL: max2uf64:
68; OPT:       # %bb.0:
69; OPT-NEXT:    fmax.d %s0, %s0, %s1
70; OPT-NEXT:    b.l.t (, %s10)
71  %3 = fcmp uge double %0, %1
72  %4 = select i1 %3, double %0, double %1
73  ret double %4
74}
75
76define float @maxf32(float, float) {
77; CHECK-LABEL: maxf32:
78; CHECK:       # %bb.0:
79; CHECK-NEXT:    fcmp.s %s2, %s0, %s1
80; CHECK-NEXT:    cmov.s.gt %s1, %s0, %s2
81; CHECK-NEXT:    or %s0, 0, %s1
82; CHECK-NEXT:    b.l.t (, %s10)
83;
84; OPT-LABEL: maxf32:
85; OPT:       # %bb.0:
86; OPT-NEXT:    fmax.s %s0, %s0, %s1
87; OPT-NEXT:    b.l.t (, %s10)
88  %3 = fcmp ogt float %0, %1
89  %4 = select i1 %3, float %0, float %1
90  ret float %4
91}
92
93define float @max2f32(float, float) {
94; CHECK-LABEL: max2f32:
95; CHECK:       # %bb.0:
96; CHECK-NEXT:    fcmp.s %s2, %s0, %s1
97; CHECK-NEXT:    cmov.s.ge %s1, %s0, %s2
98; CHECK-NEXT:    or %s0, 0, %s1
99; CHECK-NEXT:    b.l.t (, %s10)
100;
101; OPT-LABEL: max2f32:
102; OPT:       # %bb.0:
103; OPT-NEXT:    fmax.s %s0, %s0, %s1
104; OPT-NEXT:    b.l.t (, %s10)
105  %3 = fcmp oge float %0, %1
106  %4 = select i1 %3, float %0, float %1
107  ret float %4
108}
109
110define float @maxuf32(float, float) {
111; CHECK-LABEL: maxuf32:
112; CHECK:       # %bb.0:
113; CHECK-NEXT:    fcmp.s %s2, %s0, %s1
114; CHECK-NEXT:    cmov.s.gtnan %s1, %s0, %s2
115; CHECK-NEXT:    or %s0, 0, %s1
116; CHECK-NEXT:    b.l.t (, %s10)
117;
118; OPT-LABEL: maxuf32:
119; OPT:       # %bb.0:
120; OPT-NEXT:    fmax.s %s0, %s0, %s1
121; OPT-NEXT:    b.l.t (, %s10)
122  %3 = fcmp ugt float %0, %1
123  %4 = select i1 %3, float %0, float %1
124  ret float %4
125}
126
127define float @max2uf32(float, float) {
128; CHECK-LABEL: max2uf32:
129; CHECK:       # %bb.0:
130; CHECK-NEXT:    fcmp.s %s2, %s0, %s1
131; CHECK-NEXT:    cmov.s.genan %s1, %s0, %s2
132; CHECK-NEXT:    or %s0, 0, %s1
133; CHECK-NEXT:    b.l.t (, %s10)
134;
135; OPT-LABEL: max2uf32:
136; OPT:       # %bb.0:
137; OPT-NEXT:    fmax.s %s0, %s0, %s1
138; OPT-NEXT:    b.l.t (, %s10)
139  %3 = fcmp uge float %0, %1
140  %4 = select i1 %3, float %0, float %1
141  ret float %4
142}
143
144define i64 @maxi64(i64, i64) {
145; CHECK-LABEL: maxi64:
146; CHECK:       # %bb.0:
147; CHECK-NEXT:    maxs.l %s0, %s0, %s1
148; CHECK-NEXT:    b.l.t (, %s10)
149;
150; OPT-LABEL: maxi64:
151; OPT:       # %bb.0:
152; OPT-NEXT:    maxs.l %s0, %s0, %s1
153; OPT-NEXT:    b.l.t (, %s10)
154  %3 = icmp sgt i64 %0, %1
155  %4 = select i1 %3, i64 %0, i64 %1
156  ret i64 %4
157}
158
159define i64 @max2i64(i64, i64) {
160; CHECK-LABEL: max2i64:
161; CHECK:       # %bb.0:
162; CHECK-NEXT:    maxs.l %s0, %s0, %s1
163; CHECK-NEXT:    b.l.t (, %s10)
164;
165; OPT-LABEL: max2i64:
166; OPT:       # %bb.0:
167; OPT-NEXT:    maxs.l %s0, %s0, %s1
168; OPT-NEXT:    b.l.t (, %s10)
169  %3 = icmp sge i64 %0, %1
170  %4 = select i1 %3, i64 %0, i64 %1
171  ret i64 %4
172}
173
174define i64 @maxu64(i64, i64) {
175; CHECK-LABEL: maxu64:
176; CHECK:       # %bb.0:
177; CHECK-NEXT:    cmpu.l %s2, %s0, %s1
178; CHECK-NEXT:    cmov.l.gt %s1, %s0, %s2
179; CHECK-NEXT:    or %s0, 0, %s1
180; CHECK-NEXT:    b.l.t (, %s10)
181;
182; OPT-LABEL: maxu64:
183; OPT:       # %bb.0:
184; OPT-NEXT:    cmpu.l %s2, %s0, %s1
185; OPT-NEXT:    cmov.l.gt %s1, %s0, %s2
186; OPT-NEXT:    or %s0, 0, %s1
187; OPT-NEXT:    b.l.t (, %s10)
188  %3 = icmp ugt i64 %0, %1
189  %4 = select i1 %3, i64 %0, i64 %1
190  ret i64 %4
191}
192
193define i64 @max2u64(i64, i64) {
194; CHECK-LABEL: max2u64:
195; CHECK:       # %bb.0:
196; CHECK-NEXT:    cmpu.l %s2, %s0, %s1
197; CHECK-NEXT:    cmov.l.ge %s1, %s0, %s2
198; CHECK-NEXT:    or %s0, 0, %s1
199; CHECK-NEXT:    b.l.t (, %s10)
200;
201; OPT-LABEL: max2u64:
202; OPT:       # %bb.0:
203; OPT-NEXT:    cmpu.l %s2, %s0, %s1
204; OPT-NEXT:    cmov.l.ge %s1, %s0, %s2
205; OPT-NEXT:    or %s0, 0, %s1
206; OPT-NEXT:    b.l.t (, %s10)
207  %3 = icmp uge i64 %0, %1
208  %4 = select i1 %3, i64 %0, i64 %1
209  ret i64 %4
210}
211
212define i32 @maxi32(i32, i32) {
213; CHECK-LABEL: maxi32:
214; CHECK:       # %bb.0:
215; CHECK-NEXT:    maxs.w.sx %s0, %s0, %s1
216; CHECK-NEXT:    b.l.t (, %s10)
217;
218; OPT-LABEL: maxi32:
219; OPT:       # %bb.0:
220; OPT-NEXT:    maxs.w.sx %s0, %s0, %s1
221; OPT-NEXT:    b.l.t (, %s10)
222  %3 = icmp sgt i32 %0, %1
223  %4 = select i1 %3, i32 %0, i32 %1
224  ret i32 %4
225}
226
227define i32 @max2i32(i32, i32) {
228; CHECK-LABEL: max2i32:
229; CHECK:       # %bb.0:
230; CHECK-NEXT:    maxs.w.sx %s0, %s0, %s1
231; CHECK-NEXT:    b.l.t (, %s10)
232;
233; OPT-LABEL: max2i32:
234; OPT:       # %bb.0:
235; OPT-NEXT:    maxs.w.sx %s0, %s0, %s1
236; OPT-NEXT:    b.l.t (, %s10)
237  %3 = icmp sge i32 %0, %1
238  %4 = select i1 %3, i32 %0, i32 %1
239  ret i32 %4
240}
241
242define i32 @maxu32(i32, i32) {
243; CHECK-LABEL: maxu32:
244; CHECK:       # %bb.0:
245; CHECK-NEXT:    cmpu.w %s2, %s0, %s1
246; CHECK-NEXT:    cmov.w.gt %s1, %s0, %s2
247; CHECK-NEXT:    or %s0, 0, %s1
248; CHECK-NEXT:    b.l.t (, %s10)
249;
250; OPT-LABEL: maxu32:
251; OPT:       # %bb.0:
252; OPT-NEXT:    cmpu.w %s2, %s0, %s1
253; OPT-NEXT:    cmov.w.gt %s1, %s0, %s2
254; OPT-NEXT:    or %s0, 0, %s1
255; OPT-NEXT:    b.l.t (, %s10)
256  %3 = icmp ugt i32 %0, %1
257  %4 = select i1 %3, i32 %0, i32 %1
258  ret i32 %4
259}
260
261define i32 @max2u32(i32, i32) {
262; CHECK-LABEL: max2u32:
263; CHECK:       # %bb.0:
264; CHECK-NEXT:    cmpu.w %s2, %s0, %s1
265; CHECK-NEXT:    cmov.w.ge %s1, %s0, %s2
266; CHECK-NEXT:    or %s0, 0, %s1
267; CHECK-NEXT:    b.l.t (, %s10)
268;
269; OPT-LABEL: max2u32:
270; OPT:       # %bb.0:
271; OPT-NEXT:    cmpu.w %s2, %s0, %s1
272; OPT-NEXT:    cmov.w.ge %s1, %s0, %s2
273; OPT-NEXT:    or %s0, 0, %s1
274; OPT-NEXT:    b.l.t (, %s10)
275  %3 = icmp uge i32 %0, %1
276  %4 = select i1 %3, i32 %0, i32 %1
277  ret i32 %4
278}
279
280define zeroext i1 @maxi1(i1 zeroext, i1 zeroext) {
281; CHECK-LABEL: maxi1:
282; CHECK:       # %bb.0:
283; CHECK-NEXT:    or %s0, %s0, %s1
284; CHECK-NEXT:    and %s0, 1, %s0
285; CHECK-NEXT:    b.l.t (, %s10)
286;
287; OPT-LABEL: maxi1:
288; OPT:       # %bb.0:
289; OPT-NEXT:    or %s0, %s0, %s1
290; OPT-NEXT:    and %s0, 1, %s0
291; OPT-NEXT:    b.l.t (, %s10)
292  %3 = xor i1 %1, true
293  %4 = and i1 %3, %0
294  %5 = select i1 %4, i1 %0, i1 %1
295  ret i1 %5
296}
297