[RISCV] Match vcompress during shuffle lowering (#117748)
[llvm-project.git] / llvm / test / CodeGen / RISCV / abds-neg.ll
blobc9a48acb8d14a95f38196f0bfb864aaf73ff926c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=RV32I
3 ; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=RV64I
4 ; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV32ZBB
5 ; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV64ZBB
7 ; trunc(nabs(sub(sext(a),sext(b)))) -> nabds(a,b)
10 define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
11 ; RV32I-LABEL: abd_ext_i8:
12 ; RV32I:       # %bb.0:
13 ; RV32I-NEXT:    slli a1, a1, 24
14 ; RV32I-NEXT:    slli a0, a0, 24
15 ; RV32I-NEXT:    srai a1, a1, 24
16 ; RV32I-NEXT:    srai a0, a0, 24
17 ; RV32I-NEXT:    sub a0, a0, a1
18 ; RV32I-NEXT:    srai a1, a0, 31
19 ; RV32I-NEXT:    xor a0, a0, a1
20 ; RV32I-NEXT:    sub a0, a1, a0
21 ; RV32I-NEXT:    ret
23 ; RV64I-LABEL: abd_ext_i8:
24 ; RV64I:       # %bb.0:
25 ; RV64I-NEXT:    slli a0, a0, 56
26 ; RV64I-NEXT:    slli a1, a1, 56
27 ; RV64I-NEXT:    srai a0, a0, 56
28 ; RV64I-NEXT:    srai a1, a1, 56
29 ; RV64I-NEXT:    sub a0, a0, a1
30 ; RV64I-NEXT:    srai a1, a0, 63
31 ; RV64I-NEXT:    xor a0, a0, a1
32 ; RV64I-NEXT:    sub a0, a1, a0
33 ; RV64I-NEXT:    ret
35 ; RV32ZBB-LABEL: abd_ext_i8:
36 ; RV32ZBB:       # %bb.0:
37 ; RV32ZBB-NEXT:    sext.b a1, a1
38 ; RV32ZBB-NEXT:    sext.b a0, a0
39 ; RV32ZBB-NEXT:    max a2, a0, a1
40 ; RV32ZBB-NEXT:    min a0, a0, a1
41 ; RV32ZBB-NEXT:    sub a0, a0, a2
42 ; RV32ZBB-NEXT:    ret
44 ; RV64ZBB-LABEL: abd_ext_i8:
45 ; RV64ZBB:       # %bb.0:
46 ; RV64ZBB-NEXT:    sext.b a0, a0
47 ; RV64ZBB-NEXT:    sext.b a1, a1
48 ; RV64ZBB-NEXT:    sub a0, a0, a1
49 ; RV64ZBB-NEXT:    neg a1, a0
50 ; RV64ZBB-NEXT:    min a0, a0, a1
51 ; RV64ZBB-NEXT:    ret
52   %aext = sext i8 %a to i64
53   %bext = sext i8 %b to i64
54   %sub = sub i64 %aext, %bext
55   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
56   %nabs = sub i64 0, %abs
57   %trunc = trunc i64 %nabs to i8
58   ret i8 %trunc
61 define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
62 ; RV32I-LABEL: abd_ext_i8_i16:
63 ; RV32I:       # %bb.0:
64 ; RV32I-NEXT:    slli a1, a1, 16
65 ; RV32I-NEXT:    slli a0, a0, 24
66 ; RV32I-NEXT:    srai a1, a1, 16
67 ; RV32I-NEXT:    srai a0, a0, 24
68 ; RV32I-NEXT:    sub a0, a0, a1
69 ; RV32I-NEXT:    srai a1, a0, 31
70 ; RV32I-NEXT:    xor a0, a0, a1
71 ; RV32I-NEXT:    sub a0, a1, a0
72 ; RV32I-NEXT:    ret
74 ; RV64I-LABEL: abd_ext_i8_i16:
75 ; RV64I:       # %bb.0:
76 ; RV64I-NEXT:    slli a0, a0, 56
77 ; RV64I-NEXT:    slli a1, a1, 48
78 ; RV64I-NEXT:    srai a0, a0, 56
79 ; RV64I-NEXT:    srai a1, a1, 48
80 ; RV64I-NEXT:    sub a0, a0, a1
81 ; RV64I-NEXT:    srai a1, a0, 63
82 ; RV64I-NEXT:    xor a0, a0, a1
83 ; RV64I-NEXT:    sub a0, a1, a0
84 ; RV64I-NEXT:    ret
86 ; RV32ZBB-LABEL: abd_ext_i8_i16:
87 ; RV32ZBB:       # %bb.0:
88 ; RV32ZBB-NEXT:    sext.h a1, a1
89 ; RV32ZBB-NEXT:    sext.b a0, a0
90 ; RV32ZBB-NEXT:    max a2, a0, a1
91 ; RV32ZBB-NEXT:    min a0, a0, a1
92 ; RV32ZBB-NEXT:    sub a0, a0, a2
93 ; RV32ZBB-NEXT:    ret
95 ; RV64ZBB-LABEL: abd_ext_i8_i16:
96 ; RV64ZBB:       # %bb.0:
97 ; RV64ZBB-NEXT:    sext.b a0, a0
98 ; RV64ZBB-NEXT:    sext.h a1, a1
99 ; RV64ZBB-NEXT:    sub a0, a0, a1
100 ; RV64ZBB-NEXT:    neg a1, a0
101 ; RV64ZBB-NEXT:    min a0, a0, a1
102 ; RV64ZBB-NEXT:    ret
103   %aext = sext i8 %a to i64
104   %bext = sext i16 %b to i64
105   %sub = sub i64 %aext, %bext
106   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
107   %nabs = sub i64 0, %abs
108   %trunc = trunc i64 %nabs to i8
109   ret i8 %trunc
112 define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
113 ; RV32I-LABEL: abd_ext_i8_undef:
114 ; RV32I:       # %bb.0:
115 ; RV32I-NEXT:    slli a1, a1, 24
116 ; RV32I-NEXT:    slli a0, a0, 24
117 ; RV32I-NEXT:    srai a1, a1, 24
118 ; RV32I-NEXT:    srai a0, a0, 24
119 ; RV32I-NEXT:    sub a0, a0, a1
120 ; RV32I-NEXT:    srai a1, a0, 31
121 ; RV32I-NEXT:    xor a0, a0, a1
122 ; RV32I-NEXT:    sub a0, a1, a0
123 ; RV32I-NEXT:    ret
125 ; RV64I-LABEL: abd_ext_i8_undef:
126 ; RV64I:       # %bb.0:
127 ; RV64I-NEXT:    slli a0, a0, 56
128 ; RV64I-NEXT:    slli a1, a1, 56
129 ; RV64I-NEXT:    srai a0, a0, 56
130 ; RV64I-NEXT:    srai a1, a1, 56
131 ; RV64I-NEXT:    sub a0, a0, a1
132 ; RV64I-NEXT:    srai a1, a0, 63
133 ; RV64I-NEXT:    xor a0, a0, a1
134 ; RV64I-NEXT:    sub a0, a1, a0
135 ; RV64I-NEXT:    ret
137 ; RV32ZBB-LABEL: abd_ext_i8_undef:
138 ; RV32ZBB:       # %bb.0:
139 ; RV32ZBB-NEXT:    sext.b a1, a1
140 ; RV32ZBB-NEXT:    sext.b a0, a0
141 ; RV32ZBB-NEXT:    max a2, a0, a1
142 ; RV32ZBB-NEXT:    min a0, a0, a1
143 ; RV32ZBB-NEXT:    sub a0, a0, a2
144 ; RV32ZBB-NEXT:    ret
146 ; RV64ZBB-LABEL: abd_ext_i8_undef:
147 ; RV64ZBB:       # %bb.0:
148 ; RV64ZBB-NEXT:    sext.b a0, a0
149 ; RV64ZBB-NEXT:    sext.b a1, a1
150 ; RV64ZBB-NEXT:    sub a0, a0, a1
151 ; RV64ZBB-NEXT:    neg a1, a0
152 ; RV64ZBB-NEXT:    min a0, a0, a1
153 ; RV64ZBB-NEXT:    ret
154   %aext = sext i8 %a to i64
155   %bext = sext i8 %b to i64
156   %sub = sub i64 %aext, %bext
157   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
158   %nabs = sub i64 0, %abs
159   %trunc = trunc i64 %nabs to i8
160   ret i8 %trunc
163 define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
164 ; RV32I-LABEL: abd_ext_i16:
165 ; RV32I:       # %bb.0:
166 ; RV32I-NEXT:    slli a1, a1, 16
167 ; RV32I-NEXT:    slli a0, a0, 16
168 ; RV32I-NEXT:    srai a1, a1, 16
169 ; RV32I-NEXT:    srai a0, a0, 16
170 ; RV32I-NEXT:    sub a0, a0, a1
171 ; RV32I-NEXT:    srai a1, a0, 31
172 ; RV32I-NEXT:    xor a0, a0, a1
173 ; RV32I-NEXT:    sub a0, a1, a0
174 ; RV32I-NEXT:    ret
176 ; RV64I-LABEL: abd_ext_i16:
177 ; RV64I:       # %bb.0:
178 ; RV64I-NEXT:    slli a0, a0, 48
179 ; RV64I-NEXT:    slli a1, a1, 48
180 ; RV64I-NEXT:    srai a0, a0, 48
181 ; RV64I-NEXT:    srai a1, a1, 48
182 ; RV64I-NEXT:    sub a0, a0, a1
183 ; RV64I-NEXT:    srai a1, a0, 63
184 ; RV64I-NEXT:    xor a0, a0, a1
185 ; RV64I-NEXT:    sub a0, a1, a0
186 ; RV64I-NEXT:    ret
188 ; RV32ZBB-LABEL: abd_ext_i16:
189 ; RV32ZBB:       # %bb.0:
190 ; RV32ZBB-NEXT:    sext.h a1, a1
191 ; RV32ZBB-NEXT:    sext.h a0, a0
192 ; RV32ZBB-NEXT:    max a2, a0, a1
193 ; RV32ZBB-NEXT:    min a0, a0, a1
194 ; RV32ZBB-NEXT:    sub a0, a0, a2
195 ; RV32ZBB-NEXT:    ret
197 ; RV64ZBB-LABEL: abd_ext_i16:
198 ; RV64ZBB:       # %bb.0:
199 ; RV64ZBB-NEXT:    sext.h a0, a0
200 ; RV64ZBB-NEXT:    sext.h a1, a1
201 ; RV64ZBB-NEXT:    sub a0, a0, a1
202 ; RV64ZBB-NEXT:    neg a1, a0
203 ; RV64ZBB-NEXT:    min a0, a0, a1
204 ; RV64ZBB-NEXT:    ret
205   %aext = sext i16 %a to i64
206   %bext = sext i16 %b to i64
207   %sub = sub i64 %aext, %bext
208   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
209   %nabs = sub i64 0, %abs
210   %trunc = trunc i64 %nabs to i16
211   ret i16 %trunc
214 define i16 @abd_ext_i16_i32(i16 %a, i32 %b) nounwind {
215 ; RV32I-LABEL: abd_ext_i16_i32:
216 ; RV32I:       # %bb.0:
217 ; RV32I-NEXT:    slli a0, a0, 16
218 ; RV32I-NEXT:    srai a0, a0, 16
219 ; RV32I-NEXT:    blt a1, a0, .LBB4_2
220 ; RV32I-NEXT:  # %bb.1:
221 ; RV32I-NEXT:    sub a0, a1, a0
222 ; RV32I-NEXT:    neg a0, a0
223 ; RV32I-NEXT:    ret
224 ; RV32I-NEXT:  .LBB4_2:
225 ; RV32I-NEXT:    sub a0, a0, a1
226 ; RV32I-NEXT:    neg a0, a0
227 ; RV32I-NEXT:    ret
229 ; RV64I-LABEL: abd_ext_i16_i32:
230 ; RV64I:       # %bb.0:
231 ; RV64I-NEXT:    slli a0, a0, 48
232 ; RV64I-NEXT:    srai a0, a0, 48
233 ; RV64I-NEXT:    sext.w a1, a1
234 ; RV64I-NEXT:    sub a0, a0, a1
235 ; RV64I-NEXT:    srai a1, a0, 63
236 ; RV64I-NEXT:    xor a0, a0, a1
237 ; RV64I-NEXT:    sub a0, a1, a0
238 ; RV64I-NEXT:    ret
240 ; RV32ZBB-LABEL: abd_ext_i16_i32:
241 ; RV32ZBB:       # %bb.0:
242 ; RV32ZBB-NEXT:    sext.h a0, a0
243 ; RV32ZBB-NEXT:    max a2, a0, a1
244 ; RV32ZBB-NEXT:    min a0, a0, a1
245 ; RV32ZBB-NEXT:    sub a0, a0, a2
246 ; RV32ZBB-NEXT:    ret
248 ; RV64ZBB-LABEL: abd_ext_i16_i32:
249 ; RV64ZBB:       # %bb.0:
250 ; RV64ZBB-NEXT:    sext.h a0, a0
251 ; RV64ZBB-NEXT:    sext.w a1, a1
252 ; RV64ZBB-NEXT:    sub a0, a0, a1
253 ; RV64ZBB-NEXT:    neg a1, a0
254 ; RV64ZBB-NEXT:    min a0, a0, a1
255 ; RV64ZBB-NEXT:    ret
256   %aext = sext i16 %a to i64
257   %bext = sext i32 %b to i64
258   %sub = sub i64 %aext, %bext
259   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
260   %nabs = sub i64 0, %abs
261   %trunc = trunc i64 %nabs to i16
262   ret i16 %trunc
265 define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
266 ; RV32I-LABEL: abd_ext_i16_undef:
267 ; RV32I:       # %bb.0:
268 ; RV32I-NEXT:    slli a1, a1, 16
269 ; RV32I-NEXT:    slli a0, a0, 16
270 ; RV32I-NEXT:    srai a1, a1, 16
271 ; RV32I-NEXT:    srai a0, a0, 16
272 ; RV32I-NEXT:    sub a0, a0, a1
273 ; RV32I-NEXT:    srai a1, a0, 31
274 ; RV32I-NEXT:    xor a0, a0, a1
275 ; RV32I-NEXT:    sub a0, a1, a0
276 ; RV32I-NEXT:    ret
278 ; RV64I-LABEL: abd_ext_i16_undef:
279 ; RV64I:       # %bb.0:
280 ; RV64I-NEXT:    slli a0, a0, 48
281 ; RV64I-NEXT:    slli a1, a1, 48
282 ; RV64I-NEXT:    srai a0, a0, 48
283 ; RV64I-NEXT:    srai a1, a1, 48
284 ; RV64I-NEXT:    sub a0, a0, a1
285 ; RV64I-NEXT:    srai a1, a0, 63
286 ; RV64I-NEXT:    xor a0, a0, a1
287 ; RV64I-NEXT:    sub a0, a1, a0
288 ; RV64I-NEXT:    ret
290 ; RV32ZBB-LABEL: abd_ext_i16_undef:
291 ; RV32ZBB:       # %bb.0:
292 ; RV32ZBB-NEXT:    sext.h a1, a1
293 ; RV32ZBB-NEXT:    sext.h a0, a0
294 ; RV32ZBB-NEXT:    max a2, a0, a1
295 ; RV32ZBB-NEXT:    min a0, a0, a1
296 ; RV32ZBB-NEXT:    sub a0, a0, a2
297 ; RV32ZBB-NEXT:    ret
299 ; RV64ZBB-LABEL: abd_ext_i16_undef:
300 ; RV64ZBB:       # %bb.0:
301 ; RV64ZBB-NEXT:    sext.h a0, a0
302 ; RV64ZBB-NEXT:    sext.h a1, a1
303 ; RV64ZBB-NEXT:    sub a0, a0, a1
304 ; RV64ZBB-NEXT:    neg a1, a0
305 ; RV64ZBB-NEXT:    min a0, a0, a1
306 ; RV64ZBB-NEXT:    ret
307   %aext = sext i16 %a to i64
308   %bext = sext i16 %b to i64
309   %sub = sub i64 %aext, %bext
310   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
311   %nabs = sub i64 0, %abs
312   %trunc = trunc i64 %nabs to i16
313   ret i16 %trunc
316 define i32 @abd_ext_i32(i32 %a, i32 %b) nounwind {
317 ; RV32I-LABEL: abd_ext_i32:
318 ; RV32I:       # %bb.0:
319 ; RV32I-NEXT:    blt a1, a0, .LBB6_2
320 ; RV32I-NEXT:  # %bb.1:
321 ; RV32I-NEXT:    sub a0, a1, a0
322 ; RV32I-NEXT:    neg a0, a0
323 ; RV32I-NEXT:    ret
324 ; RV32I-NEXT:  .LBB6_2:
325 ; RV32I-NEXT:    sub a0, a0, a1
326 ; RV32I-NEXT:    neg a0, a0
327 ; RV32I-NEXT:    ret
329 ; RV64I-LABEL: abd_ext_i32:
330 ; RV64I:       # %bb.0:
331 ; RV64I-NEXT:    sext.w a0, a0
332 ; RV64I-NEXT:    sext.w a1, a1
333 ; RV64I-NEXT:    sub a0, a0, a1
334 ; RV64I-NEXT:    srai a1, a0, 63
335 ; RV64I-NEXT:    xor a0, a0, a1
336 ; RV64I-NEXT:    sub a0, a1, a0
337 ; RV64I-NEXT:    ret
339 ; RV32ZBB-LABEL: abd_ext_i32:
340 ; RV32ZBB:       # %bb.0:
341 ; RV32ZBB-NEXT:    max a2, a0, a1
342 ; RV32ZBB-NEXT:    min a0, a0, a1
343 ; RV32ZBB-NEXT:    sub a0, a0, a2
344 ; RV32ZBB-NEXT:    ret
346 ; RV64ZBB-LABEL: abd_ext_i32:
347 ; RV64ZBB:       # %bb.0:
348 ; RV64ZBB-NEXT:    sext.w a0, a0
349 ; RV64ZBB-NEXT:    sext.w a1, a1
350 ; RV64ZBB-NEXT:    sub a0, a0, a1
351 ; RV64ZBB-NEXT:    neg a1, a0
352 ; RV64ZBB-NEXT:    min a0, a0, a1
353 ; RV64ZBB-NEXT:    ret
354   %aext = sext i32 %a to i64
355   %bext = sext i32 %b to i64
356   %sub = sub i64 %aext, %bext
357   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
358   %nabs = sub i64 0, %abs
359   %trunc = trunc i64 %nabs to i32
360   ret i32 %trunc
363 define i32 @abd_ext_i32_i16(i32 %a, i16 %b) nounwind {
364 ; RV32I-LABEL: abd_ext_i32_i16:
365 ; RV32I:       # %bb.0:
366 ; RV32I-NEXT:    slli a1, a1, 16
367 ; RV32I-NEXT:    srai a1, a1, 16
368 ; RV32I-NEXT:    blt a1, a0, .LBB7_2
369 ; RV32I-NEXT:  # %bb.1:
370 ; RV32I-NEXT:    sub a0, a1, a0
371 ; RV32I-NEXT:    neg a0, a0
372 ; RV32I-NEXT:    ret
373 ; RV32I-NEXT:  .LBB7_2:
374 ; RV32I-NEXT:    sub a0, a0, a1
375 ; RV32I-NEXT:    neg a0, a0
376 ; RV32I-NEXT:    ret
378 ; RV64I-LABEL: abd_ext_i32_i16:
379 ; RV64I:       # %bb.0:
380 ; RV64I-NEXT:    sext.w a0, a0
381 ; RV64I-NEXT:    slli a1, a1, 48
382 ; RV64I-NEXT:    srai a1, a1, 48
383 ; RV64I-NEXT:    sub a0, a0, a1
384 ; RV64I-NEXT:    srai a1, a0, 63
385 ; RV64I-NEXT:    xor a0, a0, a1
386 ; RV64I-NEXT:    sub a0, a1, a0
387 ; RV64I-NEXT:    ret
389 ; RV32ZBB-LABEL: abd_ext_i32_i16:
390 ; RV32ZBB:       # %bb.0:
391 ; RV32ZBB-NEXT:    sext.h a1, a1
392 ; RV32ZBB-NEXT:    max a2, a0, a1
393 ; RV32ZBB-NEXT:    min a0, a0, a1
394 ; RV32ZBB-NEXT:    sub a0, a0, a2
395 ; RV32ZBB-NEXT:    ret
397 ; RV64ZBB-LABEL: abd_ext_i32_i16:
398 ; RV64ZBB:       # %bb.0:
399 ; RV64ZBB-NEXT:    sext.w a0, a0
400 ; RV64ZBB-NEXT:    sext.h a1, a1
401 ; RV64ZBB-NEXT:    sub a0, a0, a1
402 ; RV64ZBB-NEXT:    neg a1, a0
403 ; RV64ZBB-NEXT:    min a0, a0, a1
404 ; RV64ZBB-NEXT:    ret
405   %aext = sext i32 %a to i64
406   %bext = sext i16 %b to i64
407   %sub = sub i64 %aext, %bext
408   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
409   %nabs = sub i64 0, %abs
410   %trunc = trunc i64 %nabs to i32
411   ret i32 %trunc
414 define i32 @abd_ext_i32_undef(i32 %a, i32 %b) nounwind {
415 ; RV32I-LABEL: abd_ext_i32_undef:
416 ; RV32I:       # %bb.0:
417 ; RV32I-NEXT:    blt a1, a0, .LBB8_2
418 ; RV32I-NEXT:  # %bb.1:
419 ; RV32I-NEXT:    sub a0, a1, a0
420 ; RV32I-NEXT:    neg a0, a0
421 ; RV32I-NEXT:    ret
422 ; RV32I-NEXT:  .LBB8_2:
423 ; RV32I-NEXT:    sub a0, a0, a1
424 ; RV32I-NEXT:    neg a0, a0
425 ; RV32I-NEXT:    ret
427 ; RV64I-LABEL: abd_ext_i32_undef:
428 ; RV64I:       # %bb.0:
429 ; RV64I-NEXT:    sext.w a0, a0
430 ; RV64I-NEXT:    sext.w a1, a1
431 ; RV64I-NEXT:    sub a0, a0, a1
432 ; RV64I-NEXT:    srai a1, a0, 63
433 ; RV64I-NEXT:    xor a0, a0, a1
434 ; RV64I-NEXT:    sub a0, a1, a0
435 ; RV64I-NEXT:    ret
437 ; RV32ZBB-LABEL: abd_ext_i32_undef:
438 ; RV32ZBB:       # %bb.0:
439 ; RV32ZBB-NEXT:    max a2, a0, a1
440 ; RV32ZBB-NEXT:    min a0, a0, a1
441 ; RV32ZBB-NEXT:    sub a0, a0, a2
442 ; RV32ZBB-NEXT:    ret
444 ; RV64ZBB-LABEL: abd_ext_i32_undef:
445 ; RV64ZBB:       # %bb.0:
446 ; RV64ZBB-NEXT:    sext.w a0, a0
447 ; RV64ZBB-NEXT:    sext.w a1, a1
448 ; RV64ZBB-NEXT:    sub a0, a0, a1
449 ; RV64ZBB-NEXT:    neg a1, a0
450 ; RV64ZBB-NEXT:    min a0, a0, a1
451 ; RV64ZBB-NEXT:    ret
452   %aext = sext i32 %a to i64
453   %bext = sext i32 %b to i64
454   %sub = sub i64 %aext, %bext
455   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
456   %nabs = sub i64 0, %abs
457   %trunc = trunc i64 %nabs to i32
458   ret i32 %trunc
461 define i64 @abd_ext_i64(i64 %a, i64 %b) nounwind {
462 ; RV32I-LABEL: abd_ext_i64:
463 ; RV32I:       # %bb.0:
464 ; RV32I-NEXT:    sltu a4, a2, a0
465 ; RV32I-NEXT:    mv a5, a4
466 ; RV32I-NEXT:    beq a1, a3, .LBB9_2
467 ; RV32I-NEXT:  # %bb.1:
468 ; RV32I-NEXT:    slt a5, a3, a1
469 ; RV32I-NEXT:  .LBB9_2:
470 ; RV32I-NEXT:    bnez a5, .LBB9_4
471 ; RV32I-NEXT:  # %bb.3:
472 ; RV32I-NEXT:    sub a1, a3, a1
473 ; RV32I-NEXT:    sub a1, a1, a4
474 ; RV32I-NEXT:    sub a0, a2, a0
475 ; RV32I-NEXT:    j .LBB9_5
476 ; RV32I-NEXT:  .LBB9_4:
477 ; RV32I-NEXT:    sltu a4, a0, a2
478 ; RV32I-NEXT:    sub a1, a1, a3
479 ; RV32I-NEXT:    sub a1, a1, a4
480 ; RV32I-NEXT:    sub a0, a0, a2
481 ; RV32I-NEXT:  .LBB9_5:
482 ; RV32I-NEXT:    snez a2, a0
483 ; RV32I-NEXT:    add a1, a1, a2
484 ; RV32I-NEXT:    neg a1, a1
485 ; RV32I-NEXT:    neg a0, a0
486 ; RV32I-NEXT:    ret
488 ; RV64I-LABEL: abd_ext_i64:
489 ; RV64I:       # %bb.0:
490 ; RV64I-NEXT:    blt a1, a0, .LBB9_2
491 ; RV64I-NEXT:  # %bb.1:
492 ; RV64I-NEXT:    sub a0, a1, a0
493 ; RV64I-NEXT:    neg a0, a0
494 ; RV64I-NEXT:    ret
495 ; RV64I-NEXT:  .LBB9_2:
496 ; RV64I-NEXT:    sub a0, a0, a1
497 ; RV64I-NEXT:    neg a0, a0
498 ; RV64I-NEXT:    ret
500 ; RV32ZBB-LABEL: abd_ext_i64:
501 ; RV32ZBB:       # %bb.0:
502 ; RV32ZBB-NEXT:    sltu a4, a2, a0
503 ; RV32ZBB-NEXT:    mv a5, a4
504 ; RV32ZBB-NEXT:    beq a1, a3, .LBB9_2
505 ; RV32ZBB-NEXT:  # %bb.1:
506 ; RV32ZBB-NEXT:    slt a5, a3, a1
507 ; RV32ZBB-NEXT:  .LBB9_2:
508 ; RV32ZBB-NEXT:    bnez a5, .LBB9_4
509 ; RV32ZBB-NEXT:  # %bb.3:
510 ; RV32ZBB-NEXT:    sub a1, a3, a1
511 ; RV32ZBB-NEXT:    sub a1, a1, a4
512 ; RV32ZBB-NEXT:    sub a0, a2, a0
513 ; RV32ZBB-NEXT:    j .LBB9_5
514 ; RV32ZBB-NEXT:  .LBB9_4:
515 ; RV32ZBB-NEXT:    sltu a4, a0, a2
516 ; RV32ZBB-NEXT:    sub a1, a1, a3
517 ; RV32ZBB-NEXT:    sub a1, a1, a4
518 ; RV32ZBB-NEXT:    sub a0, a0, a2
519 ; RV32ZBB-NEXT:  .LBB9_5:
520 ; RV32ZBB-NEXT:    snez a2, a0
521 ; RV32ZBB-NEXT:    add a1, a1, a2
522 ; RV32ZBB-NEXT:    neg a1, a1
523 ; RV32ZBB-NEXT:    neg a0, a0
524 ; RV32ZBB-NEXT:    ret
526 ; RV64ZBB-LABEL: abd_ext_i64:
527 ; RV64ZBB:       # %bb.0:
528 ; RV64ZBB-NEXT:    max a2, a0, a1
529 ; RV64ZBB-NEXT:    min a0, a0, a1
530 ; RV64ZBB-NEXT:    sub a0, a0, a2
531 ; RV64ZBB-NEXT:    ret
532   %aext = sext i64 %a to i128
533   %bext = sext i64 %b to i128
534   %sub = sub i128 %aext, %bext
535   %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
536   %nabs = sub i128 0, %abs
537   %trunc = trunc i128 %nabs to i64
538   ret i64 %trunc
541 define i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {
542 ; RV32I-LABEL: abd_ext_i64_undef:
543 ; RV32I:       # %bb.0:
544 ; RV32I-NEXT:    sltu a4, a2, a0
545 ; RV32I-NEXT:    mv a5, a4
546 ; RV32I-NEXT:    beq a1, a3, .LBB10_2
547 ; RV32I-NEXT:  # %bb.1:
548 ; RV32I-NEXT:    slt a5, a3, a1
549 ; RV32I-NEXT:  .LBB10_2:
550 ; RV32I-NEXT:    bnez a5, .LBB10_4
551 ; RV32I-NEXT:  # %bb.3:
552 ; RV32I-NEXT:    sub a1, a3, a1
553 ; RV32I-NEXT:    sub a1, a1, a4
554 ; RV32I-NEXT:    sub a0, a2, a0
555 ; RV32I-NEXT:    j .LBB10_5
556 ; RV32I-NEXT:  .LBB10_4:
557 ; RV32I-NEXT:    sltu a4, a0, a2
558 ; RV32I-NEXT:    sub a1, a1, a3
559 ; RV32I-NEXT:    sub a1, a1, a4
560 ; RV32I-NEXT:    sub a0, a0, a2
561 ; RV32I-NEXT:  .LBB10_5:
562 ; RV32I-NEXT:    snez a2, a0
563 ; RV32I-NEXT:    add a1, a1, a2
564 ; RV32I-NEXT:    neg a1, a1
565 ; RV32I-NEXT:    neg a0, a0
566 ; RV32I-NEXT:    ret
568 ; RV64I-LABEL: abd_ext_i64_undef:
569 ; RV64I:       # %bb.0:
570 ; RV64I-NEXT:    blt a1, a0, .LBB10_2
571 ; RV64I-NEXT:  # %bb.1:
572 ; RV64I-NEXT:    sub a0, a1, a0
573 ; RV64I-NEXT:    neg a0, a0
574 ; RV64I-NEXT:    ret
575 ; RV64I-NEXT:  .LBB10_2:
576 ; RV64I-NEXT:    sub a0, a0, a1
577 ; RV64I-NEXT:    neg a0, a0
578 ; RV64I-NEXT:    ret
580 ; RV32ZBB-LABEL: abd_ext_i64_undef:
581 ; RV32ZBB:       # %bb.0:
582 ; RV32ZBB-NEXT:    sltu a4, a2, a0
583 ; RV32ZBB-NEXT:    mv a5, a4
584 ; RV32ZBB-NEXT:    beq a1, a3, .LBB10_2
585 ; RV32ZBB-NEXT:  # %bb.1:
586 ; RV32ZBB-NEXT:    slt a5, a3, a1
587 ; RV32ZBB-NEXT:  .LBB10_2:
588 ; RV32ZBB-NEXT:    bnez a5, .LBB10_4
589 ; RV32ZBB-NEXT:  # %bb.3:
590 ; RV32ZBB-NEXT:    sub a1, a3, a1
591 ; RV32ZBB-NEXT:    sub a1, a1, a4
592 ; RV32ZBB-NEXT:    sub a0, a2, a0
593 ; RV32ZBB-NEXT:    j .LBB10_5
594 ; RV32ZBB-NEXT:  .LBB10_4:
595 ; RV32ZBB-NEXT:    sltu a4, a0, a2
596 ; RV32ZBB-NEXT:    sub a1, a1, a3
597 ; RV32ZBB-NEXT:    sub a1, a1, a4
598 ; RV32ZBB-NEXT:    sub a0, a0, a2
599 ; RV32ZBB-NEXT:  .LBB10_5:
600 ; RV32ZBB-NEXT:    snez a2, a0
601 ; RV32ZBB-NEXT:    add a1, a1, a2
602 ; RV32ZBB-NEXT:    neg a1, a1
603 ; RV32ZBB-NEXT:    neg a0, a0
604 ; RV32ZBB-NEXT:    ret
606 ; RV64ZBB-LABEL: abd_ext_i64_undef:
607 ; RV64ZBB:       # %bb.0:
608 ; RV64ZBB-NEXT:    max a2, a0, a1
609 ; RV64ZBB-NEXT:    min a0, a0, a1
610 ; RV64ZBB-NEXT:    sub a0, a0, a2
611 ; RV64ZBB-NEXT:    ret
612   %aext = sext i64 %a to i128
613   %bext = sext i64 %b to i128
614   %sub = sub i128 %aext, %bext
615   %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
616   %nabs = sub i128 0, %abs
617   %trunc = trunc i128 %nabs to i64
618   ret i64 %trunc
621 define i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {
622 ; RV32I-LABEL: abd_ext_i128:
623 ; RV32I:       # %bb.0:
624 ; RV32I-NEXT:    lw a3, 0(a1)
625 ; RV32I-NEXT:    lw a4, 4(a1)
626 ; RV32I-NEXT:    lw a6, 8(a1)
627 ; RV32I-NEXT:    lw t1, 12(a1)
628 ; RV32I-NEXT:    lw t0, 8(a2)
629 ; RV32I-NEXT:    lw t2, 12(a2)
630 ; RV32I-NEXT:    lw a1, 0(a2)
631 ; RV32I-NEXT:    lw a2, 4(a2)
632 ; RV32I-NEXT:    sltu t3, t0, a6
633 ; RV32I-NEXT:    mv t4, t3
634 ; RV32I-NEXT:    beq t1, t2, .LBB11_2
635 ; RV32I-NEXT:  # %bb.1:
636 ; RV32I-NEXT:    slt t4, t2, t1
637 ; RV32I-NEXT:  .LBB11_2:
638 ; RV32I-NEXT:    sltu a5, a1, a3
639 ; RV32I-NEXT:    sltu t6, a2, a4
640 ; RV32I-NEXT:    mv a7, a5
641 ; RV32I-NEXT:    beq a4, a2, .LBB11_4
642 ; RV32I-NEXT:  # %bb.3:
643 ; RV32I-NEXT:    mv a7, t6
644 ; RV32I-NEXT:  .LBB11_4:
645 ; RV32I-NEXT:    addi sp, sp, -16
646 ; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
647 ; RV32I-NEXT:    xor t5, t1, t2
648 ; RV32I-NEXT:    xor s0, a6, t0
649 ; RV32I-NEXT:    or t5, s0, t5
650 ; RV32I-NEXT:    beqz t5, .LBB11_6
651 ; RV32I-NEXT:  # %bb.5:
652 ; RV32I-NEXT:    mv a7, t4
653 ; RV32I-NEXT:  .LBB11_6:
654 ; RV32I-NEXT:    mv t5, a5
655 ; RV32I-NEXT:    beq a2, a4, .LBB11_8
656 ; RV32I-NEXT:  # %bb.7:
657 ; RV32I-NEXT:    mv t5, t6
658 ; RV32I-NEXT:  .LBB11_8:
659 ; RV32I-NEXT:    sltu t4, a3, a1
660 ; RV32I-NEXT:    mv t6, t4
661 ; RV32I-NEXT:    beq a4, a2, .LBB11_10
662 ; RV32I-NEXT:  # %bb.9:
663 ; RV32I-NEXT:    sltu t6, a4, a2
664 ; RV32I-NEXT:  .LBB11_10:
665 ; RV32I-NEXT:    bnez a7, .LBB11_12
666 ; RV32I-NEXT:  # %bb.11:
667 ; RV32I-NEXT:    sub t1, t2, t1
668 ; RV32I-NEXT:    sub a6, t0, a6
669 ; RV32I-NEXT:    sub t0, t1, t3
670 ; RV32I-NEXT:    sltu t1, a6, t5
671 ; RV32I-NEXT:    sub t0, t0, t1
672 ; RV32I-NEXT:    sub a6, a6, t5
673 ; RV32I-NEXT:    j .LBB11_13
674 ; RV32I-NEXT:  .LBB11_12:
675 ; RV32I-NEXT:    sltu t3, a6, t0
676 ; RV32I-NEXT:    sub t1, t1, t2
677 ; RV32I-NEXT:    sub a6, a6, t0
678 ; RV32I-NEXT:    sub t0, t1, t3
679 ; RV32I-NEXT:    sltu t1, a6, t6
680 ; RV32I-NEXT:    sub t0, t0, t1
681 ; RV32I-NEXT:    sub a6, a6, t6
682 ; RV32I-NEXT:  .LBB11_13:
683 ; RV32I-NEXT:    snez t1, a6
684 ; RV32I-NEXT:    add t0, t0, t1
685 ; RV32I-NEXT:    bnez a7, .LBB11_15
686 ; RV32I-NEXT:  # %bb.14:
687 ; RV32I-NEXT:    sub a2, a2, a4
688 ; RV32I-NEXT:    sub a2, a2, a5
689 ; RV32I-NEXT:    sub a1, a1, a3
690 ; RV32I-NEXT:    j .LBB11_16
691 ; RV32I-NEXT:  .LBB11_15:
692 ; RV32I-NEXT:    sub a4, a4, a2
693 ; RV32I-NEXT:    sub a2, a4, t4
694 ; RV32I-NEXT:    sub a1, a3, a1
695 ; RV32I-NEXT:  .LBB11_16:
696 ; RV32I-NEXT:    or a3, a1, a2
697 ; RV32I-NEXT:    neg a4, a6
698 ; RV32I-NEXT:    neg a5, t0
699 ; RV32I-NEXT:    snez a6, a1
700 ; RV32I-NEXT:    neg a1, a1
701 ; RV32I-NEXT:    snez a3, a3
702 ; RV32I-NEXT:    add a2, a2, a6
703 ; RV32I-NEXT:    sltu a6, a4, a3
704 ; RV32I-NEXT:    neg a2, a2
705 ; RV32I-NEXT:    sub a4, a4, a3
706 ; RV32I-NEXT:    sub a3, a5, a6
707 ; RV32I-NEXT:    sw a1, 0(a0)
708 ; RV32I-NEXT:    sw a2, 4(a0)
709 ; RV32I-NEXT:    sw a4, 8(a0)
710 ; RV32I-NEXT:    sw a3, 12(a0)
711 ; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
712 ; RV32I-NEXT:    addi sp, sp, 16
713 ; RV32I-NEXT:    ret
715 ; RV64I-LABEL: abd_ext_i128:
716 ; RV64I:       # %bb.0:
717 ; RV64I-NEXT:    sltu a4, a2, a0
718 ; RV64I-NEXT:    mv a5, a4
719 ; RV64I-NEXT:    beq a1, a3, .LBB11_2
720 ; RV64I-NEXT:  # %bb.1:
721 ; RV64I-NEXT:    slt a5, a3, a1
722 ; RV64I-NEXT:  .LBB11_2:
723 ; RV64I-NEXT:    bnez a5, .LBB11_4
724 ; RV64I-NEXT:  # %bb.3:
725 ; RV64I-NEXT:    sub a1, a3, a1
726 ; RV64I-NEXT:    sub a1, a1, a4
727 ; RV64I-NEXT:    sub a0, a2, a0
728 ; RV64I-NEXT:    j .LBB11_5
729 ; RV64I-NEXT:  .LBB11_4:
730 ; RV64I-NEXT:    sltu a4, a0, a2
731 ; RV64I-NEXT:    sub a1, a1, a3
732 ; RV64I-NEXT:    sub a1, a1, a4
733 ; RV64I-NEXT:    sub a0, a0, a2
734 ; RV64I-NEXT:  .LBB11_5:
735 ; RV64I-NEXT:    snez a2, a0
736 ; RV64I-NEXT:    add a1, a1, a2
737 ; RV64I-NEXT:    neg a1, a1
738 ; RV64I-NEXT:    neg a0, a0
739 ; RV64I-NEXT:    ret
741 ; RV32ZBB-LABEL: abd_ext_i128:
742 ; RV32ZBB:       # %bb.0:
743 ; RV32ZBB-NEXT:    lw a3, 0(a1)
744 ; RV32ZBB-NEXT:    lw a4, 4(a1)
745 ; RV32ZBB-NEXT:    lw a6, 8(a1)
746 ; RV32ZBB-NEXT:    lw t1, 12(a1)
747 ; RV32ZBB-NEXT:    lw t0, 8(a2)
748 ; RV32ZBB-NEXT:    lw t2, 12(a2)
749 ; RV32ZBB-NEXT:    lw a1, 0(a2)
750 ; RV32ZBB-NEXT:    lw a2, 4(a2)
751 ; RV32ZBB-NEXT:    sltu t3, t0, a6
752 ; RV32ZBB-NEXT:    mv t4, t3
753 ; RV32ZBB-NEXT:    beq t1, t2, .LBB11_2
754 ; RV32ZBB-NEXT:  # %bb.1:
755 ; RV32ZBB-NEXT:    slt t4, t2, t1
756 ; RV32ZBB-NEXT:  .LBB11_2:
757 ; RV32ZBB-NEXT:    sltu a5, a1, a3
758 ; RV32ZBB-NEXT:    sltu t6, a2, a4
759 ; RV32ZBB-NEXT:    mv a7, a5
760 ; RV32ZBB-NEXT:    beq a4, a2, .LBB11_4
761 ; RV32ZBB-NEXT:  # %bb.3:
762 ; RV32ZBB-NEXT:    mv a7, t6
763 ; RV32ZBB-NEXT:  .LBB11_4:
764 ; RV32ZBB-NEXT:    addi sp, sp, -16
765 ; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
766 ; RV32ZBB-NEXT:    xor t5, t1, t2
767 ; RV32ZBB-NEXT:    xor s0, a6, t0
768 ; RV32ZBB-NEXT:    or t5, s0, t5
769 ; RV32ZBB-NEXT:    beqz t5, .LBB11_6
770 ; RV32ZBB-NEXT:  # %bb.5:
771 ; RV32ZBB-NEXT:    mv a7, t4
772 ; RV32ZBB-NEXT:  .LBB11_6:
773 ; RV32ZBB-NEXT:    mv t5, a5
774 ; RV32ZBB-NEXT:    beq a2, a4, .LBB11_8
775 ; RV32ZBB-NEXT:  # %bb.7:
776 ; RV32ZBB-NEXT:    mv t5, t6
777 ; RV32ZBB-NEXT:  .LBB11_8:
778 ; RV32ZBB-NEXT:    sltu t4, a3, a1
779 ; RV32ZBB-NEXT:    mv t6, t4
780 ; RV32ZBB-NEXT:    beq a4, a2, .LBB11_10
781 ; RV32ZBB-NEXT:  # %bb.9:
782 ; RV32ZBB-NEXT:    sltu t6, a4, a2
783 ; RV32ZBB-NEXT:  .LBB11_10:
784 ; RV32ZBB-NEXT:    bnez a7, .LBB11_12
785 ; RV32ZBB-NEXT:  # %bb.11:
786 ; RV32ZBB-NEXT:    sub t1, t2, t1
787 ; RV32ZBB-NEXT:    sub a6, t0, a6
788 ; RV32ZBB-NEXT:    sub t0, t1, t3
789 ; RV32ZBB-NEXT:    sltu t1, a6, t5
790 ; RV32ZBB-NEXT:    sub t0, t0, t1
791 ; RV32ZBB-NEXT:    sub a6, a6, t5
792 ; RV32ZBB-NEXT:    j .LBB11_13
793 ; RV32ZBB-NEXT:  .LBB11_12:
794 ; RV32ZBB-NEXT:    sltu t3, a6, t0
795 ; RV32ZBB-NEXT:    sub t1, t1, t2
796 ; RV32ZBB-NEXT:    sub a6, a6, t0
797 ; RV32ZBB-NEXT:    sub t0, t1, t3
798 ; RV32ZBB-NEXT:    sltu t1, a6, t6
799 ; RV32ZBB-NEXT:    sub t0, t0, t1
800 ; RV32ZBB-NEXT:    sub a6, a6, t6
801 ; RV32ZBB-NEXT:  .LBB11_13:
802 ; RV32ZBB-NEXT:    snez t1, a6
803 ; RV32ZBB-NEXT:    add t0, t0, t1
804 ; RV32ZBB-NEXT:    bnez a7, .LBB11_15
805 ; RV32ZBB-NEXT:  # %bb.14:
806 ; RV32ZBB-NEXT:    sub a2, a2, a4
807 ; RV32ZBB-NEXT:    sub a2, a2, a5
808 ; RV32ZBB-NEXT:    sub a1, a1, a3
809 ; RV32ZBB-NEXT:    j .LBB11_16
810 ; RV32ZBB-NEXT:  .LBB11_15:
811 ; RV32ZBB-NEXT:    sub a4, a4, a2
812 ; RV32ZBB-NEXT:    sub a2, a4, t4
813 ; RV32ZBB-NEXT:    sub a1, a3, a1
814 ; RV32ZBB-NEXT:  .LBB11_16:
815 ; RV32ZBB-NEXT:    or a3, a1, a2
816 ; RV32ZBB-NEXT:    neg a4, a6
817 ; RV32ZBB-NEXT:    neg a5, t0
818 ; RV32ZBB-NEXT:    snez a6, a1
819 ; RV32ZBB-NEXT:    neg a1, a1
820 ; RV32ZBB-NEXT:    snez a3, a3
821 ; RV32ZBB-NEXT:    add a2, a2, a6
822 ; RV32ZBB-NEXT:    sltu a6, a4, a3
823 ; RV32ZBB-NEXT:    neg a2, a2
824 ; RV32ZBB-NEXT:    sub a4, a4, a3
825 ; RV32ZBB-NEXT:    sub a3, a5, a6
826 ; RV32ZBB-NEXT:    sw a1, 0(a0)
827 ; RV32ZBB-NEXT:    sw a2, 4(a0)
828 ; RV32ZBB-NEXT:    sw a4, 8(a0)
829 ; RV32ZBB-NEXT:    sw a3, 12(a0)
830 ; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
831 ; RV32ZBB-NEXT:    addi sp, sp, 16
832 ; RV32ZBB-NEXT:    ret
834 ; RV64ZBB-LABEL: abd_ext_i128:
835 ; RV64ZBB:       # %bb.0:
836 ; RV64ZBB-NEXT:    sltu a4, a2, a0
837 ; RV64ZBB-NEXT:    mv a5, a4
838 ; RV64ZBB-NEXT:    beq a1, a3, .LBB11_2
839 ; RV64ZBB-NEXT:  # %bb.1:
840 ; RV64ZBB-NEXT:    slt a5, a3, a1
841 ; RV64ZBB-NEXT:  .LBB11_2:
842 ; RV64ZBB-NEXT:    bnez a5, .LBB11_4
843 ; RV64ZBB-NEXT:  # %bb.3:
844 ; RV64ZBB-NEXT:    sub a1, a3, a1
845 ; RV64ZBB-NEXT:    sub a1, a1, a4
846 ; RV64ZBB-NEXT:    sub a0, a2, a0
847 ; RV64ZBB-NEXT:    j .LBB11_5
848 ; RV64ZBB-NEXT:  .LBB11_4:
849 ; RV64ZBB-NEXT:    sltu a4, a0, a2
850 ; RV64ZBB-NEXT:    sub a1, a1, a3
851 ; RV64ZBB-NEXT:    sub a1, a1, a4
852 ; RV64ZBB-NEXT:    sub a0, a0, a2
853 ; RV64ZBB-NEXT:  .LBB11_5:
854 ; RV64ZBB-NEXT:    snez a2, a0
855 ; RV64ZBB-NEXT:    add a1, a1, a2
856 ; RV64ZBB-NEXT:    neg a1, a1
857 ; RV64ZBB-NEXT:    neg a0, a0
858 ; RV64ZBB-NEXT:    ret
859   %aext = sext i128 %a to i256
860   %bext = sext i128 %b to i256
861   %sub = sub i256 %aext, %bext
862   %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false)
863   %nabs = sub i256 0, %abs
864   %trunc = trunc i256 %nabs to i128
865   ret i128 %trunc
868 define i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {
869 ; RV32I-LABEL: abd_ext_i128_undef:
870 ; RV32I:       # %bb.0:
871 ; RV32I-NEXT:    lw a3, 0(a1)
872 ; RV32I-NEXT:    lw a4, 4(a1)
873 ; RV32I-NEXT:    lw a6, 8(a1)
874 ; RV32I-NEXT:    lw t1, 12(a1)
875 ; RV32I-NEXT:    lw t0, 8(a2)
876 ; RV32I-NEXT:    lw t2, 12(a2)
877 ; RV32I-NEXT:    lw a1, 0(a2)
878 ; RV32I-NEXT:    lw a2, 4(a2)
879 ; RV32I-NEXT:    sltu t3, t0, a6
880 ; RV32I-NEXT:    mv t4, t3
881 ; RV32I-NEXT:    beq t1, t2, .LBB12_2
882 ; RV32I-NEXT:  # %bb.1:
883 ; RV32I-NEXT:    slt t4, t2, t1
884 ; RV32I-NEXT:  .LBB12_2:
885 ; RV32I-NEXT:    sltu a5, a1, a3
886 ; RV32I-NEXT:    sltu t6, a2, a4
887 ; RV32I-NEXT:    mv a7, a5
888 ; RV32I-NEXT:    beq a4, a2, .LBB12_4
889 ; RV32I-NEXT:  # %bb.3:
890 ; RV32I-NEXT:    mv a7, t6
891 ; RV32I-NEXT:  .LBB12_4:
892 ; RV32I-NEXT:    addi sp, sp, -16
893 ; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
894 ; RV32I-NEXT:    xor t5, t1, t2
895 ; RV32I-NEXT:    xor s0, a6, t0
896 ; RV32I-NEXT:    or t5, s0, t5
897 ; RV32I-NEXT:    beqz t5, .LBB12_6
898 ; RV32I-NEXT:  # %bb.5:
899 ; RV32I-NEXT:    mv a7, t4
900 ; RV32I-NEXT:  .LBB12_6:
901 ; RV32I-NEXT:    mv t5, a5
902 ; RV32I-NEXT:    beq a2, a4, .LBB12_8
903 ; RV32I-NEXT:  # %bb.7:
904 ; RV32I-NEXT:    mv t5, t6
905 ; RV32I-NEXT:  .LBB12_8:
906 ; RV32I-NEXT:    sltu t4, a3, a1
907 ; RV32I-NEXT:    mv t6, t4
908 ; RV32I-NEXT:    beq a4, a2, .LBB12_10
909 ; RV32I-NEXT:  # %bb.9:
910 ; RV32I-NEXT:    sltu t6, a4, a2
911 ; RV32I-NEXT:  .LBB12_10:
912 ; RV32I-NEXT:    bnez a7, .LBB12_12
913 ; RV32I-NEXT:  # %bb.11:
914 ; RV32I-NEXT:    sub t1, t2, t1
915 ; RV32I-NEXT:    sub a6, t0, a6
916 ; RV32I-NEXT:    sub t0, t1, t3
917 ; RV32I-NEXT:    sltu t1, a6, t5
918 ; RV32I-NEXT:    sub t0, t0, t1
919 ; RV32I-NEXT:    sub a6, a6, t5
920 ; RV32I-NEXT:    j .LBB12_13
921 ; RV32I-NEXT:  .LBB12_12:
922 ; RV32I-NEXT:    sltu t3, a6, t0
923 ; RV32I-NEXT:    sub t1, t1, t2
924 ; RV32I-NEXT:    sub a6, a6, t0
925 ; RV32I-NEXT:    sub t0, t1, t3
926 ; RV32I-NEXT:    sltu t1, a6, t6
927 ; RV32I-NEXT:    sub t0, t0, t1
928 ; RV32I-NEXT:    sub a6, a6, t6
929 ; RV32I-NEXT:  .LBB12_13:
930 ; RV32I-NEXT:    snez t1, a6
931 ; RV32I-NEXT:    add t0, t0, t1
932 ; RV32I-NEXT:    bnez a7, .LBB12_15
933 ; RV32I-NEXT:  # %bb.14:
934 ; RV32I-NEXT:    sub a2, a2, a4
935 ; RV32I-NEXT:    sub a2, a2, a5
936 ; RV32I-NEXT:    sub a1, a1, a3
937 ; RV32I-NEXT:    j .LBB12_16
938 ; RV32I-NEXT:  .LBB12_15:
939 ; RV32I-NEXT:    sub a4, a4, a2
940 ; RV32I-NEXT:    sub a2, a4, t4
941 ; RV32I-NEXT:    sub a1, a3, a1
942 ; RV32I-NEXT:  .LBB12_16:
943 ; RV32I-NEXT:    or a3, a1, a2
944 ; RV32I-NEXT:    neg a4, a6
945 ; RV32I-NEXT:    neg a5, t0
946 ; RV32I-NEXT:    snez a6, a1
947 ; RV32I-NEXT:    neg a1, a1
948 ; RV32I-NEXT:    snez a3, a3
949 ; RV32I-NEXT:    add a2, a2, a6
950 ; RV32I-NEXT:    sltu a6, a4, a3
951 ; RV32I-NEXT:    neg a2, a2
952 ; RV32I-NEXT:    sub a4, a4, a3
953 ; RV32I-NEXT:    sub a3, a5, a6
954 ; RV32I-NEXT:    sw a1, 0(a0)
955 ; RV32I-NEXT:    sw a2, 4(a0)
956 ; RV32I-NEXT:    sw a4, 8(a0)
957 ; RV32I-NEXT:    sw a3, 12(a0)
958 ; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
959 ; RV32I-NEXT:    addi sp, sp, 16
960 ; RV32I-NEXT:    ret
962 ; RV64I-LABEL: abd_ext_i128_undef:
963 ; RV64I:       # %bb.0:
964 ; RV64I-NEXT:    sltu a4, a2, a0
965 ; RV64I-NEXT:    mv a5, a4
966 ; RV64I-NEXT:    beq a1, a3, .LBB12_2
967 ; RV64I-NEXT:  # %bb.1:
968 ; RV64I-NEXT:    slt a5, a3, a1
969 ; RV64I-NEXT:  .LBB12_2:
970 ; RV64I-NEXT:    bnez a5, .LBB12_4
971 ; RV64I-NEXT:  # %bb.3:
972 ; RV64I-NEXT:    sub a1, a3, a1
973 ; RV64I-NEXT:    sub a1, a1, a4
974 ; RV64I-NEXT:    sub a0, a2, a0
975 ; RV64I-NEXT:    j .LBB12_5
976 ; RV64I-NEXT:  .LBB12_4:
977 ; RV64I-NEXT:    sltu a4, a0, a2
978 ; RV64I-NEXT:    sub a1, a1, a3
979 ; RV64I-NEXT:    sub a1, a1, a4
980 ; RV64I-NEXT:    sub a0, a0, a2
981 ; RV64I-NEXT:  .LBB12_5:
982 ; RV64I-NEXT:    snez a2, a0
983 ; RV64I-NEXT:    add a1, a1, a2
984 ; RV64I-NEXT:    neg a1, a1
985 ; RV64I-NEXT:    neg a0, a0
986 ; RV64I-NEXT:    ret
988 ; RV32ZBB-LABEL: abd_ext_i128_undef:
989 ; RV32ZBB:       # %bb.0:
990 ; RV32ZBB-NEXT:    lw a3, 0(a1)
991 ; RV32ZBB-NEXT:    lw a4, 4(a1)
992 ; RV32ZBB-NEXT:    lw a6, 8(a1)
993 ; RV32ZBB-NEXT:    lw t1, 12(a1)
994 ; RV32ZBB-NEXT:    lw t0, 8(a2)
995 ; RV32ZBB-NEXT:    lw t2, 12(a2)
996 ; RV32ZBB-NEXT:    lw a1, 0(a2)
997 ; RV32ZBB-NEXT:    lw a2, 4(a2)
998 ; RV32ZBB-NEXT:    sltu t3, t0, a6
999 ; RV32ZBB-NEXT:    mv t4, t3
1000 ; RV32ZBB-NEXT:    beq t1, t2, .LBB12_2
1001 ; RV32ZBB-NEXT:  # %bb.1:
1002 ; RV32ZBB-NEXT:    slt t4, t2, t1
1003 ; RV32ZBB-NEXT:  .LBB12_2:
1004 ; RV32ZBB-NEXT:    sltu a5, a1, a3
1005 ; RV32ZBB-NEXT:    sltu t6, a2, a4
1006 ; RV32ZBB-NEXT:    mv a7, a5
1007 ; RV32ZBB-NEXT:    beq a4, a2, .LBB12_4
1008 ; RV32ZBB-NEXT:  # %bb.3:
1009 ; RV32ZBB-NEXT:    mv a7, t6
1010 ; RV32ZBB-NEXT:  .LBB12_4:
1011 ; RV32ZBB-NEXT:    addi sp, sp, -16
1012 ; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
1013 ; RV32ZBB-NEXT:    xor t5, t1, t2
1014 ; RV32ZBB-NEXT:    xor s0, a6, t0
1015 ; RV32ZBB-NEXT:    or t5, s0, t5
1016 ; RV32ZBB-NEXT:    beqz t5, .LBB12_6
1017 ; RV32ZBB-NEXT:  # %bb.5:
1018 ; RV32ZBB-NEXT:    mv a7, t4
1019 ; RV32ZBB-NEXT:  .LBB12_6:
1020 ; RV32ZBB-NEXT:    mv t5, a5
1021 ; RV32ZBB-NEXT:    beq a2, a4, .LBB12_8
1022 ; RV32ZBB-NEXT:  # %bb.7:
1023 ; RV32ZBB-NEXT:    mv t5, t6
1024 ; RV32ZBB-NEXT:  .LBB12_8:
1025 ; RV32ZBB-NEXT:    sltu t4, a3, a1
1026 ; RV32ZBB-NEXT:    mv t6, t4
1027 ; RV32ZBB-NEXT:    beq a4, a2, .LBB12_10
1028 ; RV32ZBB-NEXT:  # %bb.9:
1029 ; RV32ZBB-NEXT:    sltu t6, a4, a2
1030 ; RV32ZBB-NEXT:  .LBB12_10:
1031 ; RV32ZBB-NEXT:    bnez a7, .LBB12_12
1032 ; RV32ZBB-NEXT:  # %bb.11:
1033 ; RV32ZBB-NEXT:    sub t1, t2, t1
1034 ; RV32ZBB-NEXT:    sub a6, t0, a6
1035 ; RV32ZBB-NEXT:    sub t0, t1, t3
1036 ; RV32ZBB-NEXT:    sltu t1, a6, t5
1037 ; RV32ZBB-NEXT:    sub t0, t0, t1
1038 ; RV32ZBB-NEXT:    sub a6, a6, t5
1039 ; RV32ZBB-NEXT:    j .LBB12_13
1040 ; RV32ZBB-NEXT:  .LBB12_12:
1041 ; RV32ZBB-NEXT:    sltu t3, a6, t0
1042 ; RV32ZBB-NEXT:    sub t1, t1, t2
1043 ; RV32ZBB-NEXT:    sub a6, a6, t0
1044 ; RV32ZBB-NEXT:    sub t0, t1, t3
1045 ; RV32ZBB-NEXT:    sltu t1, a6, t6
1046 ; RV32ZBB-NEXT:    sub t0, t0, t1
1047 ; RV32ZBB-NEXT:    sub a6, a6, t6
1048 ; RV32ZBB-NEXT:  .LBB12_13:
1049 ; RV32ZBB-NEXT:    snez t1, a6
1050 ; RV32ZBB-NEXT:    add t0, t0, t1
1051 ; RV32ZBB-NEXT:    bnez a7, .LBB12_15
1052 ; RV32ZBB-NEXT:  # %bb.14:
1053 ; RV32ZBB-NEXT:    sub a2, a2, a4
1054 ; RV32ZBB-NEXT:    sub a2, a2, a5
1055 ; RV32ZBB-NEXT:    sub a1, a1, a3
1056 ; RV32ZBB-NEXT:    j .LBB12_16
1057 ; RV32ZBB-NEXT:  .LBB12_15:
1058 ; RV32ZBB-NEXT:    sub a4, a4, a2
1059 ; RV32ZBB-NEXT:    sub a2, a4, t4
1060 ; RV32ZBB-NEXT:    sub a1, a3, a1
1061 ; RV32ZBB-NEXT:  .LBB12_16:
1062 ; RV32ZBB-NEXT:    or a3, a1, a2
1063 ; RV32ZBB-NEXT:    neg a4, a6
1064 ; RV32ZBB-NEXT:    neg a5, t0
1065 ; RV32ZBB-NEXT:    snez a6, a1
1066 ; RV32ZBB-NEXT:    neg a1, a1
1067 ; RV32ZBB-NEXT:    snez a3, a3
1068 ; RV32ZBB-NEXT:    add a2, a2, a6
1069 ; RV32ZBB-NEXT:    sltu a6, a4, a3
1070 ; RV32ZBB-NEXT:    neg a2, a2
1071 ; RV32ZBB-NEXT:    sub a4, a4, a3
1072 ; RV32ZBB-NEXT:    sub a3, a5, a6
1073 ; RV32ZBB-NEXT:    sw a1, 0(a0)
1074 ; RV32ZBB-NEXT:    sw a2, 4(a0)
1075 ; RV32ZBB-NEXT:    sw a4, 8(a0)
1076 ; RV32ZBB-NEXT:    sw a3, 12(a0)
1077 ; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
1078 ; RV32ZBB-NEXT:    addi sp, sp, 16
1079 ; RV32ZBB-NEXT:    ret
1081 ; RV64ZBB-LABEL: abd_ext_i128_undef:
1082 ; RV64ZBB:       # %bb.0:
1083 ; RV64ZBB-NEXT:    sltu a4, a2, a0
1084 ; RV64ZBB-NEXT:    mv a5, a4
1085 ; RV64ZBB-NEXT:    beq a1, a3, .LBB12_2
1086 ; RV64ZBB-NEXT:  # %bb.1:
1087 ; RV64ZBB-NEXT:    slt a5, a3, a1
1088 ; RV64ZBB-NEXT:  .LBB12_2:
1089 ; RV64ZBB-NEXT:    bnez a5, .LBB12_4
1090 ; RV64ZBB-NEXT:  # %bb.3:
1091 ; RV64ZBB-NEXT:    sub a1, a3, a1
1092 ; RV64ZBB-NEXT:    sub a1, a1, a4
1093 ; RV64ZBB-NEXT:    sub a0, a2, a0
1094 ; RV64ZBB-NEXT:    j .LBB12_5
1095 ; RV64ZBB-NEXT:  .LBB12_4:
1096 ; RV64ZBB-NEXT:    sltu a4, a0, a2
1097 ; RV64ZBB-NEXT:    sub a1, a1, a3
1098 ; RV64ZBB-NEXT:    sub a1, a1, a4
1099 ; RV64ZBB-NEXT:    sub a0, a0, a2
1100 ; RV64ZBB-NEXT:  .LBB12_5:
1101 ; RV64ZBB-NEXT:    snez a2, a0
1102 ; RV64ZBB-NEXT:    add a1, a1, a2
1103 ; RV64ZBB-NEXT:    neg a1, a1
1104 ; RV64ZBB-NEXT:    neg a0, a0
1105 ; RV64ZBB-NEXT:    ret
1106   %aext = sext i128 %a to i256
1107   %bext = sext i128 %b to i256
1108   %sub = sub i256 %aext, %bext
1109   %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true)
1110   %nabs = sub i256 0, %abs
1111   %trunc = trunc i256 %nabs to i128
1112   ret i128 %trunc
1116 ; sub(smin(a,b),smax(a,b)) -> nabds(a,b)
1119 define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
1120 ; RV32I-LABEL: abd_minmax_i8:
1121 ; RV32I:       # %bb.0:
1122 ; RV32I-NEXT:    slli a1, a1, 24
1123 ; RV32I-NEXT:    slli a0, a0, 24
1124 ; RV32I-NEXT:    srai a1, a1, 24
1125 ; RV32I-NEXT:    srai a0, a0, 24
1126 ; RV32I-NEXT:    mv a2, a0
1127 ; RV32I-NEXT:    bge a0, a1, .LBB13_3
1128 ; RV32I-NEXT:  # %bb.1:
1129 ; RV32I-NEXT:    bge a1, a0, .LBB13_4
1130 ; RV32I-NEXT:  .LBB13_2:
1131 ; RV32I-NEXT:    sub a0, a2, a0
1132 ; RV32I-NEXT:    ret
1133 ; RV32I-NEXT:  .LBB13_3:
1134 ; RV32I-NEXT:    mv a2, a1
1135 ; RV32I-NEXT:    blt a1, a0, .LBB13_2
1136 ; RV32I-NEXT:  .LBB13_4:
1137 ; RV32I-NEXT:    sub a0, a2, a1
1138 ; RV32I-NEXT:    ret
1140 ; RV64I-LABEL: abd_minmax_i8:
1141 ; RV64I:       # %bb.0:
1142 ; RV64I-NEXT:    slli a1, a1, 56
1143 ; RV64I-NEXT:    slli a0, a0, 56
1144 ; RV64I-NEXT:    srai a1, a1, 56
1145 ; RV64I-NEXT:    srai a0, a0, 56
1146 ; RV64I-NEXT:    mv a2, a0
1147 ; RV64I-NEXT:    bge a0, a1, .LBB13_3
1148 ; RV64I-NEXT:  # %bb.1:
1149 ; RV64I-NEXT:    bge a1, a0, .LBB13_4
1150 ; RV64I-NEXT:  .LBB13_2:
1151 ; RV64I-NEXT:    sub a0, a2, a0
1152 ; RV64I-NEXT:    ret
1153 ; RV64I-NEXT:  .LBB13_3:
1154 ; RV64I-NEXT:    mv a2, a1
1155 ; RV64I-NEXT:    blt a1, a0, .LBB13_2
1156 ; RV64I-NEXT:  .LBB13_4:
1157 ; RV64I-NEXT:    sub a0, a2, a1
1158 ; RV64I-NEXT:    ret
1160 ; ZBB-LABEL: abd_minmax_i8:
1161 ; ZBB:       # %bb.0:
1162 ; ZBB-NEXT:    sext.b a1, a1
1163 ; ZBB-NEXT:    sext.b a0, a0
1164 ; ZBB-NEXT:    min a2, a0, a1
1165 ; ZBB-NEXT:    max a0, a0, a1
1166 ; ZBB-NEXT:    sub a0, a2, a0
1167 ; ZBB-NEXT:    ret
1168   %min = call i8 @llvm.smin.i8(i8 %a, i8 %b)
1169   %max = call i8 @llvm.smax.i8(i8 %a, i8 %b)
1170   %sub = sub i8 %min, %max
1171   ret i8 %sub
1174 define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
1175 ; RV32I-LABEL: abd_minmax_i16:
1176 ; RV32I:       # %bb.0:
1177 ; RV32I-NEXT:    slli a1, a1, 16
1178 ; RV32I-NEXT:    slli a0, a0, 16
1179 ; RV32I-NEXT:    srai a1, a1, 16
1180 ; RV32I-NEXT:    srai a0, a0, 16
1181 ; RV32I-NEXT:    mv a2, a0
1182 ; RV32I-NEXT:    bge a0, a1, .LBB14_3
1183 ; RV32I-NEXT:  # %bb.1:
1184 ; RV32I-NEXT:    bge a1, a0, .LBB14_4
1185 ; RV32I-NEXT:  .LBB14_2:
1186 ; RV32I-NEXT:    sub a0, a2, a0
1187 ; RV32I-NEXT:    ret
1188 ; RV32I-NEXT:  .LBB14_3:
1189 ; RV32I-NEXT:    mv a2, a1
1190 ; RV32I-NEXT:    blt a1, a0, .LBB14_2
1191 ; RV32I-NEXT:  .LBB14_4:
1192 ; RV32I-NEXT:    sub a0, a2, a1
1193 ; RV32I-NEXT:    ret
1195 ; RV64I-LABEL: abd_minmax_i16:
1196 ; RV64I:       # %bb.0:
1197 ; RV64I-NEXT:    slli a1, a1, 48
1198 ; RV64I-NEXT:    slli a0, a0, 48
1199 ; RV64I-NEXT:    srai a1, a1, 48
1200 ; RV64I-NEXT:    srai a0, a0, 48
1201 ; RV64I-NEXT:    mv a2, a0
1202 ; RV64I-NEXT:    bge a0, a1, .LBB14_3
1203 ; RV64I-NEXT:  # %bb.1:
1204 ; RV64I-NEXT:    bge a1, a0, .LBB14_4
1205 ; RV64I-NEXT:  .LBB14_2:
1206 ; RV64I-NEXT:    sub a0, a2, a0
1207 ; RV64I-NEXT:    ret
1208 ; RV64I-NEXT:  .LBB14_3:
1209 ; RV64I-NEXT:    mv a2, a1
1210 ; RV64I-NEXT:    blt a1, a0, .LBB14_2
1211 ; RV64I-NEXT:  .LBB14_4:
1212 ; RV64I-NEXT:    sub a0, a2, a1
1213 ; RV64I-NEXT:    ret
1215 ; ZBB-LABEL: abd_minmax_i16:
1216 ; ZBB:       # %bb.0:
1217 ; ZBB-NEXT:    sext.h a1, a1
1218 ; ZBB-NEXT:    sext.h a0, a0
1219 ; ZBB-NEXT:    min a2, a0, a1
1220 ; ZBB-NEXT:    max a0, a0, a1
1221 ; ZBB-NEXT:    sub a0, a2, a0
1222 ; ZBB-NEXT:    ret
1223   %min = call i16 @llvm.smin.i16(i16 %a, i16 %b)
1224   %max = call i16 @llvm.smax.i16(i16 %a, i16 %b)
1225   %sub = sub i16 %min, %max
1226   ret i16 %sub
1229 define i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind {
1230 ; RV32I-LABEL: abd_minmax_i32:
1231 ; RV32I:       # %bb.0:
1232 ; RV32I-NEXT:    mv a2, a0
1233 ; RV32I-NEXT:    bge a0, a1, .LBB15_3
1234 ; RV32I-NEXT:  # %bb.1:
1235 ; RV32I-NEXT:    bge a1, a0, .LBB15_4
1236 ; RV32I-NEXT:  .LBB15_2:
1237 ; RV32I-NEXT:    sub a0, a2, a0
1238 ; RV32I-NEXT:    ret
1239 ; RV32I-NEXT:  .LBB15_3:
1240 ; RV32I-NEXT:    mv a2, a1
1241 ; RV32I-NEXT:    blt a1, a0, .LBB15_2
1242 ; RV32I-NEXT:  .LBB15_4:
1243 ; RV32I-NEXT:    sub a0, a2, a1
1244 ; RV32I-NEXT:    ret
1246 ; RV64I-LABEL: abd_minmax_i32:
1247 ; RV64I:       # %bb.0:
1248 ; RV64I-NEXT:    sext.w a1, a1
1249 ; RV64I-NEXT:    sext.w a0, a0
1250 ; RV64I-NEXT:    mv a2, a0
1251 ; RV64I-NEXT:    bge a0, a1, .LBB15_3
1252 ; RV64I-NEXT:  # %bb.1:
1253 ; RV64I-NEXT:    bge a1, a0, .LBB15_4
1254 ; RV64I-NEXT:  .LBB15_2:
1255 ; RV64I-NEXT:    subw a0, a2, a0
1256 ; RV64I-NEXT:    ret
1257 ; RV64I-NEXT:  .LBB15_3:
1258 ; RV64I-NEXT:    mv a2, a1
1259 ; RV64I-NEXT:    blt a1, a0, .LBB15_2
1260 ; RV64I-NEXT:  .LBB15_4:
1261 ; RV64I-NEXT:    subw a0, a2, a1
1262 ; RV64I-NEXT:    ret
1264 ; RV32ZBB-LABEL: abd_minmax_i32:
1265 ; RV32ZBB:       # %bb.0:
1266 ; RV32ZBB-NEXT:    min a2, a0, a1
1267 ; RV32ZBB-NEXT:    max a0, a0, a1
1268 ; RV32ZBB-NEXT:    sub a0, a2, a0
1269 ; RV32ZBB-NEXT:    ret
1271 ; RV64ZBB-LABEL: abd_minmax_i32:
1272 ; RV64ZBB:       # %bb.0:
1273 ; RV64ZBB-NEXT:    sext.w a1, a1
1274 ; RV64ZBB-NEXT:    sext.w a0, a0
1275 ; RV64ZBB-NEXT:    min a2, a0, a1
1276 ; RV64ZBB-NEXT:    max a0, a0, a1
1277 ; RV64ZBB-NEXT:    subw a0, a2, a0
1278 ; RV64ZBB-NEXT:    ret
1279   %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
1280   %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
1281   %sub = sub i32 %min, %max
1282   ret i32 %sub
1285 define i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind {
1286 ; RV32I-LABEL: abd_minmax_i64:
1287 ; RV32I:       # %bb.0:
1288 ; RV32I-NEXT:    beq a1, a3, .LBB16_2
1289 ; RV32I-NEXT:  # %bb.1:
1290 ; RV32I-NEXT:    slt a6, a1, a3
1291 ; RV32I-NEXT:    j .LBB16_3
1292 ; RV32I-NEXT:  .LBB16_2:
1293 ; RV32I-NEXT:    sltu a6, a0, a2
1294 ; RV32I-NEXT:  .LBB16_3:
1295 ; RV32I-NEXT:    mv a4, a1
1296 ; RV32I-NEXT:    mv a5, a0
1297 ; RV32I-NEXT:    bnez a6, .LBB16_5
1298 ; RV32I-NEXT:  # %bb.4:
1299 ; RV32I-NEXT:    mv a4, a3
1300 ; RV32I-NEXT:    mv a5, a2
1301 ; RV32I-NEXT:  .LBB16_5:
1302 ; RV32I-NEXT:    beq a1, a3, .LBB16_7
1303 ; RV32I-NEXT:  # %bb.6:
1304 ; RV32I-NEXT:    slt a6, a3, a1
1305 ; RV32I-NEXT:    beqz a6, .LBB16_8
1306 ; RV32I-NEXT:    j .LBB16_9
1307 ; RV32I-NEXT:  .LBB16_7:
1308 ; RV32I-NEXT:    sltu a6, a2, a0
1309 ; RV32I-NEXT:    bnez a6, .LBB16_9
1310 ; RV32I-NEXT:  .LBB16_8:
1311 ; RV32I-NEXT:    mv a1, a3
1312 ; RV32I-NEXT:    mv a0, a2
1313 ; RV32I-NEXT:  .LBB16_9:
1314 ; RV32I-NEXT:    sltu a2, a5, a0
1315 ; RV32I-NEXT:    sub a1, a4, a1
1316 ; RV32I-NEXT:    sub a1, a1, a2
1317 ; RV32I-NEXT:    sub a0, a5, a0
1318 ; RV32I-NEXT:    ret
1320 ; RV64I-LABEL: abd_minmax_i64:
1321 ; RV64I:       # %bb.0:
1322 ; RV64I-NEXT:    mv a2, a0
1323 ; RV64I-NEXT:    bge a0, a1, .LBB16_3
1324 ; RV64I-NEXT:  # %bb.1:
1325 ; RV64I-NEXT:    bge a1, a0, .LBB16_4
1326 ; RV64I-NEXT:  .LBB16_2:
1327 ; RV64I-NEXT:    sub a0, a2, a0
1328 ; RV64I-NEXT:    ret
1329 ; RV64I-NEXT:  .LBB16_3:
1330 ; RV64I-NEXT:    mv a2, a1
1331 ; RV64I-NEXT:    blt a1, a0, .LBB16_2
1332 ; RV64I-NEXT:  .LBB16_4:
1333 ; RV64I-NEXT:    sub a0, a2, a1
1334 ; RV64I-NEXT:    ret
1336 ; RV32ZBB-LABEL: abd_minmax_i64:
1337 ; RV32ZBB:       # %bb.0:
1338 ; RV32ZBB-NEXT:    beq a1, a3, .LBB16_2
1339 ; RV32ZBB-NEXT:  # %bb.1:
1340 ; RV32ZBB-NEXT:    slt a6, a1, a3
1341 ; RV32ZBB-NEXT:    j .LBB16_3
1342 ; RV32ZBB-NEXT:  .LBB16_2:
1343 ; RV32ZBB-NEXT:    sltu a6, a0, a2
1344 ; RV32ZBB-NEXT:  .LBB16_3:
1345 ; RV32ZBB-NEXT:    mv a4, a1
1346 ; RV32ZBB-NEXT:    mv a5, a0
1347 ; RV32ZBB-NEXT:    bnez a6, .LBB16_5
1348 ; RV32ZBB-NEXT:  # %bb.4:
1349 ; RV32ZBB-NEXT:    mv a4, a3
1350 ; RV32ZBB-NEXT:    mv a5, a2
1351 ; RV32ZBB-NEXT:  .LBB16_5:
1352 ; RV32ZBB-NEXT:    beq a1, a3, .LBB16_7
1353 ; RV32ZBB-NEXT:  # %bb.6:
1354 ; RV32ZBB-NEXT:    slt a6, a3, a1
1355 ; RV32ZBB-NEXT:    beqz a6, .LBB16_8
1356 ; RV32ZBB-NEXT:    j .LBB16_9
1357 ; RV32ZBB-NEXT:  .LBB16_7:
1358 ; RV32ZBB-NEXT:    sltu a6, a2, a0
1359 ; RV32ZBB-NEXT:    bnez a6, .LBB16_9
1360 ; RV32ZBB-NEXT:  .LBB16_8:
1361 ; RV32ZBB-NEXT:    mv a1, a3
1362 ; RV32ZBB-NEXT:    mv a0, a2
1363 ; RV32ZBB-NEXT:  .LBB16_9:
1364 ; RV32ZBB-NEXT:    sltu a2, a5, a0
1365 ; RV32ZBB-NEXT:    sub a1, a4, a1
1366 ; RV32ZBB-NEXT:    sub a1, a1, a2
1367 ; RV32ZBB-NEXT:    sub a0, a5, a0
1368 ; RV32ZBB-NEXT:    ret
1370 ; RV64ZBB-LABEL: abd_minmax_i64:
1371 ; RV64ZBB:       # %bb.0:
1372 ; RV64ZBB-NEXT:    min a2, a0, a1
1373 ; RV64ZBB-NEXT:    max a0, a0, a1
1374 ; RV64ZBB-NEXT:    sub a0, a2, a0
1375 ; RV64ZBB-NEXT:    ret
1376   %min = call i64 @llvm.smin.i64(i64 %a, i64 %b)
1377   %max = call i64 @llvm.smax.i64(i64 %a, i64 %b)
1378   %sub = sub i64 %min, %max
1379   ret i64 %sub
1382 define i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind {
1383 ; RV32I-LABEL: abd_minmax_i128:
1384 ; RV32I:       # %bb.0:
1385 ; RV32I-NEXT:    lw a6, 4(a2)
1386 ; RV32I-NEXT:    lw a7, 8(a2)
1387 ; RV32I-NEXT:    lw t0, 12(a2)
1388 ; RV32I-NEXT:    lw a5, 12(a1)
1389 ; RV32I-NEXT:    lw a3, 4(a1)
1390 ; RV32I-NEXT:    lw a4, 8(a1)
1391 ; RV32I-NEXT:    beq a5, t0, .LBB17_2
1392 ; RV32I-NEXT:  # %bb.1:
1393 ; RV32I-NEXT:    slt t1, a5, t0
1394 ; RV32I-NEXT:    j .LBB17_3
1395 ; RV32I-NEXT:  .LBB17_2:
1396 ; RV32I-NEXT:    sltu t1, a4, a7
1397 ; RV32I-NEXT:  .LBB17_3:
1398 ; RV32I-NEXT:    lw t2, 0(a2)
1399 ; RV32I-NEXT:    lw a1, 0(a1)
1400 ; RV32I-NEXT:    beq a3, a6, .LBB17_5
1401 ; RV32I-NEXT:  # %bb.4:
1402 ; RV32I-NEXT:    sltu t6, a3, a6
1403 ; RV32I-NEXT:    j .LBB17_6
1404 ; RV32I-NEXT:  .LBB17_5:
1405 ; RV32I-NEXT:    sltu t6, a1, t2
1406 ; RV32I-NEXT:  .LBB17_6:
1407 ; RV32I-NEXT:    xor a2, a5, t0
1408 ; RV32I-NEXT:    xor t3, a4, a7
1409 ; RV32I-NEXT:    or t5, t3, a2
1410 ; RV32I-NEXT:    beqz t5, .LBB17_8
1411 ; RV32I-NEXT:  # %bb.7:
1412 ; RV32I-NEXT:    mv t6, t1
1413 ; RV32I-NEXT:  .LBB17_8:
1414 ; RV32I-NEXT:    mv a2, a1
1415 ; RV32I-NEXT:    mv t1, a3
1416 ; RV32I-NEXT:    mv t4, a5
1417 ; RV32I-NEXT:    mv t3, a4
1418 ; RV32I-NEXT:    bnez t6, .LBB17_10
1419 ; RV32I-NEXT:  # %bb.9:
1420 ; RV32I-NEXT:    mv a2, t2
1421 ; RV32I-NEXT:    mv t1, a6
1422 ; RV32I-NEXT:    mv t4, t0
1423 ; RV32I-NEXT:    mv t3, a7
1424 ; RV32I-NEXT:  .LBB17_10:
1425 ; RV32I-NEXT:    beq a5, t0, .LBB17_12
1426 ; RV32I-NEXT:  # %bb.11:
1427 ; RV32I-NEXT:    slt t6, t0, a5
1428 ; RV32I-NEXT:    j .LBB17_13
1429 ; RV32I-NEXT:  .LBB17_12:
1430 ; RV32I-NEXT:    sltu t6, a7, a4
1431 ; RV32I-NEXT:  .LBB17_13:
1432 ; RV32I-NEXT:    addi sp, sp, -16
1433 ; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
1434 ; RV32I-NEXT:    beq a3, a6, .LBB17_15
1435 ; RV32I-NEXT:  # %bb.14:
1436 ; RV32I-NEXT:    sltu s0, a6, a3
1437 ; RV32I-NEXT:    bnez t5, .LBB17_16
1438 ; RV32I-NEXT:    j .LBB17_17
1439 ; RV32I-NEXT:  .LBB17_15:
1440 ; RV32I-NEXT:    sltu s0, t2, a1
1441 ; RV32I-NEXT:    beqz t5, .LBB17_17
1442 ; RV32I-NEXT:  .LBB17_16:
1443 ; RV32I-NEXT:    mv s0, t6
1444 ; RV32I-NEXT:  .LBB17_17:
1445 ; RV32I-NEXT:    bnez s0, .LBB17_19
1446 ; RV32I-NEXT:  # %bb.18:
1447 ; RV32I-NEXT:    mv a1, t2
1448 ; RV32I-NEXT:    mv a3, a6
1449 ; RV32I-NEXT:    mv a5, t0
1450 ; RV32I-NEXT:    mv a4, a7
1451 ; RV32I-NEXT:  .LBB17_19:
1452 ; RV32I-NEXT:    sltu a7, t3, a4
1453 ; RV32I-NEXT:    sub a5, t4, a5
1454 ; RV32I-NEXT:    sltu a6, a2, a1
1455 ; RV32I-NEXT:    sub a5, a5, a7
1456 ; RV32I-NEXT:    mv a7, a6
1457 ; RV32I-NEXT:    beq t1, a3, .LBB17_21
1458 ; RV32I-NEXT:  # %bb.20:
1459 ; RV32I-NEXT:    sltu a7, t1, a3
1460 ; RV32I-NEXT:  .LBB17_21:
1461 ; RV32I-NEXT:    sub a4, t3, a4
1462 ; RV32I-NEXT:    sub a3, t1, a3
1463 ; RV32I-NEXT:    sub a2, a2, a1
1464 ; RV32I-NEXT:    sltu a1, a4, a7
1465 ; RV32I-NEXT:    sub a4, a4, a7
1466 ; RV32I-NEXT:    sub a3, a3, a6
1467 ; RV32I-NEXT:    sub a5, a5, a1
1468 ; RV32I-NEXT:    sw a2, 0(a0)
1469 ; RV32I-NEXT:    sw a3, 4(a0)
1470 ; RV32I-NEXT:    sw a4, 8(a0)
1471 ; RV32I-NEXT:    sw a5, 12(a0)
1472 ; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
1473 ; RV32I-NEXT:    addi sp, sp, 16
1474 ; RV32I-NEXT:    ret
1476 ; RV64I-LABEL: abd_minmax_i128:
1477 ; RV64I:       # %bb.0:
1478 ; RV64I-NEXT:    beq a1, a3, .LBB17_2
1479 ; RV64I-NEXT:  # %bb.1:
1480 ; RV64I-NEXT:    slt a6, a1, a3
1481 ; RV64I-NEXT:    j .LBB17_3
1482 ; RV64I-NEXT:  .LBB17_2:
1483 ; RV64I-NEXT:    sltu a6, a0, a2
1484 ; RV64I-NEXT:  .LBB17_3:
1485 ; RV64I-NEXT:    mv a4, a1
1486 ; RV64I-NEXT:    mv a5, a0
1487 ; RV64I-NEXT:    bnez a6, .LBB17_5
1488 ; RV64I-NEXT:  # %bb.4:
1489 ; RV64I-NEXT:    mv a4, a3
1490 ; RV64I-NEXT:    mv a5, a2
1491 ; RV64I-NEXT:  .LBB17_5:
1492 ; RV64I-NEXT:    beq a1, a3, .LBB17_7
1493 ; RV64I-NEXT:  # %bb.6:
1494 ; RV64I-NEXT:    slt a6, a3, a1
1495 ; RV64I-NEXT:    beqz a6, .LBB17_8
1496 ; RV64I-NEXT:    j .LBB17_9
1497 ; RV64I-NEXT:  .LBB17_7:
1498 ; RV64I-NEXT:    sltu a6, a2, a0
1499 ; RV64I-NEXT:    bnez a6, .LBB17_9
1500 ; RV64I-NEXT:  .LBB17_8:
1501 ; RV64I-NEXT:    mv a1, a3
1502 ; RV64I-NEXT:    mv a0, a2
1503 ; RV64I-NEXT:  .LBB17_9:
1504 ; RV64I-NEXT:    sltu a2, a5, a0
1505 ; RV64I-NEXT:    sub a1, a4, a1
1506 ; RV64I-NEXT:    sub a1, a1, a2
1507 ; RV64I-NEXT:    sub a0, a5, a0
1508 ; RV64I-NEXT:    ret
1510 ; RV32ZBB-LABEL: abd_minmax_i128:
1511 ; RV32ZBB:       # %bb.0:
1512 ; RV32ZBB-NEXT:    lw a6, 4(a2)
1513 ; RV32ZBB-NEXT:    lw a7, 8(a2)
1514 ; RV32ZBB-NEXT:    lw t0, 12(a2)
1515 ; RV32ZBB-NEXT:    lw a5, 12(a1)
1516 ; RV32ZBB-NEXT:    lw a3, 4(a1)
1517 ; RV32ZBB-NEXT:    lw a4, 8(a1)
1518 ; RV32ZBB-NEXT:    beq a5, t0, .LBB17_2
1519 ; RV32ZBB-NEXT:  # %bb.1:
1520 ; RV32ZBB-NEXT:    slt t1, a5, t0
1521 ; RV32ZBB-NEXT:    j .LBB17_3
1522 ; RV32ZBB-NEXT:  .LBB17_2:
1523 ; RV32ZBB-NEXT:    sltu t1, a4, a7
1524 ; RV32ZBB-NEXT:  .LBB17_3:
1525 ; RV32ZBB-NEXT:    lw t2, 0(a2)
1526 ; RV32ZBB-NEXT:    lw a1, 0(a1)
1527 ; RV32ZBB-NEXT:    beq a3, a6, .LBB17_5
1528 ; RV32ZBB-NEXT:  # %bb.4:
1529 ; RV32ZBB-NEXT:    sltu t6, a3, a6
1530 ; RV32ZBB-NEXT:    j .LBB17_6
1531 ; RV32ZBB-NEXT:  .LBB17_5:
1532 ; RV32ZBB-NEXT:    sltu t6, a1, t2
1533 ; RV32ZBB-NEXT:  .LBB17_6:
1534 ; RV32ZBB-NEXT:    xor a2, a5, t0
1535 ; RV32ZBB-NEXT:    xor t3, a4, a7
1536 ; RV32ZBB-NEXT:    or t5, t3, a2
1537 ; RV32ZBB-NEXT:    beqz t5, .LBB17_8
1538 ; RV32ZBB-NEXT:  # %bb.7:
1539 ; RV32ZBB-NEXT:    mv t6, t1
1540 ; RV32ZBB-NEXT:  .LBB17_8:
1541 ; RV32ZBB-NEXT:    mv a2, a1
1542 ; RV32ZBB-NEXT:    mv t1, a3
1543 ; RV32ZBB-NEXT:    mv t4, a5
1544 ; RV32ZBB-NEXT:    mv t3, a4
1545 ; RV32ZBB-NEXT:    bnez t6, .LBB17_10
1546 ; RV32ZBB-NEXT:  # %bb.9:
1547 ; RV32ZBB-NEXT:    mv a2, t2
1548 ; RV32ZBB-NEXT:    mv t1, a6
1549 ; RV32ZBB-NEXT:    mv t4, t0
1550 ; RV32ZBB-NEXT:    mv t3, a7
1551 ; RV32ZBB-NEXT:  .LBB17_10:
1552 ; RV32ZBB-NEXT:    beq a5, t0, .LBB17_12
1553 ; RV32ZBB-NEXT:  # %bb.11:
1554 ; RV32ZBB-NEXT:    slt t6, t0, a5
1555 ; RV32ZBB-NEXT:    j .LBB17_13
1556 ; RV32ZBB-NEXT:  .LBB17_12:
1557 ; RV32ZBB-NEXT:    sltu t6, a7, a4
1558 ; RV32ZBB-NEXT:  .LBB17_13:
1559 ; RV32ZBB-NEXT:    addi sp, sp, -16
1560 ; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
1561 ; RV32ZBB-NEXT:    beq a3, a6, .LBB17_15
1562 ; RV32ZBB-NEXT:  # %bb.14:
1563 ; RV32ZBB-NEXT:    sltu s0, a6, a3
1564 ; RV32ZBB-NEXT:    bnez t5, .LBB17_16
1565 ; RV32ZBB-NEXT:    j .LBB17_17
1566 ; RV32ZBB-NEXT:  .LBB17_15:
1567 ; RV32ZBB-NEXT:    sltu s0, t2, a1
1568 ; RV32ZBB-NEXT:    beqz t5, .LBB17_17
1569 ; RV32ZBB-NEXT:  .LBB17_16:
1570 ; RV32ZBB-NEXT:    mv s0, t6
1571 ; RV32ZBB-NEXT:  .LBB17_17:
1572 ; RV32ZBB-NEXT:    bnez s0, .LBB17_19
1573 ; RV32ZBB-NEXT:  # %bb.18:
1574 ; RV32ZBB-NEXT:    mv a1, t2
1575 ; RV32ZBB-NEXT:    mv a3, a6
1576 ; RV32ZBB-NEXT:    mv a5, t0
1577 ; RV32ZBB-NEXT:    mv a4, a7
1578 ; RV32ZBB-NEXT:  .LBB17_19:
1579 ; RV32ZBB-NEXT:    sltu a7, t3, a4
1580 ; RV32ZBB-NEXT:    sub a5, t4, a5
1581 ; RV32ZBB-NEXT:    sltu a6, a2, a1
1582 ; RV32ZBB-NEXT:    sub a5, a5, a7
1583 ; RV32ZBB-NEXT:    mv a7, a6
1584 ; RV32ZBB-NEXT:    beq t1, a3, .LBB17_21
1585 ; RV32ZBB-NEXT:  # %bb.20:
1586 ; RV32ZBB-NEXT:    sltu a7, t1, a3
1587 ; RV32ZBB-NEXT:  .LBB17_21:
1588 ; RV32ZBB-NEXT:    sub a4, t3, a4
1589 ; RV32ZBB-NEXT:    sub a3, t1, a3
1590 ; RV32ZBB-NEXT:    sub a2, a2, a1
1591 ; RV32ZBB-NEXT:    sltu a1, a4, a7
1592 ; RV32ZBB-NEXT:    sub a4, a4, a7
1593 ; RV32ZBB-NEXT:    sub a3, a3, a6
1594 ; RV32ZBB-NEXT:    sub a5, a5, a1
1595 ; RV32ZBB-NEXT:    sw a2, 0(a0)
1596 ; RV32ZBB-NEXT:    sw a3, 4(a0)
1597 ; RV32ZBB-NEXT:    sw a4, 8(a0)
1598 ; RV32ZBB-NEXT:    sw a5, 12(a0)
1599 ; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
1600 ; RV32ZBB-NEXT:    addi sp, sp, 16
1601 ; RV32ZBB-NEXT:    ret
1603 ; RV64ZBB-LABEL: abd_minmax_i128:
1604 ; RV64ZBB:       # %bb.0:
1605 ; RV64ZBB-NEXT:    beq a1, a3, .LBB17_2
1606 ; RV64ZBB-NEXT:  # %bb.1:
1607 ; RV64ZBB-NEXT:    slt a6, a1, a3
1608 ; RV64ZBB-NEXT:    j .LBB17_3
1609 ; RV64ZBB-NEXT:  .LBB17_2:
1610 ; RV64ZBB-NEXT:    sltu a6, a0, a2
1611 ; RV64ZBB-NEXT:  .LBB17_3:
1612 ; RV64ZBB-NEXT:    mv a4, a1
1613 ; RV64ZBB-NEXT:    mv a5, a0
1614 ; RV64ZBB-NEXT:    bnez a6, .LBB17_5
1615 ; RV64ZBB-NEXT:  # %bb.4:
1616 ; RV64ZBB-NEXT:    mv a4, a3
1617 ; RV64ZBB-NEXT:    mv a5, a2
1618 ; RV64ZBB-NEXT:  .LBB17_5:
1619 ; RV64ZBB-NEXT:    beq a1, a3, .LBB17_7
1620 ; RV64ZBB-NEXT:  # %bb.6:
1621 ; RV64ZBB-NEXT:    slt a6, a3, a1
1622 ; RV64ZBB-NEXT:    beqz a6, .LBB17_8
1623 ; RV64ZBB-NEXT:    j .LBB17_9
1624 ; RV64ZBB-NEXT:  .LBB17_7:
1625 ; RV64ZBB-NEXT:    sltu a6, a2, a0
1626 ; RV64ZBB-NEXT:    bnez a6, .LBB17_9
1627 ; RV64ZBB-NEXT:  .LBB17_8:
1628 ; RV64ZBB-NEXT:    mv a1, a3
1629 ; RV64ZBB-NEXT:    mv a0, a2
1630 ; RV64ZBB-NEXT:  .LBB17_9:
1631 ; RV64ZBB-NEXT:    sltu a2, a5, a0
1632 ; RV64ZBB-NEXT:    sub a1, a4, a1
1633 ; RV64ZBB-NEXT:    sub a1, a1, a2
1634 ; RV64ZBB-NEXT:    sub a0, a5, a0
1635 ; RV64ZBB-NEXT:    ret
1636   %min = call i128 @llvm.smin.i128(i128 %a, i128 %b)
1637   %max = call i128 @llvm.smax.i128(i128 %a, i128 %b)
1638   %sub = sub i128 %min, %max
1639   ret i128 %sub
1643 ; select(icmp(a,b),sub(a,b),sub(b,a)) -> nabds(a,b)
1646 define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
1647 ; RV32I-LABEL: abd_cmp_i8:
1648 ; RV32I:       # %bb.0:
1649 ; RV32I-NEXT:    slli a2, a0, 24
1650 ; RV32I-NEXT:    slli a3, a1, 24
1651 ; RV32I-NEXT:    srai a2, a2, 24
1652 ; RV32I-NEXT:    srai a3, a3, 24
1653 ; RV32I-NEXT:    bge a3, a2, .LBB18_2
1654 ; RV32I-NEXT:  # %bb.1:
1655 ; RV32I-NEXT:    sub a0, a1, a0
1656 ; RV32I-NEXT:    ret
1657 ; RV32I-NEXT:  .LBB18_2:
1658 ; RV32I-NEXT:    sub a0, a0, a1
1659 ; RV32I-NEXT:    ret
1661 ; RV64I-LABEL: abd_cmp_i8:
1662 ; RV64I:       # %bb.0:
1663 ; RV64I-NEXT:    slli a2, a0, 56
1664 ; RV64I-NEXT:    slli a3, a1, 56
1665 ; RV64I-NEXT:    srai a2, a2, 56
1666 ; RV64I-NEXT:    srai a3, a3, 56
1667 ; RV64I-NEXT:    bge a3, a2, .LBB18_2
1668 ; RV64I-NEXT:  # %bb.1:
1669 ; RV64I-NEXT:    sub a0, a1, a0
1670 ; RV64I-NEXT:    ret
1671 ; RV64I-NEXT:  .LBB18_2:
1672 ; RV64I-NEXT:    sub a0, a0, a1
1673 ; RV64I-NEXT:    ret
1675 ; ZBB-LABEL: abd_cmp_i8:
1676 ; ZBB:       # %bb.0:
1677 ; ZBB-NEXT:    sext.b a2, a0
1678 ; ZBB-NEXT:    sext.b a3, a1
1679 ; ZBB-NEXT:    bge a3, a2, .LBB18_2
1680 ; ZBB-NEXT:  # %bb.1:
1681 ; ZBB-NEXT:    sub a0, a1, a0
1682 ; ZBB-NEXT:    ret
1683 ; ZBB-NEXT:  .LBB18_2:
1684 ; ZBB-NEXT:    sub a0, a0, a1
1685 ; ZBB-NEXT:    ret
1686   %cmp = icmp sle i8 %a, %b
1687   %ab = sub i8 %a, %b
1688   %ba = sub i8 %b, %a
1689   %sel = select i1 %cmp, i8 %ab, i8 %ba
1690   ret i8 %sel
1693 define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
1694 ; RV32I-LABEL: abd_cmp_i16:
1695 ; RV32I:       # %bb.0:
1696 ; RV32I-NEXT:    slli a2, a1, 16
1697 ; RV32I-NEXT:    slli a3, a0, 16
1698 ; RV32I-NEXT:    srai a2, a2, 16
1699 ; RV32I-NEXT:    srai a3, a3, 16
1700 ; RV32I-NEXT:    blt a3, a2, .LBB19_2
1701 ; RV32I-NEXT:  # %bb.1:
1702 ; RV32I-NEXT:    sub a0, a1, a0
1703 ; RV32I-NEXT:    ret
1704 ; RV32I-NEXT:  .LBB19_2:
1705 ; RV32I-NEXT:    sub a0, a0, a1
1706 ; RV32I-NEXT:    ret
1708 ; RV64I-LABEL: abd_cmp_i16:
1709 ; RV64I:       # %bb.0:
1710 ; RV64I-NEXT:    slli a2, a1, 48
1711 ; RV64I-NEXT:    slli a3, a0, 48
1712 ; RV64I-NEXT:    srai a2, a2, 48
1713 ; RV64I-NEXT:    srai a3, a3, 48
1714 ; RV64I-NEXT:    blt a3, a2, .LBB19_2
1715 ; RV64I-NEXT:  # %bb.1:
1716 ; RV64I-NEXT:    sub a0, a1, a0
1717 ; RV64I-NEXT:    ret
1718 ; RV64I-NEXT:  .LBB19_2:
1719 ; RV64I-NEXT:    sub a0, a0, a1
1720 ; RV64I-NEXT:    ret
1722 ; ZBB-LABEL: abd_cmp_i16:
1723 ; ZBB:       # %bb.0:
1724 ; ZBB-NEXT:    sext.h a2, a1
1725 ; ZBB-NEXT:    sext.h a3, a0
1726 ; ZBB-NEXT:    blt a3, a2, .LBB19_2
1727 ; ZBB-NEXT:  # %bb.1:
1728 ; ZBB-NEXT:    sub a0, a1, a0
1729 ; ZBB-NEXT:    ret
1730 ; ZBB-NEXT:  .LBB19_2:
1731 ; ZBB-NEXT:    sub a0, a0, a1
1732 ; ZBB-NEXT:    ret
1733   %cmp = icmp slt i16 %a, %b
1734   %ab = sub i16 %a, %b
1735   %ba = sub i16 %b, %a
1736   %sel = select i1 %cmp, i16 %ab, i16 %ba
1737   ret i16 %sel
1740 define i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind {
1741 ; RV32I-LABEL: abd_cmp_i32:
1742 ; RV32I:       # %bb.0:
1743 ; RV32I-NEXT:    bge a0, a1, .LBB20_2
1744 ; RV32I-NEXT:  # %bb.1:
1745 ; RV32I-NEXT:    sub a0, a0, a1
1746 ; RV32I-NEXT:    ret
1747 ; RV32I-NEXT:  .LBB20_2:
1748 ; RV32I-NEXT:    sub a0, a1, a0
1749 ; RV32I-NEXT:    ret
1751 ; RV64I-LABEL: abd_cmp_i32:
1752 ; RV64I:       # %bb.0:
1753 ; RV64I-NEXT:    sext.w a2, a1
1754 ; RV64I-NEXT:    sext.w a3, a0
1755 ; RV64I-NEXT:    bge a3, a2, .LBB20_2
1756 ; RV64I-NEXT:  # %bb.1:
1757 ; RV64I-NEXT:    subw a0, a0, a1
1758 ; RV64I-NEXT:    ret
1759 ; RV64I-NEXT:  .LBB20_2:
1760 ; RV64I-NEXT:    subw a0, a1, a0
1761 ; RV64I-NEXT:    ret
1763 ; RV32ZBB-LABEL: abd_cmp_i32:
1764 ; RV32ZBB:       # %bb.0:
1765 ; RV32ZBB-NEXT:    bge a0, a1, .LBB20_2
1766 ; RV32ZBB-NEXT:  # %bb.1:
1767 ; RV32ZBB-NEXT:    sub a0, a0, a1
1768 ; RV32ZBB-NEXT:    ret
1769 ; RV32ZBB-NEXT:  .LBB20_2:
1770 ; RV32ZBB-NEXT:    sub a0, a1, a0
1771 ; RV32ZBB-NEXT:    ret
1773 ; RV64ZBB-LABEL: abd_cmp_i32:
1774 ; RV64ZBB:       # %bb.0:
1775 ; RV64ZBB-NEXT:    sext.w a2, a1
1776 ; RV64ZBB-NEXT:    sext.w a3, a0
1777 ; RV64ZBB-NEXT:    bge a3, a2, .LBB20_2
1778 ; RV64ZBB-NEXT:  # %bb.1:
1779 ; RV64ZBB-NEXT:    subw a0, a0, a1
1780 ; RV64ZBB-NEXT:    ret
1781 ; RV64ZBB-NEXT:  .LBB20_2:
1782 ; RV64ZBB-NEXT:    subw a0, a1, a0
1783 ; RV64ZBB-NEXT:    ret
1784   %cmp = icmp sge i32 %a, %b
1785   %ab = sub i32 %a, %b
1786   %ba = sub i32 %b, %a
1787   %sel = select i1 %cmp, i32 %ba, i32 %ab
1788   ret i32 %sel
1791 define i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {
1792 ; RV32I-LABEL: abd_cmp_i64:
1793 ; RV32I:       # %bb.0:
1794 ; RV32I-NEXT:    sltu a4, a0, a2
1795 ; RV32I-NEXT:    mv a5, a4
1796 ; RV32I-NEXT:    beq a1, a3, .LBB21_2
1797 ; RV32I-NEXT:  # %bb.1:
1798 ; RV32I-NEXT:    slt a5, a1, a3
1799 ; RV32I-NEXT:  .LBB21_2:
1800 ; RV32I-NEXT:    bnez a5, .LBB21_4
1801 ; RV32I-NEXT:  # %bb.3:
1802 ; RV32I-NEXT:    sltu a4, a2, a0
1803 ; RV32I-NEXT:    sub a1, a3, a1
1804 ; RV32I-NEXT:    sub a1, a1, a4
1805 ; RV32I-NEXT:    sub a0, a2, a0
1806 ; RV32I-NEXT:    ret
1807 ; RV32I-NEXT:  .LBB21_4:
1808 ; RV32I-NEXT:    sub a1, a1, a3
1809 ; RV32I-NEXT:    sub a1, a1, a4
1810 ; RV32I-NEXT:    sub a0, a0, a2
1811 ; RV32I-NEXT:    ret
1813 ; RV64I-LABEL: abd_cmp_i64:
1814 ; RV64I:       # %bb.0:
1815 ; RV64I-NEXT:    blt a0, a1, .LBB21_2
1816 ; RV64I-NEXT:  # %bb.1:
1817 ; RV64I-NEXT:    sub a0, a1, a0
1818 ; RV64I-NEXT:    ret
1819 ; RV64I-NEXT:  .LBB21_2:
1820 ; RV64I-NEXT:    sub a0, a0, a1
1821 ; RV64I-NEXT:    ret
1823 ; RV32ZBB-LABEL: abd_cmp_i64:
1824 ; RV32ZBB:       # %bb.0:
1825 ; RV32ZBB-NEXT:    sltu a4, a0, a2
1826 ; RV32ZBB-NEXT:    mv a5, a4
1827 ; RV32ZBB-NEXT:    beq a1, a3, .LBB21_2
1828 ; RV32ZBB-NEXT:  # %bb.1:
1829 ; RV32ZBB-NEXT:    slt a5, a1, a3
1830 ; RV32ZBB-NEXT:  .LBB21_2:
1831 ; RV32ZBB-NEXT:    bnez a5, .LBB21_4
1832 ; RV32ZBB-NEXT:  # %bb.3:
1833 ; RV32ZBB-NEXT:    sltu a4, a2, a0
1834 ; RV32ZBB-NEXT:    sub a1, a3, a1
1835 ; RV32ZBB-NEXT:    sub a1, a1, a4
1836 ; RV32ZBB-NEXT:    sub a0, a2, a0
1837 ; RV32ZBB-NEXT:    ret
1838 ; RV32ZBB-NEXT:  .LBB21_4:
1839 ; RV32ZBB-NEXT:    sub a1, a1, a3
1840 ; RV32ZBB-NEXT:    sub a1, a1, a4
1841 ; RV32ZBB-NEXT:    sub a0, a0, a2
1842 ; RV32ZBB-NEXT:    ret
1844 ; RV64ZBB-LABEL: abd_cmp_i64:
1845 ; RV64ZBB:       # %bb.0:
1846 ; RV64ZBB-NEXT:    blt a0, a1, .LBB21_2
1847 ; RV64ZBB-NEXT:  # %bb.1:
1848 ; RV64ZBB-NEXT:    sub a0, a1, a0
1849 ; RV64ZBB-NEXT:    ret
1850 ; RV64ZBB-NEXT:  .LBB21_2:
1851 ; RV64ZBB-NEXT:    sub a0, a0, a1
1852 ; RV64ZBB-NEXT:    ret
1853   %cmp = icmp slt i64 %a, %b
1854   %ab = sub i64 %a, %b
1855   %ba = sub i64 %b, %a
1856   %sel = select i1 %cmp, i64 %ab, i64 %ba
1857   ret i64 %sel
1860 define i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {
1861 ; RV32I-LABEL: abd_cmp_i128:
1862 ; RV32I:       # %bb.0:
1863 ; RV32I-NEXT:    lw a3, 0(a2)
1864 ; RV32I-NEXT:    lw a4, 4(a2)
1865 ; RV32I-NEXT:    lw a5, 8(a2)
1866 ; RV32I-NEXT:    lw a7, 12(a2)
1867 ; RV32I-NEXT:    lw a6, 8(a1)
1868 ; RV32I-NEXT:    lw t0, 12(a1)
1869 ; RV32I-NEXT:    lw a2, 0(a1)
1870 ; RV32I-NEXT:    lw a1, 4(a1)
1871 ; RV32I-NEXT:    sltu t1, a6, a5
1872 ; RV32I-NEXT:    mv t4, t1
1873 ; RV32I-NEXT:    beq t0, a7, .LBB22_2
1874 ; RV32I-NEXT:  # %bb.1:
1875 ; RV32I-NEXT:    slt t4, t0, a7
1876 ; RV32I-NEXT:  .LBB22_2:
1877 ; RV32I-NEXT:    sltu t2, a2, a3
1878 ; RV32I-NEXT:    mv t3, t2
1879 ; RV32I-NEXT:    beq a1, a4, .LBB22_4
1880 ; RV32I-NEXT:  # %bb.3:
1881 ; RV32I-NEXT:    sltu t3, a1, a4
1882 ; RV32I-NEXT:  .LBB22_4:
1883 ; RV32I-NEXT:    xor t5, t0, a7
1884 ; RV32I-NEXT:    xor t6, a6, a5
1885 ; RV32I-NEXT:    or t5, t6, t5
1886 ; RV32I-NEXT:    mv t6, t3
1887 ; RV32I-NEXT:    beqz t5, .LBB22_6
1888 ; RV32I-NEXT:  # %bb.5:
1889 ; RV32I-NEXT:    mv t6, t4
1890 ; RV32I-NEXT:  .LBB22_6:
1891 ; RV32I-NEXT:    sltu t4, a3, a2
1892 ; RV32I-NEXT:    mv t5, t4
1893 ; RV32I-NEXT:    beq a1, a4, .LBB22_8
1894 ; RV32I-NEXT:  # %bb.7:
1895 ; RV32I-NEXT:    sltu t5, a4, a1
1896 ; RV32I-NEXT:  .LBB22_8:
1897 ; RV32I-NEXT:    bnez t6, .LBB22_10
1898 ; RV32I-NEXT:  # %bb.9:
1899 ; RV32I-NEXT:    sltu t1, a5, a6
1900 ; RV32I-NEXT:    sub a7, a7, t0
1901 ; RV32I-NEXT:    sub a5, a5, a6
1902 ; RV32I-NEXT:    sub a4, a4, a1
1903 ; RV32I-NEXT:    sub a6, a7, t1
1904 ; RV32I-NEXT:    sltu a7, a5, t5
1905 ; RV32I-NEXT:    sub a1, a5, t5
1906 ; RV32I-NEXT:    sub a5, a4, t4
1907 ; RV32I-NEXT:    sub a4, a6, a7
1908 ; RV32I-NEXT:    sub a2, a3, a2
1909 ; RV32I-NEXT:    j .LBB22_11
1910 ; RV32I-NEXT:  .LBB22_10:
1911 ; RV32I-NEXT:    sub a7, t0, a7
1912 ; RV32I-NEXT:    sub a5, a6, a5
1913 ; RV32I-NEXT:    sub a4, a1, a4
1914 ; RV32I-NEXT:    sub a6, a7, t1
1915 ; RV32I-NEXT:    sltu a7, a5, t3
1916 ; RV32I-NEXT:    sub a1, a5, t3
1917 ; RV32I-NEXT:    sub a5, a4, t2
1918 ; RV32I-NEXT:    sub a4, a6, a7
1919 ; RV32I-NEXT:    sub a2, a2, a3
1920 ; RV32I-NEXT:  .LBB22_11:
1921 ; RV32I-NEXT:    sw a2, 0(a0)
1922 ; RV32I-NEXT:    sw a5, 4(a0)
1923 ; RV32I-NEXT:    sw a1, 8(a0)
1924 ; RV32I-NEXT:    sw a4, 12(a0)
1925 ; RV32I-NEXT:    ret
1927 ; RV64I-LABEL: abd_cmp_i128:
1928 ; RV64I:       # %bb.0:
1929 ; RV64I-NEXT:    sltu a4, a0, a2
1930 ; RV64I-NEXT:    mv a5, a4
1931 ; RV64I-NEXT:    beq a1, a3, .LBB22_2
1932 ; RV64I-NEXT:  # %bb.1:
1933 ; RV64I-NEXT:    slt a5, a1, a3
1934 ; RV64I-NEXT:  .LBB22_2:
1935 ; RV64I-NEXT:    bnez a5, .LBB22_4
1936 ; RV64I-NEXT:  # %bb.3:
1937 ; RV64I-NEXT:    sltu a4, a2, a0
1938 ; RV64I-NEXT:    sub a1, a3, a1
1939 ; RV64I-NEXT:    sub a1, a1, a4
1940 ; RV64I-NEXT:    sub a0, a2, a0
1941 ; RV64I-NEXT:    ret
1942 ; RV64I-NEXT:  .LBB22_4:
1943 ; RV64I-NEXT:    sub a1, a1, a3
1944 ; RV64I-NEXT:    sub a1, a1, a4
1945 ; RV64I-NEXT:    sub a0, a0, a2
1946 ; RV64I-NEXT:    ret
1948 ; RV32ZBB-LABEL: abd_cmp_i128:
1949 ; RV32ZBB:       # %bb.0:
1950 ; RV32ZBB-NEXT:    lw a3, 0(a2)
1951 ; RV32ZBB-NEXT:    lw a4, 4(a2)
1952 ; RV32ZBB-NEXT:    lw a5, 8(a2)
1953 ; RV32ZBB-NEXT:    lw a7, 12(a2)
1954 ; RV32ZBB-NEXT:    lw a6, 8(a1)
1955 ; RV32ZBB-NEXT:    lw t0, 12(a1)
1956 ; RV32ZBB-NEXT:    lw a2, 0(a1)
1957 ; RV32ZBB-NEXT:    lw a1, 4(a1)
1958 ; RV32ZBB-NEXT:    sltu t1, a6, a5
1959 ; RV32ZBB-NEXT:    mv t4, t1
1960 ; RV32ZBB-NEXT:    beq t0, a7, .LBB22_2
1961 ; RV32ZBB-NEXT:  # %bb.1:
1962 ; RV32ZBB-NEXT:    slt t4, t0, a7
1963 ; RV32ZBB-NEXT:  .LBB22_2:
1964 ; RV32ZBB-NEXT:    sltu t2, a2, a3
1965 ; RV32ZBB-NEXT:    mv t3, t2
1966 ; RV32ZBB-NEXT:    beq a1, a4, .LBB22_4
1967 ; RV32ZBB-NEXT:  # %bb.3:
1968 ; RV32ZBB-NEXT:    sltu t3, a1, a4
1969 ; RV32ZBB-NEXT:  .LBB22_4:
1970 ; RV32ZBB-NEXT:    xor t5, t0, a7
1971 ; RV32ZBB-NEXT:    xor t6, a6, a5
1972 ; RV32ZBB-NEXT:    or t5, t6, t5
1973 ; RV32ZBB-NEXT:    mv t6, t3
1974 ; RV32ZBB-NEXT:    beqz t5, .LBB22_6
1975 ; RV32ZBB-NEXT:  # %bb.5:
1976 ; RV32ZBB-NEXT:    mv t6, t4
1977 ; RV32ZBB-NEXT:  .LBB22_6:
1978 ; RV32ZBB-NEXT:    sltu t4, a3, a2
1979 ; RV32ZBB-NEXT:    mv t5, t4
1980 ; RV32ZBB-NEXT:    beq a1, a4, .LBB22_8
1981 ; RV32ZBB-NEXT:  # %bb.7:
1982 ; RV32ZBB-NEXT:    sltu t5, a4, a1
1983 ; RV32ZBB-NEXT:  .LBB22_8:
1984 ; RV32ZBB-NEXT:    bnez t6, .LBB22_10
1985 ; RV32ZBB-NEXT:  # %bb.9:
1986 ; RV32ZBB-NEXT:    sltu t1, a5, a6
1987 ; RV32ZBB-NEXT:    sub a7, a7, t0
1988 ; RV32ZBB-NEXT:    sub a5, a5, a6
1989 ; RV32ZBB-NEXT:    sub a4, a4, a1
1990 ; RV32ZBB-NEXT:    sub a6, a7, t1
1991 ; RV32ZBB-NEXT:    sltu a7, a5, t5
1992 ; RV32ZBB-NEXT:    sub a1, a5, t5
1993 ; RV32ZBB-NEXT:    sub a5, a4, t4
1994 ; RV32ZBB-NEXT:    sub a4, a6, a7
1995 ; RV32ZBB-NEXT:    sub a2, a3, a2
1996 ; RV32ZBB-NEXT:    j .LBB22_11
1997 ; RV32ZBB-NEXT:  .LBB22_10:
1998 ; RV32ZBB-NEXT:    sub a7, t0, a7
1999 ; RV32ZBB-NEXT:    sub a5, a6, a5
2000 ; RV32ZBB-NEXT:    sub a4, a1, a4
2001 ; RV32ZBB-NEXT:    sub a6, a7, t1
2002 ; RV32ZBB-NEXT:    sltu a7, a5, t3
2003 ; RV32ZBB-NEXT:    sub a1, a5, t3
2004 ; RV32ZBB-NEXT:    sub a5, a4, t2
2005 ; RV32ZBB-NEXT:    sub a4, a6, a7
2006 ; RV32ZBB-NEXT:    sub a2, a2, a3
2007 ; RV32ZBB-NEXT:  .LBB22_11:
2008 ; RV32ZBB-NEXT:    sw a2, 0(a0)
2009 ; RV32ZBB-NEXT:    sw a5, 4(a0)
2010 ; RV32ZBB-NEXT:    sw a1, 8(a0)
2011 ; RV32ZBB-NEXT:    sw a4, 12(a0)
2012 ; RV32ZBB-NEXT:    ret
2014 ; RV64ZBB-LABEL: abd_cmp_i128:
2015 ; RV64ZBB:       # %bb.0:
2016 ; RV64ZBB-NEXT:    sltu a4, a0, a2
2017 ; RV64ZBB-NEXT:    mv a5, a4
2018 ; RV64ZBB-NEXT:    beq a1, a3, .LBB22_2
2019 ; RV64ZBB-NEXT:  # %bb.1:
2020 ; RV64ZBB-NEXT:    slt a5, a1, a3
2021 ; RV64ZBB-NEXT:  .LBB22_2:
2022 ; RV64ZBB-NEXT:    bnez a5, .LBB22_4
2023 ; RV64ZBB-NEXT:  # %bb.3:
2024 ; RV64ZBB-NEXT:    sltu a4, a2, a0
2025 ; RV64ZBB-NEXT:    sub a1, a3, a1
2026 ; RV64ZBB-NEXT:    sub a1, a1, a4
2027 ; RV64ZBB-NEXT:    sub a0, a2, a0
2028 ; RV64ZBB-NEXT:    ret
2029 ; RV64ZBB-NEXT:  .LBB22_4:
2030 ; RV64ZBB-NEXT:    sub a1, a1, a3
2031 ; RV64ZBB-NEXT:    sub a1, a1, a4
2032 ; RV64ZBB-NEXT:    sub a0, a0, a2
2033 ; RV64ZBB-NEXT:    ret
2034   %cmp = icmp slt i128 %a, %b
2035   %ab = sub i128 %a, %b
2036   %ba = sub i128 %b, %a
2037   %sel = select i1 %cmp, i128 %ab, i128 %ba
2038   ret i128 %sel
2042 ; nabs(sub_nsw(x, y)) -> nabds(a,b)
2045 define i8 @abd_subnsw_i8(i8 %a, i8 %b) nounwind {
2046 ; RV32I-LABEL: abd_subnsw_i8:
2047 ; RV32I:       # %bb.0:
2048 ; RV32I-NEXT:    sub a0, a0, a1
2049 ; RV32I-NEXT:    slli a1, a0, 24
2050 ; RV32I-NEXT:    srai a1, a1, 31
2051 ; RV32I-NEXT:    xor a0, a0, a1
2052 ; RV32I-NEXT:    sub a0, a1, a0
2053 ; RV32I-NEXT:    ret
2055 ; RV64I-LABEL: abd_subnsw_i8:
2056 ; RV64I:       # %bb.0:
2057 ; RV64I-NEXT:    sub a0, a0, a1
2058 ; RV64I-NEXT:    slli a1, a0, 56
2059 ; RV64I-NEXT:    srai a1, a1, 63
2060 ; RV64I-NEXT:    xor a0, a0, a1
2061 ; RV64I-NEXT:    sub a0, a1, a0
2062 ; RV64I-NEXT:    ret
2064 ; RV32ZBB-LABEL: abd_subnsw_i8:
2065 ; RV32ZBB:       # %bb.0:
2066 ; RV32ZBB-NEXT:    sub a0, a0, a1
2067 ; RV32ZBB-NEXT:    slli a1, a0, 24
2068 ; RV32ZBB-NEXT:    srai a1, a1, 31
2069 ; RV32ZBB-NEXT:    xor a0, a0, a1
2070 ; RV32ZBB-NEXT:    sub a0, a1, a0
2071 ; RV32ZBB-NEXT:    ret
2073 ; RV64ZBB-LABEL: abd_subnsw_i8:
2074 ; RV64ZBB:       # %bb.0:
2075 ; RV64ZBB-NEXT:    sub a0, a0, a1
2076 ; RV64ZBB-NEXT:    slli a1, a0, 56
2077 ; RV64ZBB-NEXT:    srai a1, a1, 63
2078 ; RV64ZBB-NEXT:    xor a0, a0, a1
2079 ; RV64ZBB-NEXT:    sub a0, a1, a0
2080 ; RV64ZBB-NEXT:    ret
2081   %sub = sub nsw i8 %a, %b
2082   %abs = call i8 @llvm.abs.i8(i8 %sub, i1 false)
2083   %nabs = sub i8 0, %abs
2084   ret i8 %nabs
2087 define i8 @abd_subnsw_i8_undef(i8 %a, i8 %b) nounwind {
2088 ; RV32I-LABEL: abd_subnsw_i8_undef:
2089 ; RV32I:       # %bb.0:
2090 ; RV32I-NEXT:    sub a0, a0, a1
2091 ; RV32I-NEXT:    slli a1, a0, 24
2092 ; RV32I-NEXT:    srai a1, a1, 31
2093 ; RV32I-NEXT:    xor a0, a0, a1
2094 ; RV32I-NEXT:    sub a0, a1, a0
2095 ; RV32I-NEXT:    ret
2097 ; RV64I-LABEL: abd_subnsw_i8_undef:
2098 ; RV64I:       # %bb.0:
2099 ; RV64I-NEXT:    sub a0, a0, a1
2100 ; RV64I-NEXT:    slli a1, a0, 56
2101 ; RV64I-NEXT:    srai a1, a1, 63
2102 ; RV64I-NEXT:    xor a0, a0, a1
2103 ; RV64I-NEXT:    sub a0, a1, a0
2104 ; RV64I-NEXT:    ret
2106 ; RV32ZBB-LABEL: abd_subnsw_i8_undef:
2107 ; RV32ZBB:       # %bb.0:
2108 ; RV32ZBB-NEXT:    sub a0, a0, a1
2109 ; RV32ZBB-NEXT:    slli a1, a0, 24
2110 ; RV32ZBB-NEXT:    srai a1, a1, 31
2111 ; RV32ZBB-NEXT:    xor a0, a0, a1
2112 ; RV32ZBB-NEXT:    sub a0, a1, a0
2113 ; RV32ZBB-NEXT:    ret
2115 ; RV64ZBB-LABEL: abd_subnsw_i8_undef:
2116 ; RV64ZBB:       # %bb.0:
2117 ; RV64ZBB-NEXT:    sub a0, a0, a1
2118 ; RV64ZBB-NEXT:    slli a1, a0, 56
2119 ; RV64ZBB-NEXT:    srai a1, a1, 63
2120 ; RV64ZBB-NEXT:    xor a0, a0, a1
2121 ; RV64ZBB-NEXT:    sub a0, a1, a0
2122 ; RV64ZBB-NEXT:    ret
2123   %sub = sub nsw i8 %a, %b
2124   %abs = call i8 @llvm.abs.i8(i8 %sub, i1 true)
2125   %nabs = sub i8 0, %abs
2126   ret i8 %nabs
2129 define i16 @abd_subnsw_i16(i16 %a, i16 %b) nounwind {
2130 ; RV32I-LABEL: abd_subnsw_i16:
2131 ; RV32I:       # %bb.0:
2132 ; RV32I-NEXT:    sub a0, a0, a1
2133 ; RV32I-NEXT:    slli a1, a0, 16
2134 ; RV32I-NEXT:    srai a1, a1, 31
2135 ; RV32I-NEXT:    xor a0, a0, a1
2136 ; RV32I-NEXT:    sub a0, a1, a0
2137 ; RV32I-NEXT:    ret
2139 ; RV64I-LABEL: abd_subnsw_i16:
2140 ; RV64I:       # %bb.0:
2141 ; RV64I-NEXT:    sub a0, a0, a1
2142 ; RV64I-NEXT:    slli a1, a0, 48
2143 ; RV64I-NEXT:    srai a1, a1, 63
2144 ; RV64I-NEXT:    xor a0, a0, a1
2145 ; RV64I-NEXT:    sub a0, a1, a0
2146 ; RV64I-NEXT:    ret
2148 ; RV32ZBB-LABEL: abd_subnsw_i16:
2149 ; RV32ZBB:       # %bb.0:
2150 ; RV32ZBB-NEXT:    sub a0, a0, a1
2151 ; RV32ZBB-NEXT:    slli a1, a0, 16
2152 ; RV32ZBB-NEXT:    srai a1, a1, 31
2153 ; RV32ZBB-NEXT:    xor a0, a0, a1
2154 ; RV32ZBB-NEXT:    sub a0, a1, a0
2155 ; RV32ZBB-NEXT:    ret
2157 ; RV64ZBB-LABEL: abd_subnsw_i16:
2158 ; RV64ZBB:       # %bb.0:
2159 ; RV64ZBB-NEXT:    sub a0, a0, a1
2160 ; RV64ZBB-NEXT:    slli a1, a0, 48
2161 ; RV64ZBB-NEXT:    srai a1, a1, 63
2162 ; RV64ZBB-NEXT:    xor a0, a0, a1
2163 ; RV64ZBB-NEXT:    sub a0, a1, a0
2164 ; RV64ZBB-NEXT:    ret
2165   %sub = sub nsw i16 %a, %b
2166   %abs = call i16 @llvm.abs.i16(i16 %sub, i1 false)
2167   %nabs = sub i16 0, %abs
2168   ret i16 %nabs
2171 define i16 @abd_subnsw_i16_undef(i16 %a, i16 %b) nounwind {
2172 ; RV32I-LABEL: abd_subnsw_i16_undef:
2173 ; RV32I:       # %bb.0:
2174 ; RV32I-NEXT:    sub a0, a0, a1
2175 ; RV32I-NEXT:    slli a1, a0, 16
2176 ; RV32I-NEXT:    srai a1, a1, 31
2177 ; RV32I-NEXT:    xor a0, a0, a1
2178 ; RV32I-NEXT:    sub a0, a1, a0
2179 ; RV32I-NEXT:    ret
2181 ; RV64I-LABEL: abd_subnsw_i16_undef:
2182 ; RV64I:       # %bb.0:
2183 ; RV64I-NEXT:    sub a0, a0, a1
2184 ; RV64I-NEXT:    slli a1, a0, 48
2185 ; RV64I-NEXT:    srai a1, a1, 63
2186 ; RV64I-NEXT:    xor a0, a0, a1
2187 ; RV64I-NEXT:    sub a0, a1, a0
2188 ; RV64I-NEXT:    ret
2190 ; RV32ZBB-LABEL: abd_subnsw_i16_undef:
2191 ; RV32ZBB:       # %bb.0:
2192 ; RV32ZBB-NEXT:    sub a0, a0, a1
2193 ; RV32ZBB-NEXT:    slli a1, a0, 16
2194 ; RV32ZBB-NEXT:    srai a1, a1, 31
2195 ; RV32ZBB-NEXT:    xor a0, a0, a1
2196 ; RV32ZBB-NEXT:    sub a0, a1, a0
2197 ; RV32ZBB-NEXT:    ret
2199 ; RV64ZBB-LABEL: abd_subnsw_i16_undef:
2200 ; RV64ZBB:       # %bb.0:
2201 ; RV64ZBB-NEXT:    sub a0, a0, a1
2202 ; RV64ZBB-NEXT:    slli a1, a0, 48
2203 ; RV64ZBB-NEXT:    srai a1, a1, 63
2204 ; RV64ZBB-NEXT:    xor a0, a0, a1
2205 ; RV64ZBB-NEXT:    sub a0, a1, a0
2206 ; RV64ZBB-NEXT:    ret
2207   %sub = sub nsw i16 %a, %b
2208   %abs = call i16 @llvm.abs.i16(i16 %sub, i1 true)
2209   %nabs = sub i16 0, %abs
2210   ret i16 %nabs
2213 define i32 @abd_subnsw_i32(i32 %a, i32 %b) nounwind {
2214 ; RV32I-LABEL: abd_subnsw_i32:
2215 ; RV32I:       # %bb.0:
2216 ; RV32I-NEXT:    sub a0, a0, a1
2217 ; RV32I-NEXT:    srai a1, a0, 31
2218 ; RV32I-NEXT:    xor a0, a0, a1
2219 ; RV32I-NEXT:    sub a0, a1, a0
2220 ; RV32I-NEXT:    ret
2222 ; RV64I-LABEL: abd_subnsw_i32:
2223 ; RV64I:       # %bb.0:
2224 ; RV64I-NEXT:    subw a0, a0, a1
2225 ; RV64I-NEXT:    sraiw a1, a0, 31
2226 ; RV64I-NEXT:    xor a0, a0, a1
2227 ; RV64I-NEXT:    subw a0, a1, a0
2228 ; RV64I-NEXT:    ret
2230 ; RV32ZBB-LABEL: abd_subnsw_i32:
2231 ; RV32ZBB:       # %bb.0:
2232 ; RV32ZBB-NEXT:    sub a0, a0, a1
2233 ; RV32ZBB-NEXT:    neg a1, a0
2234 ; RV32ZBB-NEXT:    min a0, a0, a1
2235 ; RV32ZBB-NEXT:    ret
2237 ; RV64ZBB-LABEL: abd_subnsw_i32:
2238 ; RV64ZBB:       # %bb.0:
2239 ; RV64ZBB-NEXT:    subw a0, a0, a1
2240 ; RV64ZBB-NEXT:    sraiw a1, a0, 31
2241 ; RV64ZBB-NEXT:    xor a0, a0, a1
2242 ; RV64ZBB-NEXT:    subw a0, a1, a0
2243 ; RV64ZBB-NEXT:    ret
2244   %sub = sub nsw i32 %a, %b
2245   %abs = call i32 @llvm.abs.i32(i32 %sub, i1 false)
2246   %nabs = sub i32 0, %abs
2247   ret i32 %nabs
2250 define i32 @abd_subnsw_i32_undef(i32 %a, i32 %b) nounwind {
2251 ; RV32I-LABEL: abd_subnsw_i32_undef:
2252 ; RV32I:       # %bb.0:
2253 ; RV32I-NEXT:    sub a0, a0, a1
2254 ; RV32I-NEXT:    srai a1, a0, 31
2255 ; RV32I-NEXT:    xor a0, a0, a1
2256 ; RV32I-NEXT:    sub a0, a1, a0
2257 ; RV32I-NEXT:    ret
2259 ; RV64I-LABEL: abd_subnsw_i32_undef:
2260 ; RV64I:       # %bb.0:
2261 ; RV64I-NEXT:    subw a0, a0, a1
2262 ; RV64I-NEXT:    sraiw a1, a0, 31
2263 ; RV64I-NEXT:    xor a0, a0, a1
2264 ; RV64I-NEXT:    subw a0, a1, a0
2265 ; RV64I-NEXT:    ret
2267 ; RV32ZBB-LABEL: abd_subnsw_i32_undef:
2268 ; RV32ZBB:       # %bb.0:
2269 ; RV32ZBB-NEXT:    sub a0, a0, a1
2270 ; RV32ZBB-NEXT:    neg a1, a0
2271 ; RV32ZBB-NEXT:    min a0, a0, a1
2272 ; RV32ZBB-NEXT:    ret
2274 ; RV64ZBB-LABEL: abd_subnsw_i32_undef:
2275 ; RV64ZBB:       # %bb.0:
2276 ; RV64ZBB-NEXT:    subw a0, a0, a1
2277 ; RV64ZBB-NEXT:    sraiw a1, a0, 31
2278 ; RV64ZBB-NEXT:    xor a0, a0, a1
2279 ; RV64ZBB-NEXT:    subw a0, a1, a0
2280 ; RV64ZBB-NEXT:    ret
2281   %sub = sub nsw i32 %a, %b
2282   %abs = call i32 @llvm.abs.i32(i32 %sub, i1 true)
2283   %nabs = sub i32 0, %abs
2284   ret i32 %nabs
2287 define i64 @abd_subnsw_i64(i64 %a, i64 %b) nounwind {
2288 ; RV32I-LABEL: abd_subnsw_i64:
2289 ; RV32I:       # %bb.0:
2290 ; RV32I-NEXT:    sltu a4, a0, a2
2291 ; RV32I-NEXT:    sub a1, a1, a3
2292 ; RV32I-NEXT:    sub a0, a0, a2
2293 ; RV32I-NEXT:    sub a1, a1, a4
2294 ; RV32I-NEXT:    srai a2, a1, 31
2295 ; RV32I-NEXT:    xor a0, a0, a2
2296 ; RV32I-NEXT:    xor a1, a1, a2
2297 ; RV32I-NEXT:    sltu a3, a2, a0
2298 ; RV32I-NEXT:    sub a1, a2, a1
2299 ; RV32I-NEXT:    sub a1, a1, a3
2300 ; RV32I-NEXT:    sub a0, a2, a0
2301 ; RV32I-NEXT:    ret
2303 ; RV64I-LABEL: abd_subnsw_i64:
2304 ; RV64I:       # %bb.0:
2305 ; RV64I-NEXT:    sub a0, a0, a1
2306 ; RV64I-NEXT:    srai a1, a0, 63
2307 ; RV64I-NEXT:    xor a0, a0, a1
2308 ; RV64I-NEXT:    sub a0, a1, a0
2309 ; RV64I-NEXT:    ret
2311 ; RV32ZBB-LABEL: abd_subnsw_i64:
2312 ; RV32ZBB:       # %bb.0:
2313 ; RV32ZBB-NEXT:    sltu a4, a0, a2
2314 ; RV32ZBB-NEXT:    sub a1, a1, a3
2315 ; RV32ZBB-NEXT:    sub a0, a0, a2
2316 ; RV32ZBB-NEXT:    sub a1, a1, a4
2317 ; RV32ZBB-NEXT:    srai a2, a1, 31
2318 ; RV32ZBB-NEXT:    xor a0, a0, a2
2319 ; RV32ZBB-NEXT:    xor a1, a1, a2
2320 ; RV32ZBB-NEXT:    sltu a3, a2, a0
2321 ; RV32ZBB-NEXT:    sub a1, a2, a1
2322 ; RV32ZBB-NEXT:    sub a1, a1, a3
2323 ; RV32ZBB-NEXT:    sub a0, a2, a0
2324 ; RV32ZBB-NEXT:    ret
2326 ; RV64ZBB-LABEL: abd_subnsw_i64:
2327 ; RV64ZBB:       # %bb.0:
2328 ; RV64ZBB-NEXT:    sub a0, a0, a1
2329 ; RV64ZBB-NEXT:    neg a1, a0
2330 ; RV64ZBB-NEXT:    min a0, a0, a1
2331 ; RV64ZBB-NEXT:    ret
2332   %sub = sub nsw i64 %a, %b
2333   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
2334   %nabs = sub i64 0, %abs
2335   ret i64 %nabs
2338 define i64 @abd_subnsw_i64_undef(i64 %a, i64 %b) nounwind {
2339 ; RV32I-LABEL: abd_subnsw_i64_undef:
2340 ; RV32I:       # %bb.0:
2341 ; RV32I-NEXT:    sltu a4, a0, a2
2342 ; RV32I-NEXT:    sub a1, a1, a3
2343 ; RV32I-NEXT:    sub a0, a0, a2
2344 ; RV32I-NEXT:    sub a1, a1, a4
2345 ; RV32I-NEXT:    srai a2, a1, 31
2346 ; RV32I-NEXT:    xor a0, a0, a2
2347 ; RV32I-NEXT:    xor a1, a1, a2
2348 ; RV32I-NEXT:    sltu a3, a2, a0
2349 ; RV32I-NEXT:    sub a1, a2, a1
2350 ; RV32I-NEXT:    sub a1, a1, a3
2351 ; RV32I-NEXT:    sub a0, a2, a0
2352 ; RV32I-NEXT:    ret
2354 ; RV64I-LABEL: abd_subnsw_i64_undef:
2355 ; RV64I:       # %bb.0:
2356 ; RV64I-NEXT:    sub a0, a0, a1
2357 ; RV64I-NEXT:    srai a1, a0, 63
2358 ; RV64I-NEXT:    xor a0, a0, a1
2359 ; RV64I-NEXT:    sub a0, a1, a0
2360 ; RV64I-NEXT:    ret
2362 ; RV32ZBB-LABEL: abd_subnsw_i64_undef:
2363 ; RV32ZBB:       # %bb.0:
2364 ; RV32ZBB-NEXT:    sltu a4, a0, a2
2365 ; RV32ZBB-NEXT:    sub a1, a1, a3
2366 ; RV32ZBB-NEXT:    sub a0, a0, a2
2367 ; RV32ZBB-NEXT:    sub a1, a1, a4
2368 ; RV32ZBB-NEXT:    srai a2, a1, 31
2369 ; RV32ZBB-NEXT:    xor a0, a0, a2
2370 ; RV32ZBB-NEXT:    xor a1, a1, a2
2371 ; RV32ZBB-NEXT:    sltu a3, a2, a0
2372 ; RV32ZBB-NEXT:    sub a1, a2, a1
2373 ; RV32ZBB-NEXT:    sub a1, a1, a3
2374 ; RV32ZBB-NEXT:    sub a0, a2, a0
2375 ; RV32ZBB-NEXT:    ret
2377 ; RV64ZBB-LABEL: abd_subnsw_i64_undef:
2378 ; RV64ZBB:       # %bb.0:
2379 ; RV64ZBB-NEXT:    sub a0, a0, a1
2380 ; RV64ZBB-NEXT:    neg a1, a0
2381 ; RV64ZBB-NEXT:    min a0, a0, a1
2382 ; RV64ZBB-NEXT:    ret
2383   %sub = sub nsw i64 %a, %b
2384   %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
2385   %nabs = sub i64 0, %abs
2386   ret i64 %nabs
2389 define i128 @abd_subnsw_i128(i128 %a, i128 %b) nounwind {
2390 ; RV32I-LABEL: abd_subnsw_i128:
2391 ; RV32I:       # %bb.0:
2392 ; RV32I-NEXT:    lw a3, 0(a2)
2393 ; RV32I-NEXT:    lw a4, 4(a2)
2394 ; RV32I-NEXT:    lw a5, 8(a2)
2395 ; RV32I-NEXT:    lw a6, 12(a2)
2396 ; RV32I-NEXT:    lw t0, 8(a1)
2397 ; RV32I-NEXT:    lw t1, 12(a1)
2398 ; RV32I-NEXT:    lw a2, 0(a1)
2399 ; RV32I-NEXT:    lw a7, 4(a1)
2400 ; RV32I-NEXT:    sltu a1, t0, a5
2401 ; RV32I-NEXT:    sub t1, t1, a6
2402 ; RV32I-NEXT:    sltu a6, a2, a3
2403 ; RV32I-NEXT:    sub a1, t1, a1
2404 ; RV32I-NEXT:    mv t1, a6
2405 ; RV32I-NEXT:    beq a7, a4, .LBB31_2
2406 ; RV32I-NEXT:  # %bb.1:
2407 ; RV32I-NEXT:    sltu t1, a7, a4
2408 ; RV32I-NEXT:  .LBB31_2:
2409 ; RV32I-NEXT:    sub a5, t0, a5
2410 ; RV32I-NEXT:    sub a4, a7, a4
2411 ; RV32I-NEXT:    sub a3, a2, a3
2412 ; RV32I-NEXT:    sltu a2, a5, t1
2413 ; RV32I-NEXT:    sub t0, a4, a6
2414 ; RV32I-NEXT:    sub a4, a5, t1
2415 ; RV32I-NEXT:    sub a5, a1, a2
2416 ; RV32I-NEXT:    srai a1, a5, 31
2417 ; RV32I-NEXT:    xor a2, a4, a1
2418 ; RV32I-NEXT:    xor a5, a5, a1
2419 ; RV32I-NEXT:    xor a4, a3, a1
2420 ; RV32I-NEXT:    sltu a3, a1, a2
2421 ; RV32I-NEXT:    sub a6, a1, a5
2422 ; RV32I-NEXT:    sltu a5, a1, a4
2423 ; RV32I-NEXT:    sub a3, a6, a3
2424 ; RV32I-NEXT:    xor a7, t0, a1
2425 ; RV32I-NEXT:    mv a6, a5
2426 ; RV32I-NEXT:    beqz t0, .LBB31_4
2427 ; RV32I-NEXT:  # %bb.3:
2428 ; RV32I-NEXT:    sltu a6, a1, a7
2429 ; RV32I-NEXT:  .LBB31_4:
2430 ; RV32I-NEXT:    sub a2, a1, a2
2431 ; RV32I-NEXT:    sub a7, a1, a7
2432 ; RV32I-NEXT:    sub a1, a1, a4
2433 ; RV32I-NEXT:    sltu a4, a2, a6
2434 ; RV32I-NEXT:    sub a2, a2, a6
2435 ; RV32I-NEXT:    sub a5, a7, a5
2436 ; RV32I-NEXT:    sub a3, a3, a4
2437 ; RV32I-NEXT:    sw a1, 0(a0)
2438 ; RV32I-NEXT:    sw a5, 4(a0)
2439 ; RV32I-NEXT:    sw a2, 8(a0)
2440 ; RV32I-NEXT:    sw a3, 12(a0)
2441 ; RV32I-NEXT:    ret
2443 ; RV64I-LABEL: abd_subnsw_i128:
2444 ; RV64I:       # %bb.0:
2445 ; RV64I-NEXT:    sltu a4, a0, a2
2446 ; RV64I-NEXT:    sub a1, a1, a3
2447 ; RV64I-NEXT:    sub a0, a0, a2
2448 ; RV64I-NEXT:    sub a1, a1, a4
2449 ; RV64I-NEXT:    srai a2, a1, 63
2450 ; RV64I-NEXT:    xor a0, a0, a2
2451 ; RV64I-NEXT:    xor a1, a1, a2
2452 ; RV64I-NEXT:    sltu a3, a2, a0
2453 ; RV64I-NEXT:    sub a1, a2, a1
2454 ; RV64I-NEXT:    sub a1, a1, a3
2455 ; RV64I-NEXT:    sub a0, a2, a0
2456 ; RV64I-NEXT:    ret
2458 ; RV32ZBB-LABEL: abd_subnsw_i128:
2459 ; RV32ZBB:       # %bb.0:
2460 ; RV32ZBB-NEXT:    lw a3, 0(a2)
2461 ; RV32ZBB-NEXT:    lw a4, 4(a2)
2462 ; RV32ZBB-NEXT:    lw a5, 8(a2)
2463 ; RV32ZBB-NEXT:    lw a6, 12(a2)
2464 ; RV32ZBB-NEXT:    lw t0, 8(a1)
2465 ; RV32ZBB-NEXT:    lw t1, 12(a1)
2466 ; RV32ZBB-NEXT:    lw a2, 0(a1)
2467 ; RV32ZBB-NEXT:    lw a7, 4(a1)
2468 ; RV32ZBB-NEXT:    sltu a1, t0, a5
2469 ; RV32ZBB-NEXT:    sub t1, t1, a6
2470 ; RV32ZBB-NEXT:    sltu a6, a2, a3
2471 ; RV32ZBB-NEXT:    sub a1, t1, a1
2472 ; RV32ZBB-NEXT:    mv t1, a6
2473 ; RV32ZBB-NEXT:    beq a7, a4, .LBB31_2
2474 ; RV32ZBB-NEXT:  # %bb.1:
2475 ; RV32ZBB-NEXT:    sltu t1, a7, a4
2476 ; RV32ZBB-NEXT:  .LBB31_2:
2477 ; RV32ZBB-NEXT:    sub a5, t0, a5
2478 ; RV32ZBB-NEXT:    sub a4, a7, a4
2479 ; RV32ZBB-NEXT:    sub a3, a2, a3
2480 ; RV32ZBB-NEXT:    sltu a2, a5, t1
2481 ; RV32ZBB-NEXT:    sub t0, a4, a6
2482 ; RV32ZBB-NEXT:    sub a4, a5, t1
2483 ; RV32ZBB-NEXT:    sub a5, a1, a2
2484 ; RV32ZBB-NEXT:    srai a1, a5, 31
2485 ; RV32ZBB-NEXT:    xor a2, a4, a1
2486 ; RV32ZBB-NEXT:    xor a5, a5, a1
2487 ; RV32ZBB-NEXT:    xor a4, a3, a1
2488 ; RV32ZBB-NEXT:    sltu a3, a1, a2
2489 ; RV32ZBB-NEXT:    sub a6, a1, a5
2490 ; RV32ZBB-NEXT:    sltu a5, a1, a4
2491 ; RV32ZBB-NEXT:    sub a3, a6, a3
2492 ; RV32ZBB-NEXT:    xor a7, t0, a1
2493 ; RV32ZBB-NEXT:    mv a6, a5
2494 ; RV32ZBB-NEXT:    beqz t0, .LBB31_4
2495 ; RV32ZBB-NEXT:  # %bb.3:
2496 ; RV32ZBB-NEXT:    sltu a6, a1, a7
2497 ; RV32ZBB-NEXT:  .LBB31_4:
2498 ; RV32ZBB-NEXT:    sub a2, a1, a2
2499 ; RV32ZBB-NEXT:    sub a7, a1, a7
2500 ; RV32ZBB-NEXT:    sub a1, a1, a4
2501 ; RV32ZBB-NEXT:    sltu a4, a2, a6
2502 ; RV32ZBB-NEXT:    sub a2, a2, a6
2503 ; RV32ZBB-NEXT:    sub a5, a7, a5
2504 ; RV32ZBB-NEXT:    sub a3, a3, a4
2505 ; RV32ZBB-NEXT:    sw a1, 0(a0)
2506 ; RV32ZBB-NEXT:    sw a5, 4(a0)
2507 ; RV32ZBB-NEXT:    sw a2, 8(a0)
2508 ; RV32ZBB-NEXT:    sw a3, 12(a0)
2509 ; RV32ZBB-NEXT:    ret
2511 ; RV64ZBB-LABEL: abd_subnsw_i128:
2512 ; RV64ZBB:       # %bb.0:
2513 ; RV64ZBB-NEXT:    sltu a4, a0, a2
2514 ; RV64ZBB-NEXT:    sub a1, a1, a3
2515 ; RV64ZBB-NEXT:    sub a0, a0, a2
2516 ; RV64ZBB-NEXT:    sub a1, a1, a4
2517 ; RV64ZBB-NEXT:    srai a2, a1, 63
2518 ; RV64ZBB-NEXT:    xor a0, a0, a2
2519 ; RV64ZBB-NEXT:    xor a1, a1, a2
2520 ; RV64ZBB-NEXT:    sltu a3, a2, a0
2521 ; RV64ZBB-NEXT:    sub a1, a2, a1
2522 ; RV64ZBB-NEXT:    sub a1, a1, a3
2523 ; RV64ZBB-NEXT:    sub a0, a2, a0
2524 ; RV64ZBB-NEXT:    ret
2525   %sub = sub nsw i128 %a, %b
2526   %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
2527   %nabs = sub i128 0, %abs
2528   ret i128 %nabs
2531 define i128 @abd_subnsw_i128_undef(i128 %a, i128 %b) nounwind {
2532 ; RV32I-LABEL: abd_subnsw_i128_undef:
2533 ; RV32I:       # %bb.0:
2534 ; RV32I-NEXT:    lw a3, 0(a2)
2535 ; RV32I-NEXT:    lw a4, 4(a2)
2536 ; RV32I-NEXT:    lw a5, 8(a2)
2537 ; RV32I-NEXT:    lw a6, 12(a2)
2538 ; RV32I-NEXT:    lw t0, 8(a1)
2539 ; RV32I-NEXT:    lw t1, 12(a1)
2540 ; RV32I-NEXT:    lw a2, 0(a1)
2541 ; RV32I-NEXT:    lw a7, 4(a1)
2542 ; RV32I-NEXT:    sltu a1, t0, a5
2543 ; RV32I-NEXT:    sub t1, t1, a6
2544 ; RV32I-NEXT:    sltu a6, a2, a3
2545 ; RV32I-NEXT:    sub a1, t1, a1
2546 ; RV32I-NEXT:    mv t1, a6
2547 ; RV32I-NEXT:    beq a7, a4, .LBB32_2
2548 ; RV32I-NEXT:  # %bb.1:
2549 ; RV32I-NEXT:    sltu t1, a7, a4
2550 ; RV32I-NEXT:  .LBB32_2:
2551 ; RV32I-NEXT:    sub a5, t0, a5
2552 ; RV32I-NEXT:    sub a4, a7, a4
2553 ; RV32I-NEXT:    sub a3, a2, a3
2554 ; RV32I-NEXT:    sltu a2, a5, t1
2555 ; RV32I-NEXT:    sub t0, a4, a6
2556 ; RV32I-NEXT:    sub a4, a5, t1
2557 ; RV32I-NEXT:    sub a5, a1, a2
2558 ; RV32I-NEXT:    srai a1, a5, 31
2559 ; RV32I-NEXT:    xor a2, a4, a1
2560 ; RV32I-NEXT:    xor a5, a5, a1
2561 ; RV32I-NEXT:    xor a4, a3, a1
2562 ; RV32I-NEXT:    sltu a3, a1, a2
2563 ; RV32I-NEXT:    sub a6, a1, a5
2564 ; RV32I-NEXT:    sltu a5, a1, a4
2565 ; RV32I-NEXT:    sub a3, a6, a3
2566 ; RV32I-NEXT:    xor a7, t0, a1
2567 ; RV32I-NEXT:    mv a6, a5
2568 ; RV32I-NEXT:    beqz t0, .LBB32_4
2569 ; RV32I-NEXT:  # %bb.3:
2570 ; RV32I-NEXT:    sltu a6, a1, a7
2571 ; RV32I-NEXT:  .LBB32_4:
2572 ; RV32I-NEXT:    sub a2, a1, a2
2573 ; RV32I-NEXT:    sub a7, a1, a7
2574 ; RV32I-NEXT:    sub a1, a1, a4
2575 ; RV32I-NEXT:    sltu a4, a2, a6
2576 ; RV32I-NEXT:    sub a2, a2, a6
2577 ; RV32I-NEXT:    sub a5, a7, a5
2578 ; RV32I-NEXT:    sub a3, a3, a4
2579 ; RV32I-NEXT:    sw a1, 0(a0)
2580 ; RV32I-NEXT:    sw a5, 4(a0)
2581 ; RV32I-NEXT:    sw a2, 8(a0)
2582 ; RV32I-NEXT:    sw a3, 12(a0)
2583 ; RV32I-NEXT:    ret
2585 ; RV64I-LABEL: abd_subnsw_i128_undef:
2586 ; RV64I:       # %bb.0:
2587 ; RV64I-NEXT:    sltu a4, a0, a2
2588 ; RV64I-NEXT:    sub a1, a1, a3
2589 ; RV64I-NEXT:    sub a0, a0, a2
2590 ; RV64I-NEXT:    sub a1, a1, a4
2591 ; RV64I-NEXT:    srai a2, a1, 63
2592 ; RV64I-NEXT:    xor a0, a0, a2
2593 ; RV64I-NEXT:    xor a1, a1, a2
2594 ; RV64I-NEXT:    sltu a3, a2, a0
2595 ; RV64I-NEXT:    sub a1, a2, a1
2596 ; RV64I-NEXT:    sub a1, a1, a3
2597 ; RV64I-NEXT:    sub a0, a2, a0
2598 ; RV64I-NEXT:    ret
2600 ; RV32ZBB-LABEL: abd_subnsw_i128_undef:
2601 ; RV32ZBB:       # %bb.0:
2602 ; RV32ZBB-NEXT:    lw a3, 0(a2)
2603 ; RV32ZBB-NEXT:    lw a4, 4(a2)
2604 ; RV32ZBB-NEXT:    lw a5, 8(a2)
2605 ; RV32ZBB-NEXT:    lw a6, 12(a2)
2606 ; RV32ZBB-NEXT:    lw t0, 8(a1)
2607 ; RV32ZBB-NEXT:    lw t1, 12(a1)
2608 ; RV32ZBB-NEXT:    lw a2, 0(a1)
2609 ; RV32ZBB-NEXT:    lw a7, 4(a1)
2610 ; RV32ZBB-NEXT:    sltu a1, t0, a5
2611 ; RV32ZBB-NEXT:    sub t1, t1, a6
2612 ; RV32ZBB-NEXT:    sltu a6, a2, a3
2613 ; RV32ZBB-NEXT:    sub a1, t1, a1
2614 ; RV32ZBB-NEXT:    mv t1, a6
2615 ; RV32ZBB-NEXT:    beq a7, a4, .LBB32_2
2616 ; RV32ZBB-NEXT:  # %bb.1:
2617 ; RV32ZBB-NEXT:    sltu t1, a7, a4
2618 ; RV32ZBB-NEXT:  .LBB32_2:
2619 ; RV32ZBB-NEXT:    sub a5, t0, a5
2620 ; RV32ZBB-NEXT:    sub a4, a7, a4
2621 ; RV32ZBB-NEXT:    sub a3, a2, a3
2622 ; RV32ZBB-NEXT:    sltu a2, a5, t1
2623 ; RV32ZBB-NEXT:    sub t0, a4, a6
2624 ; RV32ZBB-NEXT:    sub a4, a5, t1
2625 ; RV32ZBB-NEXT:    sub a5, a1, a2
2626 ; RV32ZBB-NEXT:    srai a1, a5, 31
2627 ; RV32ZBB-NEXT:    xor a2, a4, a1
2628 ; RV32ZBB-NEXT:    xor a5, a5, a1
2629 ; RV32ZBB-NEXT:    xor a4, a3, a1
2630 ; RV32ZBB-NEXT:    sltu a3, a1, a2
2631 ; RV32ZBB-NEXT:    sub a6, a1, a5
2632 ; RV32ZBB-NEXT:    sltu a5, a1, a4
2633 ; RV32ZBB-NEXT:    sub a3, a6, a3
2634 ; RV32ZBB-NEXT:    xor a7, t0, a1
2635 ; RV32ZBB-NEXT:    mv a6, a5
2636 ; RV32ZBB-NEXT:    beqz t0, .LBB32_4
2637 ; RV32ZBB-NEXT:  # %bb.3:
2638 ; RV32ZBB-NEXT:    sltu a6, a1, a7
2639 ; RV32ZBB-NEXT:  .LBB32_4:
2640 ; RV32ZBB-NEXT:    sub a2, a1, a2
2641 ; RV32ZBB-NEXT:    sub a7, a1, a7
2642 ; RV32ZBB-NEXT:    sub a1, a1, a4
2643 ; RV32ZBB-NEXT:    sltu a4, a2, a6
2644 ; RV32ZBB-NEXT:    sub a2, a2, a6
2645 ; RV32ZBB-NEXT:    sub a5, a7, a5
2646 ; RV32ZBB-NEXT:    sub a3, a3, a4
2647 ; RV32ZBB-NEXT:    sw a1, 0(a0)
2648 ; RV32ZBB-NEXT:    sw a5, 4(a0)
2649 ; RV32ZBB-NEXT:    sw a2, 8(a0)
2650 ; RV32ZBB-NEXT:    sw a3, 12(a0)
2651 ; RV32ZBB-NEXT:    ret
2653 ; RV64ZBB-LABEL: abd_subnsw_i128_undef:
2654 ; RV64ZBB:       # %bb.0:
2655 ; RV64ZBB-NEXT:    sltu a4, a0, a2
2656 ; RV64ZBB-NEXT:    sub a1, a1, a3
2657 ; RV64ZBB-NEXT:    sub a0, a0, a2
2658 ; RV64ZBB-NEXT:    sub a1, a1, a4
2659 ; RV64ZBB-NEXT:    srai a2, a1, 63
2660 ; RV64ZBB-NEXT:    xor a0, a0, a2
2661 ; RV64ZBB-NEXT:    xor a1, a1, a2
2662 ; RV64ZBB-NEXT:    sltu a3, a2, a0
2663 ; RV64ZBB-NEXT:    sub a1, a2, a1
2664 ; RV64ZBB-NEXT:    sub a1, a1, a3
2665 ; RV64ZBB-NEXT:    sub a0, a2, a0
2666 ; RV64ZBB-NEXT:    ret
2667   %sub = sub nsw i128 %a, %b
2668   %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
2669   %nabs = sub i128 0, %abs
2670   ret i128 %nabs
2673 declare i8 @llvm.abs.i8(i8, i1)
2674 declare i16 @llvm.abs.i16(i16, i1)
2675 declare i32 @llvm.abs.i32(i32, i1)
2676 declare i64 @llvm.abs.i64(i64, i1)
2677 declare i128 @llvm.abs.i128(i128, i1)
2679 declare i8 @llvm.smax.i8(i8, i8)
2680 declare i16 @llvm.smax.i16(i16, i16)
2681 declare i32 @llvm.smax.i32(i32, i32)
2682 declare i64 @llvm.smax.i64(i64, i64)
2684 declare i8 @llvm.smin.i8(i8, i8)
2685 declare i16 @llvm.smin.i16(i16, i16)
2686 declare i32 @llvm.smin.i32(i32, i32)
2687 declare i64 @llvm.smin.i64(i64, i64)