xref: /llvm-project/llvm/test/CodeGen/RISCV/abds.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
104f65043SSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
204f65043SSimon Pilgrim; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefixes=RV32I
304f65043SSimon Pilgrim; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=RV64I
404f65043SSimon Pilgrim; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV32ZBB
504f65043SSimon Pilgrim; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV64ZBB
604f65043SSimon Pilgrim
704f65043SSimon Pilgrim;
804f65043SSimon Pilgrim; trunc(abs(sub(sext(a),sext(b)))) -> abds(a,b)
904f65043SSimon Pilgrim;
1004f65043SSimon Pilgrim
1104f65043SSimon Pilgrimdefine i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
1204f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8:
1304f65043SSimon Pilgrim; RV32I:       # %bb.0:
14e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
1513d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
16*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
1713d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
1804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
1904f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
2004f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
2104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
2204f65043SSimon Pilgrim; RV32I-NEXT:    ret
2304f65043SSimon Pilgrim;
2404f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8:
2504f65043SSimon Pilgrim; RV64I:       # %bb.0:
26e4e96b3eSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
2713d04fa5SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
28*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
2913d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
3004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
3104f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
3204f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
3304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
3404f65043SSimon Pilgrim; RV64I-NEXT:    ret
3504f65043SSimon Pilgrim;
3604f65043SSimon Pilgrim; ZBB-LABEL: abd_ext_i8:
3704f65043SSimon Pilgrim; ZBB:       # %bb.0:
38e4e96b3eSSimon Pilgrim; ZBB-NEXT:    sext.b a1, a1
3913d04fa5SSimon Pilgrim; ZBB-NEXT:    sext.b a0, a0
4013d04fa5SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
4104f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
4213d04fa5SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
4304f65043SSimon Pilgrim; ZBB-NEXT:    ret
4404f65043SSimon Pilgrim  %aext = sext i8 %a to i64
4504f65043SSimon Pilgrim  %bext = sext i8 %b to i64
4604f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
4704f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
4804f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i8
4904f65043SSimon Pilgrim  ret i8 %trunc
5004f65043SSimon Pilgrim}
5104f65043SSimon Pilgrim
5204f65043SSimon Pilgrimdefine i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
5304f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8_i16:
5404f65043SSimon Pilgrim; RV32I:       # %bb.0:
55e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
5613d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
57*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
5813d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
5904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
6004f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
6104f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
6204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
6304f65043SSimon Pilgrim; RV32I-NEXT:    ret
6404f65043SSimon Pilgrim;
6504f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8_i16:
6604f65043SSimon Pilgrim; RV64I:       # %bb.0:
67e4e96b3eSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
6813d04fa5SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
69*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
7013d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
7104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
7204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
7304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
7404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
7504f65043SSimon Pilgrim; RV64I-NEXT:    ret
7604f65043SSimon Pilgrim;
7704f65043SSimon Pilgrim; ZBB-LABEL: abd_ext_i8_i16:
7804f65043SSimon Pilgrim; ZBB:       # %bb.0:
79e4e96b3eSSimon Pilgrim; ZBB-NEXT:    sext.h a1, a1
8013d04fa5SSimon Pilgrim; ZBB-NEXT:    sext.b a0, a0
8113d04fa5SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
8204f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
8313d04fa5SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
8404f65043SSimon Pilgrim; ZBB-NEXT:    ret
8504f65043SSimon Pilgrim  %aext = sext i8 %a to i64
8604f65043SSimon Pilgrim  %bext = sext i16 %b to i64
8704f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
8804f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
8904f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i8
9004f65043SSimon Pilgrim  ret i8 %trunc
9104f65043SSimon Pilgrim}
9204f65043SSimon Pilgrim
9304f65043SSimon Pilgrimdefine i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
9404f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8_undef:
9504f65043SSimon Pilgrim; RV32I:       # %bb.0:
96e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
9713d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
98*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
9913d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
10004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
10104f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
10204f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
10304f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
10404f65043SSimon Pilgrim; RV32I-NEXT:    ret
10504f65043SSimon Pilgrim;
10604f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8_undef:
10704f65043SSimon Pilgrim; RV64I:       # %bb.0:
108e4e96b3eSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
10913d04fa5SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
110*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
11113d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
11204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
11304f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
11404f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
11504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
11604f65043SSimon Pilgrim; RV64I-NEXT:    ret
11704f65043SSimon Pilgrim;
11804f65043SSimon Pilgrim; ZBB-LABEL: abd_ext_i8_undef:
11904f65043SSimon Pilgrim; ZBB:       # %bb.0:
120e4e96b3eSSimon Pilgrim; ZBB-NEXT:    sext.b a1, a1
12113d04fa5SSimon Pilgrim; ZBB-NEXT:    sext.b a0, a0
12213d04fa5SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
12304f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
12413d04fa5SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
12504f65043SSimon Pilgrim; ZBB-NEXT:    ret
12604f65043SSimon Pilgrim  %aext = sext i8 %a to i64
12704f65043SSimon Pilgrim  %bext = sext i8 %b to i64
12804f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
12904f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
13004f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i8
13104f65043SSimon Pilgrim  ret i8 %trunc
13204f65043SSimon Pilgrim}
13304f65043SSimon Pilgrim
13404f65043SSimon Pilgrimdefine i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
13504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16:
13604f65043SSimon Pilgrim; RV32I:       # %bb.0:
137e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
13813d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
139*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
14013d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
14104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
14204f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
14304f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
14404f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
14504f65043SSimon Pilgrim; RV32I-NEXT:    ret
14604f65043SSimon Pilgrim;
14704f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16:
14804f65043SSimon Pilgrim; RV64I:       # %bb.0:
149e4e96b3eSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
15013d04fa5SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
151*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
15213d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
15304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
15404f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
15504f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
15604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
15704f65043SSimon Pilgrim; RV64I-NEXT:    ret
15804f65043SSimon Pilgrim;
15904f65043SSimon Pilgrim; ZBB-LABEL: abd_ext_i16:
16004f65043SSimon Pilgrim; ZBB:       # %bb.0:
161e4e96b3eSSimon Pilgrim; ZBB-NEXT:    sext.h a1, a1
16213d04fa5SSimon Pilgrim; ZBB-NEXT:    sext.h a0, a0
16313d04fa5SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
16404f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
16513d04fa5SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
16604f65043SSimon Pilgrim; ZBB-NEXT:    ret
16704f65043SSimon Pilgrim  %aext = sext i16 %a to i64
16804f65043SSimon Pilgrim  %bext = sext i16 %b to i64
16904f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
17004f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
17104f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i16
17204f65043SSimon Pilgrim  ret i16 %trunc
17304f65043SSimon Pilgrim}
17404f65043SSimon Pilgrim
17504f65043SSimon Pilgrimdefine i16 @abd_ext_i16_i32(i16 %a, i32 %b) nounwind {
17604f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16_i32:
17704f65043SSimon Pilgrim; RV32I:       # %bb.0:
17804f65043SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
17904f65043SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
18013d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB4_2
181e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
18213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
18313d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
184e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB4_2:
18513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
18604f65043SSimon Pilgrim; RV32I-NEXT:    ret
18704f65043SSimon Pilgrim;
18804f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16_i32:
18904f65043SSimon Pilgrim; RV64I:       # %bb.0:
19013d04fa5SSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
19104f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
19204f65043SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
19304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
19404f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
19504f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
19604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
19704f65043SSimon Pilgrim; RV64I-NEXT:    ret
19804f65043SSimon Pilgrim;
19904f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i16_i32:
20004f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
20104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a0, a0
20213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
20313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
20413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
20504f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
20604f65043SSimon Pilgrim;
20704f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i16_i32:
20804f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
209e4e96b3eSSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
21013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a0, a0
21113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
21204f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
21313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
21404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
21504f65043SSimon Pilgrim  %aext = sext i16 %a to i64
21604f65043SSimon Pilgrim  %bext = sext i32 %b to i64
21704f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
21804f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
21904f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i16
22004f65043SSimon Pilgrim  ret i16 %trunc
22104f65043SSimon Pilgrim}
22204f65043SSimon Pilgrim
22304f65043SSimon Pilgrimdefine i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
22404f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16_undef:
22504f65043SSimon Pilgrim; RV32I:       # %bb.0:
226e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
22713d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
228*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
22913d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
23004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
23104f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
23204f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
23304f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
23404f65043SSimon Pilgrim; RV32I-NEXT:    ret
23504f65043SSimon Pilgrim;
23604f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16_undef:
23704f65043SSimon Pilgrim; RV64I:       # %bb.0:
238e4e96b3eSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
23913d04fa5SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
240*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
24113d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
24204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
24304f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
24404f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
24504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
24604f65043SSimon Pilgrim; RV64I-NEXT:    ret
24704f65043SSimon Pilgrim;
24804f65043SSimon Pilgrim; ZBB-LABEL: abd_ext_i16_undef:
24904f65043SSimon Pilgrim; ZBB:       # %bb.0:
250e4e96b3eSSimon Pilgrim; ZBB-NEXT:    sext.h a1, a1
25113d04fa5SSimon Pilgrim; ZBB-NEXT:    sext.h a0, a0
25213d04fa5SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
25304f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
25413d04fa5SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
25504f65043SSimon Pilgrim; ZBB-NEXT:    ret
25604f65043SSimon Pilgrim  %aext = sext i16 %a to i64
25704f65043SSimon Pilgrim  %bext = sext i16 %b to i64
25804f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
25904f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
26004f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i16
26104f65043SSimon Pilgrim  ret i16 %trunc
26204f65043SSimon Pilgrim}
26304f65043SSimon Pilgrim
26404f65043SSimon Pilgrimdefine i32 @abd_ext_i32(i32 %a, i32 %b) nounwind {
26504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32:
26604f65043SSimon Pilgrim; RV32I:       # %bb.0:
26713d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB6_2
268e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
26913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
27013d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
271e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB6_2:
27213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
27304f65043SSimon Pilgrim; RV32I-NEXT:    ret
27404f65043SSimon Pilgrim;
27504f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32:
27604f65043SSimon Pilgrim; RV64I:       # %bb.0:
277e4e96b3eSSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
27813d04fa5SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
27904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
28004f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
28104f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
28204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
28304f65043SSimon Pilgrim; RV64I-NEXT:    ret
28404f65043SSimon Pilgrim;
28504f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32:
28604f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
28713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
28813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
28913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
29004f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
29104f65043SSimon Pilgrim;
29204f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32:
29304f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
294e4e96b3eSSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
29513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
29613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
29704f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
29813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
29904f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
30004f65043SSimon Pilgrim  %aext = sext i32 %a to i64
30104f65043SSimon Pilgrim  %bext = sext i32 %b to i64
30204f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
30304f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
30404f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i32
30504f65043SSimon Pilgrim  ret i32 %trunc
30604f65043SSimon Pilgrim}
30704f65043SSimon Pilgrim
30804f65043SSimon Pilgrimdefine i32 @abd_ext_i32_i16(i32 %a, i16 %b) nounwind {
30904f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32_i16:
31004f65043SSimon Pilgrim; RV32I:       # %bb.0:
31104f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
31204f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 16
31313d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB7_2
314e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
31513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
31613d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
317e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB7_2:
31813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
31904f65043SSimon Pilgrim; RV32I-NEXT:    ret
32004f65043SSimon Pilgrim;
32104f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32_i16:
32204f65043SSimon Pilgrim; RV64I:       # %bb.0:
32304f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
32404f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
32504f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 48
32604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
32704f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
32804f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
32904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
33004f65043SSimon Pilgrim; RV64I-NEXT:    ret
33104f65043SSimon Pilgrim;
33204f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32_i16:
33304f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
33404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a1, a1
33513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
33613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
33713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
33804f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
33904f65043SSimon Pilgrim;
34004f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32_i16:
34104f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
34204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
34304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a1, a1
34413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
34504f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
34613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
34704f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
34804f65043SSimon Pilgrim  %aext = sext i32 %a to i64
34904f65043SSimon Pilgrim  %bext = sext i16 %b to i64
35004f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
35104f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
35204f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i32
35304f65043SSimon Pilgrim  ret i32 %trunc
35404f65043SSimon Pilgrim}
35504f65043SSimon Pilgrim
35604f65043SSimon Pilgrimdefine i32 @abd_ext_i32_undef(i32 %a, i32 %b) nounwind {
35704f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32_undef:
35804f65043SSimon Pilgrim; RV32I:       # %bb.0:
35913d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB8_2
360e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
36113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
36213d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
363e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB8_2:
36413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
36504f65043SSimon Pilgrim; RV32I-NEXT:    ret
36604f65043SSimon Pilgrim;
36704f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32_undef:
36804f65043SSimon Pilgrim; RV64I:       # %bb.0:
369e4e96b3eSSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
37013d04fa5SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
37104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
37204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
37304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
37404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
37504f65043SSimon Pilgrim; RV64I-NEXT:    ret
37604f65043SSimon Pilgrim;
37704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32_undef:
37804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
37913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
38013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
38113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
38204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
38304f65043SSimon Pilgrim;
38404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32_undef:
38504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
386e4e96b3eSSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
38713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
38813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
38904f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
39013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
39104f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
39204f65043SSimon Pilgrim  %aext = sext i32 %a to i64
39304f65043SSimon Pilgrim  %bext = sext i32 %b to i64
39404f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
39504f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
39604f65043SSimon Pilgrim  %trunc = trunc i64 %abs to i32
39704f65043SSimon Pilgrim  ret i32 %trunc
39804f65043SSimon Pilgrim}
39904f65043SSimon Pilgrim
40004f65043SSimon Pilgrimdefine i64 @abd_ext_i64(i64 %a, i64 %b) nounwind {
40104f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i64:
40204f65043SSimon Pilgrim; RV32I:       # %bb.0:
40313d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
40413d04fa5SSimon Pilgrim; RV32I-NEXT:    mv a5, a4
40504f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB9_2
40604f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
40713d04fa5SSimon Pilgrim; RV32I-NEXT:    slt a5, a3, a1
40804f65043SSimon Pilgrim; RV32I-NEXT:  .LBB9_2:
40913d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB9_4
41013d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
41113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
41213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
41313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
41413d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
41513d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB9_4:
41613d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
41704f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
41804f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
41904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
42004f65043SSimon Pilgrim; RV32I-NEXT:    ret
42104f65043SSimon Pilgrim;
42204f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i64:
42304f65043SSimon Pilgrim; RV64I:       # %bb.0:
42413d04fa5SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB9_2
425e4e96b3eSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
42613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
42713d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
428e4e96b3eSSimon Pilgrim; RV64I-NEXT:  .LBB9_2:
42913d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
43004f65043SSimon Pilgrim; RV64I-NEXT:    ret
43104f65043SSimon Pilgrim;
43204f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i64:
43304f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
43413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
43513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
43604f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB9_2
43704f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
43813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a3, a1
43904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB9_2:
44013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB9_4
44113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
44213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
44313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
44413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
44513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
44613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB9_4:
44713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
44804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
44904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
45004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
45104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
45204f65043SSimon Pilgrim;
45304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i64:
45404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
45513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
45613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
45713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
45804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
45904f65043SSimon Pilgrim  %aext = sext i64 %a to i128
46004f65043SSimon Pilgrim  %bext = sext i64 %b to i128
46104f65043SSimon Pilgrim  %sub = sub i128 %aext, %bext
46204f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
46304f65043SSimon Pilgrim  %trunc = trunc i128 %abs to i64
46404f65043SSimon Pilgrim  ret i64 %trunc
46504f65043SSimon Pilgrim}
46604f65043SSimon Pilgrim
46704f65043SSimon Pilgrimdefine i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {
46804f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i64_undef:
46904f65043SSimon Pilgrim; RV32I:       # %bb.0:
47013d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
47113d04fa5SSimon Pilgrim; RV32I-NEXT:    mv a5, a4
47204f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB10_2
47304f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
47413d04fa5SSimon Pilgrim; RV32I-NEXT:    slt a5, a3, a1
47504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB10_2:
47613d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB10_4
47713d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
47813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
47913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
48013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
48113d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
48213d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB10_4:
48313d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
48404f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
48504f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
48604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
48704f65043SSimon Pilgrim; RV32I-NEXT:    ret
48804f65043SSimon Pilgrim;
48904f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i64_undef:
49004f65043SSimon Pilgrim; RV64I:       # %bb.0:
49113d04fa5SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB10_2
492e4e96b3eSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
49313d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
49413d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
495e4e96b3eSSimon Pilgrim; RV64I-NEXT:  .LBB10_2:
49613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
49704f65043SSimon Pilgrim; RV64I-NEXT:    ret
49804f65043SSimon Pilgrim;
49904f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i64_undef:
50004f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
50113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
50213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
50304f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB10_2
50404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
50513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a3, a1
50604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB10_2:
50713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB10_4
50813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
50913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
51013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
51113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
51213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
51313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB10_4:
51413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
51504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
51604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
51704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
51804f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
51904f65043SSimon Pilgrim;
52004f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i64_undef:
52104f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
52213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
52313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
52413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
52504f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
52604f65043SSimon Pilgrim  %aext = sext i64 %a to i128
52704f65043SSimon Pilgrim  %bext = sext i64 %b to i128
52804f65043SSimon Pilgrim  %sub = sub i128 %aext, %bext
52904f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
53004f65043SSimon Pilgrim  %trunc = trunc i128 %abs to i64
53104f65043SSimon Pilgrim  ret i64 %trunc
53204f65043SSimon Pilgrim}
53304f65043SSimon Pilgrim
53404f65043SSimon Pilgrimdefine i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {
53504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i128:
53604f65043SSimon Pilgrim; RV32I:       # %bb.0:
53713d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a1)
53813d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a4, 4(a1)
53913d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a6, 8(a1)
54004f65043SSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a1)
54114c4f28eSAlex Bradbury; RV32I-NEXT:    lw a7, 8(a2)
54213d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t1, 12(a2)
54314c4f28eSAlex Bradbury; RV32I-NEXT:    lw a5, 0(a2)
54413d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a1, 4(a2)
54513d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a2, a7, a6
54613d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, a2
54713d04fa5SSimon Pilgrim; RV32I-NEXT:    beq t0, t1, .LBB11_2
54804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
54913d04fa5SSimon Pilgrim; RV32I-NEXT:    slt t4, t1, t0
55004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_2:
55113d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t2, a5, a3
55213d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t5, a1, a4
55304f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, t2
55413d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB11_4
55504f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
55613d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t3, t5
55704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_4:
55804f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
55904f65043SSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
56013d04fa5SSimon Pilgrim; RV32I-NEXT:    xor t6, t0, t1
56113d04fa5SSimon Pilgrim; RV32I-NEXT:    xor s0, a6, a7
56213d04fa5SSimon Pilgrim; RV32I-NEXT:    or t6, s0, t6
56313d04fa5SSimon Pilgrim; RV32I-NEXT:    beqz t6, .LBB11_6
56404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.5:
56513d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t3, t4
56604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_6:
56713d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t2
56813d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a1, a4, .LBB11_8
569e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.7:
57013d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t5
571e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB11_8:
57213d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t5, a3, a5
57313d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t6, t5
57413d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB11_10
57513d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
57613d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t6, a4, a1
57713d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_10:
57813d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez t3, .LBB11_12
57913d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
58013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t0, t1, t0
58113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a7, a6
58213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a5, a3
58313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
584*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, t0, a2
585*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t4
586*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a1, t2
587*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a4, a5
58813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t4
58913d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB11_13
59013d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_12:
59113d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a2, a6, a7
59213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t0, t0, t1
59313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a6, a7
59413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a3, a5
59513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a4, a1
596*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t0, a2
597*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t6
598*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a4, t5
599*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a5
60013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t6
60113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_13:
60213d04fa5SSimon Pilgrim; RV32I-NEXT:    sw a3, 0(a0)
603*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 4(a0)
6042967e5f8SAlex Bradbury; RV32I-NEXT:    sw a4, 8(a0)
605*9122c523SPengcheng Wang; RV32I-NEXT:    sw a1, 12(a0)
60604f65043SSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
60704f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
60804f65043SSimon Pilgrim; RV32I-NEXT:    ret
60904f65043SSimon Pilgrim;
61004f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i128:
61104f65043SSimon Pilgrim; RV64I:       # %bb.0:
61213d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
61313d04fa5SSimon Pilgrim; RV64I-NEXT:    mv a5, a4
61404f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB11_2
61504f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
61613d04fa5SSimon Pilgrim; RV64I-NEXT:    slt a5, a3, a1
61704f65043SSimon Pilgrim; RV64I-NEXT:  .LBB11_2:
61813d04fa5SSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB11_4
61913d04fa5SSimon Pilgrim; RV64I-NEXT:  # %bb.3:
62013d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
62113d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
62213d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
62313d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
62413d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB11_4:
62513d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
62604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
62704f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
62804f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
62904f65043SSimon Pilgrim; RV64I-NEXT:    ret
63004f65043SSimon Pilgrim;
63104f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i128:
63204f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
63313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a1)
63413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a4, 4(a1)
63513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 8(a1)
63604f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a1)
63714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a7, 8(a2)
63813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t1, 12(a2)
63914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a5, 0(a2)
64013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 4(a2)
64113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a7, a6
64213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, a2
64313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq t0, t1, .LBB11_2
64404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
64513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt t4, t1, t0
64604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_2:
64713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t2, a5, a3
64813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a1, a4
64904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t2
65013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB11_4
65104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
65213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t5
65304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_4:
65404f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
65504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
65613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor t6, t0, t1
65713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor s0, a6, a7
65813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    or t6, s0, t6
65913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beqz t6, .LBB11_6
66004f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
66113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t4
66204f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_6:
66313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t2
66413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a4, .LBB11_8
665e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
66613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t5
667e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_8:
66813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a3, a5
66913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t5
67013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB11_10
67113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
67213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a4, a1
67313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_10:
67413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez t3, .LBB11_12
67513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
67613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t1, t0
67713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a7, a6
67813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a5, a3
67913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
680*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, t0, a2
681*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t4
682*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a1, t2
683*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a4, a5
68413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t4
68513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB11_13
68613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_12:
68713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a6, a7
68813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t0, t1
68913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, a7
69013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a3, a5
69113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a4, a1
692*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t0, a2
693*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t6
694*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a4, t5
695*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a5
69613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t6
69713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_13:
69813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sw a3, 0(a0)
699*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 4(a0)
7002967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a4, 8(a0)
701*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a1, 12(a0)
70204f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
70304f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
70404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
70504f65043SSimon Pilgrim;
70604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i128:
70704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
70813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
70913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
71004f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB11_2
71104f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
71213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a3, a1
71304f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB11_2:
71413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB11_4
71513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
71613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
71713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
71813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
71913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
72013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB11_4:
72113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
72204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
72304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
72404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
72504f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
72604f65043SSimon Pilgrim  %aext = sext i128 %a to i256
72704f65043SSimon Pilgrim  %bext = sext i128 %b to i256
72804f65043SSimon Pilgrim  %sub = sub i256 %aext, %bext
72904f65043SSimon Pilgrim  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false)
73004f65043SSimon Pilgrim  %trunc = trunc i256 %abs to i128
73104f65043SSimon Pilgrim  ret i128 %trunc
73204f65043SSimon Pilgrim}
73304f65043SSimon Pilgrim
73404f65043SSimon Pilgrimdefine i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {
73504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i128_undef:
73604f65043SSimon Pilgrim; RV32I:       # %bb.0:
73713d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a1)
73813d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a4, 4(a1)
73913d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a6, 8(a1)
74004f65043SSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a1)
74114c4f28eSAlex Bradbury; RV32I-NEXT:    lw a7, 8(a2)
74213d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t1, 12(a2)
74314c4f28eSAlex Bradbury; RV32I-NEXT:    lw a5, 0(a2)
74413d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a1, 4(a2)
74513d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a2, a7, a6
74613d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, a2
74713d04fa5SSimon Pilgrim; RV32I-NEXT:    beq t0, t1, .LBB12_2
74804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
74913d04fa5SSimon Pilgrim; RV32I-NEXT:    slt t4, t1, t0
75004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_2:
75113d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t2, a5, a3
75213d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t5, a1, a4
75304f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, t2
75413d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB12_4
75504f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
75613d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t3, t5
75704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_4:
75804f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
75904f65043SSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
76013d04fa5SSimon Pilgrim; RV32I-NEXT:    xor t6, t0, t1
76113d04fa5SSimon Pilgrim; RV32I-NEXT:    xor s0, a6, a7
76213d04fa5SSimon Pilgrim; RV32I-NEXT:    or t6, s0, t6
76313d04fa5SSimon Pilgrim; RV32I-NEXT:    beqz t6, .LBB12_6
76404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.5:
76513d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t3, t4
76604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_6:
76713d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t2
76813d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a1, a4, .LBB12_8
769e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.7:
77013d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t5
771e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB12_8:
77213d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t5, a3, a5
77313d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t6, t5
77413d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB12_10
77513d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
77613d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t6, a4, a1
77713d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_10:
77813d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez t3, .LBB12_12
77913d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
78013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t0, t1, t0
78113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a7, a6
78213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a5, a3
78313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
784*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, t0, a2
785*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t4
786*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a1, t2
787*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a4, a5
78813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t4
78913d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB12_13
79013d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_12:
79113d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a2, a6, a7
79213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t0, t0, t1
79313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a6, a7
79413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a3, a5
79513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a4, a1
796*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t0, a2
797*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t6
798*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a4, t5
799*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a5
80013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t6
80113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_13:
80213d04fa5SSimon Pilgrim; RV32I-NEXT:    sw a3, 0(a0)
803*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 4(a0)
8042967e5f8SAlex Bradbury; RV32I-NEXT:    sw a4, 8(a0)
805*9122c523SPengcheng Wang; RV32I-NEXT:    sw a1, 12(a0)
80604f65043SSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
80704f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
80804f65043SSimon Pilgrim; RV32I-NEXT:    ret
80904f65043SSimon Pilgrim;
81004f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i128_undef:
81104f65043SSimon Pilgrim; RV64I:       # %bb.0:
81213d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
81313d04fa5SSimon Pilgrim; RV64I-NEXT:    mv a5, a4
81404f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB12_2
81504f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
81613d04fa5SSimon Pilgrim; RV64I-NEXT:    slt a5, a3, a1
81704f65043SSimon Pilgrim; RV64I-NEXT:  .LBB12_2:
81813d04fa5SSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB12_4
81913d04fa5SSimon Pilgrim; RV64I-NEXT:  # %bb.3:
82013d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
82113d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
82213d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
82313d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
82413d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB12_4:
82513d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
82604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
82704f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
82804f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
82904f65043SSimon Pilgrim; RV64I-NEXT:    ret
83004f65043SSimon Pilgrim;
83104f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i128_undef:
83204f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
83313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a1)
83413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a4, 4(a1)
83513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 8(a1)
83604f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a1)
83714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a7, 8(a2)
83813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t1, 12(a2)
83914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a5, 0(a2)
84013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 4(a2)
84113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a7, a6
84213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, a2
84313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq t0, t1, .LBB12_2
84404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
84513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt t4, t1, t0
84604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_2:
84713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t2, a5, a3
84813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a1, a4
84904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t2
85013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB12_4
85104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
85213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t5
85304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_4:
85404f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
85504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
85613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor t6, t0, t1
85713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor s0, a6, a7
85813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    or t6, s0, t6
85913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beqz t6, .LBB12_6
86004f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
86113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t4
86204f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_6:
86313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t2
86413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a4, .LBB12_8
865e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
86613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t5
867e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_8:
86813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a3, a5
86913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t5
87013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB12_10
87113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
87213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a4, a1
87313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_10:
87413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez t3, .LBB12_12
87513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
87613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t1, t0
87713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a7, a6
87813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a5, a3
87913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
880*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, t0, a2
881*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t4
882*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a1, t2
883*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a4, a5
88413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t4
88513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB12_13
88613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_12:
88713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a6, a7
88813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t0, t1
88913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, a7
89013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a3, a5
89113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a4, a1
892*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t0, a2
893*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t6
894*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a4, t5
895*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a5
89613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t6
89713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_13:
89813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sw a3, 0(a0)
899*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 4(a0)
9002967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a4, 8(a0)
901*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a1, 12(a0)
90204f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
90304f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
90404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
90504f65043SSimon Pilgrim;
90604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i128_undef:
90704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
90813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
90913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
91004f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB12_2
91104f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
91213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a3, a1
91304f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB12_2:
91413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB12_4
91513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
91613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
91713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
91813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
91913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
92013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB12_4:
92113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
92204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
92304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
92404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
92504f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
92604f65043SSimon Pilgrim  %aext = sext i128 %a to i256
92704f65043SSimon Pilgrim  %bext = sext i128 %b to i256
92804f65043SSimon Pilgrim  %sub = sub i256 %aext, %bext
92904f65043SSimon Pilgrim  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true)
93004f65043SSimon Pilgrim  %trunc = trunc i256 %abs to i128
93104f65043SSimon Pilgrim  ret i128 %trunc
93204f65043SSimon Pilgrim}
93304f65043SSimon Pilgrim
93404f65043SSimon Pilgrim;
93504f65043SSimon Pilgrim; sub(smax(a,b),smin(a,b)) -> abds(a,b)
93604f65043SSimon Pilgrim;
93704f65043SSimon Pilgrim
93804f65043SSimon Pilgrimdefine i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
93904f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i8:
94004f65043SSimon Pilgrim; RV32I:       # %bb.0:
94104f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
94204f65043SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
943*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
94404f65043SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
94513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
94613d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
94713d04fa5SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
94813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
94904f65043SSimon Pilgrim; RV32I-NEXT:    ret
95004f65043SSimon Pilgrim;
95104f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i8:
95204f65043SSimon Pilgrim; RV64I:       # %bb.0:
95304f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
95404f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
955*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
95604f65043SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
95713d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
95813d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
95913d04fa5SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
96013d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
96104f65043SSimon Pilgrim; RV64I-NEXT:    ret
96204f65043SSimon Pilgrim;
96304f65043SSimon Pilgrim; ZBB-LABEL: abd_minmax_i8:
96404f65043SSimon Pilgrim; ZBB:       # %bb.0:
96504f65043SSimon Pilgrim; ZBB-NEXT:    sext.b a1, a1
96604f65043SSimon Pilgrim; ZBB-NEXT:    sext.b a0, a0
96704f65043SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
96804f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
96904f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
97004f65043SSimon Pilgrim; ZBB-NEXT:    ret
97104f65043SSimon Pilgrim  %min = call i8 @llvm.smin.i8(i8 %a, i8 %b)
97204f65043SSimon Pilgrim  %max = call i8 @llvm.smax.i8(i8 %a, i8 %b)
97304f65043SSimon Pilgrim  %sub = sub i8 %max, %min
97404f65043SSimon Pilgrim  ret i8 %sub
97504f65043SSimon Pilgrim}
97604f65043SSimon Pilgrim
97704f65043SSimon Pilgrimdefine i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
97804f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i16:
97904f65043SSimon Pilgrim; RV32I:       # %bb.0:
98004f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
98104f65043SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
982*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
98304f65043SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
98413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
98513d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
98613d04fa5SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
98713d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
98804f65043SSimon Pilgrim; RV32I-NEXT:    ret
98904f65043SSimon Pilgrim;
99004f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i16:
99104f65043SSimon Pilgrim; RV64I:       # %bb.0:
99204f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
99304f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
994*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
99504f65043SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
99613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
99713d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
99813d04fa5SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
99913d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
100004f65043SSimon Pilgrim; RV64I-NEXT:    ret
100104f65043SSimon Pilgrim;
100204f65043SSimon Pilgrim; ZBB-LABEL: abd_minmax_i16:
100304f65043SSimon Pilgrim; ZBB:       # %bb.0:
100404f65043SSimon Pilgrim; ZBB-NEXT:    sext.h a1, a1
100504f65043SSimon Pilgrim; ZBB-NEXT:    sext.h a0, a0
100604f65043SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
100704f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
100804f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
100904f65043SSimon Pilgrim; ZBB-NEXT:    ret
101004f65043SSimon Pilgrim  %min = call i16 @llvm.smin.i16(i16 %a, i16 %b)
101104f65043SSimon Pilgrim  %max = call i16 @llvm.smax.i16(i16 %a, i16 %b)
101204f65043SSimon Pilgrim  %sub = sub i16 %max, %min
101304f65043SSimon Pilgrim  ret i16 %sub
101404f65043SSimon Pilgrim}
101504f65043SSimon Pilgrim
101604f65043SSimon Pilgrimdefine i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind {
101704f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i32:
101804f65043SSimon Pilgrim; RV32I:       # %bb.0:
1019e4e96b3eSSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB15_2
102013d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
102113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
102213d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
102313d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB15_2:
102413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
102504f65043SSimon Pilgrim; RV32I-NEXT:    ret
102604f65043SSimon Pilgrim;
102704f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i32:
102804f65043SSimon Pilgrim; RV64I:       # %bb.0:
102904f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
103004f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
103113d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
103213d04fa5SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
103313d04fa5SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
103413d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
103504f65043SSimon Pilgrim; RV64I-NEXT:    ret
103604f65043SSimon Pilgrim;
103704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i32:
103804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
103904f65043SSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
104004f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
104104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
104204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
104304f65043SSimon Pilgrim;
104404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i32:
104504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
104604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
104704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
104804f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
104904f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
105013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
105104f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
105204f65043SSimon Pilgrim  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
105304f65043SSimon Pilgrim  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
105404f65043SSimon Pilgrim  %sub = sub i32 %max, %min
105504f65043SSimon Pilgrim  ret i32 %sub
105604f65043SSimon Pilgrim}
105704f65043SSimon Pilgrim
105804f65043SSimon Pilgrimdefine i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind {
105904f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i64:
106004f65043SSimon Pilgrim; RV32I:       # %bb.0:
106113d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
106213d04fa5SSimon Pilgrim; RV32I-NEXT:    mv a5, a4
106304f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB16_2
106404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
106513d04fa5SSimon Pilgrim; RV32I-NEXT:    slt a5, a3, a1
106604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_2:
106713d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB16_4
106813d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
106913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
107004f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
107113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
107213d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
107313d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB16_4:
107413d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
107513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
107613d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
107713d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
107804f65043SSimon Pilgrim; RV32I-NEXT:    ret
107904f65043SSimon Pilgrim;
108004f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i64:
108104f65043SSimon Pilgrim; RV64I:       # %bb.0:
1082e4e96b3eSSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB16_2
108313d04fa5SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
108413d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
108513d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
108613d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB16_2:
108713d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
108804f65043SSimon Pilgrim; RV64I-NEXT:    ret
108904f65043SSimon Pilgrim;
109004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i64:
109104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
109213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
109313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
109404f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB16_2
109504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
109613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a3, a1
109704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_2:
109813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB16_4
109913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
110013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
110104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
110213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
110313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
110413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_4:
110513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
110613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
110713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
110813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
110904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
111004f65043SSimon Pilgrim;
111104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i64:
111204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
111304f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
111404f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
111504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
111604f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
111704f65043SSimon Pilgrim  %min = call i64 @llvm.smin.i64(i64 %a, i64 %b)
111804f65043SSimon Pilgrim  %max = call i64 @llvm.smax.i64(i64 %a, i64 %b)
111904f65043SSimon Pilgrim  %sub = sub i64 %max, %min
112004f65043SSimon Pilgrim  ret i64 %sub
112104f65043SSimon Pilgrim}
112204f65043SSimon Pilgrim
112304f65043SSimon Pilgrimdefine i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind {
112404f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i128:
112504f65043SSimon Pilgrim; RV32I:       # %bb.0:
112613d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a1)
112713d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a4, 4(a1)
112813d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a6, 8(a1)
112913d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a1)
113014c4f28eSAlex Bradbury; RV32I-NEXT:    lw a7, 8(a2)
113113d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t1, 12(a2)
113214c4f28eSAlex Bradbury; RV32I-NEXT:    lw a5, 0(a2)
113313d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a1, 4(a2)
113413d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a2, a7, a6
113513d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, a2
113613d04fa5SSimon Pilgrim; RV32I-NEXT:    beq t0, t1, .LBB17_2
113704f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
113813d04fa5SSimon Pilgrim; RV32I-NEXT:    slt t4, t1, t0
113904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_2:
114013d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t2, a5, a3
114113d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t5, a1, a4
114213d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t3, t2
114313d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB17_4
114413d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
114513d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t3, t5
114613d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB17_4:
1147e4e96b3eSSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
1148e4e96b3eSSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
114913d04fa5SSimon Pilgrim; RV32I-NEXT:    xor t6, t0, t1
115013d04fa5SSimon Pilgrim; RV32I-NEXT:    xor s0, a6, a7
115113d04fa5SSimon Pilgrim; RV32I-NEXT:    or t6, s0, t6
115213d04fa5SSimon Pilgrim; RV32I-NEXT:    beqz t6, .LBB17_6
115313d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.5:
115413d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t3, t4
115513d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB17_6:
115613d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t2
115713d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a1, a4, .LBB17_8
115813d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.7:
115913d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t5
116013d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB17_8:
116113d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t5, a3, a5
116213d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t6, t5
116313d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB17_10
116413d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
116513d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t6, a4, a1
116613d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB17_10:
116713d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez t3, .LBB17_12
116813d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
116913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t0, t1, t0
1170e4e96b3eSSimon Pilgrim; RV32I-NEXT:    sub a6, a7, a6
117113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a5, a3
117213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
1173*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, t0, a2
1174*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t4
1175*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a1, t2
1176*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a4, a5
117713d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t4
117813d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB17_13
117913d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB17_12:
118013d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a2, a6, a7
118113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t0, t0, t1
118213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a6, a7
1183e4e96b3eSSimon Pilgrim; RV32I-NEXT:    sub a3, a3, a5
118413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a4, a1
1185*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t0, a2
1186*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t6
1187*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a4, t5
1188*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a5
118913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t6
119013d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB17_13:
119113d04fa5SSimon Pilgrim; RV32I-NEXT:    sw a3, 0(a0)
1192*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 4(a0)
11932967e5f8SAlex Bradbury; RV32I-NEXT:    sw a4, 8(a0)
1194*9122c523SPengcheng Wang; RV32I-NEXT:    sw a1, 12(a0)
119504f65043SSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
119604f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
119704f65043SSimon Pilgrim; RV32I-NEXT:    ret
119804f65043SSimon Pilgrim;
119904f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i128:
120004f65043SSimon Pilgrim; RV64I:       # %bb.0:
120113d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
120213d04fa5SSimon Pilgrim; RV64I-NEXT:    mv a5, a4
120304f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB17_2
120404f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
120513d04fa5SSimon Pilgrim; RV64I-NEXT:    slt a5, a3, a1
120604f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_2:
120713d04fa5SSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB17_4
120813d04fa5SSimon Pilgrim; RV64I-NEXT:  # %bb.3:
120913d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
121004f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
121113d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
121213d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
121313d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB17_4:
121413d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
121513d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
121613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
121713d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
121804f65043SSimon Pilgrim; RV64I-NEXT:    ret
121904f65043SSimon Pilgrim;
122004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i128:
122104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
122213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a1)
122313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a4, 4(a1)
122413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 8(a1)
122513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a1)
122614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a7, 8(a2)
122713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t1, 12(a2)
122814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a5, 0(a2)
122913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 4(a2)
123013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a7, a6
123113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, a2
123213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq t0, t1, .LBB17_2
123304f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
123413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt t4, t1, t0
123504f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_2:
123613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t2, a5, a3
123713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a1, a4
123813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t2
123913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB17_4
124013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
124113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t5
124213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_4:
1243e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
1244e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
124513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor t6, t0, t1
124613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor s0, a6, a7
124713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    or t6, s0, t6
124813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beqz t6, .LBB17_6
124913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
125013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t4
125113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_6:
125213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t2
125313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a4, .LBB17_8
125413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
125513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t5
125613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_8:
125713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a3, a5
125813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t5
125913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB17_10
126013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
126113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a4, a1
126213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_10:
126313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez t3, .LBB17_12
126413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
126513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t1, t0
1266e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a7, a6
126713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a5, a3
126813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
1269*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, t0, a2
1270*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t4
1271*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a1, t2
1272*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a4, a5
127313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t4
127413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_13
127513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_12:
127613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a6, a7
127713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t0, t1
127813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, a7
1279e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a3, a5
128013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a4, a1
1281*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t0, a2
1282*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t6
1283*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a4, t5
1284*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a5
128513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t6
128613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_13:
128713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sw a3, 0(a0)
1288*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 4(a0)
12892967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a4, 8(a0)
1290*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a1, 12(a0)
129104f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
129204f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
129304f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
129404f65043SSimon Pilgrim;
129504f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i128:
129604f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
129713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
129813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
129904f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB17_2
130004f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
130113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a3, a1
130204f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_2:
130313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB17_4
130413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
130513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
130604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
130713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
130813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
130913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_4:
131013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
131113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
131213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
131313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
131404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
131504f65043SSimon Pilgrim  %min = call i128 @llvm.smin.i128(i128 %a, i128 %b)
131604f65043SSimon Pilgrim  %max = call i128 @llvm.smax.i128(i128 %a, i128 %b)
131704f65043SSimon Pilgrim  %sub = sub i128 %max, %min
131804f65043SSimon Pilgrim  ret i128 %sub
131904f65043SSimon Pilgrim}
132004f65043SSimon Pilgrim
132104f65043SSimon Pilgrim;
132204f65043SSimon Pilgrim; select(icmp(a,b),sub(a,b),sub(b,a)) -> abds(a,b)
132304f65043SSimon Pilgrim;
132404f65043SSimon Pilgrim
132504f65043SSimon Pilgrimdefine i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
132604f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i8:
132704f65043SSimon Pilgrim; RV32I:       # %bb.0:
13288109e5deSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
13298109e5deSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
1330*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
13318109e5deSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
13328109e5deSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
13338109e5deSSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
13348109e5deSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
133504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
133604f65043SSimon Pilgrim; RV32I-NEXT:    ret
133704f65043SSimon Pilgrim;
133804f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i8:
133904f65043SSimon Pilgrim; RV64I:       # %bb.0:
13408109e5deSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
13418109e5deSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
1342*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
13438109e5deSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
13448109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
13458109e5deSSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
13468109e5deSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
134704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
134804f65043SSimon Pilgrim; RV64I-NEXT:    ret
134904f65043SSimon Pilgrim;
135004f65043SSimon Pilgrim; ZBB-LABEL: abd_cmp_i8:
135104f65043SSimon Pilgrim; ZBB:       # %bb.0:
13528109e5deSSimon Pilgrim; ZBB-NEXT:    sext.b a1, a1
13538109e5deSSimon Pilgrim; ZBB-NEXT:    sext.b a0, a0
13548109e5deSSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
13558109e5deSSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
13568109e5deSSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
135704f65043SSimon Pilgrim; ZBB-NEXT:    ret
135804f65043SSimon Pilgrim  %cmp = icmp sgt i8 %a, %b
135904f65043SSimon Pilgrim  %ab = sub i8 %a, %b
136004f65043SSimon Pilgrim  %ba = sub i8 %b, %a
136104f65043SSimon Pilgrim  %sel = select i1 %cmp, i8 %ab, i8 %ba
136204f65043SSimon Pilgrim  ret i8 %sel
136304f65043SSimon Pilgrim}
136404f65043SSimon Pilgrim
136504f65043SSimon Pilgrimdefine i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
136604f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i16:
136704f65043SSimon Pilgrim; RV32I:       # %bb.0:
13688109e5deSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
13698109e5deSSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
1370*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
13718109e5deSSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
13728109e5deSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
13738109e5deSSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
13748109e5deSSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
137504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
137604f65043SSimon Pilgrim; RV32I-NEXT:    ret
137704f65043SSimon Pilgrim;
137804f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i16:
137904f65043SSimon Pilgrim; RV64I:       # %bb.0:
13808109e5deSSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
13818109e5deSSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
1382*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
13838109e5deSSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
13848109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
13858109e5deSSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
13868109e5deSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
138704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
138804f65043SSimon Pilgrim; RV64I-NEXT:    ret
138904f65043SSimon Pilgrim;
139004f65043SSimon Pilgrim; ZBB-LABEL: abd_cmp_i16:
139104f65043SSimon Pilgrim; ZBB:       # %bb.0:
13928109e5deSSimon Pilgrim; ZBB-NEXT:    sext.h a1, a1
13938109e5deSSimon Pilgrim; ZBB-NEXT:    sext.h a0, a0
13948109e5deSSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
13958109e5deSSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
13968109e5deSSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
139704f65043SSimon Pilgrim; ZBB-NEXT:    ret
139804f65043SSimon Pilgrim  %cmp = icmp sge i16 %a, %b
139904f65043SSimon Pilgrim  %ab = sub i16 %a, %b
140004f65043SSimon Pilgrim  %ba = sub i16 %b, %a
140104f65043SSimon Pilgrim  %sel = select i1 %cmp, i16 %ab, i16 %ba
140204f65043SSimon Pilgrim  ret i16 %sel
140304f65043SSimon Pilgrim}
140404f65043SSimon Pilgrim
140504f65043SSimon Pilgrimdefine i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind {
140604f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i32:
140704f65043SSimon Pilgrim; RV32I:       # %bb.0:
14088109e5deSSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB20_2
140904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
14108109e5deSSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
141104f65043SSimon Pilgrim; RV32I-NEXT:    ret
141204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB20_2:
14138109e5deSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
141404f65043SSimon Pilgrim; RV32I-NEXT:    ret
141504f65043SSimon Pilgrim;
141604f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i32:
141704f65043SSimon Pilgrim; RV64I:       # %bb.0:
14188109e5deSSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
14198109e5deSSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
14208109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
14218109e5deSSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
14228109e5deSSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
14238109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
142404f65043SSimon Pilgrim; RV64I-NEXT:    ret
142504f65043SSimon Pilgrim;
142604f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i32:
142704f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
14288109e5deSSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
14298109e5deSSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
14308109e5deSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
143104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
143204f65043SSimon Pilgrim;
143304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i32:
143404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
14358109e5deSSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
14368109e5deSSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
14378109e5deSSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
14388109e5deSSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
14398109e5deSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
144004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
144104f65043SSimon Pilgrim  %cmp = icmp slt i32 %a, %b
144204f65043SSimon Pilgrim  %ab = sub i32 %a, %b
144304f65043SSimon Pilgrim  %ba = sub i32 %b, %a
144404f65043SSimon Pilgrim  %sel = select i1 %cmp, i32 %ba, i32 %ab
144504f65043SSimon Pilgrim  ret i32 %sel
144604f65043SSimon Pilgrim}
144704f65043SSimon Pilgrim
144804f65043SSimon Pilgrimdefine i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {
144904f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i64:
145004f65043SSimon Pilgrim; RV32I:       # %bb.0:
14517afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
145204f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, a4
145304f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB21_2
145404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
14557afdc6bdSSimon Pilgrim; RV32I-NEXT:    slt a5, a3, a1
145604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB21_2:
14577afdc6bdSSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB21_4
145804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
145904f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
146004f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
146104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
146204f65043SSimon Pilgrim; RV32I-NEXT:    ret
14637afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB21_4:
14647afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
14657afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
14667afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
14677afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
14687afdc6bdSSimon Pilgrim; RV32I-NEXT:    ret
146904f65043SSimon Pilgrim;
147004f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i64:
147104f65043SSimon Pilgrim; RV64I:       # %bb.0:
14727afdc6bdSSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB21_2
147304f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
14747afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
147504f65043SSimon Pilgrim; RV64I-NEXT:    ret
147604f65043SSimon Pilgrim; RV64I-NEXT:  .LBB21_2:
14777afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
147804f65043SSimon Pilgrim; RV64I-NEXT:    ret
147904f65043SSimon Pilgrim;
148004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i64:
148104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
14827afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
148304f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
148404f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB21_2
148504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
14867afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a3, a1
148704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB21_2:
14887afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB21_4
148904f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
149004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
149104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
149204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
149304f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
14947afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB21_4:
14957afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
14967afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
14977afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
14987afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
14997afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    ret
150004f65043SSimon Pilgrim;
150104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i64:
150204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
15037afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
15047afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
15057afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
150604f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
150704f65043SSimon Pilgrim  %cmp = icmp sge i64 %a, %b
150804f65043SSimon Pilgrim  %ab = sub i64 %a, %b
150904f65043SSimon Pilgrim  %ba = sub i64 %b, %a
15107afdc6bdSSimon Pilgrim  %sel = select i1 %cmp, i64 %ab, i64 %ba
151104f65043SSimon Pilgrim  ret i64 %sel
151204f65043SSimon Pilgrim}
151304f65043SSimon Pilgrim
151404f65043SSimon Pilgrimdefine i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {
151504f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i128:
151604f65043SSimon Pilgrim; RV32I:       # %bb.0:
15177afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a1)
15187afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw a4, 4(a1)
15197afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw a6, 8(a1)
152004f65043SSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a1)
152114c4f28eSAlex Bradbury; RV32I-NEXT:    lw a7, 8(a2)
15227afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw t1, 12(a2)
152314c4f28eSAlex Bradbury; RV32I-NEXT:    lw a5, 0(a2)
15247afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw a1, 4(a2)
15257afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a2, a7, a6
15267afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t4, a2
15277afdc6bdSSimon Pilgrim; RV32I-NEXT:    beq t0, t1, .LBB22_2
152804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
15297afdc6bdSSimon Pilgrim; RV32I-NEXT:    slt t4, t1, t0
153004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_2:
15317afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu t2, a5, a3
15327afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu t5, a1, a4
153304f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, t2
15347afdc6bdSSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB22_4
153504f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
15367afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t3, t5
153704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_4:
15387afdc6bdSSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
15397afdc6bdSSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
15407afdc6bdSSimon Pilgrim; RV32I-NEXT:    xor t6, t0, t1
15417afdc6bdSSimon Pilgrim; RV32I-NEXT:    xor s0, a6, a7
15427afdc6bdSSimon Pilgrim; RV32I-NEXT:    or t6, s0, t6
15437afdc6bdSSimon Pilgrim; RV32I-NEXT:    beqz t6, .LBB22_6
154404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.5:
15457afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t3, t4
154604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_6:
15477afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t4, t2
15487afdc6bdSSimon Pilgrim; RV32I-NEXT:    beq a1, a4, .LBB22_8
154904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.7:
15507afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t4, t5
155104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_8:
15527afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu t5, a3, a5
15537afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t6, t5
15547afdc6bdSSimon Pilgrim; RV32I-NEXT:    beq a4, a1, .LBB22_10
155504f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
15567afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu t6, a4, a1
155704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_10:
15587afdc6bdSSimon Pilgrim; RV32I-NEXT:    bnez t3, .LBB22_12
15597afdc6bdSSimon Pilgrim; RV32I-NEXT:  # %bb.11:
15607afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub t0, t1, t0
15617afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a6, a7, a6
15627afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a3, a5, a3
15637afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
1564*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, t0, a2
1565*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t4
1566*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a1, t2
1567*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a4, a5
15687afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t4
15697afdc6bdSSimon Pilgrim; RV32I-NEXT:    j .LBB22_13
15707afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_12:
15717afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a2, a6, a7
15727afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub t0, t0, t1
15737afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a6, a6, a7
15747afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a3, a3, a5
15757afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a4, a4, a1
1576*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t0, a2
1577*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t6
1578*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a4, t5
1579*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a5
15807afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a4, a6, t6
15817afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_13:
158204f65043SSimon Pilgrim; RV32I-NEXT:    sw a3, 0(a0)
1583*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 4(a0)
15842967e5f8SAlex Bradbury; RV32I-NEXT:    sw a4, 8(a0)
1585*9122c523SPengcheng Wang; RV32I-NEXT:    sw a1, 12(a0)
15867afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
15877afdc6bdSSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
158804f65043SSimon Pilgrim; RV32I-NEXT:    ret
158904f65043SSimon Pilgrim;
159004f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i128:
159104f65043SSimon Pilgrim; RV64I:       # %bb.0:
15927afdc6bdSSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
159304f65043SSimon Pilgrim; RV64I-NEXT:    mv a5, a4
159404f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB22_2
159504f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
15967afdc6bdSSimon Pilgrim; RV64I-NEXT:    slt a5, a3, a1
159704f65043SSimon Pilgrim; RV64I-NEXT:  .LBB22_2:
15987afdc6bdSSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB22_4
159904f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.3:
160004f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
160104f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
160204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
160304f65043SSimon Pilgrim; RV64I-NEXT:    ret
16047afdc6bdSSimon Pilgrim; RV64I-NEXT:  .LBB22_4:
16057afdc6bdSSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
16067afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
16077afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
16087afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
16097afdc6bdSSimon Pilgrim; RV64I-NEXT:    ret
161004f65043SSimon Pilgrim;
161104f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i128:
161204f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
16137afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a1)
16147afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw a4, 4(a1)
16157afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 8(a1)
161604f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a1)
161714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a7, 8(a2)
16187afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw t1, 12(a2)
161914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a5, 0(a2)
16207afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 4(a2)
16217afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a7, a6
16227afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, a2
16237afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beq t0, t1, .LBB22_2
162404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
16257afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    slt t4, t1, t0
162604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_2:
16277afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu t2, a5, a3
16287afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a1, a4
162904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t2
16307afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB22_4
163104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
16327afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t5
163304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_4:
16347afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
16357afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
16367afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    xor t6, t0, t1
16377afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    xor s0, a6, a7
16387afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    or t6, s0, t6
16397afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beqz t6, .LBB22_6
164004f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
16417afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t4
164204f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_6:
16437afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t2
16447afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a4, .LBB22_8
164504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
16467afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t5
164704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_8:
16487afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a3, a5
16497afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t5
16507afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB22_10
165104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
16527afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a4, a1
165304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_10:
16547afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    bnez t3, .LBB22_12
16557afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
16567afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t1, t0
16577afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a7, a6
16587afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a5, a3
16597afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
1660*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, t0, a2
1661*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t4
1662*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a1, t2
1663*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a4, a5
16647afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t4
16657afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    j .LBB22_13
16667afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_12:
16677afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a6, a7
16687afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t0, t1
16697afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, a7
16707afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a3, a5
16717afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a4, a1
1672*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t0, a2
1673*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t6
1674*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a4, t5
1675*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a5
16767afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t6
16777afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_13:
167804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a3, 0(a0)
1679*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 4(a0)
16802967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a4, 8(a0)
1681*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a1, 12(a0)
16827afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
16837afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
168404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
168504f65043SSimon Pilgrim;
168604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i128:
168704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
16887afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
168904f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
169004f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB22_2
169104f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
16927afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a3, a1
169304f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB22_2:
16947afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB22_4
169504f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
169604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
169704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
169804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
169904f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
17007afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:  .LBB22_4:
17017afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
17027afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
17037afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
17047afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
17057afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    ret
170604f65043SSimon Pilgrim  %cmp = icmp sge i128 %a, %b
170704f65043SSimon Pilgrim  %ab = sub i128 %a, %b
170804f65043SSimon Pilgrim  %ba = sub i128 %b, %a
17097afdc6bdSSimon Pilgrim  %sel = select i1 %cmp, i128 %ab, i128 %ba
171004f65043SSimon Pilgrim  ret i128 %sel
171104f65043SSimon Pilgrim}
171204f65043SSimon Pilgrim
171304f65043SSimon Pilgrim;
171404f65043SSimon Pilgrim; abs(sub_nsw(x, y)) -> abds(a,b)
171504f65043SSimon Pilgrim;
171604f65043SSimon Pilgrim
171704f65043SSimon Pilgrimdefine i8 @abd_subnsw_i8(i8 %a, i8 %b) nounwind {
171804f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i8:
171904f65043SSimon Pilgrim; RV32I:       # %bb.0:
172004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
172104f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 24
172204f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
172304f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
172404f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
172504f65043SSimon Pilgrim; RV32I-NEXT:    ret
172604f65043SSimon Pilgrim;
172704f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i8:
172804f65043SSimon Pilgrim; RV64I:       # %bb.0:
172904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
173004f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 56
173104f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
173204f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
173304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
173404f65043SSimon Pilgrim; RV64I-NEXT:    ret
173504f65043SSimon Pilgrim;
173604f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i8:
173704f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
173804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
173904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.b a0, a0
174004f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
174104f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
174204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
174304f65043SSimon Pilgrim;
174404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i8:
174504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
174604f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
174704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.b a0, a0
174804f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
174904f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
175004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
175104f65043SSimon Pilgrim  %sub = sub nsw i8 %a, %b
175204f65043SSimon Pilgrim  %abs = call i8 @llvm.abs.i8(i8 %sub, i1 false)
175304f65043SSimon Pilgrim  ret i8 %abs
175404f65043SSimon Pilgrim}
175504f65043SSimon Pilgrim
175604f65043SSimon Pilgrimdefine i8 @abd_subnsw_i8_undef(i8 %a, i8 %b) nounwind {
175704f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i8_undef:
175804f65043SSimon Pilgrim; RV32I:       # %bb.0:
175904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
176004f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 24
176104f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
176204f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
176304f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
176404f65043SSimon Pilgrim; RV32I-NEXT:    ret
176504f65043SSimon Pilgrim;
176604f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i8_undef:
176704f65043SSimon Pilgrim; RV64I:       # %bb.0:
176804f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
176904f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 56
177004f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
177104f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
177204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
177304f65043SSimon Pilgrim; RV64I-NEXT:    ret
177404f65043SSimon Pilgrim;
177504f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i8_undef:
177604f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
177704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
177804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.b a0, a0
177904f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
178004f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
178104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
178204f65043SSimon Pilgrim;
178304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i8_undef:
178404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
178504f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
178604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.b a0, a0
178704f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
178804f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
178904f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
179004f65043SSimon Pilgrim  %sub = sub nsw i8 %a, %b
179104f65043SSimon Pilgrim  %abs = call i8 @llvm.abs.i8(i8 %sub, i1 true)
179204f65043SSimon Pilgrim  ret i8 %abs
179304f65043SSimon Pilgrim}
179404f65043SSimon Pilgrim
179504f65043SSimon Pilgrimdefine i16 @abd_subnsw_i16(i16 %a, i16 %b) nounwind {
179604f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i16:
179704f65043SSimon Pilgrim; RV32I:       # %bb.0:
179804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
179904f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 16
180004f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
180104f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
180204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
180304f65043SSimon Pilgrim; RV32I-NEXT:    ret
180404f65043SSimon Pilgrim;
180504f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i16:
180604f65043SSimon Pilgrim; RV64I:       # %bb.0:
180704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
180804f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 48
180904f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
181004f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
181104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
181204f65043SSimon Pilgrim; RV64I-NEXT:    ret
181304f65043SSimon Pilgrim;
181404f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i16:
181504f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
181604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
181704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a0, a0
181804f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
181904f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
182004f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
182104f65043SSimon Pilgrim;
182204f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i16:
182304f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
182404f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
182504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a0, a0
182604f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
182704f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
182804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
182904f65043SSimon Pilgrim  %sub = sub nsw i16 %a, %b
183004f65043SSimon Pilgrim  %abs = call i16 @llvm.abs.i16(i16 %sub, i1 false)
183104f65043SSimon Pilgrim  ret i16 %abs
183204f65043SSimon Pilgrim}
183304f65043SSimon Pilgrim
183404f65043SSimon Pilgrimdefine i16 @abd_subnsw_i16_undef(i16 %a, i16 %b) nounwind {
183504f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i16_undef:
183604f65043SSimon Pilgrim; RV32I:       # %bb.0:
183704f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
183804f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 16
183904f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
184004f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
184104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
184204f65043SSimon Pilgrim; RV32I-NEXT:    ret
184304f65043SSimon Pilgrim;
184404f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i16_undef:
184504f65043SSimon Pilgrim; RV64I:       # %bb.0:
184604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
184704f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 48
184804f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
184904f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
185004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
185104f65043SSimon Pilgrim; RV64I-NEXT:    ret
185204f65043SSimon Pilgrim;
185304f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i16_undef:
185404f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
185504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
185604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a0, a0
185704f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
185804f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
185904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
186004f65043SSimon Pilgrim;
186104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i16_undef:
186204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
186304f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
186404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a0, a0
186504f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
186604f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
186704f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
186804f65043SSimon Pilgrim  %sub = sub nsw i16 %a, %b
186904f65043SSimon Pilgrim  %abs = call i16 @llvm.abs.i16(i16 %sub, i1 true)
187004f65043SSimon Pilgrim  ret i16 %abs
187104f65043SSimon Pilgrim}
187204f65043SSimon Pilgrim
187304f65043SSimon Pilgrimdefine i32 @abd_subnsw_i32(i32 %a, i32 %b) nounwind {
187404f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i32:
187504f65043SSimon Pilgrim; RV32I:       # %bb.0:
187604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
187704f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
187804f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
187904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
188004f65043SSimon Pilgrim; RV32I-NEXT:    ret
188104f65043SSimon Pilgrim;
188204f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i32:
188304f65043SSimon Pilgrim; RV64I:       # %bb.0:
188404f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
188504f65043SSimon Pilgrim; RV64I-NEXT:    sraiw a1, a0, 31
188604f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
188704f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
188804f65043SSimon Pilgrim; RV64I-NEXT:    ret
188904f65043SSimon Pilgrim;
189004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i32:
189104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
189204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
189304f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
189404f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
189504f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
189604f65043SSimon Pilgrim;
189704f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i32:
189804f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
189904f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
190004f65043SSimon Pilgrim; RV64ZBB-NEXT:    negw a1, a0
190104f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
190204f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
190304f65043SSimon Pilgrim  %sub = sub nsw i32 %a, %b
190404f65043SSimon Pilgrim  %abs = call i32 @llvm.abs.i32(i32 %sub, i1 false)
190504f65043SSimon Pilgrim  ret i32 %abs
190604f65043SSimon Pilgrim}
190704f65043SSimon Pilgrim
190804f65043SSimon Pilgrimdefine i32 @abd_subnsw_i32_undef(i32 %a, i32 %b) nounwind {
190904f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i32_undef:
191004f65043SSimon Pilgrim; RV32I:       # %bb.0:
191104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
191204f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
191304f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
191404f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
191504f65043SSimon Pilgrim; RV32I-NEXT:    ret
191604f65043SSimon Pilgrim;
191704f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i32_undef:
191804f65043SSimon Pilgrim; RV64I:       # %bb.0:
191904f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
192004f65043SSimon Pilgrim; RV64I-NEXT:    sraiw a1, a0, 31
192104f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
192204f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
192304f65043SSimon Pilgrim; RV64I-NEXT:    ret
192404f65043SSimon Pilgrim;
192504f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i32_undef:
192604f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
192704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
192804f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
192904f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
193004f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
193104f65043SSimon Pilgrim;
193204f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i32_undef:
193304f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
193404f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
193504f65043SSimon Pilgrim; RV64ZBB-NEXT:    negw a1, a0
193604f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
193704f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
193804f65043SSimon Pilgrim  %sub = sub nsw i32 %a, %b
193904f65043SSimon Pilgrim  %abs = call i32 @llvm.abs.i32(i32 %sub, i1 true)
194004f65043SSimon Pilgrim  ret i32 %abs
194104f65043SSimon Pilgrim}
194204f65043SSimon Pilgrim
194304f65043SSimon Pilgrimdefine i64 @abd_subnsw_i64(i64 %a, i64 %b) nounwind {
194404f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i64:
194504f65043SSimon Pilgrim; RV32I:       # %bb.0:
194604f65043SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
194704f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
194804f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
194904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
195004f65043SSimon Pilgrim; RV32I-NEXT:    bgez a1, .LBB29_2
195104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
195204f65043SSimon Pilgrim; RV32I-NEXT:    snez a2, a0
195304f65043SSimon Pilgrim; RV32I-NEXT:    add a1, a1, a2
195404f65043SSimon Pilgrim; RV32I-NEXT:    neg a1, a1
195504f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
195604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB29_2:
195704f65043SSimon Pilgrim; RV32I-NEXT:    ret
195804f65043SSimon Pilgrim;
195904f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i64:
196004f65043SSimon Pilgrim; RV64I:       # %bb.0:
196104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
196204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
196304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
196404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
196504f65043SSimon Pilgrim; RV64I-NEXT:    ret
196604f65043SSimon Pilgrim;
196704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i64:
196804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
196904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
197004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
197104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
197204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
197304f65043SSimon Pilgrim; RV32ZBB-NEXT:    bgez a1, .LBB29_2
197404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
197504f65043SSimon Pilgrim; RV32ZBB-NEXT:    snez a2, a0
197604f65043SSimon Pilgrim; RV32ZBB-NEXT:    add a1, a1, a2
197704f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
197804f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a0, a0
197904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB29_2:
198004f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
198104f65043SSimon Pilgrim;
198204f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i64:
198304f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
198404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
198504f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
198604f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
198704f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
198804f65043SSimon Pilgrim  %sub = sub nsw i64 %a, %b
198904f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
199004f65043SSimon Pilgrim  ret i64 %abs
199104f65043SSimon Pilgrim}
199204f65043SSimon Pilgrim
199304f65043SSimon Pilgrimdefine i64 @abd_subnsw_i64_undef(i64 %a, i64 %b) nounwind {
199404f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i64_undef:
199504f65043SSimon Pilgrim; RV32I:       # %bb.0:
199604f65043SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
199704f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
199804f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
199904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
200004f65043SSimon Pilgrim; RV32I-NEXT:    bgez a1, .LBB30_2
200104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
200204f65043SSimon Pilgrim; RV32I-NEXT:    snez a2, a0
200304f65043SSimon Pilgrim; RV32I-NEXT:    add a1, a1, a2
200404f65043SSimon Pilgrim; RV32I-NEXT:    neg a1, a1
200504f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
200604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB30_2:
200704f65043SSimon Pilgrim; RV32I-NEXT:    ret
200804f65043SSimon Pilgrim;
200904f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i64_undef:
201004f65043SSimon Pilgrim; RV64I:       # %bb.0:
201104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
201204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
201304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
201404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
201504f65043SSimon Pilgrim; RV64I-NEXT:    ret
201604f65043SSimon Pilgrim;
201704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i64_undef:
201804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
201904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
202004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
202104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
202204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
202304f65043SSimon Pilgrim; RV32ZBB-NEXT:    bgez a1, .LBB30_2
202404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
202504f65043SSimon Pilgrim; RV32ZBB-NEXT:    snez a2, a0
202604f65043SSimon Pilgrim; RV32ZBB-NEXT:    add a1, a1, a2
202704f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
202804f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a0, a0
202904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB30_2:
203004f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
203104f65043SSimon Pilgrim;
203204f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i64_undef:
203304f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
203404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
203504f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
203604f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
203704f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
203804f65043SSimon Pilgrim  %sub = sub nsw i64 %a, %b
203904f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
204004f65043SSimon Pilgrim  ret i64 %abs
204104f65043SSimon Pilgrim}
204204f65043SSimon Pilgrim
204304f65043SSimon Pilgrimdefine i128 @abd_subnsw_i128(i128 %a, i128 %b) nounwind {
204404f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i128:
204504f65043SSimon Pilgrim; RV32I:       # %bb.0:
20462967e5f8SAlex Bradbury; RV32I-NEXT:    lw a4, 0(a2)
20472967e5f8SAlex Bradbury; RV32I-NEXT:    lw a3, 4(a2)
2048*9122c523SPengcheng Wang; RV32I-NEXT:    lw a5, 8(a2)
2049*9122c523SPengcheng Wang; RV32I-NEXT:    lw a6, 12(a2)
2050*9122c523SPengcheng Wang; RV32I-NEXT:    lw a7, 8(a1)
2051*9122c523SPengcheng Wang; RV32I-NEXT:    lw t0, 12(a1)
2052*9122c523SPengcheng Wang; RV32I-NEXT:    lw a2, 0(a1)
2053*9122c523SPengcheng Wang; RV32I-NEXT:    lw a1, 4(a1)
2054*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a7, a5
2055*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, a6
2056*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a2, a4
2057*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, t1
2058*9122c523SPengcheng Wang; RV32I-NEXT:    mv t1, a6
2059*9122c523SPengcheng Wang; RV32I-NEXT:    beq a1, a3, .LBB31_2
206004f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
2061*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a1, a3
206204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB31_2:
2063*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a7, a5
2064*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a1, a3
2065*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a5, t1
2066*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, t1
2067*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t0, a1
2068*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a6
2069*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a2, a4
207004f65043SSimon Pilgrim; RV32I-NEXT:    bgez a1, .LBB31_4
207104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
2072*9122c523SPengcheng Wang; RV32I-NEXT:    snez a4, a3
2073*9122c523SPengcheng Wang; RV32I-NEXT:    snez a6, a2
2074*9122c523SPengcheng Wang; RV32I-NEXT:    neg a7, a5
2075*9122c523SPengcheng Wang; RV32I-NEXT:    snez a5, a5
2076*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, a2
2077*9122c523SPengcheng Wang; RV32I-NEXT:    or a4, a6, a4
2078*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a1, a5
20792967e5f8SAlex Bradbury; RV32I-NEXT:    add a3, a3, a6
2080*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a7, a4
2081*9122c523SPengcheng Wang; RV32I-NEXT:    neg a1, a1
2082*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a7, a4
2083*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a6
20842967e5f8SAlex Bradbury; RV32I-NEXT:    neg a3, a3
208504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB31_4:
2086*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 0(a0)
20872967e5f8SAlex Bradbury; RV32I-NEXT:    sw a3, 4(a0)
2088*9122c523SPengcheng Wang; RV32I-NEXT:    sw a5, 8(a0)
208904f65043SSimon Pilgrim; RV32I-NEXT:    sw a1, 12(a0)
209004f65043SSimon Pilgrim; RV32I-NEXT:    ret
209104f65043SSimon Pilgrim;
209204f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i128:
209304f65043SSimon Pilgrim; RV64I:       # %bb.0:
209404f65043SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
209504f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
209604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
209704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
209804f65043SSimon Pilgrim; RV64I-NEXT:    bgez a1, .LBB31_2
209904f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
210004f65043SSimon Pilgrim; RV64I-NEXT:    snez a2, a0
210104f65043SSimon Pilgrim; RV64I-NEXT:    add a1, a1, a2
210204f65043SSimon Pilgrim; RV64I-NEXT:    neg a1, a1
210304f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
210404f65043SSimon Pilgrim; RV64I-NEXT:  .LBB31_2:
210504f65043SSimon Pilgrim; RV64I-NEXT:    ret
210604f65043SSimon Pilgrim;
210704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i128:
210804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
21092967e5f8SAlex Bradbury; RV32ZBB-NEXT:    lw a4, 0(a2)
21102967e5f8SAlex Bradbury; RV32ZBB-NEXT:    lw a3, 4(a2)
2111*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a5, 8(a2)
2112*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a6, 12(a2)
2113*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a7, 8(a1)
2114*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t0, 12(a1)
2115*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a2, 0(a1)
2116*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a1, 4(a1)
2117*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a7, a5
2118*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, a6
2119*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a2, a4
2120*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, t1
2121*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv t1, a6
2122*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a1, a3, .LBB31_2
212304f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
2124*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a1, a3
212504f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB31_2:
2126*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a7, a5
2127*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a1, a3
2128*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a5, t1
2129*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, t1
2130*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t0, a1
2131*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a6
2132*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a2, a4
213304f65043SSimon Pilgrim; RV32ZBB-NEXT:    bgez a1, .LBB31_4
213404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
2135*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a4, a3
2136*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a6, a2
2137*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a7, a5
2138*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a5, a5
2139*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a2, a2
2140*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a4, a6, a4
2141*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a1, a1, a5
21422967e5f8SAlex Bradbury; RV32ZBB-NEXT:    add a3, a3, a6
2143*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a7, a4
2144*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a1, a1
2145*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a7, a4
2146*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a6
21472967e5f8SAlex Bradbury; RV32ZBB-NEXT:    neg a3, a3
214804f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB31_4:
2149*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 0(a0)
21502967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a3, 4(a0)
2151*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a5, 8(a0)
215204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a1, 12(a0)
215304f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
215404f65043SSimon Pilgrim;
215504f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i128:
215604f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
215704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
215804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
215904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
216004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
216104f65043SSimon Pilgrim; RV64ZBB-NEXT:    bgez a1, .LBB31_2
216204f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
216304f65043SSimon Pilgrim; RV64ZBB-NEXT:    snez a2, a0
216404f65043SSimon Pilgrim; RV64ZBB-NEXT:    add a1, a1, a2
216504f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a1
216604f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a0, a0
216704f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB31_2:
216804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
216904f65043SSimon Pilgrim  %sub = sub nsw i128 %a, %b
217004f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
217104f65043SSimon Pilgrim  ret i128 %abs
217204f65043SSimon Pilgrim}
217304f65043SSimon Pilgrim
217404f65043SSimon Pilgrimdefine i128 @abd_subnsw_i128_undef(i128 %a, i128 %b) nounwind {
217504f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i128_undef:
217604f65043SSimon Pilgrim; RV32I:       # %bb.0:
21772967e5f8SAlex Bradbury; RV32I-NEXT:    lw a4, 0(a2)
21782967e5f8SAlex Bradbury; RV32I-NEXT:    lw a3, 4(a2)
2179*9122c523SPengcheng Wang; RV32I-NEXT:    lw a5, 8(a2)
2180*9122c523SPengcheng Wang; RV32I-NEXT:    lw a6, 12(a2)
2181*9122c523SPengcheng Wang; RV32I-NEXT:    lw a7, 8(a1)
2182*9122c523SPengcheng Wang; RV32I-NEXT:    lw t0, 12(a1)
2183*9122c523SPengcheng Wang; RV32I-NEXT:    lw a2, 0(a1)
2184*9122c523SPengcheng Wang; RV32I-NEXT:    lw a1, 4(a1)
2185*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a7, a5
2186*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, a6
2187*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a2, a4
2188*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, t1
2189*9122c523SPengcheng Wang; RV32I-NEXT:    mv t1, a6
2190*9122c523SPengcheng Wang; RV32I-NEXT:    beq a1, a3, .LBB32_2
219104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
2192*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a1, a3
219304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB32_2:
2194*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a7, a5
2195*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a1, a3
2196*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a5, t1
2197*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, t1
2198*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t0, a1
2199*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a6
2200*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a2, a4
220104f65043SSimon Pilgrim; RV32I-NEXT:    bgez a1, .LBB32_4
220204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
2203*9122c523SPengcheng Wang; RV32I-NEXT:    snez a4, a3
2204*9122c523SPengcheng Wang; RV32I-NEXT:    snez a6, a2
2205*9122c523SPengcheng Wang; RV32I-NEXT:    neg a7, a5
2206*9122c523SPengcheng Wang; RV32I-NEXT:    snez a5, a5
2207*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, a2
2208*9122c523SPengcheng Wang; RV32I-NEXT:    or a4, a6, a4
2209*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a1, a5
22102967e5f8SAlex Bradbury; RV32I-NEXT:    add a3, a3, a6
2211*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a7, a4
2212*9122c523SPengcheng Wang; RV32I-NEXT:    neg a1, a1
2213*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a7, a4
2214*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a6
22152967e5f8SAlex Bradbury; RV32I-NEXT:    neg a3, a3
221604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB32_4:
2217*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 0(a0)
22182967e5f8SAlex Bradbury; RV32I-NEXT:    sw a3, 4(a0)
2219*9122c523SPengcheng Wang; RV32I-NEXT:    sw a5, 8(a0)
222004f65043SSimon Pilgrim; RV32I-NEXT:    sw a1, 12(a0)
222104f65043SSimon Pilgrim; RV32I-NEXT:    ret
222204f65043SSimon Pilgrim;
222304f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i128_undef:
222404f65043SSimon Pilgrim; RV64I:       # %bb.0:
222504f65043SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
222604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
222704f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
222804f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
222904f65043SSimon Pilgrim; RV64I-NEXT:    bgez a1, .LBB32_2
223004f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
223104f65043SSimon Pilgrim; RV64I-NEXT:    snez a2, a0
223204f65043SSimon Pilgrim; RV64I-NEXT:    add a1, a1, a2
223304f65043SSimon Pilgrim; RV64I-NEXT:    neg a1, a1
223404f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
223504f65043SSimon Pilgrim; RV64I-NEXT:  .LBB32_2:
223604f65043SSimon Pilgrim; RV64I-NEXT:    ret
223704f65043SSimon Pilgrim;
223804f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i128_undef:
223904f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
22402967e5f8SAlex Bradbury; RV32ZBB-NEXT:    lw a4, 0(a2)
22412967e5f8SAlex Bradbury; RV32ZBB-NEXT:    lw a3, 4(a2)
2242*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a5, 8(a2)
2243*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a6, 12(a2)
2244*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a7, 8(a1)
2245*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t0, 12(a1)
2246*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a2, 0(a1)
2247*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a1, 4(a1)
2248*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a7, a5
2249*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, a6
2250*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a2, a4
2251*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, t1
2252*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv t1, a6
2253*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a1, a3, .LBB32_2
225404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
2255*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a1, a3
225604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB32_2:
2257*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a7, a5
2258*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a1, a3
2259*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a5, t1
2260*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, t1
2261*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t0, a1
2262*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a6
2263*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a2, a4
226404f65043SSimon Pilgrim; RV32ZBB-NEXT:    bgez a1, .LBB32_4
226504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
2266*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a4, a3
2267*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a6, a2
2268*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a7, a5
2269*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a5, a5
2270*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a2, a2
2271*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a4, a6, a4
2272*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a1, a1, a5
22732967e5f8SAlex Bradbury; RV32ZBB-NEXT:    add a3, a3, a6
2274*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a7, a4
2275*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a1, a1
2276*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a7, a4
2277*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a6
22782967e5f8SAlex Bradbury; RV32ZBB-NEXT:    neg a3, a3
227904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB32_4:
2280*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 0(a0)
22812967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a3, 4(a0)
2282*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a5, 8(a0)
228304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a1, 12(a0)
228404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
228504f65043SSimon Pilgrim;
228604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i128_undef:
228704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
228804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
228904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
229004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
229104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
229204f65043SSimon Pilgrim; RV64ZBB-NEXT:    bgez a1, .LBB32_2
229304f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
229404f65043SSimon Pilgrim; RV64ZBB-NEXT:    snez a2, a0
229504f65043SSimon Pilgrim; RV64ZBB-NEXT:    add a1, a1, a2
229604f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a1
229704f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a0, a0
229804f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB32_2:
229904f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
230004f65043SSimon Pilgrim  %sub = sub nsw i128 %a, %b
230104f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
230204f65043SSimon Pilgrim  ret i128 %abs
230304f65043SSimon Pilgrim}
230404f65043SSimon Pilgrim
230504f65043SSimon Pilgrim;
230604f65043SSimon Pilgrim; negative tests
230704f65043SSimon Pilgrim;
230804f65043SSimon Pilgrim
230904f65043SSimon Pilgrimdefine i32 @abd_sub_i32(i32 %a, i32 %b) nounwind {
231004f65043SSimon Pilgrim; RV32I-LABEL: abd_sub_i32:
231104f65043SSimon Pilgrim; RV32I:       # %bb.0:
231204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
231304f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
231404f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
231504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
231604f65043SSimon Pilgrim; RV32I-NEXT:    ret
231704f65043SSimon Pilgrim;
231804f65043SSimon Pilgrim; RV64I-LABEL: abd_sub_i32:
231904f65043SSimon Pilgrim; RV64I:       # %bb.0:
232004f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
232104f65043SSimon Pilgrim; RV64I-NEXT:    sraiw a1, a0, 31
232204f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
232304f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
232404f65043SSimon Pilgrim; RV64I-NEXT:    ret
232504f65043SSimon Pilgrim;
232604f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_sub_i32:
232704f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
232804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
232904f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
233004f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
233104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
233204f65043SSimon Pilgrim;
233304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_sub_i32:
233404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
233504f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
233604f65043SSimon Pilgrim; RV64ZBB-NEXT:    negw a1, a0
233704f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
233804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
233904f65043SSimon Pilgrim  %sub = sub i32 %a, %b
234004f65043SSimon Pilgrim  %abs = call i32 @llvm.abs.i32(i32 %sub, i1 false)
234104f65043SSimon Pilgrim  ret i32 %abs
234204f65043SSimon Pilgrim}
234304f65043SSimon Pilgrim
234443da8a7aSSimon Pilgrim;
234543da8a7aSSimon Pilgrim; sub(select(icmp(a,b),a,b),select(icmp(a,b),b,a)) -> abds(a,b)
234643da8a7aSSimon Pilgrim;
234743da8a7aSSimon Pilgrim
234843da8a7aSSimon Pilgrimdefine i8 @abd_select_i8(i8 %a, i8 %b) nounwind {
234943da8a7aSSimon Pilgrim; RV32I-LABEL: abd_select_i8:
235043da8a7aSSimon Pilgrim; RV32I:       # %bb.0:
2351854ded9bSc8ef; RV32I-NEXT:    slli a1, a1, 24
2352854ded9bSc8ef; RV32I-NEXT:    slli a0, a0, 24
2353*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
2354854ded9bSc8ef; RV32I-NEXT:    srai a0, a0, 24
235543da8a7aSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
2356854ded9bSc8ef; RV32I-NEXT:    srai a1, a0, 31
2357854ded9bSc8ef; RV32I-NEXT:    xor a0, a0, a1
2358854ded9bSc8ef; RV32I-NEXT:    sub a0, a0, a1
235943da8a7aSSimon Pilgrim; RV32I-NEXT:    ret
236043da8a7aSSimon Pilgrim;
236143da8a7aSSimon Pilgrim; RV64I-LABEL: abd_select_i8:
236243da8a7aSSimon Pilgrim; RV64I:       # %bb.0:
2363854ded9bSc8ef; RV64I-NEXT:    slli a1, a1, 56
2364854ded9bSc8ef; RV64I-NEXT:    slli a0, a0, 56
2365*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
2366854ded9bSc8ef; RV64I-NEXT:    srai a0, a0, 56
236743da8a7aSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
2368854ded9bSc8ef; RV64I-NEXT:    srai a1, a0, 63
2369854ded9bSc8ef; RV64I-NEXT:    xor a0, a0, a1
2370854ded9bSc8ef; RV64I-NEXT:    sub a0, a0, a1
237143da8a7aSSimon Pilgrim; RV64I-NEXT:    ret
237243da8a7aSSimon Pilgrim;
237343da8a7aSSimon Pilgrim; ZBB-LABEL: abd_select_i8:
237443da8a7aSSimon Pilgrim; ZBB:       # %bb.0:
237543da8a7aSSimon Pilgrim; ZBB-NEXT:    sext.b a1, a1
237643da8a7aSSimon Pilgrim; ZBB-NEXT:    sext.b a0, a0
237743da8a7aSSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
237843da8a7aSSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
237943da8a7aSSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
238043da8a7aSSimon Pilgrim; ZBB-NEXT:    ret
238143da8a7aSSimon Pilgrim  %cmp = icmp slt i8 %a, %b
238243da8a7aSSimon Pilgrim  %ab = select i1 %cmp, i8 %a, i8 %b
238343da8a7aSSimon Pilgrim  %ba = select i1 %cmp, i8 %b, i8 %a
238443da8a7aSSimon Pilgrim  %sub = sub i8 %ba, %ab
238543da8a7aSSimon Pilgrim  ret i8 %sub
238643da8a7aSSimon Pilgrim}
238743da8a7aSSimon Pilgrim
238843da8a7aSSimon Pilgrimdefine i16 @abd_select_i16(i16 %a, i16 %b) nounwind {
238943da8a7aSSimon Pilgrim; RV32I-LABEL: abd_select_i16:
239043da8a7aSSimon Pilgrim; RV32I:       # %bb.0:
2391854ded9bSc8ef; RV32I-NEXT:    slli a1, a1, 16
2392854ded9bSc8ef; RV32I-NEXT:    slli a0, a0, 16
2393*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
2394854ded9bSc8ef; RV32I-NEXT:    srai a0, a0, 16
239543da8a7aSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
2396854ded9bSc8ef; RV32I-NEXT:    srai a1, a0, 31
2397854ded9bSc8ef; RV32I-NEXT:    xor a0, a0, a1
2398854ded9bSc8ef; RV32I-NEXT:    sub a0, a0, a1
239943da8a7aSSimon Pilgrim; RV32I-NEXT:    ret
240043da8a7aSSimon Pilgrim;
240143da8a7aSSimon Pilgrim; RV64I-LABEL: abd_select_i16:
240243da8a7aSSimon Pilgrim; RV64I:       # %bb.0:
2403854ded9bSc8ef; RV64I-NEXT:    slli a1, a1, 48
2404854ded9bSc8ef; RV64I-NEXT:    slli a0, a0, 48
2405*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
2406854ded9bSc8ef; RV64I-NEXT:    srai a0, a0, 48
240743da8a7aSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
2408854ded9bSc8ef; RV64I-NEXT:    srai a1, a0, 63
2409854ded9bSc8ef; RV64I-NEXT:    xor a0, a0, a1
2410854ded9bSc8ef; RV64I-NEXT:    sub a0, a0, a1
241143da8a7aSSimon Pilgrim; RV64I-NEXT:    ret
241243da8a7aSSimon Pilgrim;
241343da8a7aSSimon Pilgrim; ZBB-LABEL: abd_select_i16:
241443da8a7aSSimon Pilgrim; ZBB:       # %bb.0:
241543da8a7aSSimon Pilgrim; ZBB-NEXT:    sext.h a1, a1
241643da8a7aSSimon Pilgrim; ZBB-NEXT:    sext.h a0, a0
241743da8a7aSSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
241843da8a7aSSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
241943da8a7aSSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a2
242043da8a7aSSimon Pilgrim; ZBB-NEXT:    ret
242143da8a7aSSimon Pilgrim  %cmp = icmp sle i16 %a, %b
242243da8a7aSSimon Pilgrim  %ab = select i1 %cmp, i16 %a, i16 %b
242343da8a7aSSimon Pilgrim  %ba = select i1 %cmp, i16 %b, i16 %a
242443da8a7aSSimon Pilgrim  %sub = sub i16 %ba, %ab
242543da8a7aSSimon Pilgrim  ret i16 %sub
242643da8a7aSSimon Pilgrim}
242743da8a7aSSimon Pilgrim
242843da8a7aSSimon Pilgrimdefine i32 @abd_select_i32(i32 %a, i32 %b) nounwind {
242943da8a7aSSimon Pilgrim; RV32I-LABEL: abd_select_i32:
243043da8a7aSSimon Pilgrim; RV32I:       # %bb.0:
243143da8a7aSSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB36_2
243243da8a7aSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
243343da8a7aSSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
243443da8a7aSSimon Pilgrim; RV32I-NEXT:    ret
243543da8a7aSSimon Pilgrim; RV32I-NEXT:  .LBB36_2:
243643da8a7aSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
243743da8a7aSSimon Pilgrim; RV32I-NEXT:    ret
243843da8a7aSSimon Pilgrim;
243943da8a7aSSimon Pilgrim; RV64I-LABEL: abd_select_i32:
244043da8a7aSSimon Pilgrim; RV64I:       # %bb.0:
2441854ded9bSc8ef; RV64I-NEXT:    sext.w a1, a1
2442854ded9bSc8ef; RV64I-NEXT:    sext.w a0, a0
2443854ded9bSc8ef; RV64I-NEXT:    sub a0, a0, a1
2444854ded9bSc8ef; RV64I-NEXT:    srai a1, a0, 63
2445854ded9bSc8ef; RV64I-NEXT:    xor a0, a0, a1
2446854ded9bSc8ef; RV64I-NEXT:    sub a0, a0, a1
244743da8a7aSSimon Pilgrim; RV64I-NEXT:    ret
244843da8a7aSSimon Pilgrim;
244943da8a7aSSimon Pilgrim; RV32ZBB-LABEL: abd_select_i32:
245043da8a7aSSimon Pilgrim; RV32ZBB:       # %bb.0:
245143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
245243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
245343da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
245443da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    ret
245543da8a7aSSimon Pilgrim;
245643da8a7aSSimon Pilgrim; RV64ZBB-LABEL: abd_select_i32:
245743da8a7aSSimon Pilgrim; RV64ZBB:       # %bb.0:
245843da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
245943da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
246043da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
246143da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
246243da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
246343da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    ret
246443da8a7aSSimon Pilgrim  %cmp = icmp sgt i32 %a, %b
246543da8a7aSSimon Pilgrim  %ab = select i1 %cmp, i32 %a, i32 %b
246643da8a7aSSimon Pilgrim  %ba = select i1 %cmp, i32 %b, i32 %a
246743da8a7aSSimon Pilgrim  %sub = sub i32 %ab, %ba
246843da8a7aSSimon Pilgrim  ret i32 %sub
246943da8a7aSSimon Pilgrim}
247043da8a7aSSimon Pilgrim
247143da8a7aSSimon Pilgrimdefine i64 @abd_select_i64(i64 %a, i64 %b) nounwind {
247243da8a7aSSimon Pilgrim; RV32I-LABEL: abd_select_i64:
247343da8a7aSSimon Pilgrim; RV32I:       # %bb.0:
2474854ded9bSc8ef; RV32I-NEXT:    sltu a4, a2, a0
2475854ded9bSc8ef; RV32I-NEXT:    mv a5, a4
2476854ded9bSc8ef; RV32I-NEXT:    beq a1, a3, .LBB37_2
247743da8a7aSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
2478854ded9bSc8ef; RV32I-NEXT:    slt a5, a3, a1
247943da8a7aSSimon Pilgrim; RV32I-NEXT:  .LBB37_2:
2480854ded9bSc8ef; RV32I-NEXT:    bnez a5, .LBB37_4
2481854ded9bSc8ef; RV32I-NEXT:  # %bb.3:
2482854ded9bSc8ef; RV32I-NEXT:    sub a1, a3, a1
2483854ded9bSc8ef; RV32I-NEXT:    sub a1, a1, a4
2484854ded9bSc8ef; RV32I-NEXT:    sub a0, a2, a0
2485854ded9bSc8ef; RV32I-NEXT:    ret
2486a3b0c31eSc8ef; RV32I-NEXT:  .LBB37_4:
2487854ded9bSc8ef; RV32I-NEXT:    sltu a4, a0, a2
2488854ded9bSc8ef; RV32I-NEXT:    sub a1, a1, a3
2489854ded9bSc8ef; RV32I-NEXT:    sub a1, a1, a4
2490854ded9bSc8ef; RV32I-NEXT:    sub a0, a0, a2
249143da8a7aSSimon Pilgrim; RV32I-NEXT:    ret
249243da8a7aSSimon Pilgrim;
249343da8a7aSSimon Pilgrim; RV64I-LABEL: abd_select_i64:
249443da8a7aSSimon Pilgrim; RV64I:       # %bb.0:
2495854ded9bSc8ef; RV64I-NEXT:    blt a1, a0, .LBB37_2
249643da8a7aSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
249743da8a7aSSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
249843da8a7aSSimon Pilgrim; RV64I-NEXT:    ret
249943da8a7aSSimon Pilgrim; RV64I-NEXT:  .LBB37_2:
250043da8a7aSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
250143da8a7aSSimon Pilgrim; RV64I-NEXT:    ret
250243da8a7aSSimon Pilgrim;
250343da8a7aSSimon Pilgrim; RV32ZBB-LABEL: abd_select_i64:
250443da8a7aSSimon Pilgrim; RV32ZBB:       # %bb.0:
250543da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
250643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
250743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB37_2
250843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
250943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a3, a1
251043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB37_2:
251143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB37_4
251243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
251343da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
251443da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
251543da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
251643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    ret
251743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB37_4:
251843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
251943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
252043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
252143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
252243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    ret
252343da8a7aSSimon Pilgrim;
252443da8a7aSSimon Pilgrim; RV64ZBB-LABEL: abd_select_i64:
252543da8a7aSSimon Pilgrim; RV64ZBB:       # %bb.0:
252643da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
252743da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
252843da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
252943da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    ret
253043da8a7aSSimon Pilgrim  %cmp = icmp sge i64 %a, %b
253143da8a7aSSimon Pilgrim  %ab = select i1 %cmp, i64 %a, i64 %b
253243da8a7aSSimon Pilgrim  %ba = select i1 %cmp, i64 %b, i64 %a
253343da8a7aSSimon Pilgrim  %sub = sub i64 %ab, %ba
253443da8a7aSSimon Pilgrim  ret i64 %sub
253543da8a7aSSimon Pilgrim}
253643da8a7aSSimon Pilgrim
253743da8a7aSSimon Pilgrimdefine i128 @abd_select_i128(i128 %a, i128 %b) nounwind {
253843da8a7aSSimon Pilgrim; RV32I-LABEL: abd_select_i128:
253943da8a7aSSimon Pilgrim; RV32I:       # %bb.0:
2540854ded9bSc8ef; RV32I-NEXT:    lw a3, 0(a1)
2541854ded9bSc8ef; RV32I-NEXT:    lw a4, 4(a1)
2542854ded9bSc8ef; RV32I-NEXT:    lw a6, 8(a1)
2543854ded9bSc8ef; RV32I-NEXT:    lw t0, 12(a1)
2544854ded9bSc8ef; RV32I-NEXT:    lw a7, 8(a2)
2545854ded9bSc8ef; RV32I-NEXT:    lw t1, 12(a2)
2546854ded9bSc8ef; RV32I-NEXT:    lw a5, 0(a2)
2547854ded9bSc8ef; RV32I-NEXT:    lw a1, 4(a2)
2548854ded9bSc8ef; RV32I-NEXT:    sltu a2, a7, a6
2549854ded9bSc8ef; RV32I-NEXT:    mv t4, a2
2550854ded9bSc8ef; RV32I-NEXT:    beq t0, t1, .LBB38_2
255143da8a7aSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
2552854ded9bSc8ef; RV32I-NEXT:    slt t4, t1, t0
255343da8a7aSSimon Pilgrim; RV32I-NEXT:  .LBB38_2:
2554854ded9bSc8ef; RV32I-NEXT:    sltu t2, a5, a3
2555854ded9bSc8ef; RV32I-NEXT:    sltu t5, a1, a4
2556854ded9bSc8ef; RV32I-NEXT:    mv t3, t2
2557854ded9bSc8ef; RV32I-NEXT:    beq a4, a1, .LBB38_4
2558854ded9bSc8ef; RV32I-NEXT:  # %bb.3:
2559854ded9bSc8ef; RV32I-NEXT:    mv t3, t5
2560854ded9bSc8ef; RV32I-NEXT:  .LBB38_4:
2561854ded9bSc8ef; RV32I-NEXT:    addi sp, sp, -16
2562854ded9bSc8ef; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
2563854ded9bSc8ef; RV32I-NEXT:    xor t6, t0, t1
2564854ded9bSc8ef; RV32I-NEXT:    xor s0, a6, a7
2565854ded9bSc8ef; RV32I-NEXT:    or t6, s0, t6
2566854ded9bSc8ef; RV32I-NEXT:    beqz t6, .LBB38_6
2567854ded9bSc8ef; RV32I-NEXT:  # %bb.5:
2568854ded9bSc8ef; RV32I-NEXT:    mv t3, t4
256943da8a7aSSimon Pilgrim; RV32I-NEXT:  .LBB38_6:
2570854ded9bSc8ef; RV32I-NEXT:    mv t4, t2
2571854ded9bSc8ef; RV32I-NEXT:    beq a1, a4, .LBB38_8
257243da8a7aSSimon Pilgrim; RV32I-NEXT:  # %bb.7:
2573854ded9bSc8ef; RV32I-NEXT:    mv t4, t5
257443da8a7aSSimon Pilgrim; RV32I-NEXT:  .LBB38_8:
2575854ded9bSc8ef; RV32I-NEXT:    sltu t5, a3, a5
2576854ded9bSc8ef; RV32I-NEXT:    mv t6, t5
2577854ded9bSc8ef; RV32I-NEXT:    beq a4, a1, .LBB38_10
257843da8a7aSSimon Pilgrim; RV32I-NEXT:  # %bb.9:
2579854ded9bSc8ef; RV32I-NEXT:    sltu t6, a4, a1
258043da8a7aSSimon Pilgrim; RV32I-NEXT:  .LBB38_10:
2581854ded9bSc8ef; RV32I-NEXT:    bnez t3, .LBB38_12
2582854ded9bSc8ef; RV32I-NEXT:  # %bb.11:
2583854ded9bSc8ef; RV32I-NEXT:    sub t0, t1, t0
258443da8a7aSSimon Pilgrim; RV32I-NEXT:    sub a6, a7, a6
2585854ded9bSc8ef; RV32I-NEXT:    sub a3, a5, a3
2586854ded9bSc8ef; RV32I-NEXT:    sub a1, a1, a4
2587*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, t0, a2
2588*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t4
2589*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a1, t2
2590*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a4, a5
2591854ded9bSc8ef; RV32I-NEXT:    sub a4, a6, t4
2592854ded9bSc8ef; RV32I-NEXT:    j .LBB38_13
2593854ded9bSc8ef; RV32I-NEXT:  .LBB38_12:
2594854ded9bSc8ef; RV32I-NEXT:    sltu a2, a6, a7
2595854ded9bSc8ef; RV32I-NEXT:    sub t0, t0, t1
2596854ded9bSc8ef; RV32I-NEXT:    sub a6, a6, a7
2597a3b0c31eSc8ef; RV32I-NEXT:    sub a3, a3, a5
2598854ded9bSc8ef; RV32I-NEXT:    sub a4, a4, a1
2599*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t0, a2
2600*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a6, t6
2601*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a4, t5
2602*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a5
2603854ded9bSc8ef; RV32I-NEXT:    sub a4, a6, t6
2604854ded9bSc8ef; RV32I-NEXT:  .LBB38_13:
2605854ded9bSc8ef; RV32I-NEXT:    sw a3, 0(a0)
2606*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 4(a0)
260743da8a7aSSimon Pilgrim; RV32I-NEXT:    sw a4, 8(a0)
2608*9122c523SPengcheng Wang; RV32I-NEXT:    sw a1, 12(a0)
2609854ded9bSc8ef; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
2610854ded9bSc8ef; RV32I-NEXT:    addi sp, sp, 16
261143da8a7aSSimon Pilgrim; RV32I-NEXT:    ret
261243da8a7aSSimon Pilgrim;
261343da8a7aSSimon Pilgrim; RV64I-LABEL: abd_select_i128:
261443da8a7aSSimon Pilgrim; RV64I:       # %bb.0:
2615854ded9bSc8ef; RV64I-NEXT:    sltu a4, a2, a0
2616854ded9bSc8ef; RV64I-NEXT:    mv a5, a4
2617854ded9bSc8ef; RV64I-NEXT:    beq a1, a3, .LBB38_2
261843da8a7aSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
2619854ded9bSc8ef; RV64I-NEXT:    slt a5, a3, a1
262043da8a7aSSimon Pilgrim; RV64I-NEXT:  .LBB38_2:
2621854ded9bSc8ef; RV64I-NEXT:    bnez a5, .LBB38_4
2622854ded9bSc8ef; RV64I-NEXT:  # %bb.3:
2623854ded9bSc8ef; RV64I-NEXT:    sub a1, a3, a1
262411f625cbSc8ef; RV64I-NEXT:    sub a1, a1, a4
2625854ded9bSc8ef; RV64I-NEXT:    sub a0, a2, a0
2626854ded9bSc8ef; RV64I-NEXT:    ret
2627854ded9bSc8ef; RV64I-NEXT:  .LBB38_4:
2628854ded9bSc8ef; RV64I-NEXT:    sltu a4, a0, a2
2629854ded9bSc8ef; RV64I-NEXT:    sub a1, a1, a3
2630854ded9bSc8ef; RV64I-NEXT:    sub a1, a1, a4
2631854ded9bSc8ef; RV64I-NEXT:    sub a0, a0, a2
263243da8a7aSSimon Pilgrim; RV64I-NEXT:    ret
263343da8a7aSSimon Pilgrim;
263443da8a7aSSimon Pilgrim; RV32ZBB-LABEL: abd_select_i128:
263543da8a7aSSimon Pilgrim; RV32ZBB:       # %bb.0:
263643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a1)
263743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    lw a4, 4(a1)
263843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 8(a1)
263943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a1)
264014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a7, 8(a2)
264143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    lw t1, 12(a2)
264214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a5, 0(a2)
264343da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 4(a2)
264443da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a7, a6
264543da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, a2
264643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    beq t0, t1, .LBB38_2
264743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
264843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    slt t4, t1, t0
264943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB38_2:
265043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu t2, a5, a3
265143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a1, a4
265243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t2
265343da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB38_4
265443da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
265543da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t5
265643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB38_4:
265743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
265843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
265943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    xor t6, t0, t1
266043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    xor s0, a6, a7
266143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    or t6, s0, t6
266243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    beqz t6, .LBB38_6
266343da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
266443da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t4
266543da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB38_6:
266643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t2
266743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a4, .LBB38_8
266843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
266943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t5
267043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB38_8:
267143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu t5, a3, a5
267243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t5
267343da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    beq a4, a1, .LBB38_10
267443da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
267543da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a4, a1
267643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB38_10:
267743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    bnez t3, .LBB38_12
267843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
267943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t1, t0
268043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a7, a6
268143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a5, a3
268243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
2683*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, t0, a2
2684*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t4
2685*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a1, t2
2686*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a4, a5
268743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t4
268843da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    j .LBB38_13
268943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB38_12:
269043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a6, a7
269143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub t0, t0, t1
269243da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, a7
269343da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a3, a5
269443da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a4, a1
2695*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t0, a2
2696*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a6, t6
2697*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a4, t5
2698*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a5
269943da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sub a4, a6, t6
270043da8a7aSSimon Pilgrim; RV32ZBB-NEXT:  .LBB38_13:
270143da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    sw a3, 0(a0)
2702*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 4(a0)
27032967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a4, 8(a0)
2704*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a1, 12(a0)
270543da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
270643da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
270743da8a7aSSimon Pilgrim; RV32ZBB-NEXT:    ret
270843da8a7aSSimon Pilgrim;
270943da8a7aSSimon Pilgrim; RV64ZBB-LABEL: abd_select_i128:
271043da8a7aSSimon Pilgrim; RV64ZBB:       # %bb.0:
271143da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
271243da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
271343da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB38_2
271443da8a7aSSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
271543da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a3, a1
271643da8a7aSSimon Pilgrim; RV64ZBB-NEXT:  .LBB38_2:
271743da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB38_4
271843da8a7aSSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
271943da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
272043da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
272143da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
272243da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    ret
272343da8a7aSSimon Pilgrim; RV64ZBB-NEXT:  .LBB38_4:
272443da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
272543da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
272643da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
272743da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
272843da8a7aSSimon Pilgrim; RV64ZBB-NEXT:    ret
272943da8a7aSSimon Pilgrim  %cmp = icmp slt i128 %a, %b
273043da8a7aSSimon Pilgrim  %ab = select i1 %cmp, i128 %a, i128 %b
273143da8a7aSSimon Pilgrim  %ba = select i1 %cmp, i128 %b, i128 %a
273243da8a7aSSimon Pilgrim  %sub = sub i128 %ba, %ab
273343da8a7aSSimon Pilgrim  ret i128 %sub
273443da8a7aSSimon Pilgrim}
273504f65043SSimon Pilgrim
273604f65043SSimon Pilgrimdeclare i8 @llvm.abs.i8(i8, i1)
273704f65043SSimon Pilgrimdeclare i16 @llvm.abs.i16(i16, i1)
273804f65043SSimon Pilgrimdeclare i32 @llvm.abs.i32(i32, i1)
273904f65043SSimon Pilgrimdeclare i64 @llvm.abs.i64(i64, i1)
274004f65043SSimon Pilgrimdeclare i128 @llvm.abs.i128(i128, i1)
274104f65043SSimon Pilgrim
274204f65043SSimon Pilgrimdeclare i8 @llvm.smax.i8(i8, i8)
274304f65043SSimon Pilgrimdeclare i16 @llvm.smax.i16(i16, i16)
274404f65043SSimon Pilgrimdeclare i32 @llvm.smax.i32(i32, i32)
274504f65043SSimon Pilgrimdeclare i64 @llvm.smax.i64(i64, i64)
274604f65043SSimon Pilgrim
274704f65043SSimon Pilgrimdeclare i8 @llvm.smin.i8(i8, i8)
274804f65043SSimon Pilgrimdeclare i16 @llvm.smin.i16(i16, i16)
274904f65043SSimon Pilgrimdeclare i32 @llvm.smin.i32(i32, i32)
275004f65043SSimon Pilgrimdeclare i64 @llvm.smin.i64(i64, i64)
2751