xref: /llvm-project/llvm/test/CodeGen/RISCV/abdu.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=CHECK,NOZBB,RV32I
3; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=CHECK,NOZBB,RV64I
4; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | FileCheck %s --check-prefixes=CHECK,ZBB,RV32ZBB
5; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | FileCheck %s --check-prefixes=CHECK,ZBB,RV64ZBB
6
7;
8; trunc(abs(sub(zext(a),zext(b)))) -> abdu(a,b)
9;
10
11define i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
12; RV32I-LABEL: abd_ext_i8:
13; RV32I:       # %bb.0:
14; RV32I-NEXT:    andi a1, a1, 255
15; RV32I-NEXT:    andi a0, a0, 255
16; RV32I-NEXT:    sub a0, a0, a1
17; RV32I-NEXT:    srai a1, a0, 31
18; RV32I-NEXT:    xor a0, a0, a1
19; RV32I-NEXT:    sub a0, a0, a1
20; RV32I-NEXT:    ret
21;
22; RV64I-LABEL: abd_ext_i8:
23; RV64I:       # %bb.0:
24; RV64I-NEXT:    andi a1, a1, 255
25; RV64I-NEXT:    andi a0, a0, 255
26; RV64I-NEXT:    sub a0, a0, a1
27; RV64I-NEXT:    srai a1, a0, 63
28; RV64I-NEXT:    xor a0, a0, a1
29; RV64I-NEXT:    sub a0, a0, a1
30; RV64I-NEXT:    ret
31;
32; ZBB-LABEL: abd_ext_i8:
33; ZBB:       # %bb.0:
34; ZBB-NEXT:    andi a1, a1, 255
35; ZBB-NEXT:    andi a0, a0, 255
36; ZBB-NEXT:    minu a2, a0, a1
37; ZBB-NEXT:    maxu a0, a0, a1
38; ZBB-NEXT:    sub a0, a0, a2
39; ZBB-NEXT:    ret
40  %aext = zext i8 %a to i64
41  %bext = zext i8 %b to i64
42  %sub = sub i64 %aext, %bext
43  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
44  %trunc = trunc i64 %abs to i8
45  ret i8 %trunc
46}
47
48define i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
49; RV32I-LABEL: abd_ext_i8_i16:
50; RV32I:       # %bb.0:
51; RV32I-NEXT:    slli a1, a1, 16
52; RV32I-NEXT:    srli a1, a1, 16
53; RV32I-NEXT:    andi a0, a0, 255
54; RV32I-NEXT:    sub a0, a0, a1
55; RV32I-NEXT:    srai a1, a0, 31
56; RV32I-NEXT:    xor a0, a0, a1
57; RV32I-NEXT:    sub a0, a0, a1
58; RV32I-NEXT:    ret
59;
60; RV64I-LABEL: abd_ext_i8_i16:
61; RV64I:       # %bb.0:
62; RV64I-NEXT:    slli a1, a1, 48
63; RV64I-NEXT:    srli a1, a1, 48
64; RV64I-NEXT:    andi a0, a0, 255
65; RV64I-NEXT:    sub a0, a0, a1
66; RV64I-NEXT:    srai a1, a0, 63
67; RV64I-NEXT:    xor a0, a0, a1
68; RV64I-NEXT:    sub a0, a0, a1
69; RV64I-NEXT:    ret
70;
71; ZBB-LABEL: abd_ext_i8_i16:
72; ZBB:       # %bb.0:
73; ZBB-NEXT:    zext.h a1, a1
74; ZBB-NEXT:    andi a0, a0, 255
75; ZBB-NEXT:    minu a2, a0, a1
76; ZBB-NEXT:    maxu a0, a0, a1
77; ZBB-NEXT:    sub a0, a0, a2
78; ZBB-NEXT:    ret
79  %aext = zext i8 %a to i64
80  %bext = zext i16 %b to i64
81  %sub = sub i64 %aext, %bext
82  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
83  %trunc = trunc i64 %abs to i8
84  ret i8 %trunc
85}
86
87define i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
88; RV32I-LABEL: abd_ext_i8_undef:
89; RV32I:       # %bb.0:
90; RV32I-NEXT:    andi a1, a1, 255
91; RV32I-NEXT:    andi a0, a0, 255
92; RV32I-NEXT:    sub a0, a0, a1
93; RV32I-NEXT:    srai a1, a0, 31
94; RV32I-NEXT:    xor a0, a0, a1
95; RV32I-NEXT:    sub a0, a0, a1
96; RV32I-NEXT:    ret
97;
98; RV64I-LABEL: abd_ext_i8_undef:
99; RV64I:       # %bb.0:
100; RV64I-NEXT:    andi a1, a1, 255
101; RV64I-NEXT:    andi a0, a0, 255
102; RV64I-NEXT:    sub a0, a0, a1
103; RV64I-NEXT:    srai a1, a0, 63
104; RV64I-NEXT:    xor a0, a0, a1
105; RV64I-NEXT:    sub a0, a0, a1
106; RV64I-NEXT:    ret
107;
108; ZBB-LABEL: abd_ext_i8_undef:
109; ZBB:       # %bb.0:
110; ZBB-NEXT:    andi a1, a1, 255
111; ZBB-NEXT:    andi a0, a0, 255
112; ZBB-NEXT:    minu a2, a0, a1
113; ZBB-NEXT:    maxu a0, a0, a1
114; ZBB-NEXT:    sub a0, a0, a2
115; ZBB-NEXT:    ret
116  %aext = zext i8 %a to i64
117  %bext = zext i8 %b to i64
118  %sub = sub i64 %aext, %bext
119  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
120  %trunc = trunc i64 %abs to i8
121  ret i8 %trunc
122}
123
124define i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
125; RV32I-LABEL: abd_ext_i16:
126; RV32I:       # %bb.0:
127; RV32I-NEXT:    lui a2, 16
128; RV32I-NEXT:    addi a2, a2, -1
129; RV32I-NEXT:    and a1, a1, a2
130; RV32I-NEXT:    and a0, a0, a2
131; RV32I-NEXT:    sub a0, a0, a1
132; RV32I-NEXT:    srai a1, a0, 31
133; RV32I-NEXT:    xor a0, a0, a1
134; RV32I-NEXT:    sub a0, a0, a1
135; RV32I-NEXT:    ret
136;
137; RV64I-LABEL: abd_ext_i16:
138; RV64I:       # %bb.0:
139; RV64I-NEXT:    lui a2, 16
140; RV64I-NEXT:    addiw a2, a2, -1
141; RV64I-NEXT:    and a1, a1, a2
142; RV64I-NEXT:    and a0, a0, a2
143; RV64I-NEXT:    sub a0, a0, a1
144; RV64I-NEXT:    srai a1, a0, 63
145; RV64I-NEXT:    xor a0, a0, a1
146; RV64I-NEXT:    sub a0, a0, a1
147; RV64I-NEXT:    ret
148;
149; ZBB-LABEL: abd_ext_i16:
150; ZBB:       # %bb.0:
151; ZBB-NEXT:    zext.h a1, a1
152; ZBB-NEXT:    zext.h a0, a0
153; ZBB-NEXT:    minu a2, a0, a1
154; ZBB-NEXT:    maxu a0, a0, a1
155; ZBB-NEXT:    sub a0, a0, a2
156; ZBB-NEXT:    ret
157  %aext = zext i16 %a to i64
158  %bext = zext i16 %b to i64
159  %sub = sub i64 %aext, %bext
160  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
161  %trunc = trunc i64 %abs to i16
162  ret i16 %trunc
163}
164
165define i16 @abd_ext_i16_i32(i16 %a, i32 %b) nounwind {
166; RV32I-LABEL: abd_ext_i16_i32:
167; RV32I:       # %bb.0:
168; RV32I-NEXT:    slli a0, a0, 16
169; RV32I-NEXT:    srli a0, a0, 16
170; RV32I-NEXT:    bltu a1, a0, .LBB4_2
171; RV32I-NEXT:  # %bb.1:
172; RV32I-NEXT:    sub a0, a1, a0
173; RV32I-NEXT:    ret
174; RV32I-NEXT:  .LBB4_2:
175; RV32I-NEXT:    sub a0, a0, a1
176; RV32I-NEXT:    ret
177;
178; RV64I-LABEL: abd_ext_i16_i32:
179; RV64I:       # %bb.0:
180; RV64I-NEXT:    slli a1, a1, 32
181; RV64I-NEXT:    slli a0, a0, 48
182; RV64I-NEXT:    srli a1, a1, 32
183; RV64I-NEXT:    srli a0, a0, 48
184; RV64I-NEXT:    sub a0, a0, a1
185; RV64I-NEXT:    srai a1, a0, 63
186; RV64I-NEXT:    xor a0, a0, a1
187; RV64I-NEXT:    sub a0, a0, a1
188; RV64I-NEXT:    ret
189;
190; RV32ZBB-LABEL: abd_ext_i16_i32:
191; RV32ZBB:       # %bb.0:
192; RV32ZBB-NEXT:    zext.h a0, a0
193; RV32ZBB-NEXT:    minu a2, a0, a1
194; RV32ZBB-NEXT:    maxu a0, a0, a1
195; RV32ZBB-NEXT:    sub a0, a0, a2
196; RV32ZBB-NEXT:    ret
197;
198; RV64ZBB-LABEL: abd_ext_i16_i32:
199; RV64ZBB:       # %bb.0:
200; RV64ZBB-NEXT:    slli a1, a1, 32
201; RV64ZBB-NEXT:    zext.h a0, a0
202; RV64ZBB-NEXT:    srli a1, a1, 32
203; RV64ZBB-NEXT:    minu a2, a0, a1
204; RV64ZBB-NEXT:    maxu a0, a0, a1
205; RV64ZBB-NEXT:    sub a0, a0, a2
206; RV64ZBB-NEXT:    ret
207  %aext = zext i16 %a to i64
208  %bext = zext i32 %b to i64
209  %sub = sub i64 %aext, %bext
210  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
211  %trunc = trunc i64 %abs to i16
212  ret i16 %trunc
213}
214
215define i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
216; RV32I-LABEL: abd_ext_i16_undef:
217; RV32I:       # %bb.0:
218; RV32I-NEXT:    lui a2, 16
219; RV32I-NEXT:    addi a2, a2, -1
220; RV32I-NEXT:    and a1, a1, a2
221; RV32I-NEXT:    and a0, a0, a2
222; RV32I-NEXT:    sub a0, a0, a1
223; RV32I-NEXT:    srai a1, a0, 31
224; RV32I-NEXT:    xor a0, a0, a1
225; RV32I-NEXT:    sub a0, a0, a1
226; RV32I-NEXT:    ret
227;
228; RV64I-LABEL: abd_ext_i16_undef:
229; RV64I:       # %bb.0:
230; RV64I-NEXT:    lui a2, 16
231; RV64I-NEXT:    addiw a2, a2, -1
232; RV64I-NEXT:    and a1, a1, a2
233; RV64I-NEXT:    and a0, a0, a2
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, a0, a1
238; RV64I-NEXT:    ret
239;
240; ZBB-LABEL: abd_ext_i16_undef:
241; ZBB:       # %bb.0:
242; ZBB-NEXT:    zext.h a1, a1
243; ZBB-NEXT:    zext.h a0, a0
244; ZBB-NEXT:    minu a2, a0, a1
245; ZBB-NEXT:    maxu a0, a0, a1
246; ZBB-NEXT:    sub a0, a0, a2
247; ZBB-NEXT:    ret
248  %aext = zext i16 %a to i64
249  %bext = zext i16 %b to i64
250  %sub = sub i64 %aext, %bext
251  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
252  %trunc = trunc i64 %abs to i16
253  ret i16 %trunc
254}
255
256define i32 @abd_ext_i32(i32 %a, i32 %b) nounwind {
257; RV32I-LABEL: abd_ext_i32:
258; RV32I:       # %bb.0:
259; RV32I-NEXT:    bltu a1, a0, .LBB6_2
260; RV32I-NEXT:  # %bb.1:
261; RV32I-NEXT:    sub a0, a1, a0
262; RV32I-NEXT:    ret
263; RV32I-NEXT:  .LBB6_2:
264; RV32I-NEXT:    sub a0, a0, a1
265; RV32I-NEXT:    ret
266;
267; RV64I-LABEL: abd_ext_i32:
268; RV64I:       # %bb.0:
269; RV64I-NEXT:    slli a1, a1, 32
270; RV64I-NEXT:    slli a0, a0, 32
271; RV64I-NEXT:    srli a1, a1, 32
272; RV64I-NEXT:    srli a0, a0, 32
273; RV64I-NEXT:    sub a0, a0, a1
274; RV64I-NEXT:    srai a1, a0, 63
275; RV64I-NEXT:    xor a0, a0, a1
276; RV64I-NEXT:    sub a0, a0, a1
277; RV64I-NEXT:    ret
278;
279; RV32ZBB-LABEL: abd_ext_i32:
280; RV32ZBB:       # %bb.0:
281; RV32ZBB-NEXT:    minu a2, a0, a1
282; RV32ZBB-NEXT:    maxu a0, a0, a1
283; RV32ZBB-NEXT:    sub a0, a0, a2
284; RV32ZBB-NEXT:    ret
285;
286; RV64ZBB-LABEL: abd_ext_i32:
287; RV64ZBB:       # %bb.0:
288; RV64ZBB-NEXT:    slli a1, a1, 32
289; RV64ZBB-NEXT:    slli a0, a0, 32
290; RV64ZBB-NEXT:    srli a1, a1, 32
291; RV64ZBB-NEXT:    srli a0, a0, 32
292; RV64ZBB-NEXT:    minu a2, a0, a1
293; RV64ZBB-NEXT:    maxu a0, a0, a1
294; RV64ZBB-NEXT:    sub a0, a0, a2
295; RV64ZBB-NEXT:    ret
296  %aext = zext i32 %a to i64
297  %bext = zext i32 %b to i64
298  %sub = sub i64 %aext, %bext
299  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
300  %trunc = trunc i64 %abs to i32
301  ret i32 %trunc
302}
303
304define i32 @abd_ext_i32_i16(i32 %a, i16 %b) nounwind {
305; RV32I-LABEL: abd_ext_i32_i16:
306; RV32I:       # %bb.0:
307; RV32I-NEXT:    slli a1, a1, 16
308; RV32I-NEXT:    srli a1, a1, 16
309; RV32I-NEXT:    bltu a1, a0, .LBB7_2
310; RV32I-NEXT:  # %bb.1:
311; RV32I-NEXT:    sub a0, a1, a0
312; RV32I-NEXT:    ret
313; RV32I-NEXT:  .LBB7_2:
314; RV32I-NEXT:    sub a0, a0, a1
315; RV32I-NEXT:    ret
316;
317; RV64I-LABEL: abd_ext_i32_i16:
318; RV64I:       # %bb.0:
319; RV64I-NEXT:    slli a0, a0, 32
320; RV64I-NEXT:    slli a1, a1, 48
321; RV64I-NEXT:    srli a0, a0, 32
322; RV64I-NEXT:    srli a1, a1, 48
323; RV64I-NEXT:    sub a0, a0, a1
324; RV64I-NEXT:    srai a1, a0, 63
325; RV64I-NEXT:    xor a0, a0, a1
326; RV64I-NEXT:    sub a0, a0, a1
327; RV64I-NEXT:    ret
328;
329; RV32ZBB-LABEL: abd_ext_i32_i16:
330; RV32ZBB:       # %bb.0:
331; RV32ZBB-NEXT:    zext.h a1, a1
332; RV32ZBB-NEXT:    minu a2, a0, a1
333; RV32ZBB-NEXT:    maxu a0, a0, a1
334; RV32ZBB-NEXT:    sub a0, a0, a2
335; RV32ZBB-NEXT:    ret
336;
337; RV64ZBB-LABEL: abd_ext_i32_i16:
338; RV64ZBB:       # %bb.0:
339; RV64ZBB-NEXT:    slli a0, a0, 32
340; RV64ZBB-NEXT:    zext.h a1, a1
341; RV64ZBB-NEXT:    srli a0, a0, 32
342; RV64ZBB-NEXT:    minu a2, a0, a1
343; RV64ZBB-NEXT:    maxu a0, a0, a1
344; RV64ZBB-NEXT:    sub a0, a0, a2
345; RV64ZBB-NEXT:    ret
346  %aext = zext i32 %a to i64
347  %bext = zext i16 %b to i64
348  %sub = sub i64 %aext, %bext
349  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
350  %trunc = trunc i64 %abs to i32
351  ret i32 %trunc
352}
353
354define i32 @abd_ext_i32_undef(i32 %a, i32 %b) nounwind {
355; RV32I-LABEL: abd_ext_i32_undef:
356; RV32I:       # %bb.0:
357; RV32I-NEXT:    bltu a1, a0, .LBB8_2
358; RV32I-NEXT:  # %bb.1:
359; RV32I-NEXT:    sub a0, a1, a0
360; RV32I-NEXT:    ret
361; RV32I-NEXT:  .LBB8_2:
362; RV32I-NEXT:    sub a0, a0, a1
363; RV32I-NEXT:    ret
364;
365; RV64I-LABEL: abd_ext_i32_undef:
366; RV64I:       # %bb.0:
367; RV64I-NEXT:    slli a1, a1, 32
368; RV64I-NEXT:    slli a0, a0, 32
369; RV64I-NEXT:    srli a1, a1, 32
370; RV64I-NEXT:    srli a0, a0, 32
371; RV64I-NEXT:    sub a0, a0, a1
372; RV64I-NEXT:    srai a1, a0, 63
373; RV64I-NEXT:    xor a0, a0, a1
374; RV64I-NEXT:    sub a0, a0, a1
375; RV64I-NEXT:    ret
376;
377; RV32ZBB-LABEL: abd_ext_i32_undef:
378; RV32ZBB:       # %bb.0:
379; RV32ZBB-NEXT:    minu a2, a0, a1
380; RV32ZBB-NEXT:    maxu a0, a0, a1
381; RV32ZBB-NEXT:    sub a0, a0, a2
382; RV32ZBB-NEXT:    ret
383;
384; RV64ZBB-LABEL: abd_ext_i32_undef:
385; RV64ZBB:       # %bb.0:
386; RV64ZBB-NEXT:    slli a1, a1, 32
387; RV64ZBB-NEXT:    slli a0, a0, 32
388; RV64ZBB-NEXT:    srli a1, a1, 32
389; RV64ZBB-NEXT:    srli a0, a0, 32
390; RV64ZBB-NEXT:    minu a2, a0, a1
391; RV64ZBB-NEXT:    maxu a0, a0, a1
392; RV64ZBB-NEXT:    sub a0, a0, a2
393; RV64ZBB-NEXT:    ret
394  %aext = zext i32 %a to i64
395  %bext = zext i32 %b to i64
396  %sub = sub i64 %aext, %bext
397  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
398  %trunc = trunc i64 %abs to i32
399  ret i32 %trunc
400}
401
402define i64 @abd_ext_i64(i64 %a, i64 %b) nounwind {
403; RV32I-LABEL: abd_ext_i64:
404; RV32I:       # %bb.0:
405; RV32I-NEXT:    sltu a4, a0, a2
406; RV32I-NEXT:    sub a3, a1, a3
407; RV32I-NEXT:    sub a3, a3, a4
408; RV32I-NEXT:    sub a2, a0, a2
409; RV32I-NEXT:    beq a3, a1, .LBB9_2
410; RV32I-NEXT:  # %bb.1:
411; RV32I-NEXT:    sltu a0, a1, a3
412; RV32I-NEXT:    j .LBB9_3
413; RV32I-NEXT:  .LBB9_2:
414; RV32I-NEXT:    sltu a0, a0, a2
415; RV32I-NEXT:  .LBB9_3:
416; RV32I-NEXT:    neg a1, a0
417; RV32I-NEXT:    xor a2, a2, a1
418; RV32I-NEXT:    xor a3, a3, a1
419; RV32I-NEXT:    sltu a1, a2, a1
420; RV32I-NEXT:    add a3, a3, a0
421; RV32I-NEXT:    sub a1, a3, a1
422; RV32I-NEXT:    add a0, a2, a0
423; RV32I-NEXT:    ret
424;
425; RV64I-LABEL: abd_ext_i64:
426; RV64I:       # %bb.0:
427; RV64I-NEXT:    bltu a1, a0, .LBB9_2
428; RV64I-NEXT:  # %bb.1:
429; RV64I-NEXT:    sub a0, a1, a0
430; RV64I-NEXT:    ret
431; RV64I-NEXT:  .LBB9_2:
432; RV64I-NEXT:    sub a0, a0, a1
433; RV64I-NEXT:    ret
434;
435; RV32ZBB-LABEL: abd_ext_i64:
436; RV32ZBB:       # %bb.0:
437; RV32ZBB-NEXT:    sltu a4, a0, a2
438; RV32ZBB-NEXT:    sub a3, a1, a3
439; RV32ZBB-NEXT:    sub a3, a3, a4
440; RV32ZBB-NEXT:    sub a2, a0, a2
441; RV32ZBB-NEXT:    beq a3, a1, .LBB9_2
442; RV32ZBB-NEXT:  # %bb.1:
443; RV32ZBB-NEXT:    sltu a0, a1, a3
444; RV32ZBB-NEXT:    j .LBB9_3
445; RV32ZBB-NEXT:  .LBB9_2:
446; RV32ZBB-NEXT:    sltu a0, a0, a2
447; RV32ZBB-NEXT:  .LBB9_3:
448; RV32ZBB-NEXT:    neg a1, a0
449; RV32ZBB-NEXT:    xor a2, a2, a1
450; RV32ZBB-NEXT:    xor a3, a3, a1
451; RV32ZBB-NEXT:    sltu a1, a2, a1
452; RV32ZBB-NEXT:    add a3, a3, a0
453; RV32ZBB-NEXT:    sub a1, a3, a1
454; RV32ZBB-NEXT:    add a0, a2, a0
455; RV32ZBB-NEXT:    ret
456;
457; RV64ZBB-LABEL: abd_ext_i64:
458; RV64ZBB:       # %bb.0:
459; RV64ZBB-NEXT:    minu a2, a0, a1
460; RV64ZBB-NEXT:    maxu a0, a0, a1
461; RV64ZBB-NEXT:    sub a0, a0, a2
462; RV64ZBB-NEXT:    ret
463  %aext = zext i64 %a to i128
464  %bext = zext i64 %b to i128
465  %sub = sub i128 %aext, %bext
466  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
467  %trunc = trunc i128 %abs to i64
468  ret i64 %trunc
469}
470
471define i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {
472; RV32I-LABEL: abd_ext_i64_undef:
473; RV32I:       # %bb.0:
474; RV32I-NEXT:    sltu a4, a0, a2
475; RV32I-NEXT:    sub a3, a1, a3
476; RV32I-NEXT:    sub a3, a3, a4
477; RV32I-NEXT:    sub a2, a0, a2
478; RV32I-NEXT:    beq a3, a1, .LBB10_2
479; RV32I-NEXT:  # %bb.1:
480; RV32I-NEXT:    sltu a0, a1, a3
481; RV32I-NEXT:    j .LBB10_3
482; RV32I-NEXT:  .LBB10_2:
483; RV32I-NEXT:    sltu a0, a0, a2
484; RV32I-NEXT:  .LBB10_3:
485; RV32I-NEXT:    neg a1, a0
486; RV32I-NEXT:    xor a2, a2, a1
487; RV32I-NEXT:    xor a3, a3, a1
488; RV32I-NEXT:    sltu a1, a2, a1
489; RV32I-NEXT:    add a3, a3, a0
490; RV32I-NEXT:    sub a1, a3, a1
491; RV32I-NEXT:    add a0, a2, a0
492; RV32I-NEXT:    ret
493;
494; RV64I-LABEL: abd_ext_i64_undef:
495; RV64I:       # %bb.0:
496; RV64I-NEXT:    bltu a1, a0, .LBB10_2
497; RV64I-NEXT:  # %bb.1:
498; RV64I-NEXT:    sub a0, a1, a0
499; RV64I-NEXT:    ret
500; RV64I-NEXT:  .LBB10_2:
501; RV64I-NEXT:    sub a0, a0, a1
502; RV64I-NEXT:    ret
503;
504; RV32ZBB-LABEL: abd_ext_i64_undef:
505; RV32ZBB:       # %bb.0:
506; RV32ZBB-NEXT:    sltu a4, a0, a2
507; RV32ZBB-NEXT:    sub a3, a1, a3
508; RV32ZBB-NEXT:    sub a3, a3, a4
509; RV32ZBB-NEXT:    sub a2, a0, a2
510; RV32ZBB-NEXT:    beq a3, a1, .LBB10_2
511; RV32ZBB-NEXT:  # %bb.1:
512; RV32ZBB-NEXT:    sltu a0, a1, a3
513; RV32ZBB-NEXT:    j .LBB10_3
514; RV32ZBB-NEXT:  .LBB10_2:
515; RV32ZBB-NEXT:    sltu a0, a0, a2
516; RV32ZBB-NEXT:  .LBB10_3:
517; RV32ZBB-NEXT:    neg a1, a0
518; RV32ZBB-NEXT:    xor a2, a2, a1
519; RV32ZBB-NEXT:    xor a3, a3, a1
520; RV32ZBB-NEXT:    sltu a1, a2, a1
521; RV32ZBB-NEXT:    add a3, a3, a0
522; RV32ZBB-NEXT:    sub a1, a3, a1
523; RV32ZBB-NEXT:    add a0, a2, a0
524; RV32ZBB-NEXT:    ret
525;
526; RV64ZBB-LABEL: abd_ext_i64_undef:
527; RV64ZBB:       # %bb.0:
528; RV64ZBB-NEXT:    minu a2, a0, a1
529; RV64ZBB-NEXT:    maxu a0, a0, a1
530; RV64ZBB-NEXT:    sub a0, a0, a2
531; RV64ZBB-NEXT:    ret
532  %aext = zext i64 %a to i128
533  %bext = zext i64 %b to i128
534  %sub = sub i128 %aext, %bext
535  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
536  %trunc = trunc i128 %abs to i64
537  ret i64 %trunc
538}
539
540define i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {
541; RV32I-LABEL: abd_ext_i128:
542; RV32I:       # %bb.0:
543; RV32I-NEXT:    lw a3, 0(a2)
544; RV32I-NEXT:    lw a5, 4(a2)
545; RV32I-NEXT:    lw a6, 8(a2)
546; RV32I-NEXT:    lw a7, 12(a2)
547; RV32I-NEXT:    lw a2, 8(a1)
548; RV32I-NEXT:    lw a4, 12(a1)
549; RV32I-NEXT:    lw t0, 0(a1)
550; RV32I-NEXT:    lw a1, 4(a1)
551; RV32I-NEXT:    sltu t1, a2, a6
552; RV32I-NEXT:    sub a7, a4, a7
553; RV32I-NEXT:    sltu t2, t0, a3
554; RV32I-NEXT:    sub a7, a7, t1
555; RV32I-NEXT:    mv t1, t2
556; RV32I-NEXT:    beq a1, a5, .LBB11_2
557; RV32I-NEXT:  # %bb.1:
558; RV32I-NEXT:    sltu t1, a1, a5
559; RV32I-NEXT:  .LBB11_2:
560; RV32I-NEXT:    sub t3, a2, a6
561; RV32I-NEXT:    sltu a6, t3, t1
562; RV32I-NEXT:    sub a6, a7, a6
563; RV32I-NEXT:    sub a7, t3, t1
564; RV32I-NEXT:    beq a6, a4, .LBB11_4
565; RV32I-NEXT:  # %bb.3:
566; RV32I-NEXT:    sltu t1, a4, a6
567; RV32I-NEXT:    j .LBB11_5
568; RV32I-NEXT:  .LBB11_4:
569; RV32I-NEXT:    sltu t1, a2, a7
570; RV32I-NEXT:  .LBB11_5:
571; RV32I-NEXT:    sub a5, a1, a5
572; RV32I-NEXT:    sub a5, a5, t2
573; RV32I-NEXT:    sub a3, t0, a3
574; RV32I-NEXT:    beq a5, a1, .LBB11_7
575; RV32I-NEXT:  # %bb.6:
576; RV32I-NEXT:    sltu a1, a1, a5
577; RV32I-NEXT:    j .LBB11_8
578; RV32I-NEXT:  .LBB11_7:
579; RV32I-NEXT:    sltu a1, t0, a3
580; RV32I-NEXT:  .LBB11_8:
581; RV32I-NEXT:    xor a4, a6, a4
582; RV32I-NEXT:    xor a2, a7, a2
583; RV32I-NEXT:    or a2, a2, a4
584; RV32I-NEXT:    beqz a2, .LBB11_10
585; RV32I-NEXT:  # %bb.9:
586; RV32I-NEXT:    mv a1, t1
587; RV32I-NEXT:  .LBB11_10:
588; RV32I-NEXT:    neg t0, a1
589; RV32I-NEXT:    xor a2, a7, t0
590; RV32I-NEXT:    xor a6, a6, t0
591; RV32I-NEXT:    xor a4, a3, t0
592; RV32I-NEXT:    sltu a3, a2, t0
593; RV32I-NEXT:    add a7, a6, a1
594; RV32I-NEXT:    sltu a6, a4, t0
595; RV32I-NEXT:    sub a3, a7, a3
596; RV32I-NEXT:    xor t1, a5, t0
597; RV32I-NEXT:    mv a7, a6
598; RV32I-NEXT:    beqz a5, .LBB11_12
599; RV32I-NEXT:  # %bb.11:
600; RV32I-NEXT:    sltu a7, t1, t0
601; RV32I-NEXT:  .LBB11_12:
602; RV32I-NEXT:    add a2, a2, a1
603; RV32I-NEXT:    add t1, t1, a1
604; RV32I-NEXT:    add a1, a4, a1
605; RV32I-NEXT:    sltu a4, a2, a7
606; RV32I-NEXT:    sub a2, a2, a7
607; RV32I-NEXT:    sub a5, t1, a6
608; RV32I-NEXT:    sub a3, a3, a4
609; RV32I-NEXT:    sw a1, 0(a0)
610; RV32I-NEXT:    sw a5, 4(a0)
611; RV32I-NEXT:    sw a2, 8(a0)
612; RV32I-NEXT:    sw a3, 12(a0)
613; RV32I-NEXT:    ret
614;
615; RV64I-LABEL: abd_ext_i128:
616; RV64I:       # %bb.0:
617; RV64I-NEXT:    sltu a4, a0, a2
618; RV64I-NEXT:    sub a3, a1, a3
619; RV64I-NEXT:    sub a3, a3, a4
620; RV64I-NEXT:    sub a2, a0, a2
621; RV64I-NEXT:    beq a3, a1, .LBB11_2
622; RV64I-NEXT:  # %bb.1:
623; RV64I-NEXT:    sltu a0, a1, a3
624; RV64I-NEXT:    j .LBB11_3
625; RV64I-NEXT:  .LBB11_2:
626; RV64I-NEXT:    sltu a0, a0, a2
627; RV64I-NEXT:  .LBB11_3:
628; RV64I-NEXT:    neg a1, a0
629; RV64I-NEXT:    xor a2, a2, a1
630; RV64I-NEXT:    xor a3, a3, a1
631; RV64I-NEXT:    sltu a1, a2, a1
632; RV64I-NEXT:    add a3, a3, a0
633; RV64I-NEXT:    sub a1, a3, a1
634; RV64I-NEXT:    add a0, a2, a0
635; RV64I-NEXT:    ret
636;
637; RV32ZBB-LABEL: abd_ext_i128:
638; RV32ZBB:       # %bb.0:
639; RV32ZBB-NEXT:    lw a3, 0(a2)
640; RV32ZBB-NEXT:    lw a5, 4(a2)
641; RV32ZBB-NEXT:    lw a6, 8(a2)
642; RV32ZBB-NEXT:    lw a7, 12(a2)
643; RV32ZBB-NEXT:    lw a2, 8(a1)
644; RV32ZBB-NEXT:    lw a4, 12(a1)
645; RV32ZBB-NEXT:    lw t0, 0(a1)
646; RV32ZBB-NEXT:    lw a1, 4(a1)
647; RV32ZBB-NEXT:    sltu t1, a2, a6
648; RV32ZBB-NEXT:    sub a7, a4, a7
649; RV32ZBB-NEXT:    sltu t2, t0, a3
650; RV32ZBB-NEXT:    sub a7, a7, t1
651; RV32ZBB-NEXT:    mv t1, t2
652; RV32ZBB-NEXT:    beq a1, a5, .LBB11_2
653; RV32ZBB-NEXT:  # %bb.1:
654; RV32ZBB-NEXT:    sltu t1, a1, a5
655; RV32ZBB-NEXT:  .LBB11_2:
656; RV32ZBB-NEXT:    sub t3, a2, a6
657; RV32ZBB-NEXT:    sltu a6, t3, t1
658; RV32ZBB-NEXT:    sub a6, a7, a6
659; RV32ZBB-NEXT:    sub a7, t3, t1
660; RV32ZBB-NEXT:    beq a6, a4, .LBB11_4
661; RV32ZBB-NEXT:  # %bb.3:
662; RV32ZBB-NEXT:    sltu t1, a4, a6
663; RV32ZBB-NEXT:    j .LBB11_5
664; RV32ZBB-NEXT:  .LBB11_4:
665; RV32ZBB-NEXT:    sltu t1, a2, a7
666; RV32ZBB-NEXT:  .LBB11_5:
667; RV32ZBB-NEXT:    sub a5, a1, a5
668; RV32ZBB-NEXT:    sub a5, a5, t2
669; RV32ZBB-NEXT:    sub a3, t0, a3
670; RV32ZBB-NEXT:    beq a5, a1, .LBB11_7
671; RV32ZBB-NEXT:  # %bb.6:
672; RV32ZBB-NEXT:    sltu a1, a1, a5
673; RV32ZBB-NEXT:    j .LBB11_8
674; RV32ZBB-NEXT:  .LBB11_7:
675; RV32ZBB-NEXT:    sltu a1, t0, a3
676; RV32ZBB-NEXT:  .LBB11_8:
677; RV32ZBB-NEXT:    xor a4, a6, a4
678; RV32ZBB-NEXT:    xor a2, a7, a2
679; RV32ZBB-NEXT:    or a2, a2, a4
680; RV32ZBB-NEXT:    beqz a2, .LBB11_10
681; RV32ZBB-NEXT:  # %bb.9:
682; RV32ZBB-NEXT:    mv a1, t1
683; RV32ZBB-NEXT:  .LBB11_10:
684; RV32ZBB-NEXT:    neg t0, a1
685; RV32ZBB-NEXT:    xor a2, a7, t0
686; RV32ZBB-NEXT:    xor a6, a6, t0
687; RV32ZBB-NEXT:    xor a4, a3, t0
688; RV32ZBB-NEXT:    sltu a3, a2, t0
689; RV32ZBB-NEXT:    add a7, a6, a1
690; RV32ZBB-NEXT:    sltu a6, a4, t0
691; RV32ZBB-NEXT:    sub a3, a7, a3
692; RV32ZBB-NEXT:    xor t1, a5, t0
693; RV32ZBB-NEXT:    mv a7, a6
694; RV32ZBB-NEXT:    beqz a5, .LBB11_12
695; RV32ZBB-NEXT:  # %bb.11:
696; RV32ZBB-NEXT:    sltu a7, t1, t0
697; RV32ZBB-NEXT:  .LBB11_12:
698; RV32ZBB-NEXT:    add a2, a2, a1
699; RV32ZBB-NEXT:    add t1, t1, a1
700; RV32ZBB-NEXT:    add a1, a4, a1
701; RV32ZBB-NEXT:    sltu a4, a2, a7
702; RV32ZBB-NEXT:    sub a2, a2, a7
703; RV32ZBB-NEXT:    sub a5, t1, a6
704; RV32ZBB-NEXT:    sub a3, a3, a4
705; RV32ZBB-NEXT:    sw a1, 0(a0)
706; RV32ZBB-NEXT:    sw a5, 4(a0)
707; RV32ZBB-NEXT:    sw a2, 8(a0)
708; RV32ZBB-NEXT:    sw a3, 12(a0)
709; RV32ZBB-NEXT:    ret
710;
711; RV64ZBB-LABEL: abd_ext_i128:
712; RV64ZBB:       # %bb.0:
713; RV64ZBB-NEXT:    sltu a4, a0, a2
714; RV64ZBB-NEXT:    sub a3, a1, a3
715; RV64ZBB-NEXT:    sub a3, a3, a4
716; RV64ZBB-NEXT:    sub a2, a0, a2
717; RV64ZBB-NEXT:    beq a3, a1, .LBB11_2
718; RV64ZBB-NEXT:  # %bb.1:
719; RV64ZBB-NEXT:    sltu a0, a1, a3
720; RV64ZBB-NEXT:    j .LBB11_3
721; RV64ZBB-NEXT:  .LBB11_2:
722; RV64ZBB-NEXT:    sltu a0, a0, a2
723; RV64ZBB-NEXT:  .LBB11_3:
724; RV64ZBB-NEXT:    neg a1, a0
725; RV64ZBB-NEXT:    xor a2, a2, a1
726; RV64ZBB-NEXT:    xor a3, a3, a1
727; RV64ZBB-NEXT:    sltu a1, a2, a1
728; RV64ZBB-NEXT:    add a3, a3, a0
729; RV64ZBB-NEXT:    sub a1, a3, a1
730; RV64ZBB-NEXT:    add a0, a2, a0
731; RV64ZBB-NEXT:    ret
732  %aext = zext i128 %a to i256
733  %bext = zext i128 %b to i256
734  %sub = sub i256 %aext, %bext
735  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false)
736  %trunc = trunc i256 %abs to i128
737  ret i128 %trunc
738}
739
740define i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {
741; RV32I-LABEL: abd_ext_i128_undef:
742; RV32I:       # %bb.0:
743; RV32I-NEXT:    lw a3, 0(a2)
744; RV32I-NEXT:    lw a5, 4(a2)
745; RV32I-NEXT:    lw a6, 8(a2)
746; RV32I-NEXT:    lw a7, 12(a2)
747; RV32I-NEXT:    lw a2, 8(a1)
748; RV32I-NEXT:    lw a4, 12(a1)
749; RV32I-NEXT:    lw t0, 0(a1)
750; RV32I-NEXT:    lw a1, 4(a1)
751; RV32I-NEXT:    sltu t1, a2, a6
752; RV32I-NEXT:    sub a7, a4, a7
753; RV32I-NEXT:    sltu t2, t0, a3
754; RV32I-NEXT:    sub a7, a7, t1
755; RV32I-NEXT:    mv t1, t2
756; RV32I-NEXT:    beq a1, a5, .LBB12_2
757; RV32I-NEXT:  # %bb.1:
758; RV32I-NEXT:    sltu t1, a1, a5
759; RV32I-NEXT:  .LBB12_2:
760; RV32I-NEXT:    sub t3, a2, a6
761; RV32I-NEXT:    sltu a6, t3, t1
762; RV32I-NEXT:    sub a6, a7, a6
763; RV32I-NEXT:    sub a7, t3, t1
764; RV32I-NEXT:    beq a6, a4, .LBB12_4
765; RV32I-NEXT:  # %bb.3:
766; RV32I-NEXT:    sltu t1, a4, a6
767; RV32I-NEXT:    j .LBB12_5
768; RV32I-NEXT:  .LBB12_4:
769; RV32I-NEXT:    sltu t1, a2, a7
770; RV32I-NEXT:  .LBB12_5:
771; RV32I-NEXT:    sub a5, a1, a5
772; RV32I-NEXT:    sub a5, a5, t2
773; RV32I-NEXT:    sub a3, t0, a3
774; RV32I-NEXT:    beq a5, a1, .LBB12_7
775; RV32I-NEXT:  # %bb.6:
776; RV32I-NEXT:    sltu a1, a1, a5
777; RV32I-NEXT:    j .LBB12_8
778; RV32I-NEXT:  .LBB12_7:
779; RV32I-NEXT:    sltu a1, t0, a3
780; RV32I-NEXT:  .LBB12_8:
781; RV32I-NEXT:    xor a4, a6, a4
782; RV32I-NEXT:    xor a2, a7, a2
783; RV32I-NEXT:    or a2, a2, a4
784; RV32I-NEXT:    beqz a2, .LBB12_10
785; RV32I-NEXT:  # %bb.9:
786; RV32I-NEXT:    mv a1, t1
787; RV32I-NEXT:  .LBB12_10:
788; RV32I-NEXT:    neg t0, a1
789; RV32I-NEXT:    xor a2, a7, t0
790; RV32I-NEXT:    xor a6, a6, t0
791; RV32I-NEXT:    xor a4, a3, t0
792; RV32I-NEXT:    sltu a3, a2, t0
793; RV32I-NEXT:    add a7, a6, a1
794; RV32I-NEXT:    sltu a6, a4, t0
795; RV32I-NEXT:    sub a3, a7, a3
796; RV32I-NEXT:    xor t1, a5, t0
797; RV32I-NEXT:    mv a7, a6
798; RV32I-NEXT:    beqz a5, .LBB12_12
799; RV32I-NEXT:  # %bb.11:
800; RV32I-NEXT:    sltu a7, t1, t0
801; RV32I-NEXT:  .LBB12_12:
802; RV32I-NEXT:    add a2, a2, a1
803; RV32I-NEXT:    add t1, t1, a1
804; RV32I-NEXT:    add a1, a4, a1
805; RV32I-NEXT:    sltu a4, a2, a7
806; RV32I-NEXT:    sub a2, a2, a7
807; RV32I-NEXT:    sub a5, t1, a6
808; RV32I-NEXT:    sub a3, a3, a4
809; RV32I-NEXT:    sw a1, 0(a0)
810; RV32I-NEXT:    sw a5, 4(a0)
811; RV32I-NEXT:    sw a2, 8(a0)
812; RV32I-NEXT:    sw a3, 12(a0)
813; RV32I-NEXT:    ret
814;
815; RV64I-LABEL: abd_ext_i128_undef:
816; RV64I:       # %bb.0:
817; RV64I-NEXT:    sltu a4, a0, a2
818; RV64I-NEXT:    sub a3, a1, a3
819; RV64I-NEXT:    sub a3, a3, a4
820; RV64I-NEXT:    sub a2, a0, a2
821; RV64I-NEXT:    beq a3, a1, .LBB12_2
822; RV64I-NEXT:  # %bb.1:
823; RV64I-NEXT:    sltu a0, a1, a3
824; RV64I-NEXT:    j .LBB12_3
825; RV64I-NEXT:  .LBB12_2:
826; RV64I-NEXT:    sltu a0, a0, a2
827; RV64I-NEXT:  .LBB12_3:
828; RV64I-NEXT:    neg a1, a0
829; RV64I-NEXT:    xor a2, a2, a1
830; RV64I-NEXT:    xor a3, a3, a1
831; RV64I-NEXT:    sltu a1, a2, a1
832; RV64I-NEXT:    add a3, a3, a0
833; RV64I-NEXT:    sub a1, a3, a1
834; RV64I-NEXT:    add a0, a2, a0
835; RV64I-NEXT:    ret
836;
837; RV32ZBB-LABEL: abd_ext_i128_undef:
838; RV32ZBB:       # %bb.0:
839; RV32ZBB-NEXT:    lw a3, 0(a2)
840; RV32ZBB-NEXT:    lw a5, 4(a2)
841; RV32ZBB-NEXT:    lw a6, 8(a2)
842; RV32ZBB-NEXT:    lw a7, 12(a2)
843; RV32ZBB-NEXT:    lw a2, 8(a1)
844; RV32ZBB-NEXT:    lw a4, 12(a1)
845; RV32ZBB-NEXT:    lw t0, 0(a1)
846; RV32ZBB-NEXT:    lw a1, 4(a1)
847; RV32ZBB-NEXT:    sltu t1, a2, a6
848; RV32ZBB-NEXT:    sub a7, a4, a7
849; RV32ZBB-NEXT:    sltu t2, t0, a3
850; RV32ZBB-NEXT:    sub a7, a7, t1
851; RV32ZBB-NEXT:    mv t1, t2
852; RV32ZBB-NEXT:    beq a1, a5, .LBB12_2
853; RV32ZBB-NEXT:  # %bb.1:
854; RV32ZBB-NEXT:    sltu t1, a1, a5
855; RV32ZBB-NEXT:  .LBB12_2:
856; RV32ZBB-NEXT:    sub t3, a2, a6
857; RV32ZBB-NEXT:    sltu a6, t3, t1
858; RV32ZBB-NEXT:    sub a6, a7, a6
859; RV32ZBB-NEXT:    sub a7, t3, t1
860; RV32ZBB-NEXT:    beq a6, a4, .LBB12_4
861; RV32ZBB-NEXT:  # %bb.3:
862; RV32ZBB-NEXT:    sltu t1, a4, a6
863; RV32ZBB-NEXT:    j .LBB12_5
864; RV32ZBB-NEXT:  .LBB12_4:
865; RV32ZBB-NEXT:    sltu t1, a2, a7
866; RV32ZBB-NEXT:  .LBB12_5:
867; RV32ZBB-NEXT:    sub a5, a1, a5
868; RV32ZBB-NEXT:    sub a5, a5, t2
869; RV32ZBB-NEXT:    sub a3, t0, a3
870; RV32ZBB-NEXT:    beq a5, a1, .LBB12_7
871; RV32ZBB-NEXT:  # %bb.6:
872; RV32ZBB-NEXT:    sltu a1, a1, a5
873; RV32ZBB-NEXT:    j .LBB12_8
874; RV32ZBB-NEXT:  .LBB12_7:
875; RV32ZBB-NEXT:    sltu a1, t0, a3
876; RV32ZBB-NEXT:  .LBB12_8:
877; RV32ZBB-NEXT:    xor a4, a6, a4
878; RV32ZBB-NEXT:    xor a2, a7, a2
879; RV32ZBB-NEXT:    or a2, a2, a4
880; RV32ZBB-NEXT:    beqz a2, .LBB12_10
881; RV32ZBB-NEXT:  # %bb.9:
882; RV32ZBB-NEXT:    mv a1, t1
883; RV32ZBB-NEXT:  .LBB12_10:
884; RV32ZBB-NEXT:    neg t0, a1
885; RV32ZBB-NEXT:    xor a2, a7, t0
886; RV32ZBB-NEXT:    xor a6, a6, t0
887; RV32ZBB-NEXT:    xor a4, a3, t0
888; RV32ZBB-NEXT:    sltu a3, a2, t0
889; RV32ZBB-NEXT:    add a7, a6, a1
890; RV32ZBB-NEXT:    sltu a6, a4, t0
891; RV32ZBB-NEXT:    sub a3, a7, a3
892; RV32ZBB-NEXT:    xor t1, a5, t0
893; RV32ZBB-NEXT:    mv a7, a6
894; RV32ZBB-NEXT:    beqz a5, .LBB12_12
895; RV32ZBB-NEXT:  # %bb.11:
896; RV32ZBB-NEXT:    sltu a7, t1, t0
897; RV32ZBB-NEXT:  .LBB12_12:
898; RV32ZBB-NEXT:    add a2, a2, a1
899; RV32ZBB-NEXT:    add t1, t1, a1
900; RV32ZBB-NEXT:    add a1, a4, a1
901; RV32ZBB-NEXT:    sltu a4, a2, a7
902; RV32ZBB-NEXT:    sub a2, a2, a7
903; RV32ZBB-NEXT:    sub a5, t1, a6
904; RV32ZBB-NEXT:    sub a3, a3, a4
905; RV32ZBB-NEXT:    sw a1, 0(a0)
906; RV32ZBB-NEXT:    sw a5, 4(a0)
907; RV32ZBB-NEXT:    sw a2, 8(a0)
908; RV32ZBB-NEXT:    sw a3, 12(a0)
909; RV32ZBB-NEXT:    ret
910;
911; RV64ZBB-LABEL: abd_ext_i128_undef:
912; RV64ZBB:       # %bb.0:
913; RV64ZBB-NEXT:    sltu a4, a0, a2
914; RV64ZBB-NEXT:    sub a3, a1, a3
915; RV64ZBB-NEXT:    sub a3, a3, a4
916; RV64ZBB-NEXT:    sub a2, a0, a2
917; RV64ZBB-NEXT:    beq a3, a1, .LBB12_2
918; RV64ZBB-NEXT:  # %bb.1:
919; RV64ZBB-NEXT:    sltu a0, a1, a3
920; RV64ZBB-NEXT:    j .LBB12_3
921; RV64ZBB-NEXT:  .LBB12_2:
922; RV64ZBB-NEXT:    sltu a0, a0, a2
923; RV64ZBB-NEXT:  .LBB12_3:
924; RV64ZBB-NEXT:    neg a1, a0
925; RV64ZBB-NEXT:    xor a2, a2, a1
926; RV64ZBB-NEXT:    xor a3, a3, a1
927; RV64ZBB-NEXT:    sltu a1, a2, a1
928; RV64ZBB-NEXT:    add a3, a3, a0
929; RV64ZBB-NEXT:    sub a1, a3, a1
930; RV64ZBB-NEXT:    add a0, a2, a0
931; RV64ZBB-NEXT:    ret
932  %aext = zext i128 %a to i256
933  %bext = zext i128 %b to i256
934  %sub = sub i256 %aext, %bext
935  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true)
936  %trunc = trunc i256 %abs to i128
937  ret i128 %trunc
938}
939
940;
941; sub(umax(a,b),umin(a,b)) -> abdu(a,b)
942;
943
944define i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
945; RV32I-LABEL: abd_minmax_i8:
946; RV32I:       # %bb.0:
947; RV32I-NEXT:    andi a1, a1, 255
948; RV32I-NEXT:    andi a0, a0, 255
949; RV32I-NEXT:    sub a0, a0, a1
950; RV32I-NEXT:    srai a1, a0, 31
951; RV32I-NEXT:    xor a0, a0, a1
952; RV32I-NEXT:    sub a0, a0, a1
953; RV32I-NEXT:    ret
954;
955; RV64I-LABEL: abd_minmax_i8:
956; RV64I:       # %bb.0:
957; RV64I-NEXT:    andi a1, a1, 255
958; RV64I-NEXT:    andi a0, a0, 255
959; RV64I-NEXT:    sub a0, a0, a1
960; RV64I-NEXT:    srai a1, a0, 63
961; RV64I-NEXT:    xor a0, a0, a1
962; RV64I-NEXT:    sub a0, a0, a1
963; RV64I-NEXT:    ret
964;
965; ZBB-LABEL: abd_minmax_i8:
966; ZBB:       # %bb.0:
967; ZBB-NEXT:    andi a1, a1, 255
968; ZBB-NEXT:    andi a0, a0, 255
969; ZBB-NEXT:    minu a2, a0, a1
970; ZBB-NEXT:    maxu a0, a0, a1
971; ZBB-NEXT:    sub a0, a0, a2
972; ZBB-NEXT:    ret
973  %min = call i8 @llvm.umin.i8(i8 %a, i8 %b)
974  %max = call i8 @llvm.umax.i8(i8 %a, i8 %b)
975  %sub = sub i8 %max, %min
976  ret i8 %sub
977}
978
979define i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
980; RV32I-LABEL: abd_minmax_i16:
981; RV32I:       # %bb.0:
982; RV32I-NEXT:    lui a2, 16
983; RV32I-NEXT:    addi a2, a2, -1
984; RV32I-NEXT:    and a1, a1, a2
985; RV32I-NEXT:    and a0, a0, a2
986; RV32I-NEXT:    sub a0, a0, a1
987; RV32I-NEXT:    srai a1, a0, 31
988; RV32I-NEXT:    xor a0, a0, a1
989; RV32I-NEXT:    sub a0, a0, a1
990; RV32I-NEXT:    ret
991;
992; RV64I-LABEL: abd_minmax_i16:
993; RV64I:       # %bb.0:
994; RV64I-NEXT:    lui a2, 16
995; RV64I-NEXT:    addiw a2, a2, -1
996; RV64I-NEXT:    and a1, a1, a2
997; RV64I-NEXT:    and a0, a0, a2
998; RV64I-NEXT:    sub a0, a0, a1
999; RV64I-NEXT:    srai a1, a0, 63
1000; RV64I-NEXT:    xor a0, a0, a1
1001; RV64I-NEXT:    sub a0, a0, a1
1002; RV64I-NEXT:    ret
1003;
1004; ZBB-LABEL: abd_minmax_i16:
1005; ZBB:       # %bb.0:
1006; ZBB-NEXT:    zext.h a1, a1
1007; ZBB-NEXT:    zext.h a0, a0
1008; ZBB-NEXT:    minu a2, a0, a1
1009; ZBB-NEXT:    maxu a0, a0, a1
1010; ZBB-NEXT:    sub a0, a0, a2
1011; ZBB-NEXT:    ret
1012  %min = call i16 @llvm.umin.i16(i16 %a, i16 %b)
1013  %max = call i16 @llvm.umax.i16(i16 %a, i16 %b)
1014  %sub = sub i16 %max, %min
1015  ret i16 %sub
1016}
1017
1018define i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind {
1019; RV32I-LABEL: abd_minmax_i32:
1020; RV32I:       # %bb.0:
1021; RV32I-NEXT:    bltu a1, a0, .LBB15_2
1022; RV32I-NEXT:  # %bb.1:
1023; RV32I-NEXT:    sub a0, a1, a0
1024; RV32I-NEXT:    ret
1025; RV32I-NEXT:  .LBB15_2:
1026; RV32I-NEXT:    sub a0, a0, a1
1027; RV32I-NEXT:    ret
1028;
1029; RV64I-LABEL: abd_minmax_i32:
1030; RV64I:       # %bb.0:
1031; RV64I-NEXT:    slli a1, a1, 32
1032; RV64I-NEXT:    slli a0, a0, 32
1033; RV64I-NEXT:    srli a1, a1, 32
1034; RV64I-NEXT:    srli a0, a0, 32
1035; RV64I-NEXT:    sub a0, a0, a1
1036; RV64I-NEXT:    srai a1, a0, 63
1037; RV64I-NEXT:    xor a0, a0, a1
1038; RV64I-NEXT:    sub a0, a0, a1
1039; RV64I-NEXT:    ret
1040;
1041; RV32ZBB-LABEL: abd_minmax_i32:
1042; RV32ZBB:       # %bb.0:
1043; RV32ZBB-NEXT:    minu a2, a0, a1
1044; RV32ZBB-NEXT:    maxu a0, a0, a1
1045; RV32ZBB-NEXT:    sub a0, a0, a2
1046; RV32ZBB-NEXT:    ret
1047;
1048; RV64ZBB-LABEL: abd_minmax_i32:
1049; RV64ZBB:       # %bb.0:
1050; RV64ZBB-NEXT:    slli a1, a1, 32
1051; RV64ZBB-NEXT:    slli a0, a0, 32
1052; RV64ZBB-NEXT:    srli a1, a1, 32
1053; RV64ZBB-NEXT:    srli a0, a0, 32
1054; RV64ZBB-NEXT:    minu a2, a0, a1
1055; RV64ZBB-NEXT:    maxu a0, a0, a1
1056; RV64ZBB-NEXT:    sub a0, a0, a2
1057; RV64ZBB-NEXT:    ret
1058  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
1059  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
1060  %sub = sub i32 %max, %min
1061  ret i32 %sub
1062}
1063
1064define i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind {
1065; RV32I-LABEL: abd_minmax_i64:
1066; RV32I:       # %bb.0:
1067; RV32I-NEXT:    sltu a4, a0, a2
1068; RV32I-NEXT:    sub a3, a1, a3
1069; RV32I-NEXT:    sub a3, a3, a4
1070; RV32I-NEXT:    sub a2, a0, a2
1071; RV32I-NEXT:    beq a3, a1, .LBB16_2
1072; RV32I-NEXT:  # %bb.1:
1073; RV32I-NEXT:    sltu a0, a1, a3
1074; RV32I-NEXT:    j .LBB16_3
1075; RV32I-NEXT:  .LBB16_2:
1076; RV32I-NEXT:    sltu a0, a0, a2
1077; RV32I-NEXT:  .LBB16_3:
1078; RV32I-NEXT:    neg a1, a0
1079; RV32I-NEXT:    xor a2, a2, a1
1080; RV32I-NEXT:    xor a3, a3, a1
1081; RV32I-NEXT:    sltu a1, a2, a1
1082; RV32I-NEXT:    add a3, a3, a0
1083; RV32I-NEXT:    sub a1, a3, a1
1084; RV32I-NEXT:    add a0, a2, a0
1085; RV32I-NEXT:    ret
1086;
1087; RV64I-LABEL: abd_minmax_i64:
1088; RV64I:       # %bb.0:
1089; RV64I-NEXT:    bltu a1, a0, .LBB16_2
1090; RV64I-NEXT:  # %bb.1:
1091; RV64I-NEXT:    sub a0, a1, a0
1092; RV64I-NEXT:    ret
1093; RV64I-NEXT:  .LBB16_2:
1094; RV64I-NEXT:    sub a0, a0, a1
1095; RV64I-NEXT:    ret
1096;
1097; RV32ZBB-LABEL: abd_minmax_i64:
1098; RV32ZBB:       # %bb.0:
1099; RV32ZBB-NEXT:    sltu a4, a0, a2
1100; RV32ZBB-NEXT:    sub a3, a1, a3
1101; RV32ZBB-NEXT:    sub a3, a3, a4
1102; RV32ZBB-NEXT:    sub a2, a0, a2
1103; RV32ZBB-NEXT:    beq a3, a1, .LBB16_2
1104; RV32ZBB-NEXT:  # %bb.1:
1105; RV32ZBB-NEXT:    sltu a0, a1, a3
1106; RV32ZBB-NEXT:    j .LBB16_3
1107; RV32ZBB-NEXT:  .LBB16_2:
1108; RV32ZBB-NEXT:    sltu a0, a0, a2
1109; RV32ZBB-NEXT:  .LBB16_3:
1110; RV32ZBB-NEXT:    neg a1, a0
1111; RV32ZBB-NEXT:    xor a2, a2, a1
1112; RV32ZBB-NEXT:    xor a3, a3, a1
1113; RV32ZBB-NEXT:    sltu a1, a2, a1
1114; RV32ZBB-NEXT:    add a3, a3, a0
1115; RV32ZBB-NEXT:    sub a1, a3, a1
1116; RV32ZBB-NEXT:    add a0, a2, a0
1117; RV32ZBB-NEXT:    ret
1118;
1119; RV64ZBB-LABEL: abd_minmax_i64:
1120; RV64ZBB:       # %bb.0:
1121; RV64ZBB-NEXT:    minu a2, a0, a1
1122; RV64ZBB-NEXT:    maxu a0, a0, a1
1123; RV64ZBB-NEXT:    sub a0, a0, a2
1124; RV64ZBB-NEXT:    ret
1125  %min = call i64 @llvm.umin.i64(i64 %a, i64 %b)
1126  %max = call i64 @llvm.umax.i64(i64 %a, i64 %b)
1127  %sub = sub i64 %max, %min
1128  ret i64 %sub
1129}
1130
1131define i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind {
1132; RV32I-LABEL: abd_minmax_i128:
1133; RV32I:       # %bb.0:
1134; RV32I-NEXT:    lw a3, 0(a2)
1135; RV32I-NEXT:    lw a5, 4(a2)
1136; RV32I-NEXT:    lw a6, 8(a2)
1137; RV32I-NEXT:    lw a7, 12(a2)
1138; RV32I-NEXT:    lw a2, 8(a1)
1139; RV32I-NEXT:    lw a4, 12(a1)
1140; RV32I-NEXT:    lw t0, 0(a1)
1141; RV32I-NEXT:    lw a1, 4(a1)
1142; RV32I-NEXT:    sltu t1, a2, a6
1143; RV32I-NEXT:    sub a7, a4, a7
1144; RV32I-NEXT:    sltu t2, t0, a3
1145; RV32I-NEXT:    sub a7, a7, t1
1146; RV32I-NEXT:    mv t1, t2
1147; RV32I-NEXT:    beq a1, a5, .LBB17_2
1148; RV32I-NEXT:  # %bb.1:
1149; RV32I-NEXT:    sltu t1, a1, a5
1150; RV32I-NEXT:  .LBB17_2:
1151; RV32I-NEXT:    sub t3, a2, a6
1152; RV32I-NEXT:    sltu a6, t3, t1
1153; RV32I-NEXT:    sub a6, a7, a6
1154; RV32I-NEXT:    sub a7, t3, t1
1155; RV32I-NEXT:    beq a6, a4, .LBB17_4
1156; RV32I-NEXT:  # %bb.3:
1157; RV32I-NEXT:    sltu t1, a4, a6
1158; RV32I-NEXT:    j .LBB17_5
1159; RV32I-NEXT:  .LBB17_4:
1160; RV32I-NEXT:    sltu t1, a2, a7
1161; RV32I-NEXT:  .LBB17_5:
1162; RV32I-NEXT:    sub a5, a1, a5
1163; RV32I-NEXT:    sub a5, a5, t2
1164; RV32I-NEXT:    sub a3, t0, a3
1165; RV32I-NEXT:    beq a5, a1, .LBB17_7
1166; RV32I-NEXT:  # %bb.6:
1167; RV32I-NEXT:    sltu a1, a1, a5
1168; RV32I-NEXT:    j .LBB17_8
1169; RV32I-NEXT:  .LBB17_7:
1170; RV32I-NEXT:    sltu a1, t0, a3
1171; RV32I-NEXT:  .LBB17_8:
1172; RV32I-NEXT:    xor a4, a6, a4
1173; RV32I-NEXT:    xor a2, a7, a2
1174; RV32I-NEXT:    or a2, a2, a4
1175; RV32I-NEXT:    beqz a2, .LBB17_10
1176; RV32I-NEXT:  # %bb.9:
1177; RV32I-NEXT:    mv a1, t1
1178; RV32I-NEXT:  .LBB17_10:
1179; RV32I-NEXT:    neg t0, a1
1180; RV32I-NEXT:    xor a2, a7, t0
1181; RV32I-NEXT:    xor a6, a6, t0
1182; RV32I-NEXT:    xor a4, a3, t0
1183; RV32I-NEXT:    sltu a3, a2, t0
1184; RV32I-NEXT:    add a7, a6, a1
1185; RV32I-NEXT:    sltu a6, a4, t0
1186; RV32I-NEXT:    sub a3, a7, a3
1187; RV32I-NEXT:    xor t1, a5, t0
1188; RV32I-NEXT:    mv a7, a6
1189; RV32I-NEXT:    beqz a5, .LBB17_12
1190; RV32I-NEXT:  # %bb.11:
1191; RV32I-NEXT:    sltu a7, t1, t0
1192; RV32I-NEXT:  .LBB17_12:
1193; RV32I-NEXT:    add a2, a2, a1
1194; RV32I-NEXT:    add t1, t1, a1
1195; RV32I-NEXT:    add a1, a4, a1
1196; RV32I-NEXT:    sltu a4, a2, a7
1197; RV32I-NEXT:    sub a2, a2, a7
1198; RV32I-NEXT:    sub a5, t1, a6
1199; RV32I-NEXT:    sub a3, a3, a4
1200; RV32I-NEXT:    sw a1, 0(a0)
1201; RV32I-NEXT:    sw a5, 4(a0)
1202; RV32I-NEXT:    sw a2, 8(a0)
1203; RV32I-NEXT:    sw a3, 12(a0)
1204; RV32I-NEXT:    ret
1205;
1206; RV64I-LABEL: abd_minmax_i128:
1207; RV64I:       # %bb.0:
1208; RV64I-NEXT:    sltu a4, a0, a2
1209; RV64I-NEXT:    sub a3, a1, a3
1210; RV64I-NEXT:    sub a3, a3, a4
1211; RV64I-NEXT:    sub a2, a0, a2
1212; RV64I-NEXT:    beq a3, a1, .LBB17_2
1213; RV64I-NEXT:  # %bb.1:
1214; RV64I-NEXT:    sltu a0, a1, a3
1215; RV64I-NEXT:    j .LBB17_3
1216; RV64I-NEXT:  .LBB17_2:
1217; RV64I-NEXT:    sltu a0, a0, a2
1218; RV64I-NEXT:  .LBB17_3:
1219; RV64I-NEXT:    neg a1, a0
1220; RV64I-NEXT:    xor a2, a2, a1
1221; RV64I-NEXT:    xor a3, a3, a1
1222; RV64I-NEXT:    sltu a1, a2, a1
1223; RV64I-NEXT:    add a3, a3, a0
1224; RV64I-NEXT:    sub a1, a3, a1
1225; RV64I-NEXT:    add a0, a2, a0
1226; RV64I-NEXT:    ret
1227;
1228; RV32ZBB-LABEL: abd_minmax_i128:
1229; RV32ZBB:       # %bb.0:
1230; RV32ZBB-NEXT:    lw a3, 0(a2)
1231; RV32ZBB-NEXT:    lw a5, 4(a2)
1232; RV32ZBB-NEXT:    lw a6, 8(a2)
1233; RV32ZBB-NEXT:    lw a7, 12(a2)
1234; RV32ZBB-NEXT:    lw a2, 8(a1)
1235; RV32ZBB-NEXT:    lw a4, 12(a1)
1236; RV32ZBB-NEXT:    lw t0, 0(a1)
1237; RV32ZBB-NEXT:    lw a1, 4(a1)
1238; RV32ZBB-NEXT:    sltu t1, a2, a6
1239; RV32ZBB-NEXT:    sub a7, a4, a7
1240; RV32ZBB-NEXT:    sltu t2, t0, a3
1241; RV32ZBB-NEXT:    sub a7, a7, t1
1242; RV32ZBB-NEXT:    mv t1, t2
1243; RV32ZBB-NEXT:    beq a1, a5, .LBB17_2
1244; RV32ZBB-NEXT:  # %bb.1:
1245; RV32ZBB-NEXT:    sltu t1, a1, a5
1246; RV32ZBB-NEXT:  .LBB17_2:
1247; RV32ZBB-NEXT:    sub t3, a2, a6
1248; RV32ZBB-NEXT:    sltu a6, t3, t1
1249; RV32ZBB-NEXT:    sub a6, a7, a6
1250; RV32ZBB-NEXT:    sub a7, t3, t1
1251; RV32ZBB-NEXT:    beq a6, a4, .LBB17_4
1252; RV32ZBB-NEXT:  # %bb.3:
1253; RV32ZBB-NEXT:    sltu t1, a4, a6
1254; RV32ZBB-NEXT:    j .LBB17_5
1255; RV32ZBB-NEXT:  .LBB17_4:
1256; RV32ZBB-NEXT:    sltu t1, a2, a7
1257; RV32ZBB-NEXT:  .LBB17_5:
1258; RV32ZBB-NEXT:    sub a5, a1, a5
1259; RV32ZBB-NEXT:    sub a5, a5, t2
1260; RV32ZBB-NEXT:    sub a3, t0, a3
1261; RV32ZBB-NEXT:    beq a5, a1, .LBB17_7
1262; RV32ZBB-NEXT:  # %bb.6:
1263; RV32ZBB-NEXT:    sltu a1, a1, a5
1264; RV32ZBB-NEXT:    j .LBB17_8
1265; RV32ZBB-NEXT:  .LBB17_7:
1266; RV32ZBB-NEXT:    sltu a1, t0, a3
1267; RV32ZBB-NEXT:  .LBB17_8:
1268; RV32ZBB-NEXT:    xor a4, a6, a4
1269; RV32ZBB-NEXT:    xor a2, a7, a2
1270; RV32ZBB-NEXT:    or a2, a2, a4
1271; RV32ZBB-NEXT:    beqz a2, .LBB17_10
1272; RV32ZBB-NEXT:  # %bb.9:
1273; RV32ZBB-NEXT:    mv a1, t1
1274; RV32ZBB-NEXT:  .LBB17_10:
1275; RV32ZBB-NEXT:    neg t0, a1
1276; RV32ZBB-NEXT:    xor a2, a7, t0
1277; RV32ZBB-NEXT:    xor a6, a6, t0
1278; RV32ZBB-NEXT:    xor a4, a3, t0
1279; RV32ZBB-NEXT:    sltu a3, a2, t0
1280; RV32ZBB-NEXT:    add a7, a6, a1
1281; RV32ZBB-NEXT:    sltu a6, a4, t0
1282; RV32ZBB-NEXT:    sub a3, a7, a3
1283; RV32ZBB-NEXT:    xor t1, a5, t0
1284; RV32ZBB-NEXT:    mv a7, a6
1285; RV32ZBB-NEXT:    beqz a5, .LBB17_12
1286; RV32ZBB-NEXT:  # %bb.11:
1287; RV32ZBB-NEXT:    sltu a7, t1, t0
1288; RV32ZBB-NEXT:  .LBB17_12:
1289; RV32ZBB-NEXT:    add a2, a2, a1
1290; RV32ZBB-NEXT:    add t1, t1, a1
1291; RV32ZBB-NEXT:    add a1, a4, a1
1292; RV32ZBB-NEXT:    sltu a4, a2, a7
1293; RV32ZBB-NEXT:    sub a2, a2, a7
1294; RV32ZBB-NEXT:    sub a5, t1, a6
1295; RV32ZBB-NEXT:    sub a3, a3, a4
1296; RV32ZBB-NEXT:    sw a1, 0(a0)
1297; RV32ZBB-NEXT:    sw a5, 4(a0)
1298; RV32ZBB-NEXT:    sw a2, 8(a0)
1299; RV32ZBB-NEXT:    sw a3, 12(a0)
1300; RV32ZBB-NEXT:    ret
1301;
1302; RV64ZBB-LABEL: abd_minmax_i128:
1303; RV64ZBB:       # %bb.0:
1304; RV64ZBB-NEXT:    sltu a4, a0, a2
1305; RV64ZBB-NEXT:    sub a3, a1, a3
1306; RV64ZBB-NEXT:    sub a3, a3, a4
1307; RV64ZBB-NEXT:    sub a2, a0, a2
1308; RV64ZBB-NEXT:    beq a3, a1, .LBB17_2
1309; RV64ZBB-NEXT:  # %bb.1:
1310; RV64ZBB-NEXT:    sltu a0, a1, a3
1311; RV64ZBB-NEXT:    j .LBB17_3
1312; RV64ZBB-NEXT:  .LBB17_2:
1313; RV64ZBB-NEXT:    sltu a0, a0, a2
1314; RV64ZBB-NEXT:  .LBB17_3:
1315; RV64ZBB-NEXT:    neg a1, a0
1316; RV64ZBB-NEXT:    xor a2, a2, a1
1317; RV64ZBB-NEXT:    xor a3, a3, a1
1318; RV64ZBB-NEXT:    sltu a1, a2, a1
1319; RV64ZBB-NEXT:    add a3, a3, a0
1320; RV64ZBB-NEXT:    sub a1, a3, a1
1321; RV64ZBB-NEXT:    add a0, a2, a0
1322; RV64ZBB-NEXT:    ret
1323  %min = call i128 @llvm.umin.i128(i128 %a, i128 %b)
1324  %max = call i128 @llvm.umax.i128(i128 %a, i128 %b)
1325  %sub = sub i128 %max, %min
1326  ret i128 %sub
1327}
1328
1329;
1330; select(icmp(a,b),sub(a,b),sub(b,a)) -> abdu(a,b)
1331;
1332
1333define i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
1334; RV32I-LABEL: abd_cmp_i8:
1335; RV32I:       # %bb.0:
1336; RV32I-NEXT:    andi a1, a1, 255
1337; RV32I-NEXT:    andi a0, a0, 255
1338; RV32I-NEXT:    sub a0, a0, a1
1339; RV32I-NEXT:    srai a1, a0, 31
1340; RV32I-NEXT:    xor a0, a0, a1
1341; RV32I-NEXT:    sub a0, a0, a1
1342; RV32I-NEXT:    ret
1343;
1344; RV64I-LABEL: abd_cmp_i8:
1345; RV64I:       # %bb.0:
1346; RV64I-NEXT:    andi a1, a1, 255
1347; RV64I-NEXT:    andi a0, a0, 255
1348; RV64I-NEXT:    sub a0, a0, a1
1349; RV64I-NEXT:    srai a1, a0, 63
1350; RV64I-NEXT:    xor a0, a0, a1
1351; RV64I-NEXT:    sub a0, a0, a1
1352; RV64I-NEXT:    ret
1353;
1354; ZBB-LABEL: abd_cmp_i8:
1355; ZBB:       # %bb.0:
1356; ZBB-NEXT:    andi a1, a1, 255
1357; ZBB-NEXT:    andi a0, a0, 255
1358; ZBB-NEXT:    minu a2, a0, a1
1359; ZBB-NEXT:    maxu a0, a0, a1
1360; ZBB-NEXT:    sub a0, a0, a2
1361; ZBB-NEXT:    ret
1362  %cmp = icmp ugt i8 %a, %b
1363  %ab = sub i8 %a, %b
1364  %ba = sub i8 %b, %a
1365  %sel = select i1 %cmp, i8 %ab, i8 %ba
1366  ret i8 %sel
1367}
1368
1369define i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
1370; RV32I-LABEL: abd_cmp_i16:
1371; RV32I:       # %bb.0:
1372; RV32I-NEXT:    lui a2, 16
1373; RV32I-NEXT:    addi a2, a2, -1
1374; RV32I-NEXT:    and a1, a1, a2
1375; RV32I-NEXT:    and a0, a0, a2
1376; RV32I-NEXT:    sub a0, a0, a1
1377; RV32I-NEXT:    srai a1, a0, 31
1378; RV32I-NEXT:    xor a0, a0, a1
1379; RV32I-NEXT:    sub a0, a0, a1
1380; RV32I-NEXT:    ret
1381;
1382; RV64I-LABEL: abd_cmp_i16:
1383; RV64I:       # %bb.0:
1384; RV64I-NEXT:    lui a2, 16
1385; RV64I-NEXT:    addiw a2, a2, -1
1386; RV64I-NEXT:    and a1, a1, a2
1387; RV64I-NEXT:    and a0, a0, a2
1388; RV64I-NEXT:    sub a0, a0, a1
1389; RV64I-NEXT:    srai a1, a0, 63
1390; RV64I-NEXT:    xor a0, a0, a1
1391; RV64I-NEXT:    sub a0, a0, a1
1392; RV64I-NEXT:    ret
1393;
1394; ZBB-LABEL: abd_cmp_i16:
1395; ZBB:       # %bb.0:
1396; ZBB-NEXT:    zext.h a1, a1
1397; ZBB-NEXT:    zext.h a0, a0
1398; ZBB-NEXT:    minu a2, a0, a1
1399; ZBB-NEXT:    maxu a0, a0, a1
1400; ZBB-NEXT:    sub a0, a0, a2
1401; ZBB-NEXT:    ret
1402  %cmp = icmp uge i16 %a, %b
1403  %ab = sub i16 %a, %b
1404  %ba = sub i16 %b, %a
1405  %sel = select i1 %cmp, i16 %ab, i16 %ba
1406  ret i16 %sel
1407}
1408
1409define i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind {
1410; RV32I-LABEL: abd_cmp_i32:
1411; RV32I:       # %bb.0:
1412; RV32I-NEXT:    bltu a1, a0, .LBB20_2
1413; RV32I-NEXT:  # %bb.1:
1414; RV32I-NEXT:    sub a0, a1, a0
1415; RV32I-NEXT:    ret
1416; RV32I-NEXT:  .LBB20_2:
1417; RV32I-NEXT:    sub a0, a0, a1
1418; RV32I-NEXT:    ret
1419;
1420; RV64I-LABEL: abd_cmp_i32:
1421; RV64I:       # %bb.0:
1422; RV64I-NEXT:    slli a1, a1, 32
1423; RV64I-NEXT:    slli a0, a0, 32
1424; RV64I-NEXT:    srli a1, a1, 32
1425; RV64I-NEXT:    srli a0, a0, 32
1426; RV64I-NEXT:    sub a0, a0, a1
1427; RV64I-NEXT:    srai a1, a0, 63
1428; RV64I-NEXT:    xor a0, a0, a1
1429; RV64I-NEXT:    sub a0, a0, a1
1430; RV64I-NEXT:    ret
1431;
1432; RV32ZBB-LABEL: abd_cmp_i32:
1433; RV32ZBB:       # %bb.0:
1434; RV32ZBB-NEXT:    minu a2, a0, a1
1435; RV32ZBB-NEXT:    maxu a0, a0, a1
1436; RV32ZBB-NEXT:    sub a0, a0, a2
1437; RV32ZBB-NEXT:    ret
1438;
1439; RV64ZBB-LABEL: abd_cmp_i32:
1440; RV64ZBB:       # %bb.0:
1441; RV64ZBB-NEXT:    slli a1, a1, 32
1442; RV64ZBB-NEXT:    slli a0, a0, 32
1443; RV64ZBB-NEXT:    srli a1, a1, 32
1444; RV64ZBB-NEXT:    srli a0, a0, 32
1445; RV64ZBB-NEXT:    minu a2, a0, a1
1446; RV64ZBB-NEXT:    maxu a0, a0, a1
1447; RV64ZBB-NEXT:    sub a0, a0, a2
1448; RV64ZBB-NEXT:    ret
1449  %cmp = icmp ult i32 %a, %b
1450  %ab = sub i32 %a, %b
1451  %ba = sub i32 %b, %a
1452  %sel = select i1 %cmp, i32 %ba, i32 %ab
1453  ret i32 %sel
1454}
1455
1456define i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {
1457; RV32I-LABEL: abd_cmp_i64:
1458; RV32I:       # %bb.0:
1459; RV32I-NEXT:    sltu a4, a0, a2
1460; RV32I-NEXT:    sub a3, a1, a3
1461; RV32I-NEXT:    sub a3, a3, a4
1462; RV32I-NEXT:    sub a2, a0, a2
1463; RV32I-NEXT:    beq a3, a1, .LBB21_2
1464; RV32I-NEXT:  # %bb.1:
1465; RV32I-NEXT:    sltu a0, a1, a3
1466; RV32I-NEXT:    j .LBB21_3
1467; RV32I-NEXT:  .LBB21_2:
1468; RV32I-NEXT:    sltu a0, a0, a2
1469; RV32I-NEXT:  .LBB21_3:
1470; RV32I-NEXT:    neg a1, a0
1471; RV32I-NEXT:    xor a2, a2, a1
1472; RV32I-NEXT:    xor a3, a3, a1
1473; RV32I-NEXT:    sltu a1, a2, a1
1474; RV32I-NEXT:    add a3, a3, a0
1475; RV32I-NEXT:    sub a1, a3, a1
1476; RV32I-NEXT:    add a0, a2, a0
1477; RV32I-NEXT:    ret
1478;
1479; RV64I-LABEL: abd_cmp_i64:
1480; RV64I:       # %bb.0:
1481; RV64I-NEXT:    bltu a1, a0, .LBB21_2
1482; RV64I-NEXT:  # %bb.1:
1483; RV64I-NEXT:    sub a0, a1, a0
1484; RV64I-NEXT:    ret
1485; RV64I-NEXT:  .LBB21_2:
1486; RV64I-NEXT:    sub a0, a0, a1
1487; RV64I-NEXT:    ret
1488;
1489; RV32ZBB-LABEL: abd_cmp_i64:
1490; RV32ZBB:       # %bb.0:
1491; RV32ZBB-NEXT:    sltu a4, a0, a2
1492; RV32ZBB-NEXT:    sub a3, a1, a3
1493; RV32ZBB-NEXT:    sub a3, a3, a4
1494; RV32ZBB-NEXT:    sub a2, a0, a2
1495; RV32ZBB-NEXT:    beq a3, a1, .LBB21_2
1496; RV32ZBB-NEXT:  # %bb.1:
1497; RV32ZBB-NEXT:    sltu a0, a1, a3
1498; RV32ZBB-NEXT:    j .LBB21_3
1499; RV32ZBB-NEXT:  .LBB21_2:
1500; RV32ZBB-NEXT:    sltu a0, a0, a2
1501; RV32ZBB-NEXT:  .LBB21_3:
1502; RV32ZBB-NEXT:    neg a1, a0
1503; RV32ZBB-NEXT:    xor a2, a2, a1
1504; RV32ZBB-NEXT:    xor a3, a3, a1
1505; RV32ZBB-NEXT:    sltu a1, a2, a1
1506; RV32ZBB-NEXT:    add a3, a3, a0
1507; RV32ZBB-NEXT:    sub a1, a3, a1
1508; RV32ZBB-NEXT:    add a0, a2, a0
1509; RV32ZBB-NEXT:    ret
1510;
1511; RV64ZBB-LABEL: abd_cmp_i64:
1512; RV64ZBB:       # %bb.0:
1513; RV64ZBB-NEXT:    minu a2, a0, a1
1514; RV64ZBB-NEXT:    maxu a0, a0, a1
1515; RV64ZBB-NEXT:    sub a0, a0, a2
1516; RV64ZBB-NEXT:    ret
1517  %cmp = icmp uge i64 %a, %b
1518  %ab = sub i64 %a, %b
1519  %ba = sub i64 %b, %a
1520  %sel = select i1 %cmp, i64 %ab, i64 %ba
1521  ret i64 %sel
1522}
1523
1524define i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {
1525; RV32I-LABEL: abd_cmp_i128:
1526; RV32I:       # %bb.0:
1527; RV32I-NEXT:    lw a3, 0(a2)
1528; RV32I-NEXT:    lw a5, 4(a2)
1529; RV32I-NEXT:    lw a6, 8(a2)
1530; RV32I-NEXT:    lw a7, 12(a2)
1531; RV32I-NEXT:    lw a2, 8(a1)
1532; RV32I-NEXT:    lw a4, 12(a1)
1533; RV32I-NEXT:    lw t0, 0(a1)
1534; RV32I-NEXT:    lw a1, 4(a1)
1535; RV32I-NEXT:    sltu t1, a2, a6
1536; RV32I-NEXT:    sub a7, a4, a7
1537; RV32I-NEXT:    sltu t2, t0, a3
1538; RV32I-NEXT:    sub a7, a7, t1
1539; RV32I-NEXT:    mv t1, t2
1540; RV32I-NEXT:    beq a1, a5, .LBB22_2
1541; RV32I-NEXT:  # %bb.1:
1542; RV32I-NEXT:    sltu t1, a1, a5
1543; RV32I-NEXT:  .LBB22_2:
1544; RV32I-NEXT:    sub t3, a2, a6
1545; RV32I-NEXT:    sltu a6, t3, t1
1546; RV32I-NEXT:    sub a6, a7, a6
1547; RV32I-NEXT:    sub a7, t3, t1
1548; RV32I-NEXT:    beq a6, a4, .LBB22_4
1549; RV32I-NEXT:  # %bb.3:
1550; RV32I-NEXT:    sltu t1, a4, a6
1551; RV32I-NEXT:    j .LBB22_5
1552; RV32I-NEXT:  .LBB22_4:
1553; RV32I-NEXT:    sltu t1, a2, a7
1554; RV32I-NEXT:  .LBB22_5:
1555; RV32I-NEXT:    sub a5, a1, a5
1556; RV32I-NEXT:    sub a5, a5, t2
1557; RV32I-NEXT:    sub a3, t0, a3
1558; RV32I-NEXT:    beq a5, a1, .LBB22_7
1559; RV32I-NEXT:  # %bb.6:
1560; RV32I-NEXT:    sltu a1, a1, a5
1561; RV32I-NEXT:    j .LBB22_8
1562; RV32I-NEXT:  .LBB22_7:
1563; RV32I-NEXT:    sltu a1, t0, a3
1564; RV32I-NEXT:  .LBB22_8:
1565; RV32I-NEXT:    xor a4, a6, a4
1566; RV32I-NEXT:    xor a2, a7, a2
1567; RV32I-NEXT:    or a2, a2, a4
1568; RV32I-NEXT:    beqz a2, .LBB22_10
1569; RV32I-NEXT:  # %bb.9:
1570; RV32I-NEXT:    mv a1, t1
1571; RV32I-NEXT:  .LBB22_10:
1572; RV32I-NEXT:    neg t0, a1
1573; RV32I-NEXT:    xor a2, a7, t0
1574; RV32I-NEXT:    xor a6, a6, t0
1575; RV32I-NEXT:    xor a4, a3, t0
1576; RV32I-NEXT:    sltu a3, a2, t0
1577; RV32I-NEXT:    add a7, a6, a1
1578; RV32I-NEXT:    sltu a6, a4, t0
1579; RV32I-NEXT:    sub a3, a7, a3
1580; RV32I-NEXT:    xor t1, a5, t0
1581; RV32I-NEXT:    mv a7, a6
1582; RV32I-NEXT:    beqz a5, .LBB22_12
1583; RV32I-NEXT:  # %bb.11:
1584; RV32I-NEXT:    sltu a7, t1, t0
1585; RV32I-NEXT:  .LBB22_12:
1586; RV32I-NEXT:    add a2, a2, a1
1587; RV32I-NEXT:    add t1, t1, a1
1588; RV32I-NEXT:    add a1, a4, a1
1589; RV32I-NEXT:    sltu a4, a2, a7
1590; RV32I-NEXT:    sub a2, a2, a7
1591; RV32I-NEXT:    sub a5, t1, a6
1592; RV32I-NEXT:    sub a3, a3, a4
1593; RV32I-NEXT:    sw a1, 0(a0)
1594; RV32I-NEXT:    sw a5, 4(a0)
1595; RV32I-NEXT:    sw a2, 8(a0)
1596; RV32I-NEXT:    sw a3, 12(a0)
1597; RV32I-NEXT:    ret
1598;
1599; RV64I-LABEL: abd_cmp_i128:
1600; RV64I:       # %bb.0:
1601; RV64I-NEXT:    sltu a4, a0, a2
1602; RV64I-NEXT:    sub a3, a1, a3
1603; RV64I-NEXT:    sub a3, a3, a4
1604; RV64I-NEXT:    sub a2, a0, a2
1605; RV64I-NEXT:    beq a3, a1, .LBB22_2
1606; RV64I-NEXT:  # %bb.1:
1607; RV64I-NEXT:    sltu a0, a1, a3
1608; RV64I-NEXT:    j .LBB22_3
1609; RV64I-NEXT:  .LBB22_2:
1610; RV64I-NEXT:    sltu a0, a0, a2
1611; RV64I-NEXT:  .LBB22_3:
1612; RV64I-NEXT:    neg a1, a0
1613; RV64I-NEXT:    xor a2, a2, a1
1614; RV64I-NEXT:    xor a3, a3, a1
1615; RV64I-NEXT:    sltu a1, a2, a1
1616; RV64I-NEXT:    add a3, a3, a0
1617; RV64I-NEXT:    sub a1, a3, a1
1618; RV64I-NEXT:    add a0, a2, a0
1619; RV64I-NEXT:    ret
1620;
1621; RV32ZBB-LABEL: abd_cmp_i128:
1622; RV32ZBB:       # %bb.0:
1623; RV32ZBB-NEXT:    lw a3, 0(a2)
1624; RV32ZBB-NEXT:    lw a5, 4(a2)
1625; RV32ZBB-NEXT:    lw a6, 8(a2)
1626; RV32ZBB-NEXT:    lw a7, 12(a2)
1627; RV32ZBB-NEXT:    lw a2, 8(a1)
1628; RV32ZBB-NEXT:    lw a4, 12(a1)
1629; RV32ZBB-NEXT:    lw t0, 0(a1)
1630; RV32ZBB-NEXT:    lw a1, 4(a1)
1631; RV32ZBB-NEXT:    sltu t1, a2, a6
1632; RV32ZBB-NEXT:    sub a7, a4, a7
1633; RV32ZBB-NEXT:    sltu t2, t0, a3
1634; RV32ZBB-NEXT:    sub a7, a7, t1
1635; RV32ZBB-NEXT:    mv t1, t2
1636; RV32ZBB-NEXT:    beq a1, a5, .LBB22_2
1637; RV32ZBB-NEXT:  # %bb.1:
1638; RV32ZBB-NEXT:    sltu t1, a1, a5
1639; RV32ZBB-NEXT:  .LBB22_2:
1640; RV32ZBB-NEXT:    sub t3, a2, a6
1641; RV32ZBB-NEXT:    sltu a6, t3, t1
1642; RV32ZBB-NEXT:    sub a6, a7, a6
1643; RV32ZBB-NEXT:    sub a7, t3, t1
1644; RV32ZBB-NEXT:    beq a6, a4, .LBB22_4
1645; RV32ZBB-NEXT:  # %bb.3:
1646; RV32ZBB-NEXT:    sltu t1, a4, a6
1647; RV32ZBB-NEXT:    j .LBB22_5
1648; RV32ZBB-NEXT:  .LBB22_4:
1649; RV32ZBB-NEXT:    sltu t1, a2, a7
1650; RV32ZBB-NEXT:  .LBB22_5:
1651; RV32ZBB-NEXT:    sub a5, a1, a5
1652; RV32ZBB-NEXT:    sub a5, a5, t2
1653; RV32ZBB-NEXT:    sub a3, t0, a3
1654; RV32ZBB-NEXT:    beq a5, a1, .LBB22_7
1655; RV32ZBB-NEXT:  # %bb.6:
1656; RV32ZBB-NEXT:    sltu a1, a1, a5
1657; RV32ZBB-NEXT:    j .LBB22_8
1658; RV32ZBB-NEXT:  .LBB22_7:
1659; RV32ZBB-NEXT:    sltu a1, t0, a3
1660; RV32ZBB-NEXT:  .LBB22_8:
1661; RV32ZBB-NEXT:    xor a4, a6, a4
1662; RV32ZBB-NEXT:    xor a2, a7, a2
1663; RV32ZBB-NEXT:    or a2, a2, a4
1664; RV32ZBB-NEXT:    beqz a2, .LBB22_10
1665; RV32ZBB-NEXT:  # %bb.9:
1666; RV32ZBB-NEXT:    mv a1, t1
1667; RV32ZBB-NEXT:  .LBB22_10:
1668; RV32ZBB-NEXT:    neg t0, a1
1669; RV32ZBB-NEXT:    xor a2, a7, t0
1670; RV32ZBB-NEXT:    xor a6, a6, t0
1671; RV32ZBB-NEXT:    xor a4, a3, t0
1672; RV32ZBB-NEXT:    sltu a3, a2, t0
1673; RV32ZBB-NEXT:    add a7, a6, a1
1674; RV32ZBB-NEXT:    sltu a6, a4, t0
1675; RV32ZBB-NEXT:    sub a3, a7, a3
1676; RV32ZBB-NEXT:    xor t1, a5, t0
1677; RV32ZBB-NEXT:    mv a7, a6
1678; RV32ZBB-NEXT:    beqz a5, .LBB22_12
1679; RV32ZBB-NEXT:  # %bb.11:
1680; RV32ZBB-NEXT:    sltu a7, t1, t0
1681; RV32ZBB-NEXT:  .LBB22_12:
1682; RV32ZBB-NEXT:    add a2, a2, a1
1683; RV32ZBB-NEXT:    add t1, t1, a1
1684; RV32ZBB-NEXT:    add a1, a4, a1
1685; RV32ZBB-NEXT:    sltu a4, a2, a7
1686; RV32ZBB-NEXT:    sub a2, a2, a7
1687; RV32ZBB-NEXT:    sub a5, t1, a6
1688; RV32ZBB-NEXT:    sub a3, a3, a4
1689; RV32ZBB-NEXT:    sw a1, 0(a0)
1690; RV32ZBB-NEXT:    sw a5, 4(a0)
1691; RV32ZBB-NEXT:    sw a2, 8(a0)
1692; RV32ZBB-NEXT:    sw a3, 12(a0)
1693; RV32ZBB-NEXT:    ret
1694;
1695; RV64ZBB-LABEL: abd_cmp_i128:
1696; RV64ZBB:       # %bb.0:
1697; RV64ZBB-NEXT:    sltu a4, a0, a2
1698; RV64ZBB-NEXT:    sub a3, a1, a3
1699; RV64ZBB-NEXT:    sub a3, a3, a4
1700; RV64ZBB-NEXT:    sub a2, a0, a2
1701; RV64ZBB-NEXT:    beq a3, a1, .LBB22_2
1702; RV64ZBB-NEXT:  # %bb.1:
1703; RV64ZBB-NEXT:    sltu a0, a1, a3
1704; RV64ZBB-NEXT:    j .LBB22_3
1705; RV64ZBB-NEXT:  .LBB22_2:
1706; RV64ZBB-NEXT:    sltu a0, a0, a2
1707; RV64ZBB-NEXT:  .LBB22_3:
1708; RV64ZBB-NEXT:    neg a1, a0
1709; RV64ZBB-NEXT:    xor a2, a2, a1
1710; RV64ZBB-NEXT:    xor a3, a3, a1
1711; RV64ZBB-NEXT:    sltu a1, a2, a1
1712; RV64ZBB-NEXT:    add a3, a3, a0
1713; RV64ZBB-NEXT:    sub a1, a3, a1
1714; RV64ZBB-NEXT:    add a0, a2, a0
1715; RV64ZBB-NEXT:    ret
1716  %cmp = icmp uge i128 %a, %b
1717  %ab = sub i128 %a, %b
1718  %ba = sub i128 %b, %a
1719  %sel = select i1 %cmp, i128 %ab, i128 %ba
1720  ret i128 %sel
1721}
1722
1723;
1724; sub(select(icmp(a,b),a,b),select(icmp(a,b),b,a)) -> abdu(a,b)
1725;
1726
1727define i8 @abd_select_i8(i8 %a, i8 %b) nounwind {
1728; RV32I-LABEL: abd_select_i8:
1729; RV32I:       # %bb.0:
1730; RV32I-NEXT:    andi a1, a1, 255
1731; RV32I-NEXT:    andi a0, a0, 255
1732; RV32I-NEXT:    sub a0, a0, a1
1733; RV32I-NEXT:    srai a1, a0, 31
1734; RV32I-NEXT:    xor a0, a0, a1
1735; RV32I-NEXT:    sub a0, a0, a1
1736; RV32I-NEXT:    ret
1737;
1738; RV64I-LABEL: abd_select_i8:
1739; RV64I:       # %bb.0:
1740; RV64I-NEXT:    andi a1, a1, 255
1741; RV64I-NEXT:    andi a0, a0, 255
1742; RV64I-NEXT:    sub a0, a0, a1
1743; RV64I-NEXT:    srai a1, a0, 63
1744; RV64I-NEXT:    xor a0, a0, a1
1745; RV64I-NEXT:    sub a0, a0, a1
1746; RV64I-NEXT:    ret
1747;
1748; ZBB-LABEL: abd_select_i8:
1749; ZBB:       # %bb.0:
1750; ZBB-NEXT:    andi a1, a1, 255
1751; ZBB-NEXT:    andi a0, a0, 255
1752; ZBB-NEXT:    minu a2, a0, a1
1753; ZBB-NEXT:    maxu a0, a0, a1
1754; ZBB-NEXT:    sub a0, a0, a2
1755; ZBB-NEXT:    ret
1756  %cmp = icmp ult i8 %a, %b
1757  %ab = select i1 %cmp, i8 %a, i8 %b
1758  %ba = select i1 %cmp, i8 %b, i8 %a
1759  %sub = sub i8 %ba, %ab
1760  ret i8 %sub
1761}
1762
1763define i16 @abd_select_i16(i16 %a, i16 %b) nounwind {
1764; RV32I-LABEL: abd_select_i16:
1765; RV32I:       # %bb.0:
1766; RV32I-NEXT:    lui a2, 16
1767; RV32I-NEXT:    addi a2, a2, -1
1768; RV32I-NEXT:    and a1, a1, a2
1769; RV32I-NEXT:    and a0, a0, a2
1770; RV32I-NEXT:    sub a0, a0, a1
1771; RV32I-NEXT:    srai a1, a0, 31
1772; RV32I-NEXT:    xor a0, a0, a1
1773; RV32I-NEXT:    sub a0, a0, a1
1774; RV32I-NEXT:    ret
1775;
1776; RV64I-LABEL: abd_select_i16:
1777; RV64I:       # %bb.0:
1778; RV64I-NEXT:    lui a2, 16
1779; RV64I-NEXT:    addiw a2, a2, -1
1780; RV64I-NEXT:    and a1, a1, a2
1781; RV64I-NEXT:    and a0, a0, a2
1782; RV64I-NEXT:    sub a0, a0, a1
1783; RV64I-NEXT:    srai a1, a0, 63
1784; RV64I-NEXT:    xor a0, a0, a1
1785; RV64I-NEXT:    sub a0, a0, a1
1786; RV64I-NEXT:    ret
1787;
1788; ZBB-LABEL: abd_select_i16:
1789; ZBB:       # %bb.0:
1790; ZBB-NEXT:    zext.h a1, a1
1791; ZBB-NEXT:    zext.h a0, a0
1792; ZBB-NEXT:    minu a2, a0, a1
1793; ZBB-NEXT:    maxu a0, a0, a1
1794; ZBB-NEXT:    sub a0, a0, a2
1795; ZBB-NEXT:    ret
1796  %cmp = icmp ule i16 %a, %b
1797  %ab = select i1 %cmp, i16 %a, i16 %b
1798  %ba = select i1 %cmp, i16 %b, i16 %a
1799  %sub = sub i16 %ba, %ab
1800  ret i16 %sub
1801}
1802
1803define i32 @abd_select_i32(i32 %a, i32 %b) nounwind {
1804; RV32I-LABEL: abd_select_i32:
1805; RV32I:       # %bb.0:
1806; RV32I-NEXT:    bltu a1, a0, .LBB25_2
1807; RV32I-NEXT:  # %bb.1:
1808; RV32I-NEXT:    sub a0, a1, a0
1809; RV32I-NEXT:    ret
1810; RV32I-NEXT:  .LBB25_2:
1811; RV32I-NEXT:    sub a0, a0, a1
1812; RV32I-NEXT:    ret
1813;
1814; RV64I-LABEL: abd_select_i32:
1815; RV64I:       # %bb.0:
1816; RV64I-NEXT:    slli a1, a1, 32
1817; RV64I-NEXT:    slli a0, a0, 32
1818; RV64I-NEXT:    srli a1, a1, 32
1819; RV64I-NEXT:    srli a0, a0, 32
1820; RV64I-NEXT:    sub a0, a0, a1
1821; RV64I-NEXT:    srai a1, a0, 63
1822; RV64I-NEXT:    xor a0, a0, a1
1823; RV64I-NEXT:    sub a0, a0, a1
1824; RV64I-NEXT:    ret
1825;
1826; RV32ZBB-LABEL: abd_select_i32:
1827; RV32ZBB:       # %bb.0:
1828; RV32ZBB-NEXT:    minu a2, a0, a1
1829; RV32ZBB-NEXT:    maxu a0, a0, a1
1830; RV32ZBB-NEXT:    sub a0, a0, a2
1831; RV32ZBB-NEXT:    ret
1832;
1833; RV64ZBB-LABEL: abd_select_i32:
1834; RV64ZBB:       # %bb.0:
1835; RV64ZBB-NEXT:    slli a1, a1, 32
1836; RV64ZBB-NEXT:    slli a0, a0, 32
1837; RV64ZBB-NEXT:    srli a1, a1, 32
1838; RV64ZBB-NEXT:    srli a0, a0, 32
1839; RV64ZBB-NEXT:    minu a2, a0, a1
1840; RV64ZBB-NEXT:    maxu a0, a0, a1
1841; RV64ZBB-NEXT:    sub a0, a0, a2
1842; RV64ZBB-NEXT:    ret
1843  %cmp = icmp ugt i32 %a, %b
1844  %ab = select i1 %cmp, i32 %a, i32 %b
1845  %ba = select i1 %cmp, i32 %b, i32 %a
1846  %sub = sub i32 %ab, %ba
1847  ret i32 %sub
1848}
1849
1850define i64 @abd_select_i64(i64 %a, i64 %b) nounwind {
1851; RV32I-LABEL: abd_select_i64:
1852; RV32I:       # %bb.0:
1853; RV32I-NEXT:    sltu a4, a0, a2
1854; RV32I-NEXT:    sub a3, a1, a3
1855; RV32I-NEXT:    sub a3, a3, a4
1856; RV32I-NEXT:    sub a2, a0, a2
1857; RV32I-NEXT:    beq a3, a1, .LBB26_2
1858; RV32I-NEXT:  # %bb.1:
1859; RV32I-NEXT:    sltu a0, a1, a3
1860; RV32I-NEXT:    j .LBB26_3
1861; RV32I-NEXT:  .LBB26_2:
1862; RV32I-NEXT:    sltu a0, a0, a2
1863; RV32I-NEXT:  .LBB26_3:
1864; RV32I-NEXT:    neg a1, a0
1865; RV32I-NEXT:    xor a2, a2, a1
1866; RV32I-NEXT:    xor a3, a3, a1
1867; RV32I-NEXT:    sltu a1, a2, a1
1868; RV32I-NEXT:    add a3, a3, a0
1869; RV32I-NEXT:    sub a1, a3, a1
1870; RV32I-NEXT:    add a0, a2, a0
1871; RV32I-NEXT:    ret
1872;
1873; RV64I-LABEL: abd_select_i64:
1874; RV64I:       # %bb.0:
1875; RV64I-NEXT:    bltu a1, a0, .LBB26_2
1876; RV64I-NEXT:  # %bb.1:
1877; RV64I-NEXT:    sub a0, a1, a0
1878; RV64I-NEXT:    ret
1879; RV64I-NEXT:  .LBB26_2:
1880; RV64I-NEXT:    sub a0, a0, a1
1881; RV64I-NEXT:    ret
1882;
1883; RV32ZBB-LABEL: abd_select_i64:
1884; RV32ZBB:       # %bb.0:
1885; RV32ZBB-NEXT:    sltu a4, a0, a2
1886; RV32ZBB-NEXT:    sub a3, a1, a3
1887; RV32ZBB-NEXT:    sub a3, a3, a4
1888; RV32ZBB-NEXT:    sub a2, a0, a2
1889; RV32ZBB-NEXT:    beq a3, a1, .LBB26_2
1890; RV32ZBB-NEXT:  # %bb.1:
1891; RV32ZBB-NEXT:    sltu a0, a1, a3
1892; RV32ZBB-NEXT:    j .LBB26_3
1893; RV32ZBB-NEXT:  .LBB26_2:
1894; RV32ZBB-NEXT:    sltu a0, a0, a2
1895; RV32ZBB-NEXT:  .LBB26_3:
1896; RV32ZBB-NEXT:    neg a1, a0
1897; RV32ZBB-NEXT:    xor a2, a2, a1
1898; RV32ZBB-NEXT:    xor a3, a3, a1
1899; RV32ZBB-NEXT:    sltu a1, a2, a1
1900; RV32ZBB-NEXT:    add a3, a3, a0
1901; RV32ZBB-NEXT:    sub a1, a3, a1
1902; RV32ZBB-NEXT:    add a0, a2, a0
1903; RV32ZBB-NEXT:    ret
1904;
1905; RV64ZBB-LABEL: abd_select_i64:
1906; RV64ZBB:       # %bb.0:
1907; RV64ZBB-NEXT:    minu a2, a0, a1
1908; RV64ZBB-NEXT:    maxu a0, a0, a1
1909; RV64ZBB-NEXT:    sub a0, a0, a2
1910; RV64ZBB-NEXT:    ret
1911  %cmp = icmp uge i64 %a, %b
1912  %ab = select i1 %cmp, i64 %a, i64 %b
1913  %ba = select i1 %cmp, i64 %b, i64 %a
1914  %sub = sub i64 %ab, %ba
1915  ret i64 %sub
1916}
1917
1918define i128 @abd_select_i128(i128 %a, i128 %b) nounwind {
1919; RV32I-LABEL: abd_select_i128:
1920; RV32I:       # %bb.0:
1921; RV32I-NEXT:    lw a3, 0(a2)
1922; RV32I-NEXT:    lw a5, 4(a2)
1923; RV32I-NEXT:    lw a6, 8(a2)
1924; RV32I-NEXT:    lw a7, 12(a2)
1925; RV32I-NEXT:    lw a2, 8(a1)
1926; RV32I-NEXT:    lw a4, 12(a1)
1927; RV32I-NEXT:    lw t0, 0(a1)
1928; RV32I-NEXT:    lw a1, 4(a1)
1929; RV32I-NEXT:    sltu t1, a2, a6
1930; RV32I-NEXT:    sub a7, a4, a7
1931; RV32I-NEXT:    sltu t2, t0, a3
1932; RV32I-NEXT:    sub a7, a7, t1
1933; RV32I-NEXT:    mv t1, t2
1934; RV32I-NEXT:    beq a1, a5, .LBB27_2
1935; RV32I-NEXT:  # %bb.1:
1936; RV32I-NEXT:    sltu t1, a1, a5
1937; RV32I-NEXT:  .LBB27_2:
1938; RV32I-NEXT:    sub t3, a2, a6
1939; RV32I-NEXT:    sltu a6, t3, t1
1940; RV32I-NEXT:    sub a6, a7, a6
1941; RV32I-NEXT:    sub a7, t3, t1
1942; RV32I-NEXT:    beq a6, a4, .LBB27_4
1943; RV32I-NEXT:  # %bb.3:
1944; RV32I-NEXT:    sltu t1, a4, a6
1945; RV32I-NEXT:    j .LBB27_5
1946; RV32I-NEXT:  .LBB27_4:
1947; RV32I-NEXT:    sltu t1, a2, a7
1948; RV32I-NEXT:  .LBB27_5:
1949; RV32I-NEXT:    sub a5, a1, a5
1950; RV32I-NEXT:    sub a5, a5, t2
1951; RV32I-NEXT:    sub a3, t0, a3
1952; RV32I-NEXT:    beq a5, a1, .LBB27_7
1953; RV32I-NEXT:  # %bb.6:
1954; RV32I-NEXT:    sltu a1, a1, a5
1955; RV32I-NEXT:    j .LBB27_8
1956; RV32I-NEXT:  .LBB27_7:
1957; RV32I-NEXT:    sltu a1, t0, a3
1958; RV32I-NEXT:  .LBB27_8:
1959; RV32I-NEXT:    xor a4, a6, a4
1960; RV32I-NEXT:    xor a2, a7, a2
1961; RV32I-NEXT:    or a2, a2, a4
1962; RV32I-NEXT:    beqz a2, .LBB27_10
1963; RV32I-NEXT:  # %bb.9:
1964; RV32I-NEXT:    mv a1, t1
1965; RV32I-NEXT:  .LBB27_10:
1966; RV32I-NEXT:    neg t0, a1
1967; RV32I-NEXT:    xor a2, a7, t0
1968; RV32I-NEXT:    xor a6, a6, t0
1969; RV32I-NEXT:    xor a4, a3, t0
1970; RV32I-NEXT:    sltu a3, a2, t0
1971; RV32I-NEXT:    add a7, a6, a1
1972; RV32I-NEXT:    sltu a6, a4, t0
1973; RV32I-NEXT:    sub a3, a7, a3
1974; RV32I-NEXT:    xor t1, a5, t0
1975; RV32I-NEXT:    mv a7, a6
1976; RV32I-NEXT:    beqz a5, .LBB27_12
1977; RV32I-NEXT:  # %bb.11:
1978; RV32I-NEXT:    sltu a7, t1, t0
1979; RV32I-NEXT:  .LBB27_12:
1980; RV32I-NEXT:    add a2, a2, a1
1981; RV32I-NEXT:    add t1, t1, a1
1982; RV32I-NEXT:    add a1, a4, a1
1983; RV32I-NEXT:    sltu a4, a2, a7
1984; RV32I-NEXT:    sub a2, a2, a7
1985; RV32I-NEXT:    sub a5, t1, a6
1986; RV32I-NEXT:    sub a3, a3, a4
1987; RV32I-NEXT:    sw a1, 0(a0)
1988; RV32I-NEXT:    sw a5, 4(a0)
1989; RV32I-NEXT:    sw a2, 8(a0)
1990; RV32I-NEXT:    sw a3, 12(a0)
1991; RV32I-NEXT:    ret
1992;
1993; RV64I-LABEL: abd_select_i128:
1994; RV64I:       # %bb.0:
1995; RV64I-NEXT:    sltu a4, a0, a2
1996; RV64I-NEXT:    sub a3, a1, a3
1997; RV64I-NEXT:    sub a3, a3, a4
1998; RV64I-NEXT:    sub a2, a0, a2
1999; RV64I-NEXT:    beq a3, a1, .LBB27_2
2000; RV64I-NEXT:  # %bb.1:
2001; RV64I-NEXT:    sltu a0, a1, a3
2002; RV64I-NEXT:    j .LBB27_3
2003; RV64I-NEXT:  .LBB27_2:
2004; RV64I-NEXT:    sltu a0, a0, a2
2005; RV64I-NEXT:  .LBB27_3:
2006; RV64I-NEXT:    neg a1, a0
2007; RV64I-NEXT:    xor a2, a2, a1
2008; RV64I-NEXT:    xor a3, a3, a1
2009; RV64I-NEXT:    sltu a1, a2, a1
2010; RV64I-NEXT:    add a3, a3, a0
2011; RV64I-NEXT:    sub a1, a3, a1
2012; RV64I-NEXT:    add a0, a2, a0
2013; RV64I-NEXT:    ret
2014;
2015; RV32ZBB-LABEL: abd_select_i128:
2016; RV32ZBB:       # %bb.0:
2017; RV32ZBB-NEXT:    lw a3, 0(a2)
2018; RV32ZBB-NEXT:    lw a5, 4(a2)
2019; RV32ZBB-NEXT:    lw a6, 8(a2)
2020; RV32ZBB-NEXT:    lw a7, 12(a2)
2021; RV32ZBB-NEXT:    lw a2, 8(a1)
2022; RV32ZBB-NEXT:    lw a4, 12(a1)
2023; RV32ZBB-NEXT:    lw t0, 0(a1)
2024; RV32ZBB-NEXT:    lw a1, 4(a1)
2025; RV32ZBB-NEXT:    sltu t1, a2, a6
2026; RV32ZBB-NEXT:    sub a7, a4, a7
2027; RV32ZBB-NEXT:    sltu t2, t0, a3
2028; RV32ZBB-NEXT:    sub a7, a7, t1
2029; RV32ZBB-NEXT:    mv t1, t2
2030; RV32ZBB-NEXT:    beq a1, a5, .LBB27_2
2031; RV32ZBB-NEXT:  # %bb.1:
2032; RV32ZBB-NEXT:    sltu t1, a1, a5
2033; RV32ZBB-NEXT:  .LBB27_2:
2034; RV32ZBB-NEXT:    sub t3, a2, a6
2035; RV32ZBB-NEXT:    sltu a6, t3, t1
2036; RV32ZBB-NEXT:    sub a6, a7, a6
2037; RV32ZBB-NEXT:    sub a7, t3, t1
2038; RV32ZBB-NEXT:    beq a6, a4, .LBB27_4
2039; RV32ZBB-NEXT:  # %bb.3:
2040; RV32ZBB-NEXT:    sltu t1, a4, a6
2041; RV32ZBB-NEXT:    j .LBB27_5
2042; RV32ZBB-NEXT:  .LBB27_4:
2043; RV32ZBB-NEXT:    sltu t1, a2, a7
2044; RV32ZBB-NEXT:  .LBB27_5:
2045; RV32ZBB-NEXT:    sub a5, a1, a5
2046; RV32ZBB-NEXT:    sub a5, a5, t2
2047; RV32ZBB-NEXT:    sub a3, t0, a3
2048; RV32ZBB-NEXT:    beq a5, a1, .LBB27_7
2049; RV32ZBB-NEXT:  # %bb.6:
2050; RV32ZBB-NEXT:    sltu a1, a1, a5
2051; RV32ZBB-NEXT:    j .LBB27_8
2052; RV32ZBB-NEXT:  .LBB27_7:
2053; RV32ZBB-NEXT:    sltu a1, t0, a3
2054; RV32ZBB-NEXT:  .LBB27_8:
2055; RV32ZBB-NEXT:    xor a4, a6, a4
2056; RV32ZBB-NEXT:    xor a2, a7, a2
2057; RV32ZBB-NEXT:    or a2, a2, a4
2058; RV32ZBB-NEXT:    beqz a2, .LBB27_10
2059; RV32ZBB-NEXT:  # %bb.9:
2060; RV32ZBB-NEXT:    mv a1, t1
2061; RV32ZBB-NEXT:  .LBB27_10:
2062; RV32ZBB-NEXT:    neg t0, a1
2063; RV32ZBB-NEXT:    xor a2, a7, t0
2064; RV32ZBB-NEXT:    xor a6, a6, t0
2065; RV32ZBB-NEXT:    xor a4, a3, t0
2066; RV32ZBB-NEXT:    sltu a3, a2, t0
2067; RV32ZBB-NEXT:    add a7, a6, a1
2068; RV32ZBB-NEXT:    sltu a6, a4, t0
2069; RV32ZBB-NEXT:    sub a3, a7, a3
2070; RV32ZBB-NEXT:    xor t1, a5, t0
2071; RV32ZBB-NEXT:    mv a7, a6
2072; RV32ZBB-NEXT:    beqz a5, .LBB27_12
2073; RV32ZBB-NEXT:  # %bb.11:
2074; RV32ZBB-NEXT:    sltu a7, t1, t0
2075; RV32ZBB-NEXT:  .LBB27_12:
2076; RV32ZBB-NEXT:    add a2, a2, a1
2077; RV32ZBB-NEXT:    add t1, t1, a1
2078; RV32ZBB-NEXT:    add a1, a4, a1
2079; RV32ZBB-NEXT:    sltu a4, a2, a7
2080; RV32ZBB-NEXT:    sub a2, a2, a7
2081; RV32ZBB-NEXT:    sub a5, t1, a6
2082; RV32ZBB-NEXT:    sub a3, a3, a4
2083; RV32ZBB-NEXT:    sw a1, 0(a0)
2084; RV32ZBB-NEXT:    sw a5, 4(a0)
2085; RV32ZBB-NEXT:    sw a2, 8(a0)
2086; RV32ZBB-NEXT:    sw a3, 12(a0)
2087; RV32ZBB-NEXT:    ret
2088;
2089; RV64ZBB-LABEL: abd_select_i128:
2090; RV64ZBB:       # %bb.0:
2091; RV64ZBB-NEXT:    sltu a4, a0, a2
2092; RV64ZBB-NEXT:    sub a3, a1, a3
2093; RV64ZBB-NEXT:    sub a3, a3, a4
2094; RV64ZBB-NEXT:    sub a2, a0, a2
2095; RV64ZBB-NEXT:    beq a3, a1, .LBB27_2
2096; RV64ZBB-NEXT:  # %bb.1:
2097; RV64ZBB-NEXT:    sltu a0, a1, a3
2098; RV64ZBB-NEXT:    j .LBB27_3
2099; RV64ZBB-NEXT:  .LBB27_2:
2100; RV64ZBB-NEXT:    sltu a0, a0, a2
2101; RV64ZBB-NEXT:  .LBB27_3:
2102; RV64ZBB-NEXT:    neg a1, a0
2103; RV64ZBB-NEXT:    xor a2, a2, a1
2104; RV64ZBB-NEXT:    xor a3, a3, a1
2105; RV64ZBB-NEXT:    sltu a1, a2, a1
2106; RV64ZBB-NEXT:    add a3, a3, a0
2107; RV64ZBB-NEXT:    sub a1, a3, a1
2108; RV64ZBB-NEXT:    add a0, a2, a0
2109; RV64ZBB-NEXT:    ret
2110  %cmp = icmp ult i128 %a, %b
2111  %ab = select i1 %cmp, i128 %a, i128 %b
2112  %ba = select i1 %cmp, i128 %b, i128 %a
2113  %sub = sub i128 %ba, %ab
2114  ret i128 %sub
2115}
2116
2117declare i8 @llvm.abs.i8(i8, i1)
2118declare i16 @llvm.abs.i16(i16, i1)
2119declare i32 @llvm.abs.i32(i32, i1)
2120declare i64 @llvm.abs.i64(i64, i1)
2121declare i128 @llvm.abs.i128(i128, i1)
2122
2123declare i8 @llvm.umax.i8(i8, i8)
2124declare i16 @llvm.umax.i16(i16, i16)
2125declare i32 @llvm.umax.i32(i32, i32)
2126declare i64 @llvm.umax.i64(i64, i64)
2127
2128declare i8 @llvm.umin.i8(i8, i8)
2129declare i16 @llvm.umin.i16(i16, i16)
2130declare i32 @llvm.umin.i32(i32, i32)
2131declare i64 @llvm.umin.i64(i64, i64)
2132;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
2133; CHECK: {{.*}}
2134; NOZBB: {{.*}}
2135