xref: /llvm-project/llvm/test/CodeGen/RISCV/min-max.ll (revision 7b3bbd83c0c24087072ec5b22a76799ab31f87d5)
1be51ddf6SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2be51ddf6SCraig Topper; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=NOZBB,RV32I
3be51ddf6SCraig Topper; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=NOZBB,RV64I
4be51ddf6SCraig Topper; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | \
5be51ddf6SCraig Topper; RUN:   FileCheck %s --check-prefixes=ZBB,RV32ZBB
6be51ddf6SCraig Topper; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | \
7be51ddf6SCraig Topper; RUN:   FileCheck %s --check-prefixes=ZBB,RV64ZBB
8be51ddf6SCraig Topper
9be51ddf6SCraig Topper; Basic tests.
10be51ddf6SCraig Topper
11be51ddf6SCraig Topperdeclare i8 @llvm.smax.i8(i8 %a, i8 %b) readnone
12be51ddf6SCraig Topper
13be51ddf6SCraig Topperdefine signext i8 @smax_i8(i8 signext %a, i8 signext %b) {
14be51ddf6SCraig Topper; NOZBB-LABEL: smax_i8:
15be51ddf6SCraig Topper; NOZBB:       # %bb.0:
16be51ddf6SCraig Topper; NOZBB-NEXT:    blt a1, a0, .LBB0_2
17be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
18be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
19be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB0_2:
20be51ddf6SCraig Topper; NOZBB-NEXT:    ret
21be51ddf6SCraig Topper;
22be51ddf6SCraig Topper; ZBB-LABEL: smax_i8:
23be51ddf6SCraig Topper; ZBB:       # %bb.0:
24be51ddf6SCraig Topper; ZBB-NEXT:    max a0, a0, a1
25be51ddf6SCraig Topper; ZBB-NEXT:    ret
26be51ddf6SCraig Topper  %c = call i8 @llvm.smax.i8(i8 %a, i8 %b)
27be51ddf6SCraig Topper  ret i8 %c
28be51ddf6SCraig Topper}
29be51ddf6SCraig Topper
30be51ddf6SCraig Topperdeclare i16 @llvm.smax.i16(i16 %a, i16 %b) readnone
31be51ddf6SCraig Topper
32be51ddf6SCraig Topperdefine signext i16 @smax_i16(i16 signext %a, i16 signext %b) {
33be51ddf6SCraig Topper; NOZBB-LABEL: smax_i16:
34be51ddf6SCraig Topper; NOZBB:       # %bb.0:
35be51ddf6SCraig Topper; NOZBB-NEXT:    blt a1, a0, .LBB1_2
36be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
37be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
38be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB1_2:
39be51ddf6SCraig Topper; NOZBB-NEXT:    ret
40be51ddf6SCraig Topper;
41be51ddf6SCraig Topper; ZBB-LABEL: smax_i16:
42be51ddf6SCraig Topper; ZBB:       # %bb.0:
43be51ddf6SCraig Topper; ZBB-NEXT:    max a0, a0, a1
44be51ddf6SCraig Topper; ZBB-NEXT:    ret
45be51ddf6SCraig Topper  %c = call i16 @llvm.smax.i16(i16 %a, i16 %b)
46be51ddf6SCraig Topper  ret i16 %c
47be51ddf6SCraig Topper}
48be51ddf6SCraig Topper
49be51ddf6SCraig Topperdeclare i32 @llvm.smax.i32(i32 %a, i32 %b) readnone
50be51ddf6SCraig Topper
51be51ddf6SCraig Topperdefine signext i32 @smax_i32(i32 signext %a, i32 signext %b) {
52be51ddf6SCraig Topper; NOZBB-LABEL: smax_i32:
53be51ddf6SCraig Topper; NOZBB:       # %bb.0:
54be51ddf6SCraig Topper; NOZBB-NEXT:    blt a1, a0, .LBB2_2
55be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
56be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
57be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB2_2:
58be51ddf6SCraig Topper; NOZBB-NEXT:    ret
59be51ddf6SCraig Topper;
60be51ddf6SCraig Topper; ZBB-LABEL: smax_i32:
61be51ddf6SCraig Topper; ZBB:       # %bb.0:
62be51ddf6SCraig Topper; ZBB-NEXT:    max a0, a0, a1
63be51ddf6SCraig Topper; ZBB-NEXT:    ret
64be51ddf6SCraig Topper  %c = call i32 @llvm.smax.i32(i32 %a, i32 %b)
65be51ddf6SCraig Topper  ret i32 %c
66be51ddf6SCraig Topper}
67be51ddf6SCraig Topper
68be51ddf6SCraig Topperdeclare i64 @llvm.smax.i64(i64 %a, i64 %b) readnone
69be51ddf6SCraig Topper
70be51ddf6SCraig Topperdefine i64 @smax_i64(i64 %a, i64 %b) {
71be51ddf6SCraig Topper; RV32I-LABEL: smax_i64:
72be51ddf6SCraig Topper; RV32I:       # %bb.0:
73bc7f11ccSEli Friedman; RV32I-NEXT:    beq a1, a3, .LBB3_2
74be51ddf6SCraig Topper; RV32I-NEXT:  # %bb.1:
75bc7f11ccSEli Friedman; RV32I-NEXT:    slt a4, a3, a1
76bc7f11ccSEli Friedman; RV32I-NEXT:    beqz a4, .LBB3_3
77bc7f11ccSEli Friedman; RV32I-NEXT:    j .LBB3_4
78be51ddf6SCraig Topper; RV32I-NEXT:  .LBB3_2:
79bc7f11ccSEli Friedman; RV32I-NEXT:    sltu a4, a2, a0
80bc7f11ccSEli Friedman; RV32I-NEXT:    bnez a4, .LBB3_4
81be51ddf6SCraig Topper; RV32I-NEXT:  .LBB3_3:
82be51ddf6SCraig Topper; RV32I-NEXT:    mv a0, a2
83be51ddf6SCraig Topper; RV32I-NEXT:    mv a1, a3
84bc7f11ccSEli Friedman; RV32I-NEXT:  .LBB3_4:
85be51ddf6SCraig Topper; RV32I-NEXT:    ret
86be51ddf6SCraig Topper;
87be51ddf6SCraig Topper; RV64I-LABEL: smax_i64:
88be51ddf6SCraig Topper; RV64I:       # %bb.0:
89be51ddf6SCraig Topper; RV64I-NEXT:    blt a1, a0, .LBB3_2
90be51ddf6SCraig Topper; RV64I-NEXT:  # %bb.1:
91be51ddf6SCraig Topper; RV64I-NEXT:    mv a0, a1
92be51ddf6SCraig Topper; RV64I-NEXT:  .LBB3_2:
93be51ddf6SCraig Topper; RV64I-NEXT:    ret
94be51ddf6SCraig Topper;
95be51ddf6SCraig Topper; RV32ZBB-LABEL: smax_i64:
96be51ddf6SCraig Topper; RV32ZBB:       # %bb.0:
97bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beq a1, a3, .LBB3_2
98be51ddf6SCraig Topper; RV32ZBB-NEXT:  # %bb.1:
99bc7f11ccSEli Friedman; RV32ZBB-NEXT:    slt a4, a3, a1
100bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beqz a4, .LBB3_3
101bc7f11ccSEli Friedman; RV32ZBB-NEXT:    j .LBB3_4
102be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB3_2:
103bc7f11ccSEli Friedman; RV32ZBB-NEXT:    sltu a4, a2, a0
104bc7f11ccSEli Friedman; RV32ZBB-NEXT:    bnez a4, .LBB3_4
105be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB3_3:
106be51ddf6SCraig Topper; RV32ZBB-NEXT:    mv a0, a2
107bc7f11ccSEli Friedman; RV32ZBB-NEXT:    mv a1, a3
108be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB3_4:
109be51ddf6SCraig Topper; RV32ZBB-NEXT:    ret
110be51ddf6SCraig Topper;
111be51ddf6SCraig Topper; RV64ZBB-LABEL: smax_i64:
112be51ddf6SCraig Topper; RV64ZBB:       # %bb.0:
113be51ddf6SCraig Topper; RV64ZBB-NEXT:    max a0, a0, a1
114be51ddf6SCraig Topper; RV64ZBB-NEXT:    ret
115be51ddf6SCraig Topper  %c = call i64 @llvm.smax.i64(i64 %a, i64 %b)
116be51ddf6SCraig Topper  ret i64 %c
117be51ddf6SCraig Topper}
118be51ddf6SCraig Topper
119be51ddf6SCraig Topperdeclare i8 @llvm.smin.i8(i8 %a, i8 %b) readnone
120be51ddf6SCraig Topper
121be51ddf6SCraig Topperdefine signext i8 @smin_i8(i8 signext %a, i8 signext %b) {
122be51ddf6SCraig Topper; NOZBB-LABEL: smin_i8:
123be51ddf6SCraig Topper; NOZBB:       # %bb.0:
124be51ddf6SCraig Topper; NOZBB-NEXT:    blt a0, a1, .LBB4_2
125be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
126be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
127be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB4_2:
128be51ddf6SCraig Topper; NOZBB-NEXT:    ret
129be51ddf6SCraig Topper;
130be51ddf6SCraig Topper; ZBB-LABEL: smin_i8:
131be51ddf6SCraig Topper; ZBB:       # %bb.0:
132be51ddf6SCraig Topper; ZBB-NEXT:    min a0, a0, a1
133be51ddf6SCraig Topper; ZBB-NEXT:    ret
134be51ddf6SCraig Topper  %c = call i8 @llvm.smin.i8(i8 %a, i8 %b)
135be51ddf6SCraig Topper  ret i8 %c
136be51ddf6SCraig Topper}
137be51ddf6SCraig Topper
138be51ddf6SCraig Topperdeclare i16 @llvm.smin.i16(i16 %a, i16 %b) readnone
139be51ddf6SCraig Topper
140be51ddf6SCraig Topperdefine signext i16 @smin_i16(i16 signext %a, i16 signext %b) {
141be51ddf6SCraig Topper; NOZBB-LABEL: smin_i16:
142be51ddf6SCraig Topper; NOZBB:       # %bb.0:
143be51ddf6SCraig Topper; NOZBB-NEXT:    blt a0, a1, .LBB5_2
144be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
145be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
146be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB5_2:
147be51ddf6SCraig Topper; NOZBB-NEXT:    ret
148be51ddf6SCraig Topper;
149be51ddf6SCraig Topper; ZBB-LABEL: smin_i16:
150be51ddf6SCraig Topper; ZBB:       # %bb.0:
151be51ddf6SCraig Topper; ZBB-NEXT:    min a0, a0, a1
152be51ddf6SCraig Topper; ZBB-NEXT:    ret
153be51ddf6SCraig Topper  %c = call i16 @llvm.smin.i16(i16 %a, i16 %b)
154be51ddf6SCraig Topper  ret i16 %c
155be51ddf6SCraig Topper}
156be51ddf6SCraig Topper
157be51ddf6SCraig Topperdeclare i32 @llvm.smin.i32(i32 %a, i32 %b) readnone
158be51ddf6SCraig Topper
159be51ddf6SCraig Topperdefine signext i32 @smin_i32(i32 signext %a, i32 signext %b) {
160be51ddf6SCraig Topper; NOZBB-LABEL: smin_i32:
161be51ddf6SCraig Topper; NOZBB:       # %bb.0:
162be51ddf6SCraig Topper; NOZBB-NEXT:    blt a0, a1, .LBB6_2
163be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
164be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
165be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB6_2:
166be51ddf6SCraig Topper; NOZBB-NEXT:    ret
167be51ddf6SCraig Topper;
168be51ddf6SCraig Topper; ZBB-LABEL: smin_i32:
169be51ddf6SCraig Topper; ZBB:       # %bb.0:
170be51ddf6SCraig Topper; ZBB-NEXT:    min a0, a0, a1
171be51ddf6SCraig Topper; ZBB-NEXT:    ret
172be51ddf6SCraig Topper  %c = call i32 @llvm.smin.i32(i32 %a, i32 %b)
173be51ddf6SCraig Topper  ret i32 %c
174be51ddf6SCraig Topper}
175be51ddf6SCraig Topper
176be51ddf6SCraig Topperdeclare i64 @llvm.smin.i64(i64 %a, i64 %b) readnone
177be51ddf6SCraig Topper
178be51ddf6SCraig Topperdefine i64 @smin_i64(i64 %a, i64 %b) {
179be51ddf6SCraig Topper; RV32I-LABEL: smin_i64:
180be51ddf6SCraig Topper; RV32I:       # %bb.0:
181bc7f11ccSEli Friedman; RV32I-NEXT:    beq a1, a3, .LBB7_2
182be51ddf6SCraig Topper; RV32I-NEXT:  # %bb.1:
183bc7f11ccSEli Friedman; RV32I-NEXT:    slt a4, a1, a3
184bc7f11ccSEli Friedman; RV32I-NEXT:    beqz a4, .LBB7_3
185bc7f11ccSEli Friedman; RV32I-NEXT:    j .LBB7_4
186be51ddf6SCraig Topper; RV32I-NEXT:  .LBB7_2:
187bc7f11ccSEli Friedman; RV32I-NEXT:    sltu a4, a0, a2
188bc7f11ccSEli Friedman; RV32I-NEXT:    bnez a4, .LBB7_4
189be51ddf6SCraig Topper; RV32I-NEXT:  .LBB7_3:
190be51ddf6SCraig Topper; RV32I-NEXT:    mv a0, a2
191be51ddf6SCraig Topper; RV32I-NEXT:    mv a1, a3
192bc7f11ccSEli Friedman; RV32I-NEXT:  .LBB7_4:
193be51ddf6SCraig Topper; RV32I-NEXT:    ret
194be51ddf6SCraig Topper;
195be51ddf6SCraig Topper; RV64I-LABEL: smin_i64:
196be51ddf6SCraig Topper; RV64I:       # %bb.0:
197be51ddf6SCraig Topper; RV64I-NEXT:    blt a0, a1, .LBB7_2
198be51ddf6SCraig Topper; RV64I-NEXT:  # %bb.1:
199be51ddf6SCraig Topper; RV64I-NEXT:    mv a0, a1
200be51ddf6SCraig Topper; RV64I-NEXT:  .LBB7_2:
201be51ddf6SCraig Topper; RV64I-NEXT:    ret
202be51ddf6SCraig Topper;
203be51ddf6SCraig Topper; RV32ZBB-LABEL: smin_i64:
204be51ddf6SCraig Topper; RV32ZBB:       # %bb.0:
205bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beq a1, a3, .LBB7_2
206be51ddf6SCraig Topper; RV32ZBB-NEXT:  # %bb.1:
207bc7f11ccSEli Friedman; RV32ZBB-NEXT:    slt a4, a1, a3
208bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beqz a4, .LBB7_3
209bc7f11ccSEli Friedman; RV32ZBB-NEXT:    j .LBB7_4
210be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB7_2:
211bc7f11ccSEli Friedman; RV32ZBB-NEXT:    sltu a4, a0, a2
212bc7f11ccSEli Friedman; RV32ZBB-NEXT:    bnez a4, .LBB7_4
213be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB7_3:
214be51ddf6SCraig Topper; RV32ZBB-NEXT:    mv a0, a2
215bc7f11ccSEli Friedman; RV32ZBB-NEXT:    mv a1, a3
216be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB7_4:
217be51ddf6SCraig Topper; RV32ZBB-NEXT:    ret
218be51ddf6SCraig Topper;
219be51ddf6SCraig Topper; RV64ZBB-LABEL: smin_i64:
220be51ddf6SCraig Topper; RV64ZBB:       # %bb.0:
221be51ddf6SCraig Topper; RV64ZBB-NEXT:    min a0, a0, a1
222be51ddf6SCraig Topper; RV64ZBB-NEXT:    ret
223be51ddf6SCraig Topper  %c = call i64 @llvm.smin.i64(i64 %a, i64 %b)
224be51ddf6SCraig Topper  ret i64 %c
225be51ddf6SCraig Topper}
226be51ddf6SCraig Topper
227be51ddf6SCraig Topperdeclare i8 @llvm.umax.i8(i8 %a, i8 %b) readnone
228be51ddf6SCraig Topper
229be51ddf6SCraig Topperdefine i8 @umax_i8(i8 zeroext %a, i8 zeroext %b) {
230be51ddf6SCraig Topper; NOZBB-LABEL: umax_i8:
231be51ddf6SCraig Topper; NOZBB:       # %bb.0:
232be51ddf6SCraig Topper; NOZBB-NEXT:    bltu a1, a0, .LBB8_2
233be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
234be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
235be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB8_2:
236be51ddf6SCraig Topper; NOZBB-NEXT:    ret
237be51ddf6SCraig Topper;
238be51ddf6SCraig Topper; ZBB-LABEL: umax_i8:
239be51ddf6SCraig Topper; ZBB:       # %bb.0:
240be51ddf6SCraig Topper; ZBB-NEXT:    maxu a0, a0, a1
241be51ddf6SCraig Topper; ZBB-NEXT:    ret
242be51ddf6SCraig Topper  %c = call i8 @llvm.umax.i8(i8 %a, i8 %b)
243be51ddf6SCraig Topper  ret i8 %c
244be51ddf6SCraig Topper}
245be51ddf6SCraig Topper
246be51ddf6SCraig Topperdeclare i16 @llvm.umax.i16(i16 %a, i16 %b) readnone
247be51ddf6SCraig Topper
248be51ddf6SCraig Topperdefine i16 @umax_i16(i16 zeroext %a, i16 zeroext %b) {
249be51ddf6SCraig Topper; NOZBB-LABEL: umax_i16:
250be51ddf6SCraig Topper; NOZBB:       # %bb.0:
251be51ddf6SCraig Topper; NOZBB-NEXT:    bltu a1, a0, .LBB9_2
252be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
253be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
254be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB9_2:
255be51ddf6SCraig Topper; NOZBB-NEXT:    ret
256be51ddf6SCraig Topper;
257be51ddf6SCraig Topper; ZBB-LABEL: umax_i16:
258be51ddf6SCraig Topper; ZBB:       # %bb.0:
259be51ddf6SCraig Topper; ZBB-NEXT:    maxu a0, a0, a1
260be51ddf6SCraig Topper; ZBB-NEXT:    ret
261be51ddf6SCraig Topper  %c = call i16 @llvm.umax.i16(i16 %a, i16 %b)
262be51ddf6SCraig Topper  ret i16 %c
263be51ddf6SCraig Topper}
264be51ddf6SCraig Topper
265be51ddf6SCraig Topperdeclare i32 @llvm.umax.i32(i32 %a, i32 %b) readnone
266be51ddf6SCraig Topper
267be51ddf6SCraig Topperdefine signext i32 @umax_i32(i32 signext %a, i32 signext %b) {
268be51ddf6SCraig Topper; NOZBB-LABEL: umax_i32:
269be51ddf6SCraig Topper; NOZBB:       # %bb.0:
270be51ddf6SCraig Topper; NOZBB-NEXT:    bltu a1, a0, .LBB10_2
271be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
272be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
273be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB10_2:
274be51ddf6SCraig Topper; NOZBB-NEXT:    ret
275be51ddf6SCraig Topper;
276be51ddf6SCraig Topper; ZBB-LABEL: umax_i32:
277be51ddf6SCraig Topper; ZBB:       # %bb.0:
278be51ddf6SCraig Topper; ZBB-NEXT:    maxu a0, a0, a1
279be51ddf6SCraig Topper; ZBB-NEXT:    ret
280be51ddf6SCraig Topper  %c = call i32 @llvm.umax.i32(i32 %a, i32 %b)
281be51ddf6SCraig Topper  ret i32 %c
282be51ddf6SCraig Topper}
283be51ddf6SCraig Topper
284be51ddf6SCraig Topperdeclare i64 @llvm.umax.i64(i64 %a, i64 %b) readnone
285be51ddf6SCraig Topper
286be51ddf6SCraig Topperdefine i64 @umax_i64(i64 %a, i64 %b) {
287be51ddf6SCraig Topper; RV32I-LABEL: umax_i64:
288be51ddf6SCraig Topper; RV32I:       # %bb.0:
289bc7f11ccSEli Friedman; RV32I-NEXT:    beq a1, a3, .LBB11_2
290be51ddf6SCraig Topper; RV32I-NEXT:  # %bb.1:
291bc7f11ccSEli Friedman; RV32I-NEXT:    sltu a4, a3, a1
292bc7f11ccSEli Friedman; RV32I-NEXT:    beqz a4, .LBB11_3
293bc7f11ccSEli Friedman; RV32I-NEXT:    j .LBB11_4
294be51ddf6SCraig Topper; RV32I-NEXT:  .LBB11_2:
295bc7f11ccSEli Friedman; RV32I-NEXT:    sltu a4, a2, a0
296bc7f11ccSEli Friedman; RV32I-NEXT:    bnez a4, .LBB11_4
297be51ddf6SCraig Topper; RV32I-NEXT:  .LBB11_3:
298be51ddf6SCraig Topper; RV32I-NEXT:    mv a0, a2
299be51ddf6SCraig Topper; RV32I-NEXT:    mv a1, a3
300bc7f11ccSEli Friedman; RV32I-NEXT:  .LBB11_4:
301be51ddf6SCraig Topper; RV32I-NEXT:    ret
302be51ddf6SCraig Topper;
303be51ddf6SCraig Topper; RV64I-LABEL: umax_i64:
304be51ddf6SCraig Topper; RV64I:       # %bb.0:
305be51ddf6SCraig Topper; RV64I-NEXT:    bltu a1, a0, .LBB11_2
306be51ddf6SCraig Topper; RV64I-NEXT:  # %bb.1:
307be51ddf6SCraig Topper; RV64I-NEXT:    mv a0, a1
308be51ddf6SCraig Topper; RV64I-NEXT:  .LBB11_2:
309be51ddf6SCraig Topper; RV64I-NEXT:    ret
310be51ddf6SCraig Topper;
311be51ddf6SCraig Topper; RV32ZBB-LABEL: umax_i64:
312be51ddf6SCraig Topper; RV32ZBB:       # %bb.0:
313bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beq a1, a3, .LBB11_2
314be51ddf6SCraig Topper; RV32ZBB-NEXT:  # %bb.1:
315bc7f11ccSEli Friedman; RV32ZBB-NEXT:    sltu a4, a3, a1
316bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beqz a4, .LBB11_3
317bc7f11ccSEli Friedman; RV32ZBB-NEXT:    j .LBB11_4
318be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB11_2:
319bc7f11ccSEli Friedman; RV32ZBB-NEXT:    sltu a4, a2, a0
320bc7f11ccSEli Friedman; RV32ZBB-NEXT:    bnez a4, .LBB11_4
321be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB11_3:
322be51ddf6SCraig Topper; RV32ZBB-NEXT:    mv a0, a2
323bc7f11ccSEli Friedman; RV32ZBB-NEXT:    mv a1, a3
324be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB11_4:
325be51ddf6SCraig Topper; RV32ZBB-NEXT:    ret
326be51ddf6SCraig Topper;
327be51ddf6SCraig Topper; RV64ZBB-LABEL: umax_i64:
328be51ddf6SCraig Topper; RV64ZBB:       # %bb.0:
329be51ddf6SCraig Topper; RV64ZBB-NEXT:    maxu a0, a0, a1
330be51ddf6SCraig Topper; RV64ZBB-NEXT:    ret
331be51ddf6SCraig Topper  %c = call i64 @llvm.umax.i64(i64 %a, i64 %b)
332be51ddf6SCraig Topper  ret i64 %c
333be51ddf6SCraig Topper}
334be51ddf6SCraig Topper
335be51ddf6SCraig Topperdeclare i8 @llvm.umin.i8(i8 %a, i8 %b) readnone
336be51ddf6SCraig Topper
337be51ddf6SCraig Topperdefine zeroext i8 @umin_i8(i8 zeroext %a, i8 zeroext %b) {
338be51ddf6SCraig Topper; NOZBB-LABEL: umin_i8:
339be51ddf6SCraig Topper; NOZBB:       # %bb.0:
340be51ddf6SCraig Topper; NOZBB-NEXT:    bltu a0, a1, .LBB12_2
341be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
342be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
343be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB12_2:
344be51ddf6SCraig Topper; NOZBB-NEXT:    ret
345be51ddf6SCraig Topper;
346be51ddf6SCraig Topper; ZBB-LABEL: umin_i8:
347be51ddf6SCraig Topper; ZBB:       # %bb.0:
348be51ddf6SCraig Topper; ZBB-NEXT:    minu a0, a0, a1
349be51ddf6SCraig Topper; ZBB-NEXT:    ret
350be51ddf6SCraig Topper  %c = call i8 @llvm.umin.i8(i8 %a, i8 %b)
351be51ddf6SCraig Topper  ret i8 %c
352be51ddf6SCraig Topper}
353be51ddf6SCraig Topper
354be51ddf6SCraig Topperdeclare i16 @llvm.umin.i16(i16 %a, i16 %b) readnone
355be51ddf6SCraig Topper
356be51ddf6SCraig Topperdefine zeroext i16 @umin_i16(i16 zeroext %a, i16 zeroext %b) {
357be51ddf6SCraig Topper; NOZBB-LABEL: umin_i16:
358be51ddf6SCraig Topper; NOZBB:       # %bb.0:
359be51ddf6SCraig Topper; NOZBB-NEXT:    bltu a0, a1, .LBB13_2
360be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
361be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
362be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB13_2:
363be51ddf6SCraig Topper; NOZBB-NEXT:    ret
364be51ddf6SCraig Topper;
365be51ddf6SCraig Topper; ZBB-LABEL: umin_i16:
366be51ddf6SCraig Topper; ZBB:       # %bb.0:
367be51ddf6SCraig Topper; ZBB-NEXT:    minu a0, a0, a1
368be51ddf6SCraig Topper; ZBB-NEXT:    ret
369be51ddf6SCraig Topper  %c = call i16 @llvm.umin.i16(i16 %a, i16 %b)
370be51ddf6SCraig Topper  ret i16 %c
371be51ddf6SCraig Topper}
372be51ddf6SCraig Topper
373be51ddf6SCraig Topperdeclare i32 @llvm.umin.i32(i32 %a, i32 %b) readnone
374be51ddf6SCraig Topper
375be51ddf6SCraig Topperdefine signext i32 @umin_i32(i32 signext %a, i32 signext %b) {
376be51ddf6SCraig Topper; NOZBB-LABEL: umin_i32:
377be51ddf6SCraig Topper; NOZBB:       # %bb.0:
378be51ddf6SCraig Topper; NOZBB-NEXT:    bltu a0, a1, .LBB14_2
379be51ddf6SCraig Topper; NOZBB-NEXT:  # %bb.1:
380be51ddf6SCraig Topper; NOZBB-NEXT:    mv a0, a1
381be51ddf6SCraig Topper; NOZBB-NEXT:  .LBB14_2:
382be51ddf6SCraig Topper; NOZBB-NEXT:    ret
383be51ddf6SCraig Topper;
384be51ddf6SCraig Topper; ZBB-LABEL: umin_i32:
385be51ddf6SCraig Topper; ZBB:       # %bb.0:
386be51ddf6SCraig Topper; ZBB-NEXT:    minu a0, a0, a1
387be51ddf6SCraig Topper; ZBB-NEXT:    ret
388be51ddf6SCraig Topper  %c = call i32 @llvm.umin.i32(i32 %a, i32 %b)
389be51ddf6SCraig Topper  ret i32 %c
390be51ddf6SCraig Topper}
391be51ddf6SCraig Topper
392be51ddf6SCraig Topperdeclare i64 @llvm.umin.i64(i64 %a, i64 %b) readnone
393be51ddf6SCraig Topper
394be51ddf6SCraig Topperdefine i64 @umin_i64(i64 %a, i64 %b) {
395be51ddf6SCraig Topper; RV32I-LABEL: umin_i64:
396be51ddf6SCraig Topper; RV32I:       # %bb.0:
397bc7f11ccSEli Friedman; RV32I-NEXT:    beq a1, a3, .LBB15_2
398be51ddf6SCraig Topper; RV32I-NEXT:  # %bb.1:
399bc7f11ccSEli Friedman; RV32I-NEXT:    sltu a4, a1, a3
400bc7f11ccSEli Friedman; RV32I-NEXT:    beqz a4, .LBB15_3
401bc7f11ccSEli Friedman; RV32I-NEXT:    j .LBB15_4
402be51ddf6SCraig Topper; RV32I-NEXT:  .LBB15_2:
403bc7f11ccSEli Friedman; RV32I-NEXT:    sltu a4, a0, a2
404bc7f11ccSEli Friedman; RV32I-NEXT:    bnez a4, .LBB15_4
405be51ddf6SCraig Topper; RV32I-NEXT:  .LBB15_3:
406be51ddf6SCraig Topper; RV32I-NEXT:    mv a0, a2
407be51ddf6SCraig Topper; RV32I-NEXT:    mv a1, a3
408bc7f11ccSEli Friedman; RV32I-NEXT:  .LBB15_4:
409be51ddf6SCraig Topper; RV32I-NEXT:    ret
410be51ddf6SCraig Topper;
411be51ddf6SCraig Topper; RV64I-LABEL: umin_i64:
412be51ddf6SCraig Topper; RV64I:       # %bb.0:
413be51ddf6SCraig Topper; RV64I-NEXT:    bltu a0, a1, .LBB15_2
414be51ddf6SCraig Topper; RV64I-NEXT:  # %bb.1:
415be51ddf6SCraig Topper; RV64I-NEXT:    mv a0, a1
416be51ddf6SCraig Topper; RV64I-NEXT:  .LBB15_2:
417be51ddf6SCraig Topper; RV64I-NEXT:    ret
418be51ddf6SCraig Topper;
419be51ddf6SCraig Topper; RV32ZBB-LABEL: umin_i64:
420be51ddf6SCraig Topper; RV32ZBB:       # %bb.0:
421bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beq a1, a3, .LBB15_2
422be51ddf6SCraig Topper; RV32ZBB-NEXT:  # %bb.1:
423bc7f11ccSEli Friedman; RV32ZBB-NEXT:    sltu a4, a1, a3
424bc7f11ccSEli Friedman; RV32ZBB-NEXT:    beqz a4, .LBB15_3
425bc7f11ccSEli Friedman; RV32ZBB-NEXT:    j .LBB15_4
426be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB15_2:
427bc7f11ccSEli Friedman; RV32ZBB-NEXT:    sltu a4, a0, a2
428bc7f11ccSEli Friedman; RV32ZBB-NEXT:    bnez a4, .LBB15_4
429be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB15_3:
430be51ddf6SCraig Topper; RV32ZBB-NEXT:    mv a0, a2
431bc7f11ccSEli Friedman; RV32ZBB-NEXT:    mv a1, a3
432be51ddf6SCraig Topper; RV32ZBB-NEXT:  .LBB15_4:
433be51ddf6SCraig Topper; RV32ZBB-NEXT:    ret
434be51ddf6SCraig Topper;
435be51ddf6SCraig Topper; RV64ZBB-LABEL: umin_i64:
436be51ddf6SCraig Topper; RV64ZBB:       # %bb.0:
437be51ddf6SCraig Topper; RV64ZBB-NEXT:    minu a0, a0, a1
438be51ddf6SCraig Topper; RV64ZBB-NEXT:    ret
439be51ddf6SCraig Topper  %c = call i64 @llvm.umin.i64(i64 %a, i64 %b)
440be51ddf6SCraig Topper  ret i64 %c
441be51ddf6SCraig Topper}
442be51ddf6SCraig Topper
443fd13192aSCraig Topper; Tests with the same operand used twice. These should fold away.
444be51ddf6SCraig Topper
445be51ddf6SCraig Topperdefine signext i32 @smin_same_op_i32(i32 signext %a) {
446be51ddf6SCraig Topper; NOZBB-LABEL: smin_same_op_i32:
447be51ddf6SCraig Topper; NOZBB:       # %bb.0:
448be51ddf6SCraig Topper; NOZBB-NEXT:    ret
449be51ddf6SCraig Topper;
450be51ddf6SCraig Topper; ZBB-LABEL: smin_same_op_i32:
451be51ddf6SCraig Topper; ZBB:       # %bb.0:
452be51ddf6SCraig Topper; ZBB-NEXT:    ret
453be51ddf6SCraig Topper  %c = call i32 @llvm.smin.i32(i32 %a, i32 %a)
454be51ddf6SCraig Topper  ret i32 %c
455be51ddf6SCraig Topper}
456be51ddf6SCraig Topper
457be51ddf6SCraig Topperdefine signext i32 @smax_same_op_i32(i32 signext %a) {
458be51ddf6SCraig Topper; NOZBB-LABEL: smax_same_op_i32:
459be51ddf6SCraig Topper; NOZBB:       # %bb.0:
460be51ddf6SCraig Topper; NOZBB-NEXT:    ret
461be51ddf6SCraig Topper;
462be51ddf6SCraig Topper; ZBB-LABEL: smax_same_op_i32:
463be51ddf6SCraig Topper; ZBB:       # %bb.0:
464be51ddf6SCraig Topper; ZBB-NEXT:    ret
465be51ddf6SCraig Topper  %c = call i32 @llvm.smax.i32(i32 %a, i32 %a)
466be51ddf6SCraig Topper  ret i32 %c
467be51ddf6SCraig Topper}
468be51ddf6SCraig Topper
469be51ddf6SCraig Topperdefine signext i32 @umin_same_op_i32(i32 signext %a) {
470be51ddf6SCraig Topper; NOZBB-LABEL: umin_same_op_i32:
471be51ddf6SCraig Topper; NOZBB:       # %bb.0:
472be51ddf6SCraig Topper; NOZBB-NEXT:    ret
473be51ddf6SCraig Topper;
474be51ddf6SCraig Topper; ZBB-LABEL: umin_same_op_i32:
475be51ddf6SCraig Topper; ZBB:       # %bb.0:
476be51ddf6SCraig Topper; ZBB-NEXT:    ret
477be51ddf6SCraig Topper  %c = call i32 @llvm.umin.i32(i32 %a, i32 %a)
478be51ddf6SCraig Topper  ret i32 %c
479be51ddf6SCraig Topper}
480be51ddf6SCraig Topper
481be51ddf6SCraig Topperdefine signext i32 @umax_same_op_i32(i32 signext %a) {
482be51ddf6SCraig Topper; NOZBB-LABEL: umax_same_op_i32:
483be51ddf6SCraig Topper; NOZBB:       # %bb.0:
484be51ddf6SCraig Topper; NOZBB-NEXT:    ret
485be51ddf6SCraig Topper;
486be51ddf6SCraig Topper; ZBB-LABEL: umax_same_op_i32:
487be51ddf6SCraig Topper; ZBB:       # %bb.0:
488be51ddf6SCraig Topper; ZBB-NEXT:    ret
489be51ddf6SCraig Topper  %c = call i32 @llvm.umax.i32(i32 %a, i32 %a)
490be51ddf6SCraig Topper  ret i32 %c
491be51ddf6SCraig Topper}
492be51ddf6SCraig Topper
493fd13192aSCraig Topper; Tests with undef operands. These should fold to undef for RV32 or 0 for RV64.
494be51ddf6SCraig Topper
495be51ddf6SCraig Topperdefine signext i32 @smin_undef_i32() {
4964e2d1a6cSCraig Topper; RV32I-LABEL: smin_undef_i32:
4974e2d1a6cSCraig Topper; RV32I:       # %bb.0:
4984e2d1a6cSCraig Topper; RV32I-NEXT:    ret
499be51ddf6SCraig Topper;
5004e2d1a6cSCraig Topper; RV64I-LABEL: smin_undef_i32:
5014e2d1a6cSCraig Topper; RV64I:       # %bb.0:
5024e2d1a6cSCraig Topper; RV64I-NEXT:    li a0, 0
5034e2d1a6cSCraig Topper; RV64I-NEXT:    ret
5044e2d1a6cSCraig Topper;
5054e2d1a6cSCraig Topper; RV32ZBB-LABEL: smin_undef_i32:
5064e2d1a6cSCraig Topper; RV32ZBB:       # %bb.0:
5074e2d1a6cSCraig Topper; RV32ZBB-NEXT:    ret
5084e2d1a6cSCraig Topper;
5094e2d1a6cSCraig Topper; RV64ZBB-LABEL: smin_undef_i32:
5104e2d1a6cSCraig Topper; RV64ZBB:       # %bb.0:
5114e2d1a6cSCraig Topper; RV64ZBB-NEXT:    li a0, 0
5124e2d1a6cSCraig Topper; RV64ZBB-NEXT:    ret
513be51ddf6SCraig Topper  %c = call i32 @llvm.smin.i32(i32 undef, i32 undef)
514be51ddf6SCraig Topper  ret i32 %c
515be51ddf6SCraig Topper}
516be51ddf6SCraig Topper
517be51ddf6SCraig Topperdefine signext i32 @smax_undef_i32() {
5184e2d1a6cSCraig Topper; RV32I-LABEL: smax_undef_i32:
5194e2d1a6cSCraig Topper; RV32I:       # %bb.0:
5204e2d1a6cSCraig Topper; RV32I-NEXT:    ret
521be51ddf6SCraig Topper;
5224e2d1a6cSCraig Topper; RV64I-LABEL: smax_undef_i32:
5234e2d1a6cSCraig Topper; RV64I:       # %bb.0:
5244e2d1a6cSCraig Topper; RV64I-NEXT:    li a0, 0
5254e2d1a6cSCraig Topper; RV64I-NEXT:    ret
5264e2d1a6cSCraig Topper;
5274e2d1a6cSCraig Topper; RV32ZBB-LABEL: smax_undef_i32:
5284e2d1a6cSCraig Topper; RV32ZBB:       # %bb.0:
5294e2d1a6cSCraig Topper; RV32ZBB-NEXT:    ret
5304e2d1a6cSCraig Topper;
5314e2d1a6cSCraig Topper; RV64ZBB-LABEL: smax_undef_i32:
5324e2d1a6cSCraig Topper; RV64ZBB:       # %bb.0:
5334e2d1a6cSCraig Topper; RV64ZBB-NEXT:    li a0, 0
5344e2d1a6cSCraig Topper; RV64ZBB-NEXT:    ret
535be51ddf6SCraig Topper  %c = call i32 @llvm.smax.i32(i32 undef, i32 undef)
536be51ddf6SCraig Topper  ret i32 %c
537be51ddf6SCraig Topper}
538be51ddf6SCraig Topper
539be51ddf6SCraig Topperdefine signext i32 @umin_undef_i32() {
5404e2d1a6cSCraig Topper; RV32I-LABEL: umin_undef_i32:
5414e2d1a6cSCraig Topper; RV32I:       # %bb.0:
5424e2d1a6cSCraig Topper; RV32I-NEXT:    ret
543be51ddf6SCraig Topper;
5444e2d1a6cSCraig Topper; RV64I-LABEL: umin_undef_i32:
5454e2d1a6cSCraig Topper; RV64I:       # %bb.0:
5464e2d1a6cSCraig Topper; RV64I-NEXT:    li a0, 0
5474e2d1a6cSCraig Topper; RV64I-NEXT:    ret
5484e2d1a6cSCraig Topper;
5494e2d1a6cSCraig Topper; RV32ZBB-LABEL: umin_undef_i32:
5504e2d1a6cSCraig Topper; RV32ZBB:       # %bb.0:
5514e2d1a6cSCraig Topper; RV32ZBB-NEXT:    ret
5524e2d1a6cSCraig Topper;
5534e2d1a6cSCraig Topper; RV64ZBB-LABEL: umin_undef_i32:
5544e2d1a6cSCraig Topper; RV64ZBB:       # %bb.0:
5554e2d1a6cSCraig Topper; RV64ZBB-NEXT:    li a0, 0
5564e2d1a6cSCraig Topper; RV64ZBB-NEXT:    ret
557be51ddf6SCraig Topper  %c = call i32 @llvm.umin.i32(i32 undef, i32 undef)
558be51ddf6SCraig Topper  ret i32 %c
559be51ddf6SCraig Topper}
560be51ddf6SCraig Topper
561be51ddf6SCraig Topperdefine signext i32 @umax_undef_i32() {
5624e2d1a6cSCraig Topper; RV32I-LABEL: umax_undef_i32:
5634e2d1a6cSCraig Topper; RV32I:       # %bb.0:
5644e2d1a6cSCraig Topper; RV32I-NEXT:    ret
565be51ddf6SCraig Topper;
5664e2d1a6cSCraig Topper; RV64I-LABEL: umax_undef_i32:
5674e2d1a6cSCraig Topper; RV64I:       # %bb.0:
5684e2d1a6cSCraig Topper; RV64I-NEXT:    li a0, 0
5694e2d1a6cSCraig Topper; RV64I-NEXT:    ret
5704e2d1a6cSCraig Topper;
5714e2d1a6cSCraig Topper; RV32ZBB-LABEL: umax_undef_i32:
5724e2d1a6cSCraig Topper; RV32ZBB:       # %bb.0:
5734e2d1a6cSCraig Topper; RV32ZBB-NEXT:    ret
5744e2d1a6cSCraig Topper;
5754e2d1a6cSCraig Topper; RV64ZBB-LABEL: umax_undef_i32:
5764e2d1a6cSCraig Topper; RV64ZBB:       # %bb.0:
5774e2d1a6cSCraig Topper; RV64ZBB-NEXT:    li a0, 0
5784e2d1a6cSCraig Topper; RV64ZBB-NEXT:    ret
579be51ddf6SCraig Topper  %c = call i32 @llvm.umax.i32(i32 undef, i32 undef)
580be51ddf6SCraig Topper  ret i32 %c
581be51ddf6SCraig Topper}
582be51ddf6SCraig Topper
58301ba4708SCraig Topperdefine signext i32 @smax_i32_pos_constant(i32 signext %a) {
584fa20bf16SCraig Topper; NOZBB-LABEL: smax_i32_pos_constant:
585fa20bf16SCraig Topper; NOZBB:       # %bb.0:
586fa20bf16SCraig Topper; NOZBB-NEXT:    li a1, 10
587fa20bf16SCraig Topper; NOZBB-NEXT:    blt a1, a0, .LBB24_2
588fa20bf16SCraig Topper; NOZBB-NEXT:  # %bb.1:
589fa20bf16SCraig Topper; NOZBB-NEXT:    li a0, 10
590fa20bf16SCraig Topper; NOZBB-NEXT:  .LBB24_2:
591fa20bf16SCraig Topper; NOZBB-NEXT:    ret
59201ba4708SCraig Topper;
593fa20bf16SCraig Topper; ZBB-LABEL: smax_i32_pos_constant:
594fa20bf16SCraig Topper; ZBB:       # %bb.0:
595fa20bf16SCraig Topper; ZBB-NEXT:    li a1, 10
596fa20bf16SCraig Topper; ZBB-NEXT:    max a0, a0, a1
597fa20bf16SCraig Topper; ZBB-NEXT:    ret
59801ba4708SCraig Topper  %c = call i32 @llvm.smax.i32(i32 %a, i32 10)
59901ba4708SCraig Topper  ret i32 %c
60001ba4708SCraig Topper}
601be398100SCraig Topper
602be398100SCraig Topperdefine signext i32 @smax_i32_pos_constant_trailing_zeros(i32 signext %a) {
603be398100SCraig Topper; NOZBB-LABEL: smax_i32_pos_constant_trailing_zeros:
604be398100SCraig Topper; NOZBB:       # %bb.0:
605be398100SCraig Topper; NOZBB-NEXT:    andi a0, a0, -8
606be398100SCraig Topper; NOZBB-NEXT:    li a1, 16
607be398100SCraig Topper; NOZBB-NEXT:    blt a1, a0, .LBB25_2
608be398100SCraig Topper; NOZBB-NEXT:  # %bb.1:
609be398100SCraig Topper; NOZBB-NEXT:    li a0, 16
610be398100SCraig Topper; NOZBB-NEXT:  .LBB25_2:
611be398100SCraig Topper; NOZBB-NEXT:    ret
612be398100SCraig Topper;
613be398100SCraig Topper; ZBB-LABEL: smax_i32_pos_constant_trailing_zeros:
614be398100SCraig Topper; ZBB:       # %bb.0:
615be398100SCraig Topper; ZBB-NEXT:    andi a0, a0, -8
616be398100SCraig Topper; ZBB-NEXT:    li a1, 16
617be398100SCraig Topper; ZBB-NEXT:    max a0, a0, a1
618be398100SCraig Topper; ZBB-NEXT:    ret
619be398100SCraig Topper  %b = and i32 %a, -8
620be398100SCraig Topper  %c = call i32 @llvm.smax.i32(i32 %b, i32 16)
621be398100SCraig Topper  %d = and i32 %c, -4
622be398100SCraig Topper  ret i32 %d
623be398100SCraig Topper}
6241a042dd6SCraig Topper
6251a042dd6SCraig Topperdefine signext i32 @smin_i32_negone(i32 signext %a) {
6261a042dd6SCraig Topper; NOZBB-LABEL: smin_i32_negone:
6271a042dd6SCraig Topper; NOZBB:       # %bb.0:
628e68b0d58SCraig Topper; NOZBB-NEXT:    slti a1, a0, -1
62979f0413eSPhilip Reames; NOZBB-NEXT:    addi a1, a1, -1
63079f0413eSPhilip Reames; NOZBB-NEXT:    or a0, a1, a0
6311a042dd6SCraig Topper; NOZBB-NEXT:    ret
6321a042dd6SCraig Topper;
6331a042dd6SCraig Topper; ZBB-LABEL: smin_i32_negone:
6341a042dd6SCraig Topper; ZBB:       # %bb.0:
6351a042dd6SCraig Topper; ZBB-NEXT:    li a1, -1
6361a042dd6SCraig Topper; ZBB-NEXT:    min a0, a0, a1
6371a042dd6SCraig Topper; ZBB-NEXT:    ret
6381a042dd6SCraig Topper  %c = call i32 @llvm.smin.i32(i32 %a, i32 -1)
6391a042dd6SCraig Topper  ret i32 %c
6401a042dd6SCraig Topper}
6411a042dd6SCraig Topper
6421a042dd6SCraig Topperdefine i64 @smin_i64_negone(i64 %a) {
6431a042dd6SCraig Topper; RV32I-LABEL: smin_i64_negone:
6441a042dd6SCraig Topper; RV32I:       # %bb.0:
645139392c0SCraig Topper; RV32I-NEXT:    slti a2, a1, 0
64679f0413eSPhilip Reames; RV32I-NEXT:    addi a2, a2, -1
64779f0413eSPhilip Reames; RV32I-NEXT:    or a0, a2, a0
648139392c0SCraig Topper; RV32I-NEXT:    slti a2, a1, -1
649139392c0SCraig Topper; RV32I-NEXT:    addi a2, a2, -1
65079f0413eSPhilip Reames; RV32I-NEXT:    or a1, a2, a1
6511a042dd6SCraig Topper; RV32I-NEXT:    ret
6521a042dd6SCraig Topper;
6531a042dd6SCraig Topper; RV64I-LABEL: smin_i64_negone:
6541a042dd6SCraig Topper; RV64I:       # %bb.0:
655e68b0d58SCraig Topper; RV64I-NEXT:    slti a1, a0, -1
65679f0413eSPhilip Reames; RV64I-NEXT:    addi a1, a1, -1
65779f0413eSPhilip Reames; RV64I-NEXT:    or a0, a1, a0
6581a042dd6SCraig Topper; RV64I-NEXT:    ret
6591a042dd6SCraig Topper;
6601a042dd6SCraig Topper; RV32ZBB-LABEL: smin_i64_negone:
6611a042dd6SCraig Topper; RV32ZBB:       # %bb.0:
6621a042dd6SCraig Topper; RV32ZBB-NEXT:    li a2, -1
663139392c0SCraig Topper; RV32ZBB-NEXT:    min a2, a1, a2
664139392c0SCraig Topper; RV32ZBB-NEXT:    slti a1, a1, 0
665139392c0SCraig Topper; RV32ZBB-NEXT:    addi a1, a1, -1
666139392c0SCraig Topper; RV32ZBB-NEXT:    or a0, a1, a0
667139392c0SCraig Topper; RV32ZBB-NEXT:    mv a1, a2
6681a042dd6SCraig Topper; RV32ZBB-NEXT:    ret
6691a042dd6SCraig Topper;
6701a042dd6SCraig Topper; RV64ZBB-LABEL: smin_i64_negone:
6711a042dd6SCraig Topper; RV64ZBB:       # %bb.0:
6721a042dd6SCraig Topper; RV64ZBB-NEXT:    li a1, -1
6731a042dd6SCraig Topper; RV64ZBB-NEXT:    min a0, a0, a1
6741a042dd6SCraig Topper; RV64ZBB-NEXT:    ret
6751a042dd6SCraig Topper  %c = call i64 @llvm.smin.i64(i64 %a, i64 -1)
6761a042dd6SCraig Topper  ret i64 %c
6771a042dd6SCraig Topper}
678fc973037SLiaoChunyu
679fc973037SLiaoChunyudefine i64 @umax_i64_one(i64 %a, i64 %b) {
680fc973037SLiaoChunyu; RV32I-LABEL: umax_i64_one:
681fc973037SLiaoChunyu; RV32I:       # %bb.0:
682fc973037SLiaoChunyu; RV32I-NEXT:    mv a2, a0
683fc973037SLiaoChunyu; RV32I-NEXT:    beqz a1, .LBB28_3
684fc973037SLiaoChunyu; RV32I-NEXT:  # %bb.1:
685fc973037SLiaoChunyu; RV32I-NEXT:    beqz a1, .LBB28_4
686fc973037SLiaoChunyu; RV32I-NEXT:  .LBB28_2:
687fc973037SLiaoChunyu; RV32I-NEXT:    ret
688fc973037SLiaoChunyu; RV32I-NEXT:  .LBB28_3:
689*7b3bbd83SJay Foad; RV32I-NEXT:    li a0, 1
690fc973037SLiaoChunyu; RV32I-NEXT:    bnez a1, .LBB28_2
691fc973037SLiaoChunyu; RV32I-NEXT:  .LBB28_4:
692*7b3bbd83SJay Foad; RV32I-NEXT:    seqz a0, a2
693*7b3bbd83SJay Foad; RV32I-NEXT:    add a0, a2, a0
694fc973037SLiaoChunyu; RV32I-NEXT:    ret
695fc973037SLiaoChunyu;
696fc973037SLiaoChunyu; RV64I-LABEL: umax_i64_one:
697fc973037SLiaoChunyu; RV64I:       # %bb.0:
698fc973037SLiaoChunyu; RV64I-NEXT:    seqz a1, a0
699fc973037SLiaoChunyu; RV64I-NEXT:    add a0, a0, a1
700fc973037SLiaoChunyu; RV64I-NEXT:    ret
701fc973037SLiaoChunyu;
702fc973037SLiaoChunyu; RV32ZBB-LABEL: umax_i64_one:
703fc973037SLiaoChunyu; RV32ZBB:       # %bb.0:
7042501ae58SJay Foad; RV32ZBB-NEXT:    mv a2, a0
705*7b3bbd83SJay Foad; RV32ZBB-NEXT:    li a3, 1
706fc973037SLiaoChunyu; RV32ZBB-NEXT:    beqz a1, .LBB28_3
707fc973037SLiaoChunyu; RV32ZBB-NEXT:  # %bb.1:
708fc973037SLiaoChunyu; RV32ZBB-NEXT:    beqz a1, .LBB28_4
709fc973037SLiaoChunyu; RV32ZBB-NEXT:  .LBB28_2:
710fc973037SLiaoChunyu; RV32ZBB-NEXT:    ret
711fc973037SLiaoChunyu; RV32ZBB-NEXT:  .LBB28_3:
712*7b3bbd83SJay Foad; RV32ZBB-NEXT:    li a0, 1
713fc973037SLiaoChunyu; RV32ZBB-NEXT:    bnez a1, .LBB28_2
714fc973037SLiaoChunyu; RV32ZBB-NEXT:  .LBB28_4:
715*7b3bbd83SJay Foad; RV32ZBB-NEXT:    maxu a0, a2, a3
716fc973037SLiaoChunyu; RV32ZBB-NEXT:    ret
717fc973037SLiaoChunyu;
718fc973037SLiaoChunyu; RV64ZBB-LABEL: umax_i64_one:
719fc973037SLiaoChunyu; RV64ZBB:       # %bb.0:
720fc973037SLiaoChunyu; RV64ZBB-NEXT:    li a1, 1
721fc973037SLiaoChunyu; RV64ZBB-NEXT:    maxu a0, a0, a1
722fc973037SLiaoChunyu; RV64ZBB-NEXT:    ret
723fc973037SLiaoChunyu  %c = call i64 @llvm.umax.i64(i64 %a, i64 1)
724fc973037SLiaoChunyu  ret i64 %c
725fc973037SLiaoChunyu}
726