xref: /llvm-project/llvm/test/CodeGen/RISCV/abds-neg.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
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
6;
7; trunc(nabs(sub(sext(a),sext(b)))) -> nabds(a,b)
8;
9
10define 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
22;
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
34;
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
43;
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
59}
60
61define 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
73;
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
85;
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
94;
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
110}
111
112define 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
124;
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
136;
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
145;
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
161}
162
163define 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
175;
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
187;
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
196;
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
212}
213
214define 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
228;
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
239;
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
247;
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
263}
264
265define 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
277;
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
289;
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
298;
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
314}
315
316define 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
328;
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
338;
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
345;
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
361}
362
363define 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
377;
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
388;
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
396;
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
412}
413
414define 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
426;
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
436;
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
443;
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
459}
460
461define 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
487;
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
499;
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
525;
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
539}
540
541define 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
567;
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
579;
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
605;
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
619}
620
621define 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
714;
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
740;
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
833;
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
866}
867
868define 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
961;
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
987;
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
1080;
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
1113}
1114
1115;
1116; sub(smin(a,b),smax(a,b)) -> nabds(a,b)
1117;
1118
1119define 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
1139;
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
1159;
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
1172}
1173
1174define 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
1194;
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
1214;
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
1227}
1228
1229define 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
1245;
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
1263;
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
1270;
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
1283}
1284
1285define 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
1319;
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
1335;
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
1369;
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
1380}
1381
1382define 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
1475;
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
1509;
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
1602;
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
1640}
1641
1642;
1643; select(icmp(a,b),sub(a,b),sub(b,a)) -> nabds(a,b)
1644;
1645
1646define 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
1660;
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
1674;
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
1691}
1692
1693define 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
1707;
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
1721;
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
1738}
1739
1740define 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
1750;
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
1762;
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
1772;
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
1789}
1790
1791define 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
1812;
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
1822;
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
1843;
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
1858}
1859
1860define 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
1926;
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
1947;
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
2013;
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
2039}
2040
2041;
2042; nabs(sub_nsw(x, y)) -> nabds(a,b)
2043;
2044
2045define 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
2054;
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
2063;
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
2072;
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
2085}
2086
2087define 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
2096;
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
2105;
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
2114;
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
2127}
2128
2129define 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
2138;
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
2147;
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
2156;
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
2169}
2170
2171define 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
2180;
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
2189;
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
2198;
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
2211}
2212
2213define 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
2221;
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
2229;
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
2236;
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
2248}
2249
2250define 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
2258;
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
2266;
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
2273;
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
2285}
2286
2287define 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
2302;
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
2310;
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
2325;
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
2336}
2337
2338define 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
2353;
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
2361;
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
2376;
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
2387}
2388
2389define 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
2442;
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
2457;
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
2510;
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
2529}
2530
2531define 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
2584;
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
2599;
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
2652;
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
2671}
2672
2673declare i8 @llvm.abs.i8(i8, i1)
2674declare i16 @llvm.abs.i16(i16, i1)
2675declare i32 @llvm.abs.i32(i32, i1)
2676declare i64 @llvm.abs.i64(i64, i1)
2677declare i128 @llvm.abs.i128(i128, i1)
2678
2679declare i8 @llvm.smax.i8(i8, i8)
2680declare i16 @llvm.smax.i16(i16, i16)
2681declare i32 @llvm.smax.i32(i32, i32)
2682declare i64 @llvm.smax.i64(i64, i64)
2683
2684declare i8 @llvm.smin.i8(i8, i8)
2685declare i16 @llvm.smin.i16(i16, i16)
2686declare i32 @llvm.smin.i32(i32, i32)
2687declare i64 @llvm.smin.i64(i64, i64)
2688