xref: /llvm-project/llvm/test/CodeGen/RISCV/abds-neg.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; trunc(nabs(sub(sext(a),sext(b)))) -> nabds(a,b)
804f65043SSimon Pilgrim;
904f65043SSimon Pilgrim
1004f65043SSimon Pilgrimdefine i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
1104f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8:
1204f65043SSimon Pilgrim; RV32I:       # %bb.0:
13e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
1413d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
15*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
1613d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
1704f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
1804f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
1904f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
2004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
2104f65043SSimon Pilgrim; RV32I-NEXT:    ret
2204f65043SSimon Pilgrim;
2304f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8:
2404f65043SSimon Pilgrim; RV64I:       # %bb.0:
2504f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
2604f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
27*9122c523SPengcheng Wang; RV64I-NEXT:    srai a0, a0, 56
2804f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 56
2904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
3004f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
3104f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
3204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
3304f65043SSimon Pilgrim; RV64I-NEXT:    ret
3404f65043SSimon Pilgrim;
3513d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i8:
3613d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
3713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.b a1, a1
3813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.b a0, a0
3913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
4013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
4113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
4213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
4313d04fa5SSimon Pilgrim;
4413d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i8:
4513d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
4613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.b a0, a0
4713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.b a1, a1
4813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
4913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
5013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
5113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
5204f65043SSimon Pilgrim  %aext = sext i8 %a to i64
5304f65043SSimon Pilgrim  %bext = sext i8 %b to i64
5404f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
5504f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
5604f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
5704f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i8
5804f65043SSimon Pilgrim  ret i8 %trunc
5904f65043SSimon Pilgrim}
6004f65043SSimon Pilgrim
6104f65043SSimon Pilgrimdefine i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
6204f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8_i16:
6304f65043SSimon Pilgrim; RV32I:       # %bb.0:
64e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
6513d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
66*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
6713d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
6804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
6904f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
7004f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
7104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
7204f65043SSimon Pilgrim; RV32I-NEXT:    ret
7304f65043SSimon Pilgrim;
7404f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8_i16:
7504f65043SSimon Pilgrim; RV64I:       # %bb.0:
7604f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
7704f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
78*9122c523SPengcheng Wang; RV64I-NEXT:    srai a0, a0, 56
7904f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 48
8004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
8104f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
8204f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
8304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
8404f65043SSimon Pilgrim; RV64I-NEXT:    ret
8504f65043SSimon Pilgrim;
8613d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i8_i16:
8713d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
8813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a1, a1
8913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.b a0, a0
9013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
9113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
9213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
9313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
9413d04fa5SSimon Pilgrim;
9513d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i8_i16:
9613d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
9713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.b a0, a0
9813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a1, a1
9913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
10013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
10113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
10213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
10304f65043SSimon Pilgrim  %aext = sext i8 %a to i64
10404f65043SSimon Pilgrim  %bext = sext i16 %b to i64
10504f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
10604f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
10704f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
10804f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i8
10904f65043SSimon Pilgrim  ret i8 %trunc
11004f65043SSimon Pilgrim}
11104f65043SSimon Pilgrim
11204f65043SSimon Pilgrimdefine i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
11304f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8_undef:
11404f65043SSimon Pilgrim; RV32I:       # %bb.0:
115e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
11613d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
117*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
11813d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
11904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
12004f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
12104f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
12204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
12304f65043SSimon Pilgrim; RV32I-NEXT:    ret
12404f65043SSimon Pilgrim;
12504f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8_undef:
12604f65043SSimon Pilgrim; RV64I:       # %bb.0:
12704f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
12804f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
129*9122c523SPengcheng Wang; RV64I-NEXT:    srai a0, a0, 56
13004f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 56
13104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
13204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
13304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
13404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
13504f65043SSimon Pilgrim; RV64I-NEXT:    ret
13604f65043SSimon Pilgrim;
13713d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i8_undef:
13813d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
13913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.b a1, a1
14013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.b a0, a0
14113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
14213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
14313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
14413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
14513d04fa5SSimon Pilgrim;
14613d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i8_undef:
14713d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
14813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.b a0, a0
14913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.b a1, a1
15013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
15113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
15213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
15313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
15404f65043SSimon Pilgrim  %aext = sext i8 %a to i64
15504f65043SSimon Pilgrim  %bext = sext i8 %b to i64
15604f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
15704f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
15804f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
15904f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i8
16004f65043SSimon Pilgrim  ret i8 %trunc
16104f65043SSimon Pilgrim}
16204f65043SSimon Pilgrim
16304f65043SSimon Pilgrimdefine i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
16404f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16:
16504f65043SSimon Pilgrim; RV32I:       # %bb.0:
166e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
16713d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
168*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
16913d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
17004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
17104f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
17204f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
17304f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
17404f65043SSimon Pilgrim; RV32I-NEXT:    ret
17504f65043SSimon Pilgrim;
17604f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16:
17704f65043SSimon Pilgrim; RV64I:       # %bb.0:
17804f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
17904f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
180*9122c523SPengcheng Wang; RV64I-NEXT:    srai a0, a0, 48
18104f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 48
18204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
18304f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
18404f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
18504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
18604f65043SSimon Pilgrim; RV64I-NEXT:    ret
18704f65043SSimon Pilgrim;
18813d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i16:
18913d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
19013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a1, a1
19113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a0, a0
19213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
19313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
19413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
19513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
19613d04fa5SSimon Pilgrim;
19713d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i16:
19813d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
19913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a0, a0
20013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a1, a1
20113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
20213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
20313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
20413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
20504f65043SSimon Pilgrim  %aext = sext i16 %a to i64
20604f65043SSimon Pilgrim  %bext = sext i16 %b to i64
20704f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
20804f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
20904f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
21004f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i16
21104f65043SSimon Pilgrim  ret i16 %trunc
21204f65043SSimon Pilgrim}
21304f65043SSimon Pilgrim
21404f65043SSimon Pilgrimdefine i16 @abd_ext_i16_i32(i16 %a, i32 %b) nounwind {
21504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16_i32:
21604f65043SSimon Pilgrim; RV32I:       # %bb.0:
21704f65043SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
21804f65043SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
21913d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB4_2
220e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
22113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
222e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
22313d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
224e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB4_2:
22513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
22604f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
22704f65043SSimon Pilgrim; RV32I-NEXT:    ret
22804f65043SSimon Pilgrim;
22904f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16_i32:
23004f65043SSimon Pilgrim; RV64I:       # %bb.0:
23104f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
23204f65043SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
23304f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
23404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
23504f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
23604f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
23704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
23804f65043SSimon Pilgrim; RV64I-NEXT:    ret
23904f65043SSimon Pilgrim;
24004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i16_i32:
24104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
24204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a0, a0
24313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
24413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
24513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
24604f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
24704f65043SSimon Pilgrim;
24804f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i16_i32:
24904f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
25004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a0, a0
25104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
25204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
25304f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
25404f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
25504f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
25604f65043SSimon Pilgrim  %aext = sext i16 %a to i64
25704f65043SSimon Pilgrim  %bext = sext i32 %b to i64
25804f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
25904f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
26004f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
26104f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i16
26204f65043SSimon Pilgrim  ret i16 %trunc
26304f65043SSimon Pilgrim}
26404f65043SSimon Pilgrim
26504f65043SSimon Pilgrimdefine i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
26604f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16_undef:
26704f65043SSimon Pilgrim; RV32I:       # %bb.0:
268e4e96b3eSSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
26913d04fa5SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
270*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
27113d04fa5SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
27204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
27304f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
27404f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
27504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
27604f65043SSimon Pilgrim; RV32I-NEXT:    ret
27704f65043SSimon Pilgrim;
27804f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16_undef:
27904f65043SSimon Pilgrim; RV64I:       # %bb.0:
28004f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
28104f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
282*9122c523SPengcheng Wang; RV64I-NEXT:    srai a0, a0, 48
28304f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 48
28404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
28504f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
28604f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
28704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
28804f65043SSimon Pilgrim; RV64I-NEXT:    ret
28904f65043SSimon Pilgrim;
29013d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i16_undef:
29113d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
29213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a1, a1
29313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a0, a0
29413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
29513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
29613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
29713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
29813d04fa5SSimon Pilgrim;
29913d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i16_undef:
30013d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
30113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a0, a0
30213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a1, a1
30313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
30413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
30513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
30613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
30704f65043SSimon Pilgrim  %aext = sext i16 %a to i64
30804f65043SSimon Pilgrim  %bext = sext i16 %b to i64
30904f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
31004f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
31104f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
31204f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i16
31304f65043SSimon Pilgrim  ret i16 %trunc
31404f65043SSimon Pilgrim}
31504f65043SSimon Pilgrim
31604f65043SSimon Pilgrimdefine i32 @abd_ext_i32(i32 %a, i32 %b) nounwind {
31704f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32:
31804f65043SSimon Pilgrim; RV32I:       # %bb.0:
31913d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB6_2
320e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
32113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
322e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
32313d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
324e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB6_2:
32513d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
32604f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
32704f65043SSimon Pilgrim; RV32I-NEXT:    ret
32804f65043SSimon Pilgrim;
32904f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32:
33004f65043SSimon Pilgrim; RV64I:       # %bb.0:
33104f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
33204f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
33304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
33404f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
33504f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
33604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
33704f65043SSimon Pilgrim; RV64I-NEXT:    ret
33804f65043SSimon Pilgrim;
33904f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32:
34004f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
34113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
34213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
34313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
34404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
34504f65043SSimon Pilgrim;
34604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32:
34704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
34804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
34904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
35004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
35104f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
35204f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
35304f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
35404f65043SSimon Pilgrim  %aext = sext i32 %a to i64
35504f65043SSimon Pilgrim  %bext = sext i32 %b to i64
35604f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
35704f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
35804f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
35904f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i32
36004f65043SSimon Pilgrim  ret i32 %trunc
36104f65043SSimon Pilgrim}
36204f65043SSimon Pilgrim
36304f65043SSimon Pilgrimdefine i32 @abd_ext_i32_i16(i32 %a, i16 %b) nounwind {
36404f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32_i16:
36504f65043SSimon Pilgrim; RV32I:       # %bb.0:
36604f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
36704f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 16
36813d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB7_2
369e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
37013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
371e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
37213d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
373e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB7_2:
37413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
37504f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
37604f65043SSimon Pilgrim; RV32I-NEXT:    ret
37704f65043SSimon Pilgrim;
37804f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32_i16:
37904f65043SSimon Pilgrim; RV64I:       # %bb.0:
38004f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
38104f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
38204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 48
38304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
38404f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
38504f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
38604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
38704f65043SSimon Pilgrim; RV64I-NEXT:    ret
38804f65043SSimon Pilgrim;
38904f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32_i16:
39004f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
39104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sext.h a1, a1
39213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
39313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
39413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
39504f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
39604f65043SSimon Pilgrim;
39704f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32_i16:
39804f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
39904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
40004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.h a1, a1
40104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
40204f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
40304f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
40404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
40504f65043SSimon Pilgrim  %aext = sext i32 %a to i64
40604f65043SSimon Pilgrim  %bext = sext i16 %b to i64
40704f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
40804f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
40904f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
41004f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i32
41104f65043SSimon Pilgrim  ret i32 %trunc
41204f65043SSimon Pilgrim}
41304f65043SSimon Pilgrim
41404f65043SSimon Pilgrimdefine i32 @abd_ext_i32_undef(i32 %a, i32 %b) nounwind {
41504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32_undef:
41604f65043SSimon Pilgrim; RV32I:       # %bb.0:
41713d04fa5SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB8_2
418e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
41913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
420e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
42113d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
422e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB8_2:
42313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
42404f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
42504f65043SSimon Pilgrim; RV32I-NEXT:    ret
42604f65043SSimon Pilgrim;
42704f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32_undef:
42804f65043SSimon Pilgrim; RV64I:       # %bb.0:
42904f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
43004f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
43104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
43204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
43304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
43404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
43504f65043SSimon Pilgrim; RV64I-NEXT:    ret
43604f65043SSimon Pilgrim;
43704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32_undef:
43804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
43913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    max a2, a0, a1
44013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
44113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
44204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
44304f65043SSimon Pilgrim;
44404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32_undef:
44504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
44604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
44704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
44804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
44904f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
45004f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
45104f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
45204f65043SSimon Pilgrim  %aext = sext i32 %a to i64
45304f65043SSimon Pilgrim  %bext = sext i32 %b to i64
45404f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
45504f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
45604f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
45704f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i32
45804f65043SSimon Pilgrim  ret i32 %trunc
45904f65043SSimon Pilgrim}
46004f65043SSimon Pilgrim
46104f65043SSimon Pilgrimdefine i64 @abd_ext_i64(i64 %a, i64 %b) nounwind {
46204f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i64:
46304f65043SSimon Pilgrim; RV32I:       # %bb.0:
46413d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
46513d04fa5SSimon Pilgrim; RV32I-NEXT:    mv a5, a4
46604f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB9_2
46704f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
46813d04fa5SSimon Pilgrim; RV32I-NEXT:    slt a5, a3, a1
46904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB9_2:
47013d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB9_4
47113d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
47213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
47313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
47413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
47513d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB9_5
47613d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB9_4:
47713d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
47804f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
47904f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
48004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
48113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB9_5:
48204f65043SSimon Pilgrim; RV32I-NEXT:    snez a2, a0
48304f65043SSimon Pilgrim; RV32I-NEXT:    add a1, a1, a2
48404f65043SSimon Pilgrim; RV32I-NEXT:    neg a1, a1
48504f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
48604f65043SSimon Pilgrim; RV32I-NEXT:    ret
48704f65043SSimon Pilgrim;
48804f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i64:
48904f65043SSimon Pilgrim; RV64I:       # %bb.0:
49013d04fa5SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB9_2
491e4e96b3eSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
49213d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
493e4e96b3eSSimon Pilgrim; RV64I-NEXT:    neg a0, a0
49413d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
495e4e96b3eSSimon Pilgrim; RV64I-NEXT:  .LBB9_2:
49613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
49704f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
49804f65043SSimon Pilgrim; RV64I-NEXT:    ret
49904f65043SSimon Pilgrim;
50004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i64:
50104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
50213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
50313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
50404f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB9_2
50504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
50613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a3, a1
50704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB9_2:
50813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB9_4
50913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
51013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
51113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
51213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
51313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB9_5
51413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB9_4:
51513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
51604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
51704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
51804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
51913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB9_5:
52004f65043SSimon Pilgrim; RV32ZBB-NEXT:    snez a2, a0
52104f65043SSimon Pilgrim; RV32ZBB-NEXT:    add a1, a1, a2
52204f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
52304f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a0, a0
52404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
52504f65043SSimon Pilgrim;
52604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i64:
52704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
52813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    max a2, a0, a1
52913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
53013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
53104f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
53204f65043SSimon Pilgrim  %aext = sext i64 %a to i128
53304f65043SSimon Pilgrim  %bext = sext i64 %b to i128
53404f65043SSimon Pilgrim  %sub = sub i128 %aext, %bext
53504f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
53604f65043SSimon Pilgrim  %nabs = sub i128 0, %abs
53704f65043SSimon Pilgrim  %trunc = trunc i128 %nabs to i64
53804f65043SSimon Pilgrim  ret i64 %trunc
53904f65043SSimon Pilgrim}
54004f65043SSimon Pilgrim
54104f65043SSimon Pilgrimdefine i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {
54204f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i64_undef:
54304f65043SSimon Pilgrim; RV32I:       # %bb.0:
54413d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
54513d04fa5SSimon Pilgrim; RV32I-NEXT:    mv a5, a4
54604f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB10_2
54704f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
54813d04fa5SSimon Pilgrim; RV32I-NEXT:    slt a5, a3, a1
54904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB10_2:
55013d04fa5SSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB10_4
55113d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
55213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
55313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
55413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
55513d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB10_5
55613d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB10_4:
55713d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
55804f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
55904f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
56004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
56113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB10_5:
56204f65043SSimon Pilgrim; RV32I-NEXT:    snez a2, a0
56304f65043SSimon Pilgrim; RV32I-NEXT:    add a1, a1, a2
56404f65043SSimon Pilgrim; RV32I-NEXT:    neg a1, a1
56504f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
56604f65043SSimon Pilgrim; RV32I-NEXT:    ret
56704f65043SSimon Pilgrim;
56804f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i64_undef:
56904f65043SSimon Pilgrim; RV64I:       # %bb.0:
57013d04fa5SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB10_2
571e4e96b3eSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
57213d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
573e4e96b3eSSimon Pilgrim; RV64I-NEXT:    neg a0, a0
57413d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
575e4e96b3eSSimon Pilgrim; RV64I-NEXT:  .LBB10_2:
57613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
57704f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
57804f65043SSimon Pilgrim; RV64I-NEXT:    ret
57904f65043SSimon Pilgrim;
58004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i64_undef:
58104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
58213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
58313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
58404f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB10_2
58504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
58613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a3, a1
58704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB10_2:
58813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB10_4
58913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
59013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
59113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
59213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
59313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB10_5
59413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB10_4:
59513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
59604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
59704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
59804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
59913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB10_5:
60004f65043SSimon Pilgrim; RV32ZBB-NEXT:    snez a2, a0
60104f65043SSimon Pilgrim; RV32ZBB-NEXT:    add a1, a1, a2
60204f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
60304f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a0, a0
60404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
60504f65043SSimon Pilgrim;
60604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i64_undef:
60704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
60813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    max a2, a0, a1
60913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
61013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
61104f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
61204f65043SSimon Pilgrim  %aext = sext i64 %a to i128
61304f65043SSimon Pilgrim  %bext = sext i64 %b to i128
61404f65043SSimon Pilgrim  %sub = sub i128 %aext, %bext
61504f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
61604f65043SSimon Pilgrim  %nabs = sub i128 0, %abs
61704f65043SSimon Pilgrim  %trunc = trunc i128 %nabs to i64
61804f65043SSimon Pilgrim  ret i64 %trunc
61904f65043SSimon Pilgrim}
62004f65043SSimon Pilgrim
62104f65043SSimon Pilgrimdefine i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {
62204f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i128:
62304f65043SSimon Pilgrim; RV32I:       # %bb.0:
62413d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a1)
62514c4f28eSAlex Bradbury; RV32I-NEXT:    lw a4, 4(a1)
62613d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a6, 8(a1)
62713d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t1, 12(a1)
628*9122c523SPengcheng Wang; RV32I-NEXT:    lw t0, 8(a2)
62913d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t2, 12(a2)
63014c4f28eSAlex Bradbury; RV32I-NEXT:    lw a1, 0(a2)
63114c4f28eSAlex Bradbury; RV32I-NEXT:    lw a2, 4(a2)
632*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t3, t0, a6
63313d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t3
63413d04fa5SSimon Pilgrim; RV32I-NEXT:    beq t1, t2, .LBB11_2
63504f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
63613d04fa5SSimon Pilgrim; RV32I-NEXT:    slt t4, t2, t1
63704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_2:
63814c4f28eSAlex Bradbury; RV32I-NEXT:    sltu a5, a1, a3
63914c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t6, a2, a4
640*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, a5
64114c4f28eSAlex Bradbury; RV32I-NEXT:    beq a4, a2, .LBB11_4
64204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
643*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, t6
64404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_4:
64504f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
64604f65043SSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
64713d04fa5SSimon Pilgrim; RV32I-NEXT:    xor t5, t1, t2
648*9122c523SPengcheng Wang; RV32I-NEXT:    xor s0, a6, t0
64913d04fa5SSimon Pilgrim; RV32I-NEXT:    or t5, s0, t5
65013d04fa5SSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB11_6
65104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.5:
652*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, t4
65304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_6:
65414c4f28eSAlex Bradbury; RV32I-NEXT:    mv t5, a5
65514c4f28eSAlex Bradbury; RV32I-NEXT:    beq a2, a4, .LBB11_8
656e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.7:
65713d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t5, t6
658e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB11_8:
65914c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t4, a3, a1
66013d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t6, t4
66114c4f28eSAlex Bradbury; RV32I-NEXT:    beq a4, a2, .LBB11_10
66213d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
66314c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t6, a4, a2
66413d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_10:
665*9122c523SPengcheng Wang; RV32I-NEXT:    bnez a7, .LBB11_12
66613d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
66713d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t1, t2, t1
668*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, t0, a6
669*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t1, t3
67013d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t1, a6, t5
671*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, t1
67213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a6, t5
67313d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB11_13
67413d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_12:
675*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t3, a6, t0
67613d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t1, t1, t2
677*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a6, t0
678*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t1, t3
679*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a6, t6
680*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, t1
68113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a6, t6
68213d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_13:
68313d04fa5SSimon Pilgrim; RV32I-NEXT:    snez t1, a6
684*9122c523SPengcheng Wang; RV32I-NEXT:    add t0, t0, t1
685*9122c523SPengcheng Wang; RV32I-NEXT:    bnez a7, .LBB11_15
68613d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.14:
68714c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a2, a4
68814c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a2, a5
68914c4f28eSAlex Bradbury; RV32I-NEXT:    sub a1, a1, a3
69013d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB11_16
69113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_15:
69214c4f28eSAlex Bradbury; RV32I-NEXT:    sub a4, a4, a2
69314c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a4, t4
69414c4f28eSAlex Bradbury; RV32I-NEXT:    sub a1, a3, a1
69513d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_16:
69614c4f28eSAlex Bradbury; RV32I-NEXT:    or a3, a1, a2
69713d04fa5SSimon Pilgrim; RV32I-NEXT:    neg a4, a6
698*9122c523SPengcheng Wang; RV32I-NEXT:    neg a5, t0
69914c4f28eSAlex Bradbury; RV32I-NEXT:    snez a6, a1
700*9122c523SPengcheng Wang; RV32I-NEXT:    neg a1, a1
701*9122c523SPengcheng Wang; RV32I-NEXT:    snez a3, a3
70214c4f28eSAlex Bradbury; RV32I-NEXT:    add a2, a2, a6
703*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a4, a3
70414c4f28eSAlex Bradbury; RV32I-NEXT:    neg a2, a2
70514c4f28eSAlex Bradbury; RV32I-NEXT:    sub a4, a4, a3
706*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a5, a6
70714c4f28eSAlex Bradbury; RV32I-NEXT:    sw a1, 0(a0)
70814c4f28eSAlex Bradbury; RV32I-NEXT:    sw a2, 4(a0)
7092967e5f8SAlex Bradbury; RV32I-NEXT:    sw a4, 8(a0)
710*9122c523SPengcheng Wang; RV32I-NEXT:    sw a3, 12(a0)
71104f65043SSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
71204f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
71304f65043SSimon Pilgrim; RV32I-NEXT:    ret
71404f65043SSimon Pilgrim;
71504f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i128:
71604f65043SSimon Pilgrim; RV64I:       # %bb.0:
71713d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
71813d04fa5SSimon Pilgrim; RV64I-NEXT:    mv a5, a4
71904f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB11_2
72004f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
72113d04fa5SSimon Pilgrim; RV64I-NEXT:    slt a5, a3, a1
72204f65043SSimon Pilgrim; RV64I-NEXT:  .LBB11_2:
72313d04fa5SSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB11_4
72413d04fa5SSimon Pilgrim; RV64I-NEXT:  # %bb.3:
72513d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
72613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
72713d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
72813d04fa5SSimon Pilgrim; RV64I-NEXT:    j .LBB11_5
72913d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB11_4:
73013d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
73104f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
73204f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
73304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
73413d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB11_5:
73504f65043SSimon Pilgrim; RV64I-NEXT:    snez a2, a0
73604f65043SSimon Pilgrim; RV64I-NEXT:    add a1, a1, a2
73704f65043SSimon Pilgrim; RV64I-NEXT:    neg a1, a1
73804f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
73904f65043SSimon Pilgrim; RV64I-NEXT:    ret
74004f65043SSimon Pilgrim;
74104f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i128:
74204f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
74313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a1)
74414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a4, 4(a1)
74513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 8(a1)
74613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t1, 12(a1)
747*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t0, 8(a2)
74813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t2, 12(a2)
74914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a1, 0(a2)
75014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a2, 4(a2)
751*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t3, t0, a6
75213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t3
75313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq t1, t2, .LBB11_2
75404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
75513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt t4, t2, t1
75604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_2:
75714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu a5, a1, a3
75814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t6, a2, a4
759*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, a5
76014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a4, a2, .LBB11_4
76104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
762*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, t6
76304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_4:
76404f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
76504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
76613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor t5, t1, t2
767*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor s0, a6, t0
76813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    or t5, s0, t5
76913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB11_6
77004f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
771*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, t4
77204f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_6:
77314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    mv t5, a5
77414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a2, a4, .LBB11_8
775e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
77613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t5, t6
777e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_8:
77814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t4, a3, a1
77913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t4
78014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a4, a2, .LBB11_10
78113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
78214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t6, a4, a2
78313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_10:
784*9122c523SPengcheng Wang; RV32ZBB-NEXT:    bnez a7, .LBB11_12
78513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
78613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t1, t2, t1
787*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, t0, a6
788*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t1, t3
78913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t1, a6, t5
790*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, t1
79113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, t5
79213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB11_13
79313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_12:
794*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t3, a6, t0
79513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t1, t1, t2
796*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a6, t0
797*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t1, t3
798*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a6, t6
799*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, t1
80013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, t6
80113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_13:
80213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    snez t1, a6
803*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t0, t0, t1
804*9122c523SPengcheng Wang; RV32ZBB-NEXT:    bnez a7, .LBB11_15
80513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.14:
80614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a2, a4
80714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a2, a5
80814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a1, a1, a3
80913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB11_16
81013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_15:
81114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a4, a4, a2
81214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a4, t4
81314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a1, a3, a1
81413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_16:
81514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    or a3, a1, a2
81613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    neg a4, a6
817*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a5, t0
81814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    snez a6, a1
819*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a1, a1
820*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a3, a3
82114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    add a2, a2, a6
822*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a4, a3
82314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    neg a2, a2
82414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a4, a4, a3
825*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a5, a6
82614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sw a1, 0(a0)
82714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sw a2, 4(a0)
8282967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a4, 8(a0)
829*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a3, 12(a0)
83004f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
83104f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
83204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
83304f65043SSimon Pilgrim;
83404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i128:
83504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
83613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
83713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
83804f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB11_2
83904f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
84013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a3, a1
84104f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB11_2:
84213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB11_4
84313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
84413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
84513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
84613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
84713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB11_5
84813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB11_4:
84913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
85004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
85104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
85204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
85313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB11_5:
85404f65043SSimon Pilgrim; RV64ZBB-NEXT:    snez a2, a0
85504f65043SSimon Pilgrim; RV64ZBB-NEXT:    add a1, a1, a2
85604f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a1
85704f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a0, a0
85804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
85904f65043SSimon Pilgrim  %aext = sext i128 %a to i256
86004f65043SSimon Pilgrim  %bext = sext i128 %b to i256
86104f65043SSimon Pilgrim  %sub = sub i256 %aext, %bext
86204f65043SSimon Pilgrim  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false)
86304f65043SSimon Pilgrim  %nabs = sub i256 0, %abs
86404f65043SSimon Pilgrim  %trunc = trunc i256 %nabs to i128
86504f65043SSimon Pilgrim  ret i128 %trunc
86604f65043SSimon Pilgrim}
86704f65043SSimon Pilgrim
86804f65043SSimon Pilgrimdefine i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {
86904f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i128_undef:
87004f65043SSimon Pilgrim; RV32I:       # %bb.0:
87113d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a1)
87214c4f28eSAlex Bradbury; RV32I-NEXT:    lw a4, 4(a1)
87313d04fa5SSimon Pilgrim; RV32I-NEXT:    lw a6, 8(a1)
87413d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t1, 12(a1)
875*9122c523SPengcheng Wang; RV32I-NEXT:    lw t0, 8(a2)
87613d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t2, 12(a2)
87714c4f28eSAlex Bradbury; RV32I-NEXT:    lw a1, 0(a2)
87814c4f28eSAlex Bradbury; RV32I-NEXT:    lw a2, 4(a2)
879*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t3, t0, a6
88013d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t4, t3
88113d04fa5SSimon Pilgrim; RV32I-NEXT:    beq t1, t2, .LBB12_2
88204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
88313d04fa5SSimon Pilgrim; RV32I-NEXT:    slt t4, t2, t1
88404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_2:
88514c4f28eSAlex Bradbury; RV32I-NEXT:    sltu a5, a1, a3
88614c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t6, a2, a4
887*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, a5
88814c4f28eSAlex Bradbury; RV32I-NEXT:    beq a4, a2, .LBB12_4
88904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
890*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, t6
89104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_4:
89204f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
89304f65043SSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
89413d04fa5SSimon Pilgrim; RV32I-NEXT:    xor t5, t1, t2
895*9122c523SPengcheng Wang; RV32I-NEXT:    xor s0, a6, t0
89613d04fa5SSimon Pilgrim; RV32I-NEXT:    or t5, s0, t5
89713d04fa5SSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB12_6
89804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.5:
899*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, t4
90004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_6:
90114c4f28eSAlex Bradbury; RV32I-NEXT:    mv t5, a5
90214c4f28eSAlex Bradbury; RV32I-NEXT:    beq a2, a4, .LBB12_8
903e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.7:
90413d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t5, t6
905e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB12_8:
90614c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t4, a3, a1
90713d04fa5SSimon Pilgrim; RV32I-NEXT:    mv t6, t4
90814c4f28eSAlex Bradbury; RV32I-NEXT:    beq a4, a2, .LBB12_10
90913d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
91014c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t6, a4, a2
91113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_10:
912*9122c523SPengcheng Wang; RV32I-NEXT:    bnez a7, .LBB12_12
91313d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
91413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t1, t2, t1
915*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, t0, a6
916*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t1, t3
91713d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu t1, a6, t5
918*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, t1
91913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a6, t5
92013d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB12_13
92113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_12:
922*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t3, a6, t0
92313d04fa5SSimon Pilgrim; RV32I-NEXT:    sub t1, t1, t2
924*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a6, t0
925*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t1, t3
926*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a6, t6
927*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, t0, t1
92813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a6, a6, t6
92913d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_13:
93013d04fa5SSimon Pilgrim; RV32I-NEXT:    snez t1, a6
931*9122c523SPengcheng Wang; RV32I-NEXT:    add t0, t0, t1
932*9122c523SPengcheng Wang; RV32I-NEXT:    bnez a7, .LBB12_15
93313d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.14:
93414c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a2, a4
93514c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a2, a5
93614c4f28eSAlex Bradbury; RV32I-NEXT:    sub a1, a1, a3
93713d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB12_16
93813d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_15:
93914c4f28eSAlex Bradbury; RV32I-NEXT:    sub a4, a4, a2
94014c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a4, t4
94114c4f28eSAlex Bradbury; RV32I-NEXT:    sub a1, a3, a1
94213d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_16:
94314c4f28eSAlex Bradbury; RV32I-NEXT:    or a3, a1, a2
94413d04fa5SSimon Pilgrim; RV32I-NEXT:    neg a4, a6
945*9122c523SPengcheng Wang; RV32I-NEXT:    neg a5, t0
94614c4f28eSAlex Bradbury; RV32I-NEXT:    snez a6, a1
947*9122c523SPengcheng Wang; RV32I-NEXT:    neg a1, a1
948*9122c523SPengcheng Wang; RV32I-NEXT:    snez a3, a3
94914c4f28eSAlex Bradbury; RV32I-NEXT:    add a2, a2, a6
950*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a4, a3
95114c4f28eSAlex Bradbury; RV32I-NEXT:    neg a2, a2
95214c4f28eSAlex Bradbury; RV32I-NEXT:    sub a4, a4, a3
953*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a5, a6
95414c4f28eSAlex Bradbury; RV32I-NEXT:    sw a1, 0(a0)
95514c4f28eSAlex Bradbury; RV32I-NEXT:    sw a2, 4(a0)
9562967e5f8SAlex Bradbury; RV32I-NEXT:    sw a4, 8(a0)
957*9122c523SPengcheng Wang; RV32I-NEXT:    sw a3, 12(a0)
95804f65043SSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
95904f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
96004f65043SSimon Pilgrim; RV32I-NEXT:    ret
96104f65043SSimon Pilgrim;
96204f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i128_undef:
96304f65043SSimon Pilgrim; RV64I:       # %bb.0:
96413d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
96513d04fa5SSimon Pilgrim; RV64I-NEXT:    mv a5, a4
96604f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB12_2
96704f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
96813d04fa5SSimon Pilgrim; RV64I-NEXT:    slt a5, a3, a1
96904f65043SSimon Pilgrim; RV64I-NEXT:  .LBB12_2:
97013d04fa5SSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB12_4
97113d04fa5SSimon Pilgrim; RV64I-NEXT:  # %bb.3:
97213d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
97313d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
97413d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
97513d04fa5SSimon Pilgrim; RV64I-NEXT:    j .LBB12_5
97613d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB12_4:
97713d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
97804f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
97904f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
98004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
98113d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB12_5:
98204f65043SSimon Pilgrim; RV64I-NEXT:    snez a2, a0
98304f65043SSimon Pilgrim; RV64I-NEXT:    add a1, a1, a2
98404f65043SSimon Pilgrim; RV64I-NEXT:    neg a1, a1
98504f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
98604f65043SSimon Pilgrim; RV64I-NEXT:    ret
98704f65043SSimon Pilgrim;
98804f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i128_undef:
98904f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
99013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a1)
99114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a4, 4(a1)
99213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 8(a1)
99313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t1, 12(a1)
994*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t0, 8(a2)
99513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t2, 12(a2)
99614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a1, 0(a2)
99714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a2, 4(a2)
998*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t3, t0, a6
99913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t3
100013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq t1, t2, .LBB12_2
100104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
100213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    slt t4, t2, t1
100304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_2:
100414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu a5, a1, a3
100514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t6, a2, a4
1006*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, a5
100714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a4, a2, .LBB12_4
100804f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
1009*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, t6
101004f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_4:
101104f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
101204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
101313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor t5, t1, t2
1014*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor s0, a6, t0
101513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    or t5, s0, t5
101613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB12_6
101704f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
1018*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, t4
101904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_6:
102014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    mv t5, a5
102114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a2, a4, .LBB12_8
1022e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
102313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t5, t6
1024e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_8:
102514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t4, a3, a1
102613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t4
102714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a4, a2, .LBB12_10
102813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
102914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t6, a4, a2
103013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_10:
1031*9122c523SPengcheng Wang; RV32ZBB-NEXT:    bnez a7, .LBB12_12
103213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
103313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t1, t2, t1
1034*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, t0, a6
1035*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t1, t3
103613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu t1, a6, t5
1037*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, t1
103813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, t5
103913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB12_13
104013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_12:
1041*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t3, a6, t0
104213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub t1, t1, t2
1043*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a6, t0
1044*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t1, t3
1045*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a6, t6
1046*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, t0, t1
104713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a6, a6, t6
104813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_13:
104913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    snez t1, a6
1050*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t0, t0, t1
1051*9122c523SPengcheng Wang; RV32ZBB-NEXT:    bnez a7, .LBB12_15
105213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.14:
105314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a2, a4
105414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a2, a5
105514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a1, a1, a3
105613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB12_16
105713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_15:
105814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a4, a4, a2
105914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a4, t4
106014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a1, a3, a1
106113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_16:
106214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    or a3, a1, a2
106313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    neg a4, a6
1064*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a5, t0
106514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    snez a6, a1
1066*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a1, a1
1067*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a3, a3
106814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    add a2, a2, a6
1069*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a4, a3
107014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    neg a2, a2
107114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a4, a4, a3
1072*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a5, a6
107314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sw a1, 0(a0)
107414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sw a2, 4(a0)
10752967e5f8SAlex Bradbury; RV32ZBB-NEXT:    sw a4, 8(a0)
1076*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a3, 12(a0)
107704f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
107804f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
107904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
108004f65043SSimon Pilgrim;
108104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i128_undef:
108204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
108313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
108413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
108504f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB12_2
108604f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
108713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a3, a1
108804f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB12_2:
108913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB12_4
109013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
109113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
109213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
109313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
109413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB12_5
109513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB12_4:
109613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
109704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
109804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
109904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
110013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB12_5:
110104f65043SSimon Pilgrim; RV64ZBB-NEXT:    snez a2, a0
110204f65043SSimon Pilgrim; RV64ZBB-NEXT:    add a1, a1, a2
110304f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a1
110404f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a0, a0
110504f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
110604f65043SSimon Pilgrim  %aext = sext i128 %a to i256
110704f65043SSimon Pilgrim  %bext = sext i128 %b to i256
110804f65043SSimon Pilgrim  %sub = sub i256 %aext, %bext
110904f65043SSimon Pilgrim  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true)
111004f65043SSimon Pilgrim  %nabs = sub i256 0, %abs
111104f65043SSimon Pilgrim  %trunc = trunc i256 %nabs to i128
111204f65043SSimon Pilgrim  ret i128 %trunc
111304f65043SSimon Pilgrim}
111404f65043SSimon Pilgrim
111504f65043SSimon Pilgrim;
111604f65043SSimon Pilgrim; sub(smin(a,b),smax(a,b)) -> nabds(a,b)
111704f65043SSimon Pilgrim;
111804f65043SSimon Pilgrim
111904f65043SSimon Pilgrimdefine i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
112004f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i8:
112104f65043SSimon Pilgrim; RV32I:       # %bb.0:
112204f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 24
112304f65043SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 24
1124*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 24
112504f65043SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 24
112604f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a0
112704f65043SSimon Pilgrim; RV32I-NEXT:    bge a0, a1, .LBB13_3
112804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
112904f65043SSimon Pilgrim; RV32I-NEXT:    bge a1, a0, .LBB13_4
113004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB13_2:
113104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
113204f65043SSimon Pilgrim; RV32I-NEXT:    ret
113304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB13_3:
113404f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a1
113504f65043SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB13_2
113604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB13_4:
113704f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a1
113804f65043SSimon Pilgrim; RV32I-NEXT:    ret
113904f65043SSimon Pilgrim;
114004f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i8:
114104f65043SSimon Pilgrim; RV64I:       # %bb.0:
114204f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 56
114304f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 56
1144*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 56
114504f65043SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 56
114604f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a0
114704f65043SSimon Pilgrim; RV64I-NEXT:    bge a0, a1, .LBB13_3
114804f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
114904f65043SSimon Pilgrim; RV64I-NEXT:    bge a1, a0, .LBB13_4
115004f65043SSimon Pilgrim; RV64I-NEXT:  .LBB13_2:
115104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
115204f65043SSimon Pilgrim; RV64I-NEXT:    ret
115304f65043SSimon Pilgrim; RV64I-NEXT:  .LBB13_3:
115404f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a1
115504f65043SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB13_2
115604f65043SSimon Pilgrim; RV64I-NEXT:  .LBB13_4:
115704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a1
115804f65043SSimon Pilgrim; RV64I-NEXT:    ret
115904f65043SSimon Pilgrim;
116004f65043SSimon Pilgrim; ZBB-LABEL: abd_minmax_i8:
116104f65043SSimon Pilgrim; ZBB:       # %bb.0:
116204f65043SSimon Pilgrim; ZBB-NEXT:    sext.b a1, a1
116304f65043SSimon Pilgrim; ZBB-NEXT:    sext.b a0, a0
116404f65043SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
116504f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
116604f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a2, a0
116704f65043SSimon Pilgrim; ZBB-NEXT:    ret
116804f65043SSimon Pilgrim  %min = call i8 @llvm.smin.i8(i8 %a, i8 %b)
116904f65043SSimon Pilgrim  %max = call i8 @llvm.smax.i8(i8 %a, i8 %b)
117004f65043SSimon Pilgrim  %sub = sub i8 %min, %max
117104f65043SSimon Pilgrim  ret i8 %sub
117204f65043SSimon Pilgrim}
117304f65043SSimon Pilgrim
117404f65043SSimon Pilgrimdefine i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
117504f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i16:
117604f65043SSimon Pilgrim; RV32I:       # %bb.0:
117704f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
117804f65043SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
1179*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a1, 16
118004f65043SSimon Pilgrim; RV32I-NEXT:    srai a0, a0, 16
118104f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a0
118204f65043SSimon Pilgrim; RV32I-NEXT:    bge a0, a1, .LBB14_3
118304f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
118404f65043SSimon Pilgrim; RV32I-NEXT:    bge a1, a0, .LBB14_4
118504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB14_2:
118604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
118704f65043SSimon Pilgrim; RV32I-NEXT:    ret
118804f65043SSimon Pilgrim; RV32I-NEXT:  .LBB14_3:
118904f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a1
119004f65043SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB14_2
119104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB14_4:
119204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a1
119304f65043SSimon Pilgrim; RV32I-NEXT:    ret
119404f65043SSimon Pilgrim;
119504f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i16:
119604f65043SSimon Pilgrim; RV64I:       # %bb.0:
119704f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
119804f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
1199*9122c523SPengcheng Wang; RV64I-NEXT:    srai a1, a1, 48
120004f65043SSimon Pilgrim; RV64I-NEXT:    srai a0, a0, 48
120104f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a0
120204f65043SSimon Pilgrim; RV64I-NEXT:    bge a0, a1, .LBB14_3
120304f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
120404f65043SSimon Pilgrim; RV64I-NEXT:    bge a1, a0, .LBB14_4
120504f65043SSimon Pilgrim; RV64I-NEXT:  .LBB14_2:
120604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
120704f65043SSimon Pilgrim; RV64I-NEXT:    ret
120804f65043SSimon Pilgrim; RV64I-NEXT:  .LBB14_3:
120904f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a1
121004f65043SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB14_2
121104f65043SSimon Pilgrim; RV64I-NEXT:  .LBB14_4:
121204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a1
121304f65043SSimon Pilgrim; RV64I-NEXT:    ret
121404f65043SSimon Pilgrim;
121504f65043SSimon Pilgrim; ZBB-LABEL: abd_minmax_i16:
121604f65043SSimon Pilgrim; ZBB:       # %bb.0:
121704f65043SSimon Pilgrim; ZBB-NEXT:    sext.h a1, a1
121804f65043SSimon Pilgrim; ZBB-NEXT:    sext.h a0, a0
121904f65043SSimon Pilgrim; ZBB-NEXT:    min a2, a0, a1
122004f65043SSimon Pilgrim; ZBB-NEXT:    max a0, a0, a1
122104f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a2, a0
122204f65043SSimon Pilgrim; ZBB-NEXT:    ret
122304f65043SSimon Pilgrim  %min = call i16 @llvm.smin.i16(i16 %a, i16 %b)
122404f65043SSimon Pilgrim  %max = call i16 @llvm.smax.i16(i16 %a, i16 %b)
122504f65043SSimon Pilgrim  %sub = sub i16 %min, %max
122604f65043SSimon Pilgrim  ret i16 %sub
122704f65043SSimon Pilgrim}
122804f65043SSimon Pilgrim
122904f65043SSimon Pilgrimdefine i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind {
123004f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i32:
123104f65043SSimon Pilgrim; RV32I:       # %bb.0:
123204f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a0
123304f65043SSimon Pilgrim; RV32I-NEXT:    bge a0, a1, .LBB15_3
123404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
123504f65043SSimon Pilgrim; RV32I-NEXT:    bge a1, a0, .LBB15_4
123604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB15_2:
123704f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
123804f65043SSimon Pilgrim; RV32I-NEXT:    ret
123904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB15_3:
124004f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a1
124104f65043SSimon Pilgrim; RV32I-NEXT:    blt a1, a0, .LBB15_2
124204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB15_4:
124304f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a1
124404f65043SSimon Pilgrim; RV32I-NEXT:    ret
124504f65043SSimon Pilgrim;
124604f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i32:
124704f65043SSimon Pilgrim; RV64I:       # %bb.0:
124804f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
124904f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
125004f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a0
125104f65043SSimon Pilgrim; RV64I-NEXT:    bge a0, a1, .LBB15_3
125204f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
125304f65043SSimon Pilgrim; RV64I-NEXT:    bge a1, a0, .LBB15_4
125404f65043SSimon Pilgrim; RV64I-NEXT:  .LBB15_2:
125504f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a2, a0
125604f65043SSimon Pilgrim; RV64I-NEXT:    ret
125704f65043SSimon Pilgrim; RV64I-NEXT:  .LBB15_3:
125804f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a1
125904f65043SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB15_2
126004f65043SSimon Pilgrim; RV64I-NEXT:  .LBB15_4:
126104f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a2, a1
126204f65043SSimon Pilgrim; RV64I-NEXT:    ret
126304f65043SSimon Pilgrim;
126404f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i32:
126504f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
126604f65043SSimon Pilgrim; RV32ZBB-NEXT:    min a2, a0, a1
126704f65043SSimon Pilgrim; RV32ZBB-NEXT:    max a0, a0, a1
126804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
126904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
127004f65043SSimon Pilgrim;
127104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i32:
127204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
127304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
127404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
127504f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
127604f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
127704f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a2, a0
127804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
127904f65043SSimon Pilgrim  %min = call i32 @llvm.smin.i32(i32 %a, i32 %b)
128004f65043SSimon Pilgrim  %max = call i32 @llvm.smax.i32(i32 %a, i32 %b)
128104f65043SSimon Pilgrim  %sub = sub i32 %min, %max
128204f65043SSimon Pilgrim  ret i32 %sub
128304f65043SSimon Pilgrim}
128404f65043SSimon Pilgrim
128504f65043SSimon Pilgrimdefine i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind {
128604f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i64:
128704f65043SSimon Pilgrim; RV32I:       # %bb.0:
128804f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB16_2
128904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
129004f65043SSimon Pilgrim; RV32I-NEXT:    slt a6, a1, a3
129104f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB16_3
129204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_2:
129304f65043SSimon Pilgrim; RV32I-NEXT:    sltu a6, a0, a2
129404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_3:
129504f65043SSimon Pilgrim; RV32I-NEXT:    mv a4, a1
129604f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, a0
129704f65043SSimon Pilgrim; RV32I-NEXT:    bnez a6, .LBB16_5
129804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.4:
129904f65043SSimon Pilgrim; RV32I-NEXT:    mv a4, a3
130004f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, a2
130104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_5:
130204f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB16_7
130304f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.6:
130404f65043SSimon Pilgrim; RV32I-NEXT:    slt a6, a3, a1
130504f65043SSimon Pilgrim; RV32I-NEXT:    beqz a6, .LBB16_8
130604f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB16_9
130704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_7:
130804f65043SSimon Pilgrim; RV32I-NEXT:    sltu a6, a2, a0
130904f65043SSimon Pilgrim; RV32I-NEXT:    bnez a6, .LBB16_9
131004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_8:
131104f65043SSimon Pilgrim; RV32I-NEXT:    mv a1, a3
131204f65043SSimon Pilgrim; RV32I-NEXT:    mv a0, a2
131304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_9:
131404f65043SSimon Pilgrim; RV32I-NEXT:    sltu a2, a5, a0
131504f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a4, a1
131604f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a2
131704f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a5, a0
131804f65043SSimon Pilgrim; RV32I-NEXT:    ret
131904f65043SSimon Pilgrim;
132004f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i64:
132104f65043SSimon Pilgrim; RV64I:       # %bb.0:
132204f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a0
132304f65043SSimon Pilgrim; RV64I-NEXT:    bge a0, a1, .LBB16_3
132404f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
132504f65043SSimon Pilgrim; RV64I-NEXT:    bge a1, a0, .LBB16_4
132604f65043SSimon Pilgrim; RV64I-NEXT:  .LBB16_2:
132704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
132804f65043SSimon Pilgrim; RV64I-NEXT:    ret
132904f65043SSimon Pilgrim; RV64I-NEXT:  .LBB16_3:
133004f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a1
133104f65043SSimon Pilgrim; RV64I-NEXT:    blt a1, a0, .LBB16_2
133204f65043SSimon Pilgrim; RV64I-NEXT:  .LBB16_4:
133304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a1
133404f65043SSimon Pilgrim; RV64I-NEXT:    ret
133504f65043SSimon Pilgrim;
133604f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i64:
133704f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
133804f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB16_2
133904f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
134004f65043SSimon Pilgrim; RV32ZBB-NEXT:    slt a6, a1, a3
134104f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB16_3
134204f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_2:
134304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a6, a0, a2
134404f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_3:
134504f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a4, a1
134604f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a0
134704f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez a6, .LBB16_5
134804f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.4:
134904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a4, a3
135004f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a2
135104f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_5:
135204f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB16_7
135304f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.6:
135404f65043SSimon Pilgrim; RV32ZBB-NEXT:    slt a6, a3, a1
135504f65043SSimon Pilgrim; RV32ZBB-NEXT:    beqz a6, .LBB16_8
135604f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB16_9
135704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_7:
135804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a6, a2, a0
135904f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez a6, .LBB16_9
136004f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_8:
136104f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a1, a3
136204f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a0, a2
136304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_9:
136404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a5, a0
136504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a4, a1
136604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a2
136704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a5, a0
136804f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
136904f65043SSimon Pilgrim;
137004f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i64:
137104f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
137204f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a2, a0, a1
137304f65043SSimon Pilgrim; RV64ZBB-NEXT:    max a0, a0, a1
137404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
137504f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
137604f65043SSimon Pilgrim  %min = call i64 @llvm.smin.i64(i64 %a, i64 %b)
137704f65043SSimon Pilgrim  %max = call i64 @llvm.smax.i64(i64 %a, i64 %b)
137804f65043SSimon Pilgrim  %sub = sub i64 %min, %max
137904f65043SSimon Pilgrim  ret i64 %sub
138004f65043SSimon Pilgrim}
138104f65043SSimon Pilgrim
138204f65043SSimon Pilgrimdefine i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind {
138304f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i128:
138404f65043SSimon Pilgrim; RV32I:       # %bb.0:
138504f65043SSimon Pilgrim; RV32I-NEXT:    lw a6, 4(a2)
138604f65043SSimon Pilgrim; RV32I-NEXT:    lw a7, 8(a2)
138704f65043SSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a2)
138804f65043SSimon Pilgrim; RV32I-NEXT:    lw a5, 12(a1)
138914c4f28eSAlex Bradbury; RV32I-NEXT:    lw a3, 4(a1)
139004f65043SSimon Pilgrim; RV32I-NEXT:    lw a4, 8(a1)
139104f65043SSimon Pilgrim; RV32I-NEXT:    beq a5, t0, .LBB17_2
139204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
139304f65043SSimon Pilgrim; RV32I-NEXT:    slt t1, a5, t0
139404f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_3
139504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_2:
139604f65043SSimon Pilgrim; RV32I-NEXT:    sltu t1, a4, a7
139704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_3:
139804f65043SSimon Pilgrim; RV32I-NEXT:    lw t2, 0(a2)
139904f65043SSimon Pilgrim; RV32I-NEXT:    lw a1, 0(a1)
140004f65043SSimon Pilgrim; RV32I-NEXT:    beq a3, a6, .LBB17_5
140104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.4:
140204f65043SSimon Pilgrim; RV32I-NEXT:    sltu t6, a3, a6
140304f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_6
140404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_5:
140504f65043SSimon Pilgrim; RV32I-NEXT:    sltu t6, a1, t2
140604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_6:
140704f65043SSimon Pilgrim; RV32I-NEXT:    xor a2, a5, t0
140804f65043SSimon Pilgrim; RV32I-NEXT:    xor t3, a4, a7
140904f65043SSimon Pilgrim; RV32I-NEXT:    or t5, t3, a2
141004f65043SSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB17_8
141104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.7:
141204f65043SSimon Pilgrim; RV32I-NEXT:    mv t6, t1
141304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_8:
141404f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a1
141504f65043SSimon Pilgrim; RV32I-NEXT:    mv t1, a3
141604f65043SSimon Pilgrim; RV32I-NEXT:    mv t4, a5
141704f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, a4
141804f65043SSimon Pilgrim; RV32I-NEXT:    bnez t6, .LBB17_10
141904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
142004f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, t2
142104f65043SSimon Pilgrim; RV32I-NEXT:    mv t1, a6
142204f65043SSimon Pilgrim; RV32I-NEXT:    mv t4, t0
142304f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, a7
142404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_10:
142504f65043SSimon Pilgrim; RV32I-NEXT:    beq a5, t0, .LBB17_12
142604f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
142704f65043SSimon Pilgrim; RV32I-NEXT:    slt t6, t0, a5
142804f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_13
142904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_12:
143004f65043SSimon Pilgrim; RV32I-NEXT:    sltu t6, a7, a4
143104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_13:
143204f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
143304f65043SSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
143404f65043SSimon Pilgrim; RV32I-NEXT:    beq a3, a6, .LBB17_15
143504f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.14:
143604f65043SSimon Pilgrim; RV32I-NEXT:    sltu s0, a6, a3
143704f65043SSimon Pilgrim; RV32I-NEXT:    bnez t5, .LBB17_16
143804f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_17
143904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_15:
144004f65043SSimon Pilgrim; RV32I-NEXT:    sltu s0, t2, a1
144104f65043SSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB17_17
144204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_16:
144304f65043SSimon Pilgrim; RV32I-NEXT:    mv s0, t6
144404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_17:
144504f65043SSimon Pilgrim; RV32I-NEXT:    bnez s0, .LBB17_19
144604f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.18:
144704f65043SSimon Pilgrim; RV32I-NEXT:    mv a1, t2
144804f65043SSimon Pilgrim; RV32I-NEXT:    mv a3, a6
144904f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, t0
145004f65043SSimon Pilgrim; RV32I-NEXT:    mv a4, a7
145104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_19:
1452*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a7, t3, a4
1453*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, t4, a5
1454*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a2, a1
1455*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, a7
1456*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, a6
145704f65043SSimon Pilgrim; RV32I-NEXT:    beq t1, a3, .LBB17_21
145804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.20:
145904f65043SSimon Pilgrim; RV32I-NEXT:    sltu a7, t1, a3
146004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_21:
146104f65043SSimon Pilgrim; RV32I-NEXT:    sub a4, t3, a4
146204f65043SSimon Pilgrim; RV32I-NEXT:    sub a3, t1, a3
146304f65043SSimon Pilgrim; RV32I-NEXT:    sub a2, a2, a1
1464*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a4, a7
1465*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a4, a7
1466*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a6
1467*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, a1
146804f65043SSimon Pilgrim; RV32I-NEXT:    sw a2, 0(a0)
146904f65043SSimon Pilgrim; RV32I-NEXT:    sw a3, 4(a0)
147004f65043SSimon Pilgrim; RV32I-NEXT:    sw a4, 8(a0)
1471*9122c523SPengcheng Wang; RV32I-NEXT:    sw a5, 12(a0)
147204f65043SSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
147304f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
147404f65043SSimon Pilgrim; RV32I-NEXT:    ret
147504f65043SSimon Pilgrim;
147604f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i128:
147704f65043SSimon Pilgrim; RV64I:       # %bb.0:
147804f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB17_2
147904f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
148004f65043SSimon Pilgrim; RV64I-NEXT:    slt a6, a1, a3
148104f65043SSimon Pilgrim; RV64I-NEXT:    j .LBB17_3
148204f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_2:
148304f65043SSimon Pilgrim; RV64I-NEXT:    sltu a6, a0, a2
148404f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_3:
148504f65043SSimon Pilgrim; RV64I-NEXT:    mv a4, a1
148604f65043SSimon Pilgrim; RV64I-NEXT:    mv a5, a0
148704f65043SSimon Pilgrim; RV64I-NEXT:    bnez a6, .LBB17_5
148804f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.4:
148904f65043SSimon Pilgrim; RV64I-NEXT:    mv a4, a3
149004f65043SSimon Pilgrim; RV64I-NEXT:    mv a5, a2
149104f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_5:
149204f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB17_7
149304f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.6:
149404f65043SSimon Pilgrim; RV64I-NEXT:    slt a6, a3, a1
149504f65043SSimon Pilgrim; RV64I-NEXT:    beqz a6, .LBB17_8
149604f65043SSimon Pilgrim; RV64I-NEXT:    j .LBB17_9
149704f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_7:
149804f65043SSimon Pilgrim; RV64I-NEXT:    sltu a6, a2, a0
149904f65043SSimon Pilgrim; RV64I-NEXT:    bnez a6, .LBB17_9
150004f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_8:
150104f65043SSimon Pilgrim; RV64I-NEXT:    mv a1, a3
150204f65043SSimon Pilgrim; RV64I-NEXT:    mv a0, a2
150304f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_9:
150404f65043SSimon Pilgrim; RV64I-NEXT:    sltu a2, a5, a0
150504f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a4, a1
150604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a2
150704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a5, a0
150804f65043SSimon Pilgrim; RV64I-NEXT:    ret
150904f65043SSimon Pilgrim;
151004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i128:
151104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
151204f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 4(a2)
151304f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a7, 8(a2)
151404f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a2)
151504f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a5, 12(a1)
151614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a3, 4(a1)
151704f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a4, 8(a1)
151804f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a5, t0, .LBB17_2
151904f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
152004f65043SSimon Pilgrim; RV32ZBB-NEXT:    slt t1, a5, t0
152104f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_3
152204f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_2:
152304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t1, a4, a7
152404f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_3:
152504f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t2, 0(a2)
152604f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 0(a1)
152704f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a3, a6, .LBB17_5
152804f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.4:
152904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a3, a6
153004f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_6
153104f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_5:
153204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a1, t2
153304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_6:
153404f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a2, a5, t0
153504f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor t3, a4, a7
153604f65043SSimon Pilgrim; RV32ZBB-NEXT:    or t5, t3, a2
153704f65043SSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB17_8
153804f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
153904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t1
154004f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_8:
154104f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a2, a1
154204f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t1, a3
154304f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, a5
154404f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, a4
154504f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez t6, .LBB17_10
154604f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
154704f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a2, t2
154804f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t1, a6
154904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t0
155004f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, a7
155104f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_10:
155204f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a5, t0, .LBB17_12
155304f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
155404f65043SSimon Pilgrim; RV32ZBB-NEXT:    slt t6, t0, a5
155504f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_13
155604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_12:
155704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a7, a4
155804f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_13:
155904f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
156004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
156104f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a3, a6, .LBB17_15
156204f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.14:
156304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu s0, a6, a3
156404f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez t5, .LBB17_16
156504f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_17
156604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_15:
156704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu s0, t2, a1
156804f65043SSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB17_17
156904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_16:
157004f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv s0, t6
157104f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_17:
157204f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez s0, .LBB17_19
157304f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.18:
157404f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a1, t2
157504f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a3, a6
157604f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, t0
157704f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a4, a7
157804f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_19:
1579*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a7, t3, a4
1580*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, t4, a5
1581*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a2, a1
1582*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, a7
1583*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, a6
158404f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq t1, a3, .LBB17_21
158504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.20:
158604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a7, t1, a3
158704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_21:
158804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, t3, a4
158904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, t1, a3
159004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a2, a2, a1
1591*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a4, a7
1592*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a4, a7
1593*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a6
1594*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, a1
159504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a2, 0(a0)
159604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a3, 4(a0)
159704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a4, 8(a0)
1598*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a5, 12(a0)
159904f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
160004f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
160104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
160204f65043SSimon Pilgrim;
160304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i128:
160404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
160504f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB17_2
160604f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
160704f65043SSimon Pilgrim; RV64ZBB-NEXT:    slt a6, a1, a3
160804f65043SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB17_3
160904f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_2:
161004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a6, a0, a2
161104f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_3:
161204f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a4, a1
161304f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a0
161404f65043SSimon Pilgrim; RV64ZBB-NEXT:    bnez a6, .LBB17_5
161504f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.4:
161604f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a4, a3
161704f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a2
161804f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_5:
161904f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB17_7
162004f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.6:
162104f65043SSimon Pilgrim; RV64ZBB-NEXT:    slt a6, a3, a1
162204f65043SSimon Pilgrim; RV64ZBB-NEXT:    beqz a6, .LBB17_8
162304f65043SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB17_9
162404f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_7:
162504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a6, a2, a0
162604f65043SSimon Pilgrim; RV64ZBB-NEXT:    bnez a6, .LBB17_9
162704f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_8:
162804f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a1, a3
162904f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a0, a2
163004f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_9:
163104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a2, a5, a0
163204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a4, a1
163304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a2
163404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a5, a0
163504f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
163604f65043SSimon Pilgrim  %min = call i128 @llvm.smin.i128(i128 %a, i128 %b)
163704f65043SSimon Pilgrim  %max = call i128 @llvm.smax.i128(i128 %a, i128 %b)
163804f65043SSimon Pilgrim  %sub = sub i128 %min, %max
163904f65043SSimon Pilgrim  ret i128 %sub
164004f65043SSimon Pilgrim}
164104f65043SSimon Pilgrim
164204f65043SSimon Pilgrim;
164304f65043SSimon Pilgrim; select(icmp(a,b),sub(a,b),sub(b,a)) -> nabds(a,b)
164404f65043SSimon Pilgrim;
164504f65043SSimon Pilgrim
164604f65043SSimon Pilgrimdefine i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
164704f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i8:
164804f65043SSimon Pilgrim; RV32I:       # %bb.0:
164904f65043SSimon Pilgrim; RV32I-NEXT:    slli a2, a0, 24
165004f65043SSimon Pilgrim; RV32I-NEXT:    slli a3, a1, 24
1651*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a2, 24
165204f65043SSimon Pilgrim; RV32I-NEXT:    srai a3, a3, 24
165304f65043SSimon Pilgrim; RV32I-NEXT:    bge a3, a2, .LBB18_2
165404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
165504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
165604f65043SSimon Pilgrim; RV32I-NEXT:    ret
165704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB18_2:
165804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
165904f65043SSimon Pilgrim; RV32I-NEXT:    ret
166004f65043SSimon Pilgrim;
166104f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i8:
166204f65043SSimon Pilgrim; RV64I:       # %bb.0:
166304f65043SSimon Pilgrim; RV64I-NEXT:    slli a2, a0, 56
166404f65043SSimon Pilgrim; RV64I-NEXT:    slli a3, a1, 56
1665*9122c523SPengcheng Wang; RV64I-NEXT:    srai a2, a2, 56
166604f65043SSimon Pilgrim; RV64I-NEXT:    srai a3, a3, 56
166704f65043SSimon Pilgrim; RV64I-NEXT:    bge a3, a2, .LBB18_2
166804f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
166904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
167004f65043SSimon Pilgrim; RV64I-NEXT:    ret
167104f65043SSimon Pilgrim; RV64I-NEXT:  .LBB18_2:
167204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
167304f65043SSimon Pilgrim; RV64I-NEXT:    ret
167404f65043SSimon Pilgrim;
167504f65043SSimon Pilgrim; ZBB-LABEL: abd_cmp_i8:
167604f65043SSimon Pilgrim; ZBB:       # %bb.0:
167704f65043SSimon Pilgrim; ZBB-NEXT:    sext.b a2, a0
167804f65043SSimon Pilgrim; ZBB-NEXT:    sext.b a3, a1
167904f65043SSimon Pilgrim; ZBB-NEXT:    bge a3, a2, .LBB18_2
168004f65043SSimon Pilgrim; ZBB-NEXT:  # %bb.1:
168104f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a1, a0
168204f65043SSimon Pilgrim; ZBB-NEXT:    ret
168304f65043SSimon Pilgrim; ZBB-NEXT:  .LBB18_2:
168404f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a1
168504f65043SSimon Pilgrim; ZBB-NEXT:    ret
168604f65043SSimon Pilgrim  %cmp = icmp sle i8 %a, %b
168704f65043SSimon Pilgrim  %ab = sub i8 %a, %b
168804f65043SSimon Pilgrim  %ba = sub i8 %b, %a
168904f65043SSimon Pilgrim  %sel = select i1 %cmp, i8 %ab, i8 %ba
169004f65043SSimon Pilgrim  ret i8 %sel
169104f65043SSimon Pilgrim}
169204f65043SSimon Pilgrim
169304f65043SSimon Pilgrimdefine i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
169404f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i16:
169504f65043SSimon Pilgrim; RV32I:       # %bb.0:
169604f65043SSimon Pilgrim; RV32I-NEXT:    slli a2, a1, 16
169704f65043SSimon Pilgrim; RV32I-NEXT:    slli a3, a0, 16
1698*9122c523SPengcheng Wang; RV32I-NEXT:    srai a2, a2, 16
169904f65043SSimon Pilgrim; RV32I-NEXT:    srai a3, a3, 16
170004f65043SSimon Pilgrim; RV32I-NEXT:    blt a3, a2, .LBB19_2
170104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
170204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
170304f65043SSimon Pilgrim; RV32I-NEXT:    ret
170404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB19_2:
170504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
170604f65043SSimon Pilgrim; RV32I-NEXT:    ret
170704f65043SSimon Pilgrim;
170804f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i16:
170904f65043SSimon Pilgrim; RV64I:       # %bb.0:
171004f65043SSimon Pilgrim; RV64I-NEXT:    slli a2, a1, 48
171104f65043SSimon Pilgrim; RV64I-NEXT:    slli a3, a0, 48
1712*9122c523SPengcheng Wang; RV64I-NEXT:    srai a2, a2, 48
171304f65043SSimon Pilgrim; RV64I-NEXT:    srai a3, a3, 48
171404f65043SSimon Pilgrim; RV64I-NEXT:    blt a3, a2, .LBB19_2
171504f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
171604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
171704f65043SSimon Pilgrim; RV64I-NEXT:    ret
171804f65043SSimon Pilgrim; RV64I-NEXT:  .LBB19_2:
171904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
172004f65043SSimon Pilgrim; RV64I-NEXT:    ret
172104f65043SSimon Pilgrim;
172204f65043SSimon Pilgrim; ZBB-LABEL: abd_cmp_i16:
172304f65043SSimon Pilgrim; ZBB:       # %bb.0:
172404f65043SSimon Pilgrim; ZBB-NEXT:    sext.h a2, a1
172504f65043SSimon Pilgrim; ZBB-NEXT:    sext.h a3, a0
172604f65043SSimon Pilgrim; ZBB-NEXT:    blt a3, a2, .LBB19_2
172704f65043SSimon Pilgrim; ZBB-NEXT:  # %bb.1:
172804f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a1, a0
172904f65043SSimon Pilgrim; ZBB-NEXT:    ret
173004f65043SSimon Pilgrim; ZBB-NEXT:  .LBB19_2:
173104f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a1
173204f65043SSimon Pilgrim; ZBB-NEXT:    ret
173304f65043SSimon Pilgrim  %cmp = icmp slt i16 %a, %b
173404f65043SSimon Pilgrim  %ab = sub i16 %a, %b
173504f65043SSimon Pilgrim  %ba = sub i16 %b, %a
173604f65043SSimon Pilgrim  %sel = select i1 %cmp, i16 %ab, i16 %ba
173704f65043SSimon Pilgrim  ret i16 %sel
173804f65043SSimon Pilgrim}
173904f65043SSimon Pilgrim
174004f65043SSimon Pilgrimdefine i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind {
174104f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i32:
174204f65043SSimon Pilgrim; RV32I:       # %bb.0:
174304f65043SSimon Pilgrim; RV32I-NEXT:    bge a0, a1, .LBB20_2
174404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
174504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
174604f65043SSimon Pilgrim; RV32I-NEXT:    ret
174704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB20_2:
174804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
174904f65043SSimon Pilgrim; RV32I-NEXT:    ret
175004f65043SSimon Pilgrim;
175104f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i32:
175204f65043SSimon Pilgrim; RV64I:       # %bb.0:
175304f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a2, a1
175404f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a3, a0
175504f65043SSimon Pilgrim; RV64I-NEXT:    bge a3, a2, .LBB20_2
175604f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
175704f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
175804f65043SSimon Pilgrim; RV64I-NEXT:    ret
175904f65043SSimon Pilgrim; RV64I-NEXT:  .LBB20_2:
176004f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a1, a0
176104f65043SSimon Pilgrim; RV64I-NEXT:    ret
176204f65043SSimon Pilgrim;
176304f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i32:
176404f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
176504f65043SSimon Pilgrim; RV32ZBB-NEXT:    bge a0, a1, .LBB20_2
176604f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
176704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
176804f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
176904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB20_2:
177004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a1, a0
177104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
177204f65043SSimon Pilgrim;
177304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i32:
177404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
177504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a2, a1
177604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a3, a0
177704f65043SSimon Pilgrim; RV64ZBB-NEXT:    bge a3, a2, .LBB20_2
177804f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
177904f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
178004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
178104f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB20_2:
178204f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a1, a0
178304f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
178404f65043SSimon Pilgrim  %cmp = icmp sge i32 %a, %b
178504f65043SSimon Pilgrim  %ab = sub i32 %a, %b
178604f65043SSimon Pilgrim  %ba = sub i32 %b, %a
178704f65043SSimon Pilgrim  %sel = select i1 %cmp, i32 %ba, i32 %ab
178804f65043SSimon Pilgrim  ret i32 %sel
178904f65043SSimon Pilgrim}
179004f65043SSimon Pilgrim
179104f65043SSimon Pilgrimdefine i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {
179204f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i64:
179304f65043SSimon Pilgrim; RV32I:       # %bb.0:
17947afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
179504f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, a4
179604f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB21_2
179704f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
17987afdc6bdSSimon Pilgrim; RV32I-NEXT:    slt a5, a1, a3
179904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB21_2:
180004f65043SSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB21_4
180104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
18027afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
180304f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
180404f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
180504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
180604f65043SSimon Pilgrim; RV32I-NEXT:    ret
18078109e5deSSimon Pilgrim; RV32I-NEXT:  .LBB21_4:
18088109e5deSSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
18098109e5deSSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
18108109e5deSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
18118109e5deSSimon Pilgrim; RV32I-NEXT:    ret
181204f65043SSimon Pilgrim;
181304f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i64:
181404f65043SSimon Pilgrim; RV64I:       # %bb.0:
18157afdc6bdSSimon Pilgrim; RV64I-NEXT:    blt a0, a1, .LBB21_2
181604f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
18178109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
181804f65043SSimon Pilgrim; RV64I-NEXT:    ret
181904f65043SSimon Pilgrim; RV64I-NEXT:  .LBB21_2:
18208109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
182104f65043SSimon Pilgrim; RV64I-NEXT:    ret
182204f65043SSimon Pilgrim;
182304f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i64:
182404f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
18257afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
182604f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
182704f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB21_2
182804f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
18297afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    slt a5, a1, a3
183004f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB21_2:
183104f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB21_4
183204f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
18337afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
183404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
183504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
183604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
183704f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
18388109e5deSSimon Pilgrim; RV32ZBB-NEXT:  .LBB21_4:
18398109e5deSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
18408109e5deSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
18418109e5deSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
18428109e5deSSimon Pilgrim; RV32ZBB-NEXT:    ret
184304f65043SSimon Pilgrim;
184404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i64:
184504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
18467afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    blt a0, a1, .LBB21_2
18477afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
18487afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a1, a0
18497afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    ret
18507afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:  .LBB21_2:
18517afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
185204f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
185304f65043SSimon Pilgrim  %cmp = icmp slt i64 %a, %b
185404f65043SSimon Pilgrim  %ab = sub i64 %a, %b
185504f65043SSimon Pilgrim  %ba = sub i64 %b, %a
18567afdc6bdSSimon Pilgrim  %sel = select i1 %cmp, i64 %ab, i64 %ba
185704f65043SSimon Pilgrim  ret i64 %sel
185804f65043SSimon Pilgrim}
185904f65043SSimon Pilgrim
186004f65043SSimon Pilgrimdefine i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {
186104f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i128:
186204f65043SSimon Pilgrim; RV32I:       # %bb.0:
18637afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a2)
186414c4f28eSAlex Bradbury; RV32I-NEXT:    lw a4, 4(a2)
186514c4f28eSAlex Bradbury; RV32I-NEXT:    lw a5, 8(a2)
186614c4f28eSAlex Bradbury; RV32I-NEXT:    lw a7, 12(a2)
186714c4f28eSAlex Bradbury; RV32I-NEXT:    lw a6, 8(a1)
186804f65043SSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a1)
186914c4f28eSAlex Bradbury; RV32I-NEXT:    lw a2, 0(a1)
18707afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw a1, 4(a1)
187114c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t1, a6, a5
18727afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t4, t1
187314c4f28eSAlex Bradbury; RV32I-NEXT:    beq t0, a7, .LBB22_2
187404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
187514c4f28eSAlex Bradbury; RV32I-NEXT:    slt t4, t0, a7
187604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_2:
187714c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t2, a2, a3
187804f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, t2
187914c4f28eSAlex Bradbury; RV32I-NEXT:    beq a1, a4, .LBB22_4
188004f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
188114c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t3, a1, a4
188204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_4:
188314c4f28eSAlex Bradbury; RV32I-NEXT:    xor t5, t0, a7
188414c4f28eSAlex Bradbury; RV32I-NEXT:    xor t6, a6, a5
18857afdc6bdSSimon Pilgrim; RV32I-NEXT:    or t5, t6, t5
18867afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t6, t3
18877afdc6bdSSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB22_6
188804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.5:
18897afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t6, t4
189004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_6:
189114c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t4, a3, a2
18927afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t5, t4
189314c4f28eSAlex Bradbury; RV32I-NEXT:    beq a1, a4, .LBB22_8
189404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.7:
189514c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t5, a4, a1
189604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB22_8:
18977afdc6bdSSimon Pilgrim; RV32I-NEXT:    bnez t6, .LBB22_10
189804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
189914c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t1, a5, a6
190014c4f28eSAlex Bradbury; RV32I-NEXT:    sub a7, a7, t0
1901*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, a6
190214c4f28eSAlex Bradbury; RV32I-NEXT:    sub a4, a4, a1
1903*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a7, t1
1904*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a7, a5, t5
1905*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a5, t5
1906*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a4, t4
1907*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a6, a7
190814c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a3, a2
19097afdc6bdSSimon Pilgrim; RV32I-NEXT:    j .LBB22_11
19107afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_10:
191114c4f28eSAlex Bradbury; RV32I-NEXT:    sub a7, t0, a7
1912*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a6, a5
1913*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a1, a4
1914*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a7, t1
1915*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a7, a5, t3
1916*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a5, t3
1917*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a4, t2
1918*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a6, a7
191914c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a2, a3
19207afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_11:
192114c4f28eSAlex Bradbury; RV32I-NEXT:    sw a2, 0(a0)
1922*9122c523SPengcheng Wang; RV32I-NEXT:    sw a5, 4(a0)
1923*9122c523SPengcheng Wang; RV32I-NEXT:    sw a1, 8(a0)
1924*9122c523SPengcheng Wang; RV32I-NEXT:    sw a4, 12(a0)
192504f65043SSimon Pilgrim; RV32I-NEXT:    ret
192604f65043SSimon Pilgrim;
192704f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i128:
192804f65043SSimon Pilgrim; RV64I:       # %bb.0:
19297afdc6bdSSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
193004f65043SSimon Pilgrim; RV64I-NEXT:    mv a5, a4
193104f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB22_2
193204f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
19337afdc6bdSSimon Pilgrim; RV64I-NEXT:    slt a5, a1, a3
193404f65043SSimon Pilgrim; RV64I-NEXT:  .LBB22_2:
193504f65043SSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB22_4
193604f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.3:
19377afdc6bdSSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
193804f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
193904f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
194004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
194104f65043SSimon Pilgrim; RV64I-NEXT:    ret
19428109e5deSSimon Pilgrim; RV64I-NEXT:  .LBB22_4:
19438109e5deSSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
19448109e5deSSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
19458109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
19468109e5deSSimon Pilgrim; RV64I-NEXT:    ret
194704f65043SSimon Pilgrim;
194804f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i128:
194904f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
19507afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a2)
195114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a4, 4(a2)
195214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a5, 8(a2)
195314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a7, 12(a2)
195414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a6, 8(a1)
195504f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a1)
195614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a2, 0(a1)
19577afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 4(a1)
195814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t1, a6, a5
19597afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t1
196014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq t0, a7, .LBB22_2
196104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
196214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    slt t4, t0, a7
196304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_2:
196414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t2, a2, a3
196504f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t2
196614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a1, a4, .LBB22_4
196704f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
196814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t3, a1, a4
196904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_4:
197014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    xor t5, t0, a7
197114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    xor t6, a6, a5
19727afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    or t5, t6, t5
19737afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t3
19747afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB22_6
197504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
19767afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t4
197704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_6:
197814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t4, a3, a2
19797afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t5, t4
198014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a1, a4, .LBB22_8
198104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
198214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t5, a4, a1
198304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_8:
19847afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    bnez t6, .LBB22_10
198504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
198614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t1, a5, a6
198714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a7, a7, t0
1988*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, a6
198914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a4, a4, a1
1990*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a7, t1
1991*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a7, a5, t5
1992*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a5, t5
1993*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a4, t4
1994*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a6, a7
199514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a3, a2
19967afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    j .LBB22_11
19977afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_10:
199814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a7, t0, a7
1999*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a6, a5
2000*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a1, a4
2001*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a7, t1
2002*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a7, a5, t3
2003*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a5, t3
2004*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a4, t2
2005*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a6, a7
200614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a2, a3
20077afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_11:
200814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sw a2, 0(a0)
2009*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a5, 4(a0)
2010*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a1, 8(a0)
2011*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a4, 12(a0)
201204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
201304f65043SSimon Pilgrim;
201404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i128:
201504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
20167afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
201704f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
201804f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB22_2
201904f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
20207afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    slt a5, a1, a3
202104f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB22_2:
202204f65043SSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB22_4
202304f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
20247afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
202504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
202604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
202704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
202804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
20298109e5deSSimon Pilgrim; RV64ZBB-NEXT:  .LBB22_4:
20308109e5deSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
20318109e5deSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
20328109e5deSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
20338109e5deSSimon Pilgrim; RV64ZBB-NEXT:    ret
203404f65043SSimon Pilgrim  %cmp = icmp slt i128 %a, %b
203504f65043SSimon Pilgrim  %ab = sub i128 %a, %b
203604f65043SSimon Pilgrim  %ba = sub i128 %b, %a
20377afdc6bdSSimon Pilgrim  %sel = select i1 %cmp, i128 %ab, i128 %ba
203804f65043SSimon Pilgrim  ret i128 %sel
203904f65043SSimon Pilgrim}
204004f65043SSimon Pilgrim
204104f65043SSimon Pilgrim;
204204f65043SSimon Pilgrim; nabs(sub_nsw(x, y)) -> nabds(a,b)
204304f65043SSimon Pilgrim;
204404f65043SSimon Pilgrim
204504f65043SSimon Pilgrimdefine i8 @abd_subnsw_i8(i8 %a, i8 %b) nounwind {
204604f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i8:
204704f65043SSimon Pilgrim; RV32I:       # %bb.0:
204804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
204904f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 24
205004f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
205104f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
205204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
205304f65043SSimon Pilgrim; RV32I-NEXT:    ret
205404f65043SSimon Pilgrim;
205504f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i8:
205604f65043SSimon Pilgrim; RV64I:       # %bb.0:
205704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
205804f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 56
205904f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
206004f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
206104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
206204f65043SSimon Pilgrim; RV64I-NEXT:    ret
206304f65043SSimon Pilgrim;
206404f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i8:
206504f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
206604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
206704f65043SSimon Pilgrim; RV32ZBB-NEXT:    slli a1, a0, 24
206804f65043SSimon Pilgrim; RV32ZBB-NEXT:    srai a1, a1, 31
206904f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a0, a0, a1
207004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a1, a0
207104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
207204f65043SSimon Pilgrim;
207304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i8:
207404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
207504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
207604f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a1, a0, 56
207704f65043SSimon Pilgrim; RV64ZBB-NEXT:    srai a1, a1, 63
207804f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a1
207904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a1, a0
208004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
208104f65043SSimon Pilgrim  %sub = sub nsw i8 %a, %b
208204f65043SSimon Pilgrim  %abs = call i8 @llvm.abs.i8(i8 %sub, i1 false)
208304f65043SSimon Pilgrim  %nabs = sub i8 0, %abs
208404f65043SSimon Pilgrim  ret i8 %nabs
208504f65043SSimon Pilgrim}
208604f65043SSimon Pilgrim
208704f65043SSimon Pilgrimdefine i8 @abd_subnsw_i8_undef(i8 %a, i8 %b) nounwind {
208804f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i8_undef:
208904f65043SSimon Pilgrim; RV32I:       # %bb.0:
209004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
209104f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 24
209204f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
209304f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
209404f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
209504f65043SSimon Pilgrim; RV32I-NEXT:    ret
209604f65043SSimon Pilgrim;
209704f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i8_undef:
209804f65043SSimon Pilgrim; RV64I:       # %bb.0:
209904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
210004f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 56
210104f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
210204f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
210304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
210404f65043SSimon Pilgrim; RV64I-NEXT:    ret
210504f65043SSimon Pilgrim;
210604f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i8_undef:
210704f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
210804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
210904f65043SSimon Pilgrim; RV32ZBB-NEXT:    slli a1, a0, 24
211004f65043SSimon Pilgrim; RV32ZBB-NEXT:    srai a1, a1, 31
211104f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a0, a0, a1
211204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a1, a0
211304f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
211404f65043SSimon Pilgrim;
211504f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i8_undef:
211604f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
211704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
211804f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a1, a0, 56
211904f65043SSimon Pilgrim; RV64ZBB-NEXT:    srai a1, a1, 63
212004f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a1
212104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a1, a0
212204f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
212304f65043SSimon Pilgrim  %sub = sub nsw i8 %a, %b
212404f65043SSimon Pilgrim  %abs = call i8 @llvm.abs.i8(i8 %sub, i1 true)
212504f65043SSimon Pilgrim  %nabs = sub i8 0, %abs
212604f65043SSimon Pilgrim  ret i8 %nabs
212704f65043SSimon Pilgrim}
212804f65043SSimon Pilgrim
212904f65043SSimon Pilgrimdefine i16 @abd_subnsw_i16(i16 %a, i16 %b) nounwind {
213004f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i16:
213104f65043SSimon Pilgrim; RV32I:       # %bb.0:
213204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
213304f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 16
213404f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
213504f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
213604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
213704f65043SSimon Pilgrim; RV32I-NEXT:    ret
213804f65043SSimon Pilgrim;
213904f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i16:
214004f65043SSimon Pilgrim; RV64I:       # %bb.0:
214104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
214204f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 48
214304f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
214404f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
214504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
214604f65043SSimon Pilgrim; RV64I-NEXT:    ret
214704f65043SSimon Pilgrim;
214804f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i16:
214904f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
215004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
215104f65043SSimon Pilgrim; RV32ZBB-NEXT:    slli a1, a0, 16
215204f65043SSimon Pilgrim; RV32ZBB-NEXT:    srai a1, a1, 31
215304f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a0, a0, a1
215404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a1, a0
215504f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
215604f65043SSimon Pilgrim;
215704f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i16:
215804f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
215904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
216004f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a1, a0, 48
216104f65043SSimon Pilgrim; RV64ZBB-NEXT:    srai a1, a1, 63
216204f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a1
216304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a1, a0
216404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
216504f65043SSimon Pilgrim  %sub = sub nsw i16 %a, %b
216604f65043SSimon Pilgrim  %abs = call i16 @llvm.abs.i16(i16 %sub, i1 false)
216704f65043SSimon Pilgrim  %nabs = sub i16 0, %abs
216804f65043SSimon Pilgrim  ret i16 %nabs
216904f65043SSimon Pilgrim}
217004f65043SSimon Pilgrim
217104f65043SSimon Pilgrimdefine i16 @abd_subnsw_i16_undef(i16 %a, i16 %b) nounwind {
217204f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i16_undef:
217304f65043SSimon Pilgrim; RV32I:       # %bb.0:
217404f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
217504f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a0, 16
217604f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a1, 31
217704f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
217804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
217904f65043SSimon Pilgrim; RV32I-NEXT:    ret
218004f65043SSimon Pilgrim;
218104f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i16_undef:
218204f65043SSimon Pilgrim; RV64I:       # %bb.0:
218304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
218404f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a0, 48
218504f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a1, 63
218604f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
218704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
218804f65043SSimon Pilgrim; RV64I-NEXT:    ret
218904f65043SSimon Pilgrim;
219004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i16_undef:
219104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
219204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
219304f65043SSimon Pilgrim; RV32ZBB-NEXT:    slli a1, a0, 16
219404f65043SSimon Pilgrim; RV32ZBB-NEXT:    srai a1, a1, 31
219504f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a0, a0, a1
219604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a1, a0
219704f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
219804f65043SSimon Pilgrim;
219904f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i16_undef:
220004f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
220104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
220204f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a1, a0, 48
220304f65043SSimon Pilgrim; RV64ZBB-NEXT:    srai a1, a1, 63
220404f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a1
220504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a1, a0
220604f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
220704f65043SSimon Pilgrim  %sub = sub nsw i16 %a, %b
220804f65043SSimon Pilgrim  %abs = call i16 @llvm.abs.i16(i16 %sub, i1 true)
220904f65043SSimon Pilgrim  %nabs = sub i16 0, %abs
221004f65043SSimon Pilgrim  ret i16 %nabs
221104f65043SSimon Pilgrim}
221204f65043SSimon Pilgrim
221304f65043SSimon Pilgrimdefine i32 @abd_subnsw_i32(i32 %a, i32 %b) nounwind {
221404f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i32:
221504f65043SSimon Pilgrim; RV32I:       # %bb.0:
221604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
221704f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
221804f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
221904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
222004f65043SSimon Pilgrim; RV32I-NEXT:    ret
222104f65043SSimon Pilgrim;
222204f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i32:
222304f65043SSimon Pilgrim; RV64I:       # %bb.0:
222404f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
222504f65043SSimon Pilgrim; RV64I-NEXT:    sraiw a1, a0, 31
222604f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
222704f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a1, a0
222804f65043SSimon Pilgrim; RV64I-NEXT:    ret
222904f65043SSimon Pilgrim;
223004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i32:
223104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
223204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
223304f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
223404f65043SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
223504f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
223604f65043SSimon Pilgrim;
223704f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i32:
223804f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
223904f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
224004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sraiw a1, a0, 31
224104f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a1
224204f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a1, a0
224304f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
224404f65043SSimon Pilgrim  %sub = sub nsw i32 %a, %b
224504f65043SSimon Pilgrim  %abs = call i32 @llvm.abs.i32(i32 %sub, i1 false)
224604f65043SSimon Pilgrim  %nabs = sub i32 0, %abs
224704f65043SSimon Pilgrim  ret i32 %nabs
224804f65043SSimon Pilgrim}
224904f65043SSimon Pilgrim
225004f65043SSimon Pilgrimdefine i32 @abd_subnsw_i32_undef(i32 %a, i32 %b) nounwind {
225104f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i32_undef:
225204f65043SSimon Pilgrim; RV32I:       # %bb.0:
225304f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
225404f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
225504f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
225604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
225704f65043SSimon Pilgrim; RV32I-NEXT:    ret
225804f65043SSimon Pilgrim;
225904f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i32_undef:
226004f65043SSimon Pilgrim; RV64I:       # %bb.0:
226104f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
226204f65043SSimon Pilgrim; RV64I-NEXT:    sraiw a1, a0, 31
226304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
226404f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a1, a0
226504f65043SSimon Pilgrim; RV64I-NEXT:    ret
226604f65043SSimon Pilgrim;
226704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i32_undef:
226804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
226904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
227004f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
227104f65043SSimon Pilgrim; RV32ZBB-NEXT:    min a0, a0, a1
227204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
227304f65043SSimon Pilgrim;
227404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i32_undef:
227504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
227604f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
227704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sraiw a1, a0, 31
227804f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a1
227904f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a1, a0
228004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
228104f65043SSimon Pilgrim  %sub = sub nsw i32 %a, %b
228204f65043SSimon Pilgrim  %abs = call i32 @llvm.abs.i32(i32 %sub, i1 true)
228304f65043SSimon Pilgrim  %nabs = sub i32 0, %abs
228404f65043SSimon Pilgrim  ret i32 %nabs
228504f65043SSimon Pilgrim}
228604f65043SSimon Pilgrim
228704f65043SSimon Pilgrimdefine i64 @abd_subnsw_i64(i64 %a, i64 %b) nounwind {
228804f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i64:
228904f65043SSimon Pilgrim; RV32I:       # %bb.0:
229004f65043SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
229104f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
229204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
2293*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a4
229404f65043SSimon Pilgrim; RV32I-NEXT:    srai a2, a1, 31
229504f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a2
229604f65043SSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a2
2297*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, a2, a0
229804f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a2, a1
229904f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
230004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
230104f65043SSimon Pilgrim; RV32I-NEXT:    ret
230204f65043SSimon Pilgrim;
230304f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i64:
230404f65043SSimon Pilgrim; RV64I:       # %bb.0:
230504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
230604f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
230704f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
230804f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
230904f65043SSimon Pilgrim; RV64I-NEXT:    ret
231004f65043SSimon Pilgrim;
231104f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i64:
231204f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
231304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
231404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
231504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
2316*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a4
231704f65043SSimon Pilgrim; RV32ZBB-NEXT:    srai a2, a1, 31
231804f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a0, a0, a2
231904f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a1, a1, a2
2320*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, a2, a0
232104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a2, a1
232204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
232304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
232404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
232504f65043SSimon Pilgrim;
232604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i64:
232704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
232804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
232904f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
233004f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
233104f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
233204f65043SSimon Pilgrim  %sub = sub nsw i64 %a, %b
233304f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
233404f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
233504f65043SSimon Pilgrim  ret i64 %nabs
233604f65043SSimon Pilgrim}
233704f65043SSimon Pilgrim
233804f65043SSimon Pilgrimdefine i64 @abd_subnsw_i64_undef(i64 %a, i64 %b) nounwind {
233904f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i64_undef:
234004f65043SSimon Pilgrim; RV32I:       # %bb.0:
234104f65043SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
234204f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
234304f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
2344*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a4
234504f65043SSimon Pilgrim; RV32I-NEXT:    srai a2, a1, 31
234604f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a2
234704f65043SSimon Pilgrim; RV32I-NEXT:    xor a1, a1, a2
2348*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, a2, a0
234904f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a2, a1
235004f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
235104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
235204f65043SSimon Pilgrim; RV32I-NEXT:    ret
235304f65043SSimon Pilgrim;
235404f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i64_undef:
235504f65043SSimon Pilgrim; RV64I:       # %bb.0:
235604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
235704f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
235804f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
235904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
236004f65043SSimon Pilgrim; RV64I-NEXT:    ret
236104f65043SSimon Pilgrim;
236204f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i64_undef:
236304f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
236404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
236504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
236604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
2367*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a4
236804f65043SSimon Pilgrim; RV32ZBB-NEXT:    srai a2, a1, 31
236904f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a0, a0, a2
237004f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a1, a1, a2
2371*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, a2, a0
237204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a2, a1
237304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
237404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
237504f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
237604f65043SSimon Pilgrim;
237704f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i64_undef:
237804f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
237904f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
238004f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
238104f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
238204f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
238304f65043SSimon Pilgrim  %sub = sub nsw i64 %a, %b
238404f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
238504f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
238604f65043SSimon Pilgrim  ret i64 %nabs
238704f65043SSimon Pilgrim}
238804f65043SSimon Pilgrim
238904f65043SSimon Pilgrimdefine i128 @abd_subnsw_i128(i128 %a, i128 %b) nounwind {
239004f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i128:
239104f65043SSimon Pilgrim; RV32I:       # %bb.0:
239204f65043SSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a2)
239314c4f28eSAlex Bradbury; RV32I-NEXT:    lw a4, 4(a2)
239404f65043SSimon Pilgrim; RV32I-NEXT:    lw a5, 8(a2)
2395*9122c523SPengcheng Wang; RV32I-NEXT:    lw a6, 12(a2)
2396*9122c523SPengcheng Wang; RV32I-NEXT:    lw t0, 8(a1)
2397*9122c523SPengcheng Wang; RV32I-NEXT:    lw t1, 12(a1)
239814c4f28eSAlex Bradbury; RV32I-NEXT:    lw a2, 0(a1)
2399*9122c523SPengcheng Wang; RV32I-NEXT:    lw a7, 4(a1)
2400*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, t0, a5
2401*9122c523SPengcheng Wang; RV32I-NEXT:    sub t1, t1, a6
2402*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a2, a3
2403*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t1, a1
2404*9122c523SPengcheng Wang; RV32I-NEXT:    mv t1, a6
2405*9122c523SPengcheng Wang; RV32I-NEXT:    beq a7, a4, .LBB31_2
240604f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
2407*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a7, a4
240804f65043SSimon Pilgrim; RV32I-NEXT:  .LBB31_2:
2409*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, t0, a5
2410*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a7, a4
241114c4f28eSAlex Bradbury; RV32I-NEXT:    sub a3, a2, a3
2412*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a5, t1
2413*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, a4, a6
2414*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a5, t1
2415*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a1, a2
2416*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a5, 31
241714c4f28eSAlex Bradbury; RV32I-NEXT:    xor a2, a4, a1
2418*9122c523SPengcheng Wang; RV32I-NEXT:    xor a5, a5, a1
2419*9122c523SPengcheng Wang; RV32I-NEXT:    xor a4, a3, a1
2420*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, a1, a2
2421*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a1, a5
2422*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a1, a4
2423*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a6, a3
2424*9122c523SPengcheng Wang; RV32I-NEXT:    xor a7, t0, a1
2425*9122c523SPengcheng Wang; RV32I-NEXT:    mv a6, a5
2426*9122c523SPengcheng Wang; RV32I-NEXT:    beqz t0, .LBB31_4
242704f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
2428*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a1, a7
242904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB31_4:
243004f65043SSimon Pilgrim; RV32I-NEXT:    sub a2, a1, a2
2431*9122c523SPengcheng Wang; RV32I-NEXT:    sub a7, a1, a7
2432*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a4
2433*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a4, a2, a6
2434*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a2, a6
2435*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a7, a5
2436*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a4
243704f65043SSimon Pilgrim; RV32I-NEXT:    sw a1, 0(a0)
243804f65043SSimon Pilgrim; RV32I-NEXT:    sw a5, 4(a0)
243904f65043SSimon Pilgrim; RV32I-NEXT:    sw a2, 8(a0)
2440*9122c523SPengcheng Wang; RV32I-NEXT:    sw a3, 12(a0)
244104f65043SSimon Pilgrim; RV32I-NEXT:    ret
244204f65043SSimon Pilgrim;
244304f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i128:
244404f65043SSimon Pilgrim; RV64I:       # %bb.0:
244504f65043SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
244604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
244704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
2448*9122c523SPengcheng Wang; RV64I-NEXT:    sub a1, a1, a4
244904f65043SSimon Pilgrim; RV64I-NEXT:    srai a2, a1, 63
245004f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a2
245104f65043SSimon Pilgrim; RV64I-NEXT:    xor a1, a1, a2
2452*9122c523SPengcheng Wang; RV64I-NEXT:    sltu a3, a2, a0
245304f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a2, a1
245404f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
245504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
245604f65043SSimon Pilgrim; RV64I-NEXT:    ret
245704f65043SSimon Pilgrim;
245804f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i128:
245904f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
246004f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a2)
246114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a4, 4(a2)
246204f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a5, 8(a2)
2463*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a6, 12(a2)
2464*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t0, 8(a1)
2465*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t1, 12(a1)
246614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a2, 0(a1)
2467*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a7, 4(a1)
2468*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, t0, a5
2469*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t1, t1, a6
2470*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a2, a3
2471*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t1, a1
2472*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv t1, a6
2473*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a7, a4, .LBB31_2
247404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
2475*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a7, a4
247604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB31_2:
2477*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, t0, a5
2478*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a7, a4
247914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a3, a2, a3
2480*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a2, a5, t1
2481*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, a4, a6
2482*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a5, t1
2483*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a1, a2
2484*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srai a1, a5, 31
248514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    xor a2, a4, a1
2486*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a5, a5, a1
2487*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a4, a3, a1
2488*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, a1, a2
2489*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a1, a5
2490*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a1, a4
2491*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a6, a3
2492*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a7, t0, a1
2493*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a6, a5
2494*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beqz t0, .LBB31_4
249504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
2496*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a1, a7
249704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB31_4:
249804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a2, a1, a2
2499*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a7, a1, a7
2500*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a4
2501*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a4, a2, a6
2502*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a2, a6
2503*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a7, a5
2504*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a4
250504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a1, 0(a0)
250604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a5, 4(a0)
250704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a2, 8(a0)
2508*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a3, 12(a0)
250904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
251004f65043SSimon Pilgrim;
251104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i128:
251204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
251304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
251404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
251504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
2516*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sub a1, a1, a4
251704f65043SSimon Pilgrim; RV64ZBB-NEXT:    srai a2, a1, 63
251804f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a2
251904f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a1, a1, a2
2520*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sltu a3, a2, a0
252104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a2, a1
252204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
252304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
252404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
252504f65043SSimon Pilgrim  %sub = sub nsw i128 %a, %b
252604f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
252704f65043SSimon Pilgrim  %nabs = sub i128 0, %abs
252804f65043SSimon Pilgrim  ret i128 %nabs
252904f65043SSimon Pilgrim}
253004f65043SSimon Pilgrim
253104f65043SSimon Pilgrimdefine i128 @abd_subnsw_i128_undef(i128 %a, i128 %b) nounwind {
253204f65043SSimon Pilgrim; RV32I-LABEL: abd_subnsw_i128_undef:
253304f65043SSimon Pilgrim; RV32I:       # %bb.0:
253404f65043SSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a2)
253514c4f28eSAlex Bradbury; RV32I-NEXT:    lw a4, 4(a2)
253604f65043SSimon Pilgrim; RV32I-NEXT:    lw a5, 8(a2)
2537*9122c523SPengcheng Wang; RV32I-NEXT:    lw a6, 12(a2)
2538*9122c523SPengcheng Wang; RV32I-NEXT:    lw t0, 8(a1)
2539*9122c523SPengcheng Wang; RV32I-NEXT:    lw t1, 12(a1)
254014c4f28eSAlex Bradbury; RV32I-NEXT:    lw a2, 0(a1)
2541*9122c523SPengcheng Wang; RV32I-NEXT:    lw a7, 4(a1)
2542*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, t0, a5
2543*9122c523SPengcheng Wang; RV32I-NEXT:    sub t1, t1, a6
2544*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a2, a3
2545*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t1, a1
2546*9122c523SPengcheng Wang; RV32I-NEXT:    mv t1, a6
2547*9122c523SPengcheng Wang; RV32I-NEXT:    beq a7, a4, .LBB32_2
254804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
2549*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a7, a4
255004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB32_2:
2551*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, t0, a5
2552*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a7, a4
255314c4f28eSAlex Bradbury; RV32I-NEXT:    sub a3, a2, a3
2554*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a5, t1
2555*9122c523SPengcheng Wang; RV32I-NEXT:    sub t0, a4, a6
2556*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a5, t1
2557*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a1, a2
2558*9122c523SPengcheng Wang; RV32I-NEXT:    srai a1, a5, 31
255914c4f28eSAlex Bradbury; RV32I-NEXT:    xor a2, a4, a1
2560*9122c523SPengcheng Wang; RV32I-NEXT:    xor a5, a5, a1
2561*9122c523SPengcheng Wang; RV32I-NEXT:    xor a4, a3, a1
2562*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, a1, a2
2563*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a1, a5
2564*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, a1, a4
2565*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a6, a3
2566*9122c523SPengcheng Wang; RV32I-NEXT:    xor a7, t0, a1
2567*9122c523SPengcheng Wang; RV32I-NEXT:    mv a6, a5
2568*9122c523SPengcheng Wang; RV32I-NEXT:    beqz t0, .LBB32_4
256904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
2570*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a1, a7
257104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB32_4:
257204f65043SSimon Pilgrim; RV32I-NEXT:    sub a2, a1, a2
2573*9122c523SPengcheng Wang; RV32I-NEXT:    sub a7, a1, a7
2574*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a4
2575*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a4, a2, a6
2576*9122c523SPengcheng Wang; RV32I-NEXT:    sub a2, a2, a6
2577*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a7, a5
2578*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a4
257904f65043SSimon Pilgrim; RV32I-NEXT:    sw a1, 0(a0)
258004f65043SSimon Pilgrim; RV32I-NEXT:    sw a5, 4(a0)
258104f65043SSimon Pilgrim; RV32I-NEXT:    sw a2, 8(a0)
2582*9122c523SPengcheng Wang; RV32I-NEXT:    sw a3, 12(a0)
258304f65043SSimon Pilgrim; RV32I-NEXT:    ret
258404f65043SSimon Pilgrim;
258504f65043SSimon Pilgrim; RV64I-LABEL: abd_subnsw_i128_undef:
258604f65043SSimon Pilgrim; RV64I:       # %bb.0:
258704f65043SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
258804f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
258904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
2590*9122c523SPengcheng Wang; RV64I-NEXT:    sub a1, a1, a4
259104f65043SSimon Pilgrim; RV64I-NEXT:    srai a2, a1, 63
259204f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a2
259304f65043SSimon Pilgrim; RV64I-NEXT:    xor a1, a1, a2
2594*9122c523SPengcheng Wang; RV64I-NEXT:    sltu a3, a2, a0
259504f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a2, a1
259604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
259704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
259804f65043SSimon Pilgrim; RV64I-NEXT:    ret
259904f65043SSimon Pilgrim;
260004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_subnsw_i128_undef:
260104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
260204f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a2)
260314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a4, 4(a2)
260404f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a5, 8(a2)
2605*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a6, 12(a2)
2606*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t0, 8(a1)
2607*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t1, 12(a1)
260814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a2, 0(a1)
2609*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a7, 4(a1)
2610*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, t0, a5
2611*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t1, t1, a6
2612*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a2, a3
2613*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t1, a1
2614*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv t1, a6
2615*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a7, a4, .LBB32_2
261604f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
2617*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a7, a4
261804f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB32_2:
2619*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, t0, a5
2620*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a7, a4
262114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a3, a2, a3
2622*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a2, a5, t1
2623*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t0, a4, a6
2624*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a5, t1
2625*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a1, a2
2626*9122c523SPengcheng Wang; RV32ZBB-NEXT:    srai a1, a5, 31
262714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    xor a2, a4, a1
2628*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a5, a5, a1
2629*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a4, a3, a1
2630*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, a1, a2
2631*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a1, a5
2632*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, a1, a4
2633*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a6, a3
2634*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a7, t0, a1
2635*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a6, a5
2636*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beqz t0, .LBB32_4
263704f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
2638*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a1, a7
263904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB32_4:
264004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a2, a1, a2
2641*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a7, a1, a7
2642*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a4
2643*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a4, a2, a6
2644*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a2, a2, a6
2645*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a7, a5
2646*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a4
264704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a1, 0(a0)
264804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a5, 4(a0)
264904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a2, 8(a0)
2650*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a3, 12(a0)
265104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
265204f65043SSimon Pilgrim;
265304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_subnsw_i128_undef:
265404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
265504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
265604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
265704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
2658*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sub a1, a1, a4
265904f65043SSimon Pilgrim; RV64ZBB-NEXT:    srai a2, a1, 63
266004f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a0, a0, a2
266104f65043SSimon Pilgrim; RV64ZBB-NEXT:    xor a1, a1, a2
2662*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sltu a3, a2, a0
266304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a2, a1
266404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
266504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
266604f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
266704f65043SSimon Pilgrim  %sub = sub nsw i128 %a, %b
266804f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
266904f65043SSimon Pilgrim  %nabs = sub i128 0, %abs
267004f65043SSimon Pilgrim  ret i128 %nabs
267104f65043SSimon Pilgrim}
267204f65043SSimon Pilgrim
267304f65043SSimon Pilgrimdeclare i8 @llvm.abs.i8(i8, i1)
267404f65043SSimon Pilgrimdeclare i16 @llvm.abs.i16(i16, i1)
267504f65043SSimon Pilgrimdeclare i32 @llvm.abs.i32(i32, i1)
267604f65043SSimon Pilgrimdeclare i64 @llvm.abs.i64(i64, i1)
267704f65043SSimon Pilgrimdeclare i128 @llvm.abs.i128(i128, i1)
267804f65043SSimon Pilgrim
267904f65043SSimon Pilgrimdeclare i8 @llvm.smax.i8(i8, i8)
268004f65043SSimon Pilgrimdeclare i16 @llvm.smax.i16(i16, i16)
268104f65043SSimon Pilgrimdeclare i32 @llvm.smax.i32(i32, i32)
268204f65043SSimon Pilgrimdeclare i64 @llvm.smax.i64(i64, i64)
268304f65043SSimon Pilgrim
268404f65043SSimon Pilgrimdeclare i8 @llvm.smin.i8(i8, i8)
268504f65043SSimon Pilgrimdeclare i16 @llvm.smin.i16(i16, i16)
268604f65043SSimon Pilgrimdeclare i32 @llvm.smin.i32(i32, i32)
268704f65043SSimon Pilgrimdeclare i64 @llvm.smin.i64(i64, i64)
2688