xref: /llvm-project/llvm/test/CodeGen/RISCV/abdu-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=NOZBB,RV32I
304f65043SSimon Pilgrim; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefixes=NOZBB,RV64I
404f65043SSimon Pilgrim; RUN: llc < %s -mtriple=riscv32 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV32ZBB
504f65043SSimon Pilgrim; RUN: llc < %s -mtriple=riscv64 -mattr=+zbb | FileCheck %s --check-prefixes=ZBB,RV64ZBB
604f65043SSimon Pilgrim
704f65043SSimon Pilgrim;
804f65043SSimon Pilgrim; trunc(nabs(sub(zext(a),zext(b)))) -> nabds(a,b)
904f65043SSimon Pilgrim;
1004f65043SSimon Pilgrim
1104f65043SSimon Pilgrimdefine i8 @abd_ext_i8(i8 %a, i8 %b) nounwind {
1204f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8:
1304f65043SSimon Pilgrim; RV32I:       # %bb.0:
14e4e96b3eSSimon Pilgrim; RV32I-NEXT:    andi a1, a1, 255
1513d04fa5SSimon Pilgrim; RV32I-NEXT:    andi a0, a0, 255
1604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
1704f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
1804f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
1904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
2004f65043SSimon Pilgrim; RV32I-NEXT:    ret
2104f65043SSimon Pilgrim;
2204f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8:
2304f65043SSimon Pilgrim; RV64I:       # %bb.0:
2404f65043SSimon Pilgrim; RV64I-NEXT:    andi a0, a0, 255
2504f65043SSimon Pilgrim; RV64I-NEXT:    andi a1, a1, 255
2604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
2704f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
2804f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
2904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
3004f65043SSimon Pilgrim; RV64I-NEXT:    ret
3104f65043SSimon Pilgrim;
3213d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i8:
3313d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
3413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    andi a1, a1, 255
3513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    andi a0, a0, 255
3613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
3713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
3813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
3913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
4013d04fa5SSimon Pilgrim;
4113d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i8:
4213d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
4313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    andi a0, a0, 255
4413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    andi a1, a1, 255
4513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
4613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
4713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
4813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
4904f65043SSimon Pilgrim  %aext = zext i8 %a to i64
5004f65043SSimon Pilgrim  %bext = zext i8 %b to i64
5104f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
5204f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
5304f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
5404f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i8
5504f65043SSimon Pilgrim  ret i8 %trunc
5604f65043SSimon Pilgrim}
5704f65043SSimon Pilgrim
5804f65043SSimon Pilgrimdefine i8 @abd_ext_i8_i16(i8 %a, i16 %b) nounwind {
5904f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8_i16:
6004f65043SSimon Pilgrim; RV32I:       # %bb.0:
6104f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
6204f65043SSimon Pilgrim; RV32I-NEXT:    srli a1, a1, 16
6313d04fa5SSimon Pilgrim; RV32I-NEXT:    andi a0, a0, 255
6404f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
6504f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
6604f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
6704f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
6804f65043SSimon Pilgrim; RV32I-NEXT:    ret
6904f65043SSimon Pilgrim;
7004f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8_i16:
7104f65043SSimon Pilgrim; RV64I:       # %bb.0:
7204f65043SSimon Pilgrim; RV64I-NEXT:    andi a0, a0, 255
7304f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
7404f65043SSimon Pilgrim; RV64I-NEXT:    srli a1, a1, 48
7504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
7604f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
7704f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
7804f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
7904f65043SSimon Pilgrim; RV64I-NEXT:    ret
8004f65043SSimon Pilgrim;
8113d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i8_i16:
8213d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
8313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    zext.h a1, a1
8413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    andi a0, a0, 255
8513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
8613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
8713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
8813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
8913d04fa5SSimon Pilgrim;
9013d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i8_i16:
9113d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
9213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    andi a0, a0, 255
9313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    zext.h a1, a1
9413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
9513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
9613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
9713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
9804f65043SSimon Pilgrim  %aext = zext i8 %a to i64
9904f65043SSimon Pilgrim  %bext = zext i16 %b to i64
10004f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
10104f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
10204f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
10304f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i8
10404f65043SSimon Pilgrim  ret i8 %trunc
10504f65043SSimon Pilgrim}
10604f65043SSimon Pilgrim
10704f65043SSimon Pilgrimdefine i8 @abd_ext_i8_undef(i8 %a, i8 %b) nounwind {
10804f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i8_undef:
10904f65043SSimon Pilgrim; RV32I:       # %bb.0:
110e4e96b3eSSimon Pilgrim; RV32I-NEXT:    andi a1, a1, 255
11113d04fa5SSimon Pilgrim; RV32I-NEXT:    andi a0, a0, 255
11204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
11304f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
11404f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
11504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
11604f65043SSimon Pilgrim; RV32I-NEXT:    ret
11704f65043SSimon Pilgrim;
11804f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i8_undef:
11904f65043SSimon Pilgrim; RV64I:       # %bb.0:
12004f65043SSimon Pilgrim; RV64I-NEXT:    andi a0, a0, 255
12104f65043SSimon Pilgrim; RV64I-NEXT:    andi a1, a1, 255
12204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
12304f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
12404f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
12504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
12604f65043SSimon Pilgrim; RV64I-NEXT:    ret
12704f65043SSimon Pilgrim;
12813d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i8_undef:
12913d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
13013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    andi a1, a1, 255
13113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    andi a0, a0, 255
13213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
13313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
13413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
13513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
13613d04fa5SSimon Pilgrim;
13713d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i8_undef:
13813d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
13913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    andi a0, a0, 255
14013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    andi a1, a1, 255
14113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
14213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
14313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
14413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
14504f65043SSimon Pilgrim  %aext = zext i8 %a to i64
14604f65043SSimon Pilgrim  %bext = zext i8 %b to i64
14704f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
14804f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
14904f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
15004f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i8
15104f65043SSimon Pilgrim  ret i8 %trunc
15204f65043SSimon Pilgrim}
15304f65043SSimon Pilgrim
15404f65043SSimon Pilgrimdefine i16 @abd_ext_i16(i16 %a, i16 %b) nounwind {
15504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16:
15604f65043SSimon Pilgrim; RV32I:       # %bb.0:
15704f65043SSimon Pilgrim; RV32I-NEXT:    lui a2, 16
15804f65043SSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
159e4e96b3eSSimon Pilgrim; RV32I-NEXT:    and a1, a1, a2
16013d04fa5SSimon Pilgrim; RV32I-NEXT:    and a0, a0, a2
16104f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
16204f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
16304f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
16404f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
16504f65043SSimon Pilgrim; RV32I-NEXT:    ret
16604f65043SSimon Pilgrim;
16704f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16:
16804f65043SSimon Pilgrim; RV64I:       # %bb.0:
16904f65043SSimon Pilgrim; RV64I-NEXT:    lui a2, 16
17004f65043SSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
17104f65043SSimon Pilgrim; RV64I-NEXT:    and a0, a0, a2
17204f65043SSimon Pilgrim; RV64I-NEXT:    and a1, a1, a2
17304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
17404f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
17504f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
17604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
17704f65043SSimon Pilgrim; RV64I-NEXT:    ret
17804f65043SSimon Pilgrim;
17913d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i16:
18013d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
18113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    zext.h a1, a1
18213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    zext.h a0, a0
18313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
18413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
18513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
18613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
18713d04fa5SSimon Pilgrim;
18813d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i16:
18913d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
19013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    zext.h a0, a0
19113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    zext.h a1, a1
19213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
19313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
19413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
19513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
19604f65043SSimon Pilgrim  %aext = zext i16 %a to i64
19704f65043SSimon Pilgrim  %bext = zext i16 %b to i64
19804f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
19904f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
20004f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
20104f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i16
20204f65043SSimon Pilgrim  ret i16 %trunc
20304f65043SSimon Pilgrim}
20404f65043SSimon Pilgrim
20504f65043SSimon Pilgrimdefine i16 @abd_ext_i16_i32(i16 %a, i32 %b) nounwind {
20604f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16_i32:
20704f65043SSimon Pilgrim; RV32I:       # %bb.0:
20804f65043SSimon Pilgrim; RV32I-NEXT:    slli a0, a0, 16
20904f65043SSimon Pilgrim; RV32I-NEXT:    srli a0, a0, 16
21013d04fa5SSimon Pilgrim; RV32I-NEXT:    bltu a1, a0, .LBB4_2
211e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
21213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
213e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
21413d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
215e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB4_2:
21613d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
21704f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
21804f65043SSimon Pilgrim; RV32I-NEXT:    ret
21904f65043SSimon Pilgrim;
22004f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16_i32:
22104f65043SSimon Pilgrim; RV64I:       # %bb.0:
22204f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 48
22304f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 32
224*9122c523SPengcheng Wang; RV64I-NEXT:    srli a0, a0, 48
22504f65043SSimon Pilgrim; RV64I-NEXT:    srli a1, a1, 32
22604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
22704f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
22804f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
22904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
23004f65043SSimon Pilgrim; RV64I-NEXT:    ret
23104f65043SSimon Pilgrim;
23204f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i16_i32:
23304f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
23404f65043SSimon Pilgrim; RV32ZBB-NEXT:    zext.h a0, a0
23513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
23613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
23713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
23804f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
23904f65043SSimon Pilgrim;
24004f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i16_i32:
24104f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
24204f65043SSimon Pilgrim; RV64ZBB-NEXT:    zext.h a0, a0
24304f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a1, a1, 32
24404f65043SSimon Pilgrim; RV64ZBB-NEXT:    srli a1, a1, 32
24504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
24604f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
24704f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
24804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
24904f65043SSimon Pilgrim  %aext = zext i16 %a to i64
25004f65043SSimon Pilgrim  %bext = zext i32 %b to i64
25104f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
25204f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
25304f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
25404f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i16
25504f65043SSimon Pilgrim  ret i16 %trunc
25604f65043SSimon Pilgrim}
25704f65043SSimon Pilgrim
25804f65043SSimon Pilgrimdefine i16 @abd_ext_i16_undef(i16 %a, i16 %b) nounwind {
25904f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i16_undef:
26004f65043SSimon Pilgrim; RV32I:       # %bb.0:
26104f65043SSimon Pilgrim; RV32I-NEXT:    lui a2, 16
26204f65043SSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
263e4e96b3eSSimon Pilgrim; RV32I-NEXT:    and a1, a1, a2
26413d04fa5SSimon Pilgrim; RV32I-NEXT:    and a0, a0, a2
26504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
26604f65043SSimon Pilgrim; RV32I-NEXT:    srai a1, a0, 31
26704f65043SSimon Pilgrim; RV32I-NEXT:    xor a0, a0, a1
26804f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
26904f65043SSimon Pilgrim; RV32I-NEXT:    ret
27004f65043SSimon Pilgrim;
27104f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i16_undef:
27204f65043SSimon Pilgrim; RV64I:       # %bb.0:
27304f65043SSimon Pilgrim; RV64I-NEXT:    lui a2, 16
27404f65043SSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
27504f65043SSimon Pilgrim; RV64I-NEXT:    and a0, a0, a2
27604f65043SSimon Pilgrim; RV64I-NEXT:    and a1, a1, a2
27704f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
27804f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
27904f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
28004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
28104f65043SSimon Pilgrim; RV64I-NEXT:    ret
28204f65043SSimon Pilgrim;
28313d04fa5SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i16_undef:
28413d04fa5SSimon Pilgrim; RV32ZBB:       # %bb.0:
28513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    zext.h a1, a1
28613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    zext.h a0, a0
28713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
28813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
28913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
29013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    ret
29113d04fa5SSimon Pilgrim;
29213d04fa5SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i16_undef:
29313d04fa5SSimon Pilgrim; RV64ZBB:       # %bb.0:
29413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    zext.h a0, a0
29513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    zext.h a1, a1
29613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
29713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
29813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
29913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    ret
30004f65043SSimon Pilgrim  %aext = zext i16 %a to i64
30104f65043SSimon Pilgrim  %bext = zext i16 %b to i64
30204f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
30304f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
30404f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
30504f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i16
30604f65043SSimon Pilgrim  ret i16 %trunc
30704f65043SSimon Pilgrim}
30804f65043SSimon Pilgrim
30904f65043SSimon Pilgrimdefine i32 @abd_ext_i32(i32 %a, i32 %b) nounwind {
31004f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32:
31104f65043SSimon Pilgrim; RV32I:       # %bb.0:
31213d04fa5SSimon Pilgrim; RV32I-NEXT:    bltu a1, a0, .LBB6_2
313e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
31413d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
315e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
31613d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
317e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB6_2:
31813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
31904f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
32004f65043SSimon Pilgrim; RV32I-NEXT:    ret
32104f65043SSimon Pilgrim;
32204f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32:
32304f65043SSimon Pilgrim; RV64I:       # %bb.0:
32404f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 32
32504f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 32
326*9122c523SPengcheng Wang; RV64I-NEXT:    srli a0, a0, 32
32704f65043SSimon Pilgrim; RV64I-NEXT:    srli a1, a1, 32
32804f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
32904f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
33004f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
33104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
33204f65043SSimon Pilgrim; RV64I-NEXT:    ret
33304f65043SSimon Pilgrim;
33404f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32:
33504f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
33613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
33713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
33813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
33904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
34004f65043SSimon Pilgrim;
34104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32:
34204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
34304f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a0, a0, 32
34404f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a1, a1, 32
345*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a0, a0, 32
34604f65043SSimon Pilgrim; RV64ZBB-NEXT:    srli a1, a1, 32
34704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
34804f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
34904f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
35004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
35104f65043SSimon Pilgrim  %aext = zext i32 %a to i64
35204f65043SSimon Pilgrim  %bext = zext i32 %b to i64
35304f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
35404f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
35504f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
35604f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i32
35704f65043SSimon Pilgrim  ret i32 %trunc
35804f65043SSimon Pilgrim}
35904f65043SSimon Pilgrim
36004f65043SSimon Pilgrimdefine i32 @abd_ext_i32_i16(i32 %a, i16 %b) nounwind {
36104f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32_i16:
36204f65043SSimon Pilgrim; RV32I:       # %bb.0:
36304f65043SSimon Pilgrim; RV32I-NEXT:    slli a1, a1, 16
36404f65043SSimon Pilgrim; RV32I-NEXT:    srli a1, a1, 16
36513d04fa5SSimon Pilgrim; RV32I-NEXT:    bltu a1, a0, .LBB7_2
366e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
36713d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
368e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
36913d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
370e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB7_2:
37113d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
37204f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
37304f65043SSimon Pilgrim; RV32I-NEXT:    ret
37404f65043SSimon Pilgrim;
37504f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32_i16:
37604f65043SSimon Pilgrim; RV64I:       # %bb.0:
37704f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 32
37804f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 48
379*9122c523SPengcheng Wang; RV64I-NEXT:    srli a0, a0, 32
38004f65043SSimon Pilgrim; RV64I-NEXT:    srli a1, a1, 48
38104f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
38204f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
38304f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
38404f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
38504f65043SSimon Pilgrim; RV64I-NEXT:    ret
38604f65043SSimon Pilgrim;
38704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32_i16:
38804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
38904f65043SSimon Pilgrim; RV32ZBB-NEXT:    zext.h a1, a1
39013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
39113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
39213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
39304f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
39404f65043SSimon Pilgrim;
39504f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32_i16:
39604f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
39704f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a0, a0, 32
39804f65043SSimon Pilgrim; RV64ZBB-NEXT:    srli a0, a0, 32
39904f65043SSimon Pilgrim; RV64ZBB-NEXT:    zext.h a1, a1
40004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
40104f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
40204f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
40304f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
40404f65043SSimon Pilgrim  %aext = zext i32 %a to i64
40504f65043SSimon Pilgrim  %bext = zext i16 %b to i64
40604f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
40704f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 false)
40804f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
40904f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i32
41004f65043SSimon Pilgrim  ret i32 %trunc
41104f65043SSimon Pilgrim}
41204f65043SSimon Pilgrim
41304f65043SSimon Pilgrimdefine i32 @abd_ext_i32_undef(i32 %a, i32 %b) nounwind {
41404f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i32_undef:
41504f65043SSimon Pilgrim; RV32I:       # %bb.0:
41613d04fa5SSimon Pilgrim; RV32I-NEXT:    bltu a1, a0, .LBB8_2
417e4e96b3eSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
41813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
419e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a0, a0
42013d04fa5SSimon Pilgrim; RV32I-NEXT:    ret
421e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB8_2:
42213d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
42304f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
42404f65043SSimon Pilgrim; RV32I-NEXT:    ret
42504f65043SSimon Pilgrim;
42604f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i32_undef:
42704f65043SSimon Pilgrim; RV64I:       # %bb.0:
42804f65043SSimon Pilgrim; RV64I-NEXT:    slli a0, a0, 32
42904f65043SSimon Pilgrim; RV64I-NEXT:    slli a1, a1, 32
430*9122c523SPengcheng Wang; RV64I-NEXT:    srli a0, a0, 32
43104f65043SSimon Pilgrim; RV64I-NEXT:    srli a1, a1, 32
43204f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
43304f65043SSimon Pilgrim; RV64I-NEXT:    srai a1, a0, 63
43404f65043SSimon Pilgrim; RV64I-NEXT:    xor a0, a0, a1
43504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
43604f65043SSimon Pilgrim; RV64I-NEXT:    ret
43704f65043SSimon Pilgrim;
43804f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i32_undef:
43904f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
44013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    maxu a2, a0, a1
44113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    minu a0, a0, a1
44213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
44304f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
44404f65043SSimon Pilgrim;
44504f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i32_undef:
44604f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
44704f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a0, a0, 32
44804f65043SSimon Pilgrim; RV64ZBB-NEXT:    slli a1, a1, 32
449*9122c523SPengcheng Wang; RV64ZBB-NEXT:    srli a0, a0, 32
45004f65043SSimon Pilgrim; RV64ZBB-NEXT:    srli a1, a1, 32
45104f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
45204f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
45304f65043SSimon Pilgrim; RV64ZBB-NEXT:    min a0, a0, a1
45404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
45504f65043SSimon Pilgrim  %aext = zext i32 %a to i64
45604f65043SSimon Pilgrim  %bext = zext i32 %b to i64
45704f65043SSimon Pilgrim  %sub = sub i64 %aext, %bext
45804f65043SSimon Pilgrim  %abs = call i64 @llvm.abs.i64(i64 %sub, i1 true)
45904f65043SSimon Pilgrim  %nabs = sub i64 0, %abs
46004f65043SSimon Pilgrim  %trunc = trunc i64 %nabs to i32
46104f65043SSimon Pilgrim  ret i32 %trunc
46204f65043SSimon Pilgrim}
46304f65043SSimon Pilgrim
46404f65043SSimon Pilgrimdefine i64 @abd_ext_i64(i64 %a, i64 %b) nounwind {
46504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i64:
46604f65043SSimon Pilgrim; RV32I:       # %bb.0:
46704f65043SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
46813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a1, a3
46913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a3, a4
47013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a2, a0, a2
47113d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a3, a1, .LBB9_2
47204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
47313d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a0, a1, a3
47413d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB9_3
47504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB9_2:
47613d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a0, a0, a2
47713d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB9_3:
47813d04fa5SSimon Pilgrim; RV32I-NEXT:    neg a1, a0
47913d04fa5SSimon Pilgrim; RV32I-NEXT:    xor a2, a2, a1
480*9122c523SPengcheng Wang; RV32I-NEXT:    xor a3, a3, a1
481*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a2, a1
482*9122c523SPengcheng Wang; RV32I-NEXT:    add a3, a3, a0
48313d04fa5SSimon Pilgrim; RV32I-NEXT:    add a0, a2, a0
484*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a1
485*9122c523SPengcheng Wang; RV32I-NEXT:    snez a1, a0
486*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a3, a1
48704f65043SSimon Pilgrim; RV32I-NEXT:    neg a1, a1
48804f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
48904f65043SSimon Pilgrim; RV32I-NEXT:    ret
49004f65043SSimon Pilgrim;
49104f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i64:
49204f65043SSimon Pilgrim; RV64I:       # %bb.0:
49313d04fa5SSimon Pilgrim; RV64I-NEXT:    bltu a1, a0, .LBB9_2
494e4e96b3eSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
49513d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
496e4e96b3eSSimon Pilgrim; RV64I-NEXT:    neg a0, a0
49713d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
498e4e96b3eSSimon Pilgrim; RV64I-NEXT:  .LBB9_2:
49913d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
50004f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
50104f65043SSimon Pilgrim; RV64I-NEXT:    ret
50204f65043SSimon Pilgrim;
50304f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i64:
50404f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
50504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
50613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a1, a3
50713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a3, a4
50813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a2, a0, a2
50913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a3, a1, .LBB9_2
51004f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
51113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a0, a1, a3
51213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB9_3
51304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB9_2:
51413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a0, a0, a2
51513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB9_3:
51613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
51713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor a2, a2, a1
518*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a3, a3, a1
519*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a2, a1
520*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a3, a3, a0
52113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    add a0, a2, a0
522*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a1
523*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a1, a0
524*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a1, a3, a1
52504f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
52604f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a0, a0
52704f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
52804f65043SSimon Pilgrim;
52904f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i64:
53004f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
53113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    maxu a2, a0, a1
53213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    minu a0, a0, a1
53313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
53404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
53504f65043SSimon Pilgrim  %aext = zext i64 %a to i128
53604f65043SSimon Pilgrim  %bext = zext i64 %b to i128
53704f65043SSimon Pilgrim  %sub = sub i128 %aext, %bext
53804f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 false)
53904f65043SSimon Pilgrim  %nabs = sub i128 0, %abs
54004f65043SSimon Pilgrim  %trunc = trunc i128 %nabs to i64
54104f65043SSimon Pilgrim  ret i64 %trunc
54204f65043SSimon Pilgrim}
54304f65043SSimon Pilgrim
54404f65043SSimon Pilgrimdefine i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {
54504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i64_undef:
54604f65043SSimon Pilgrim; RV32I:       # %bb.0:
54704f65043SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
54813d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a1, a3
54913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a3, a3, a4
55013d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a2, a0, a2
55113d04fa5SSimon Pilgrim; RV32I-NEXT:    beq a3, a1, .LBB10_2
55204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
55313d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a0, a1, a3
55413d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB10_3
55504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB10_2:
55613d04fa5SSimon Pilgrim; RV32I-NEXT:    sltu a0, a0, a2
55713d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB10_3:
55813d04fa5SSimon Pilgrim; RV32I-NEXT:    neg a1, a0
55913d04fa5SSimon Pilgrim; RV32I-NEXT:    xor a2, a2, a1
560*9122c523SPengcheng Wang; RV32I-NEXT:    xor a3, a3, a1
561*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a2, a1
562*9122c523SPengcheng Wang; RV32I-NEXT:    add a3, a3, a0
56313d04fa5SSimon Pilgrim; RV32I-NEXT:    add a0, a2, a0
564*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a1
565*9122c523SPengcheng Wang; RV32I-NEXT:    snez a1, a0
566*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a3, a1
56704f65043SSimon Pilgrim; RV32I-NEXT:    neg a1, a1
56804f65043SSimon Pilgrim; RV32I-NEXT:    neg a0, a0
56904f65043SSimon Pilgrim; RV32I-NEXT:    ret
57004f65043SSimon Pilgrim;
57104f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i64_undef:
57204f65043SSimon Pilgrim; RV64I:       # %bb.0:
57313d04fa5SSimon Pilgrim; RV64I-NEXT:    bltu a1, a0, .LBB10_2
574e4e96b3eSSimon Pilgrim; RV64I-NEXT:  # %bb.1:
57513d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
576e4e96b3eSSimon Pilgrim; RV64I-NEXT:    neg a0, a0
57713d04fa5SSimon Pilgrim; RV64I-NEXT:    ret
578e4e96b3eSSimon Pilgrim; RV64I-NEXT:  .LBB10_2:
57913d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
58004f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
58104f65043SSimon Pilgrim; RV64I-NEXT:    ret
58204f65043SSimon Pilgrim;
58304f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i64_undef:
58404f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
58504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
58613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a1, a3
58713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, a3, a4
58813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a2, a0, a2
58913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    beq a3, a1, .LBB10_2
59004f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
59113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a0, a1, a3
59213d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB10_3
59304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB10_2:
59413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sltu a0, a0, a2
59513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB10_3:
59613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a0
59713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    xor a2, a2, a1
598*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a3, a3, a1
599*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a2, a1
600*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a3, a3, a0
60113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    add a0, a2, a0
602*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a1
603*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a1, a0
604*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a1, a3, a1
60504f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
60604f65043SSimon Pilgrim; RV32ZBB-NEXT:    neg a0, a0
60704f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
60804f65043SSimon Pilgrim;
60904f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i64_undef:
61004f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
61113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    maxu a2, a0, a1
61213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    minu a0, a0, a1
61313d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
61404f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
61504f65043SSimon Pilgrim  %aext = zext i64 %a to i128
61604f65043SSimon Pilgrim  %bext = zext i64 %b to i128
61704f65043SSimon Pilgrim  %sub = sub i128 %aext, %bext
61804f65043SSimon Pilgrim  %abs = call i128 @llvm.abs.i128(i128 %sub, i1 true)
61904f65043SSimon Pilgrim  %nabs = sub i128 0, %abs
62004f65043SSimon Pilgrim  %trunc = trunc i128 %nabs to i64
62104f65043SSimon Pilgrim  ret i64 %trunc
62204f65043SSimon Pilgrim}
62304f65043SSimon Pilgrim
62404f65043SSimon Pilgrimdefine i128 @abd_ext_i128(i128 %a, i128 %b) nounwind {
62504f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i128:
62604f65043SSimon Pilgrim; RV32I:       # %bb.0:
627*9122c523SPengcheng Wang; RV32I-NEXT:    lw a5, 0(a2)
628*9122c523SPengcheng Wang; RV32I-NEXT:    lw a7, 4(a2)
629*9122c523SPengcheng Wang; RV32I-NEXT:    lw a3, 8(a2)
630*9122c523SPengcheng Wang; RV32I-NEXT:    lw t1, 12(a2)
631*9122c523SPengcheng Wang; RV32I-NEXT:    lw a4, 8(a1)
632*9122c523SPengcheng Wang; RV32I-NEXT:    lw a6, 12(a1)
633*9122c523SPengcheng Wang; RV32I-NEXT:    lw a2, 0(a1)
63413d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t0, 4(a1)
635*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a4, a3
636*9122c523SPengcheng Wang; RV32I-NEXT:    sub t1, a6, t1
637*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t2, a2, a5
638*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t1, a1
639*9122c523SPengcheng Wang; RV32I-NEXT:    mv t1, t2
640*9122c523SPengcheng Wang; RV32I-NEXT:    beq t0, a7, .LBB11_2
64104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
642*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, t0, a7
64304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_2:
644*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a4, a3
645*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t3, a3, t1
64613d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, t3
647*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, t1
648*9122c523SPengcheng Wang; RV32I-NEXT:    beq a1, a6, .LBB11_4
64904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
650*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a6, a1
65113d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB11_5
65204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB11_4:
653*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a4, a3
65413d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_5:
655*9122c523SPengcheng Wang; RV32I-NEXT:    sub a7, t0, a7
656*9122c523SPengcheng Wang; RV32I-NEXT:    sub a7, a7, t2
657*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a2, a5
658*9122c523SPengcheng Wang; RV32I-NEXT:    beq a7, t0, .LBB11_7
65913d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.6:
660*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, t0, a7
66113d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB11_8
66213d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_7:
663*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a2, a5
664e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB11_8:
665*9122c523SPengcheng Wang; RV32I-NEXT:    xor a6, a1, a6
666*9122c523SPengcheng Wang; RV32I-NEXT:    xor a4, a3, a4
667*9122c523SPengcheng Wang; RV32I-NEXT:    or a4, a4, a6
668*9122c523SPengcheng Wang; RV32I-NEXT:    beqz a4, .LBB11_10
66913d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
670*9122c523SPengcheng Wang; RV32I-NEXT:    mv a2, t1
67113d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_10:
672*9122c523SPengcheng Wang; RV32I-NEXT:    neg a4, a2
673*9122c523SPengcheng Wang; RV32I-NEXT:    xor t0, a5, a4
674*9122c523SPengcheng Wang; RV32I-NEXT:    xor t3, a7, a4
675*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, t0, a4
676*9122c523SPengcheng Wang; RV32I-NEXT:    add a6, t3, a2
677*9122c523SPengcheng Wang; RV32I-NEXT:    add t0, t0, a2
678*9122c523SPengcheng Wang; RV32I-NEXT:    sub t1, a6, a5
679*9122c523SPengcheng Wang; RV32I-NEXT:    snez a6, t1
680*9122c523SPengcheng Wang; RV32I-NEXT:    snez t2, t0
681*9122c523SPengcheng Wang; RV32I-NEXT:    or a6, t2, a6
682*9122c523SPengcheng Wang; RV32I-NEXT:    beqz a7, .LBB11_12
68313d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
684*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, t3, a4
68513d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB11_12:
686*9122c523SPengcheng Wang; RV32I-NEXT:    xor a3, a3, a4
687*9122c523SPengcheng Wang; RV32I-NEXT:    xor a1, a1, a4
688*9122c523SPengcheng Wang; RV32I-NEXT:    add t1, t1, t2
689*9122c523SPengcheng Wang; RV32I-NEXT:    neg a7, t0
690*9122c523SPengcheng Wang; RV32I-NEXT:    add t0, a3, a2
691*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, a3, a4
69213d04fa5SSimon Pilgrim; RV32I-NEXT:    add a1, a1, a2
693*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, t1
694*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, t0, a5
695*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a3
696*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, t0, a5
697*9122c523SPengcheng Wang; RV32I-NEXT:    neg a5, a4
698*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a3
699*9122c523SPengcheng Wang; RV32I-NEXT:    snez a3, a4
700*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a4, a5, a6
701*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a1, a3
702*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a5, a6
703e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a1, a1
704*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a4
705*9122c523SPengcheng Wang; RV32I-NEXT:    sw a7, 0(a0)
706*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 4(a0)
707*9122c523SPengcheng Wang; RV32I-NEXT:    sw a3, 8(a0)
70813d04fa5SSimon Pilgrim; RV32I-NEXT:    sw a1, 12(a0)
70904f65043SSimon Pilgrim; RV32I-NEXT:    ret
71004f65043SSimon Pilgrim;
71104f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i128:
71204f65043SSimon Pilgrim; RV64I:       # %bb.0:
71304f65043SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
71413d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a3, a1, a3
71513d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a3, a3, a4
71613d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a2, a0, a2
71713d04fa5SSimon Pilgrim; RV64I-NEXT:    beq a3, a1, .LBB11_2
71804f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
71913d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a0, a1, a3
72013d04fa5SSimon Pilgrim; RV64I-NEXT:    j .LBB11_3
72104f65043SSimon Pilgrim; RV64I-NEXT:  .LBB11_2:
72213d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a0, a0, a2
72313d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB11_3:
72413d04fa5SSimon Pilgrim; RV64I-NEXT:    neg a1, a0
72513d04fa5SSimon Pilgrim; RV64I-NEXT:    xor a2, a2, a1
726*9122c523SPengcheng Wang; RV64I-NEXT:    xor a3, a3, a1
727*9122c523SPengcheng Wang; RV64I-NEXT:    sltu a1, a2, a1
728*9122c523SPengcheng Wang; RV64I-NEXT:    add a3, a3, a0
72913d04fa5SSimon Pilgrim; RV64I-NEXT:    add a0, a2, a0
730*9122c523SPengcheng Wang; RV64I-NEXT:    sub a3, a3, a1
731*9122c523SPengcheng Wang; RV64I-NEXT:    snez a1, a0
732*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a3, a1
73304f65043SSimon Pilgrim; RV64I-NEXT:    neg a1, a1
73404f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
73504f65043SSimon Pilgrim; RV64I-NEXT:    ret
73604f65043SSimon Pilgrim;
73704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i128:
73804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
739*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a5, 0(a2)
740*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a7, 4(a2)
741*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a3, 8(a2)
742*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t1, 12(a2)
743*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a4, 8(a1)
744*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a6, 12(a1)
745*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a2, 0(a1)
74613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 4(a1)
747*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a4, a3
748*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t1, a6, t1
749*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t2, a2, a5
750*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t1, a1
751*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv t1, t2
752*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq t0, a7, .LBB11_2
75304f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
754*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, t0, a7
75504f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_2:
756*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a4, a3
757*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t3, a3, t1
75813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, t3
759*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, t1
760*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a1, a6, .LBB11_4
76104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
762*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a6, a1
76313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB11_5
76404f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_4:
765*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a4, a3
76613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_5:
767*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a7, t0, a7
768*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a7, a7, t2
769*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a2, a5
770*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a7, t0, .LBB11_7
77113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.6:
772*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a2, t0, a7
77313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB11_8
77413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_7:
775*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a2, a2, a5
776e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_8:
777*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a6, a1, a6
778*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a4, a3, a4
779*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a4, a4, a6
780*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beqz a4, .LBB11_10
78113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
782*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a2, t1
78313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_10:
784*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a4, a2
785*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor t0, a5, a4
786*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor t3, a7, a4
787*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, t0, a4
788*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a6, t3, a2
789*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t0, t0, a2
790*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t1, a6, a5
791*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a6, t1
792*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez t2, t0
793*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a6, t2, a6
794*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beqz a7, .LBB11_12
79513d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
796*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, t3, a4
79713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB11_12:
798*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a3, a3, a4
799*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a1, a1, a4
800*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t1, t1, t2
801*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a7, t0
802*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t0, a3, a2
803*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, a3, a4
80413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    add a1, a1, a2
805*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a2, t1
806*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, t0, a5
807*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a3
808*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, t0, a5
809*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a5, a4
810*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a3
811*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a3, a4
812*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a4, a5, a6
813*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a1, a1, a3
814*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a5, a6
815e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
816*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a4
817*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a7, 0(a0)
818*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 4(a0)
819*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a3, 8(a0)
82013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sw a1, 12(a0)
82104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
82204f65043SSimon Pilgrim;
82304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i128:
82404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
82504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
82613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a3, a1, a3
82713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a3, a3, a4
82813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a2, a0, a2
82913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    beq a3, a1, .LBB11_2
83004f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
83113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a0, a1, a3
83213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB11_3
83304f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB11_2:
83413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a0, a0, a2
83513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB11_3:
83613d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
83713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    xor a2, a2, a1
838*9122c523SPengcheng Wang; RV64ZBB-NEXT:    xor a3, a3, a1
839*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sltu a1, a2, a1
840*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a3, a3, a0
84113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    add a0, a2, a0
842*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sub a3, a3, a1
843*9122c523SPengcheng Wang; RV64ZBB-NEXT:    snez a1, a0
844*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a1, a3, a1
84504f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a1
84604f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a0, a0
84704f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
84804f65043SSimon Pilgrim  %aext = zext i128 %a to i256
84904f65043SSimon Pilgrim  %bext = zext i128 %b to i256
85004f65043SSimon Pilgrim  %sub = sub i256 %aext, %bext
85104f65043SSimon Pilgrim  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 false)
85204f65043SSimon Pilgrim  %nabs = sub i256 0, %abs
85304f65043SSimon Pilgrim  %trunc = trunc i256 %nabs to i128
85404f65043SSimon Pilgrim  ret i128 %trunc
85504f65043SSimon Pilgrim}
85604f65043SSimon Pilgrim
85704f65043SSimon Pilgrimdefine i128 @abd_ext_i128_undef(i128 %a, i128 %b) nounwind {
85804f65043SSimon Pilgrim; RV32I-LABEL: abd_ext_i128_undef:
85904f65043SSimon Pilgrim; RV32I:       # %bb.0:
860*9122c523SPengcheng Wang; RV32I-NEXT:    lw a5, 0(a2)
861*9122c523SPengcheng Wang; RV32I-NEXT:    lw a7, 4(a2)
862*9122c523SPengcheng Wang; RV32I-NEXT:    lw a3, 8(a2)
863*9122c523SPengcheng Wang; RV32I-NEXT:    lw t1, 12(a2)
864*9122c523SPengcheng Wang; RV32I-NEXT:    lw a4, 8(a1)
865*9122c523SPengcheng Wang; RV32I-NEXT:    lw a6, 12(a1)
866*9122c523SPengcheng Wang; RV32I-NEXT:    lw a2, 0(a1)
86713d04fa5SSimon Pilgrim; RV32I-NEXT:    lw t0, 4(a1)
868*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a4, a3
869*9122c523SPengcheng Wang; RV32I-NEXT:    sub t1, a6, t1
870*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t2, a2, a5
871*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, t1, a1
872*9122c523SPengcheng Wang; RV32I-NEXT:    mv t1, t2
873*9122c523SPengcheng Wang; RV32I-NEXT:    beq t0, a7, .LBB12_2
87404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
875*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, t0, a7
87604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_2:
877*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a4, a3
878*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t3, a3, t1
87913d04fa5SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, t3
880*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, t1
881*9122c523SPengcheng Wang; RV32I-NEXT:    beq a1, a6, .LBB12_4
88204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.3:
883*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a6, a1
88413d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB12_5
88504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB12_4:
886*9122c523SPengcheng Wang; RV32I-NEXT:    sltu t1, a4, a3
88713d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_5:
888*9122c523SPengcheng Wang; RV32I-NEXT:    sub a7, t0, a7
889*9122c523SPengcheng Wang; RV32I-NEXT:    sub a7, a7, t2
890*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a2, a5
891*9122c523SPengcheng Wang; RV32I-NEXT:    beq a7, t0, .LBB12_7
89213d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.6:
893*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, t0, a7
89413d04fa5SSimon Pilgrim; RV32I-NEXT:    j .LBB12_8
89513d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_7:
896*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a2, a2, a5
897e4e96b3eSSimon Pilgrim; RV32I-NEXT:  .LBB12_8:
898*9122c523SPengcheng Wang; RV32I-NEXT:    xor a6, a1, a6
899*9122c523SPengcheng Wang; RV32I-NEXT:    xor a4, a3, a4
900*9122c523SPengcheng Wang; RV32I-NEXT:    or a4, a4, a6
901*9122c523SPengcheng Wang; RV32I-NEXT:    beqz a4, .LBB12_10
90213d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
903*9122c523SPengcheng Wang; RV32I-NEXT:    mv a2, t1
90413d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_10:
905*9122c523SPengcheng Wang; RV32I-NEXT:    neg a4, a2
906*9122c523SPengcheng Wang; RV32I-NEXT:    xor t0, a5, a4
907*9122c523SPengcheng Wang; RV32I-NEXT:    xor t3, a7, a4
908*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, t0, a4
909*9122c523SPengcheng Wang; RV32I-NEXT:    add a6, t3, a2
910*9122c523SPengcheng Wang; RV32I-NEXT:    add t0, t0, a2
911*9122c523SPengcheng Wang; RV32I-NEXT:    sub t1, a6, a5
912*9122c523SPengcheng Wang; RV32I-NEXT:    snez a6, t1
913*9122c523SPengcheng Wang; RV32I-NEXT:    snez t2, t0
914*9122c523SPengcheng Wang; RV32I-NEXT:    or a6, t2, a6
915*9122c523SPengcheng Wang; RV32I-NEXT:    beqz a7, .LBB12_12
91613d04fa5SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
917*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a5, t3, a4
91813d04fa5SSimon Pilgrim; RV32I-NEXT:  .LBB12_12:
919*9122c523SPengcheng Wang; RV32I-NEXT:    xor a3, a3, a4
920*9122c523SPengcheng Wang; RV32I-NEXT:    xor a1, a1, a4
921*9122c523SPengcheng Wang; RV32I-NEXT:    add t1, t1, t2
922*9122c523SPengcheng Wang; RV32I-NEXT:    neg a7, t0
923*9122c523SPengcheng Wang; RV32I-NEXT:    add t0, a3, a2
924*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, a3, a4
92513d04fa5SSimon Pilgrim; RV32I-NEXT:    add a1, a1, a2
926*9122c523SPengcheng Wang; RV32I-NEXT:    neg a2, t1
927*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, t0, a5
928*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a3
929*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a3, t0, a5
930*9122c523SPengcheng Wang; RV32I-NEXT:    neg a5, a4
931*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a3
932*9122c523SPengcheng Wang; RV32I-NEXT:    snez a3, a4
933*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a4, a5, a6
934*9122c523SPengcheng Wang; RV32I-NEXT:    add a1, a1, a3
935*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a5, a6
936e4e96b3eSSimon Pilgrim; RV32I-NEXT:    neg a1, a1
937*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a1, a4
938*9122c523SPengcheng Wang; RV32I-NEXT:    sw a7, 0(a0)
939*9122c523SPengcheng Wang; RV32I-NEXT:    sw a2, 4(a0)
940*9122c523SPengcheng Wang; RV32I-NEXT:    sw a3, 8(a0)
94113d04fa5SSimon Pilgrim; RV32I-NEXT:    sw a1, 12(a0)
94204f65043SSimon Pilgrim; RV32I-NEXT:    ret
94304f65043SSimon Pilgrim;
94404f65043SSimon Pilgrim; RV64I-LABEL: abd_ext_i128_undef:
94504f65043SSimon Pilgrim; RV64I:       # %bb.0:
94604f65043SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
94713d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a3, a1, a3
94813d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a3, a3, a4
94913d04fa5SSimon Pilgrim; RV64I-NEXT:    sub a2, a0, a2
95013d04fa5SSimon Pilgrim; RV64I-NEXT:    beq a3, a1, .LBB12_2
95104f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
95213d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a0, a1, a3
95313d04fa5SSimon Pilgrim; RV64I-NEXT:    j .LBB12_3
95404f65043SSimon Pilgrim; RV64I-NEXT:  .LBB12_2:
95513d04fa5SSimon Pilgrim; RV64I-NEXT:    sltu a0, a0, a2
95613d04fa5SSimon Pilgrim; RV64I-NEXT:  .LBB12_3:
95713d04fa5SSimon Pilgrim; RV64I-NEXT:    neg a1, a0
95813d04fa5SSimon Pilgrim; RV64I-NEXT:    xor a2, a2, a1
959*9122c523SPengcheng Wang; RV64I-NEXT:    xor a3, a3, a1
960*9122c523SPengcheng Wang; RV64I-NEXT:    sltu a1, a2, a1
961*9122c523SPengcheng Wang; RV64I-NEXT:    add a3, a3, a0
96213d04fa5SSimon Pilgrim; RV64I-NEXT:    add a0, a2, a0
963*9122c523SPengcheng Wang; RV64I-NEXT:    sub a3, a3, a1
964*9122c523SPengcheng Wang; RV64I-NEXT:    snez a1, a0
965*9122c523SPengcheng Wang; RV64I-NEXT:    add a1, a3, a1
96604f65043SSimon Pilgrim; RV64I-NEXT:    neg a1, a1
96704f65043SSimon Pilgrim; RV64I-NEXT:    neg a0, a0
96804f65043SSimon Pilgrim; RV64I-NEXT:    ret
96904f65043SSimon Pilgrim;
97004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_ext_i128_undef:
97104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
972*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a5, 0(a2)
973*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a7, 4(a2)
974*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a3, 8(a2)
975*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw t1, 12(a2)
976*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a4, 8(a1)
977*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a6, 12(a1)
978*9122c523SPengcheng Wang; RV32ZBB-NEXT:    lw a2, 0(a1)
97913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 4(a1)
980*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a4, a3
981*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t1, a6, t1
982*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t2, a2, a5
983*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, t1, a1
984*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv t1, t2
985*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq t0, a7, .LBB12_2
98604f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
987*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, t0, a7
98804f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_2:
989*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a4, a3
990*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t3, a3, t1
99113d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, t3
992*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, t1
993*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a1, a6, .LBB12_4
99404f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
995*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a6, a1
99613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB12_5
99704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_4:
998*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu t1, a4, a3
99913d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_5:
1000*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a7, t0, a7
1001*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a7, a7, t2
1002*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a2, a5
1003*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beq a7, t0, .LBB12_7
100413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.6:
1005*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a2, t0, a7
100613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB12_8
100713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_7:
1008*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a2, a2, a5
1009e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_8:
1010*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a6, a1, a6
1011*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a4, a3, a4
1012*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a4, a4, a6
1013*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beqz a4, .LBB12_10
101413d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
1015*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a2, t1
101613d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_10:
1017*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a4, a2
1018*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor t0, a5, a4
1019*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor t3, a7, a4
1020*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, t0, a4
1021*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a6, t3, a2
1022*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t0, t0, a2
1023*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub t1, a6, a5
1024*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a6, t1
1025*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez t2, t0
1026*9122c523SPengcheng Wang; RV32ZBB-NEXT:    or a6, t2, a6
1027*9122c523SPengcheng Wang; RV32ZBB-NEXT:    beqz a7, .LBB12_12
102813d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
1029*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a5, t3, a4
103013d04fa5SSimon Pilgrim; RV32ZBB-NEXT:  .LBB12_12:
1031*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a3, a3, a4
1032*9122c523SPengcheng Wang; RV32ZBB-NEXT:    xor a1, a1, a4
1033*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t1, t1, t2
1034*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a7, t0
1035*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add t0, a3, a2
1036*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, a3, a4
103713d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    add a1, a1, a2
1038*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a2, t1
1039*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, t0, a5
1040*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a3
1041*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a3, t0, a5
1042*9122c523SPengcheng Wang; RV32ZBB-NEXT:    neg a5, a4
1043*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a3
1044*9122c523SPengcheng Wang; RV32ZBB-NEXT:    snez a3, a4
1045*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a4, a5, a6
1046*9122c523SPengcheng Wang; RV32ZBB-NEXT:    add a1, a1, a3
1047*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a5, a6
1048e4e96b3eSSimon Pilgrim; RV32ZBB-NEXT:    neg a1, a1
1049*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a1, a4
1050*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a7, 0(a0)
1051*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a2, 4(a0)
1052*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a3, 8(a0)
105313d04fa5SSimon Pilgrim; RV32ZBB-NEXT:    sw a1, 12(a0)
105404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
105504f65043SSimon Pilgrim;
105604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_ext_i128_undef:
105704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
105804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
105913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a3, a1, a3
106013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a3, a3, a4
106113d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sub a2, a0, a2
106213d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    beq a3, a1, .LBB12_2
106304f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
106413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a0, a1, a3
106513d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB12_3
106604f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB12_2:
106713d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    sltu a0, a0, a2
106813d04fa5SSimon Pilgrim; RV64ZBB-NEXT:  .LBB12_3:
106913d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a0
107013d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    xor a2, a2, a1
1071*9122c523SPengcheng Wang; RV64ZBB-NEXT:    xor a3, a3, a1
1072*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sltu a1, a2, a1
1073*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a3, a3, a0
107413d04fa5SSimon Pilgrim; RV64ZBB-NEXT:    add a0, a2, a0
1075*9122c523SPengcheng Wang; RV64ZBB-NEXT:    sub a3, a3, a1
1076*9122c523SPengcheng Wang; RV64ZBB-NEXT:    snez a1, a0
1077*9122c523SPengcheng Wang; RV64ZBB-NEXT:    add a1, a3, a1
107804f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a1, a1
107904f65043SSimon Pilgrim; RV64ZBB-NEXT:    neg a0, a0
108004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
108104f65043SSimon Pilgrim  %aext = zext i128 %a to i256
108204f65043SSimon Pilgrim  %bext = zext i128 %b to i256
108304f65043SSimon Pilgrim  %sub = sub i256 %aext, %bext
108404f65043SSimon Pilgrim  %abs = call i256 @llvm.abs.i256(i256 %sub, i1 true)
108504f65043SSimon Pilgrim  %nabs = sub i256 0, %abs
108604f65043SSimon Pilgrim  %trunc = trunc i256 %nabs to i128
108704f65043SSimon Pilgrim  ret i128 %trunc
108804f65043SSimon Pilgrim}
108904f65043SSimon Pilgrim
109004f65043SSimon Pilgrim;
109104f65043SSimon Pilgrim; sub(umin(a,b),umax(a,b)) -> nabds(a,b)
109204f65043SSimon Pilgrim;
109304f65043SSimon Pilgrim
109404f65043SSimon Pilgrimdefine i8 @abd_minmax_i8(i8 %a, i8 %b) nounwind {
109504f65043SSimon Pilgrim; NOZBB-LABEL: abd_minmax_i8:
109604f65043SSimon Pilgrim; NOZBB:       # %bb.0:
109704f65043SSimon Pilgrim; NOZBB-NEXT:    andi a1, a1, 255
109804f65043SSimon Pilgrim; NOZBB-NEXT:    andi a0, a0, 255
109904f65043SSimon Pilgrim; NOZBB-NEXT:    mv a2, a0
110004f65043SSimon Pilgrim; NOZBB-NEXT:    bgeu a0, a1, .LBB13_3
110104f65043SSimon Pilgrim; NOZBB-NEXT:  # %bb.1:
110204f65043SSimon Pilgrim; NOZBB-NEXT:    bgeu a1, a0, .LBB13_4
110304f65043SSimon Pilgrim; NOZBB-NEXT:  .LBB13_2:
110404f65043SSimon Pilgrim; NOZBB-NEXT:    sub a0, a2, a0
110504f65043SSimon Pilgrim; NOZBB-NEXT:    ret
110604f65043SSimon Pilgrim; NOZBB-NEXT:  .LBB13_3:
110704f65043SSimon Pilgrim; NOZBB-NEXT:    mv a2, a1
110804f65043SSimon Pilgrim; NOZBB-NEXT:    bltu a1, a0, .LBB13_2
110904f65043SSimon Pilgrim; NOZBB-NEXT:  .LBB13_4:
111004f65043SSimon Pilgrim; NOZBB-NEXT:    sub a0, a2, a1
111104f65043SSimon Pilgrim; NOZBB-NEXT:    ret
111204f65043SSimon Pilgrim;
111304f65043SSimon Pilgrim; ZBB-LABEL: abd_minmax_i8:
111404f65043SSimon Pilgrim; ZBB:       # %bb.0:
111504f65043SSimon Pilgrim; ZBB-NEXT:    andi a1, a1, 255
111604f65043SSimon Pilgrim; ZBB-NEXT:    andi a0, a0, 255
111704f65043SSimon Pilgrim; ZBB-NEXT:    minu a2, a0, a1
111804f65043SSimon Pilgrim; ZBB-NEXT:    maxu a0, a0, a1
111904f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a2, a0
112004f65043SSimon Pilgrim; ZBB-NEXT:    ret
112104f65043SSimon Pilgrim  %min = call i8 @llvm.umin.i8(i8 %a, i8 %b)
112204f65043SSimon Pilgrim  %max = call i8 @llvm.umax.i8(i8 %a, i8 %b)
112304f65043SSimon Pilgrim  %sub = sub i8 %min, %max
112404f65043SSimon Pilgrim  ret i8 %sub
112504f65043SSimon Pilgrim}
112604f65043SSimon Pilgrim
112704f65043SSimon Pilgrimdefine i16 @abd_minmax_i16(i16 %a, i16 %b) nounwind {
112804f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i16:
112904f65043SSimon Pilgrim; RV32I:       # %bb.0:
113004f65043SSimon Pilgrim; RV32I-NEXT:    lui a2, 16
113104f65043SSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
113204f65043SSimon Pilgrim; RV32I-NEXT:    and a1, a1, a2
113304f65043SSimon Pilgrim; RV32I-NEXT:    and a0, a0, a2
113404f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a0
113504f65043SSimon Pilgrim; RV32I-NEXT:    bgeu a0, a1, .LBB14_3
113604f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
113704f65043SSimon Pilgrim; RV32I-NEXT:    bgeu a1, a0, .LBB14_4
113804f65043SSimon Pilgrim; RV32I-NEXT:  .LBB14_2:
113904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
114004f65043SSimon Pilgrim; RV32I-NEXT:    ret
114104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB14_3:
114204f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a1
114304f65043SSimon Pilgrim; RV32I-NEXT:    bltu a1, a0, .LBB14_2
114404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB14_4:
114504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a1
114604f65043SSimon Pilgrim; RV32I-NEXT:    ret
114704f65043SSimon Pilgrim;
114804f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i16:
114904f65043SSimon Pilgrim; RV64I:       # %bb.0:
115004f65043SSimon Pilgrim; RV64I-NEXT:    lui a2, 16
115104f65043SSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
115204f65043SSimon Pilgrim; RV64I-NEXT:    and a1, a1, a2
115304f65043SSimon Pilgrim; RV64I-NEXT:    and a0, a0, a2
115404f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a0
115504f65043SSimon Pilgrim; RV64I-NEXT:    bgeu a0, a1, .LBB14_3
115604f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
115704f65043SSimon Pilgrim; RV64I-NEXT:    bgeu a1, a0, .LBB14_4
115804f65043SSimon Pilgrim; RV64I-NEXT:  .LBB14_2:
115904f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
116004f65043SSimon Pilgrim; RV64I-NEXT:    ret
116104f65043SSimon Pilgrim; RV64I-NEXT:  .LBB14_3:
116204f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a1
116304f65043SSimon Pilgrim; RV64I-NEXT:    bltu a1, a0, .LBB14_2
116404f65043SSimon Pilgrim; RV64I-NEXT:  .LBB14_4:
116504f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a1
116604f65043SSimon Pilgrim; RV64I-NEXT:    ret
116704f65043SSimon Pilgrim;
116804f65043SSimon Pilgrim; ZBB-LABEL: abd_minmax_i16:
116904f65043SSimon Pilgrim; ZBB:       # %bb.0:
117004f65043SSimon Pilgrim; ZBB-NEXT:    zext.h a1, a1
117104f65043SSimon Pilgrim; ZBB-NEXT:    zext.h a0, a0
117204f65043SSimon Pilgrim; ZBB-NEXT:    minu a2, a0, a1
117304f65043SSimon Pilgrim; ZBB-NEXT:    maxu a0, a0, a1
117404f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a2, a0
117504f65043SSimon Pilgrim; ZBB-NEXT:    ret
117604f65043SSimon Pilgrim  %min = call i16 @llvm.umin.i16(i16 %a, i16 %b)
117704f65043SSimon Pilgrim  %max = call i16 @llvm.umax.i16(i16 %a, i16 %b)
117804f65043SSimon Pilgrim  %sub = sub i16 %min, %max
117904f65043SSimon Pilgrim  ret i16 %sub
118004f65043SSimon Pilgrim}
118104f65043SSimon Pilgrim
118204f65043SSimon Pilgrimdefine i32 @abd_minmax_i32(i32 %a, i32 %b) nounwind {
118304f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i32:
118404f65043SSimon Pilgrim; RV32I:       # %bb.0:
118504f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a0
118604f65043SSimon Pilgrim; RV32I-NEXT:    bgeu a0, a1, .LBB15_3
118704f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
118804f65043SSimon Pilgrim; RV32I-NEXT:    bgeu a1, a0, .LBB15_4
118904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB15_2:
119004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
119104f65043SSimon Pilgrim; RV32I-NEXT:    ret
119204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB15_3:
119304f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a1
119404f65043SSimon Pilgrim; RV32I-NEXT:    bltu a1, a0, .LBB15_2
119504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB15_4:
119604f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a1
119704f65043SSimon Pilgrim; RV32I-NEXT:    ret
119804f65043SSimon Pilgrim;
119904f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i32:
120004f65043SSimon Pilgrim; RV64I:       # %bb.0:
120104f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a1, a1
120204f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a0, a0
120304f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a0
120404f65043SSimon Pilgrim; RV64I-NEXT:    bgeu a0, a1, .LBB15_3
120504f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
120604f65043SSimon Pilgrim; RV64I-NEXT:    bgeu a1, a0, .LBB15_4
120704f65043SSimon Pilgrim; RV64I-NEXT:  .LBB15_2:
120804f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a2, a0
120904f65043SSimon Pilgrim; RV64I-NEXT:    ret
121004f65043SSimon Pilgrim; RV64I-NEXT:  .LBB15_3:
121104f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a1
121204f65043SSimon Pilgrim; RV64I-NEXT:    bltu a1, a0, .LBB15_2
121304f65043SSimon Pilgrim; RV64I-NEXT:  .LBB15_4:
121404f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a2, a1
121504f65043SSimon Pilgrim; RV64I-NEXT:    ret
121604f65043SSimon Pilgrim;
121704f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i32:
121804f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
121904f65043SSimon Pilgrim; RV32ZBB-NEXT:    minu a2, a0, a1
122004f65043SSimon Pilgrim; RV32ZBB-NEXT:    maxu a0, a0, a1
122104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
122204f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
122304f65043SSimon Pilgrim;
122404f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i32:
122504f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
122604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a1, a1
122704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a0, a0
122804f65043SSimon Pilgrim; RV64ZBB-NEXT:    minu a2, a0, a1
122904f65043SSimon Pilgrim; RV64ZBB-NEXT:    maxu a0, a0, a1
123004f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a2, a0
123104f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
123204f65043SSimon Pilgrim  %min = call i32 @llvm.umin.i32(i32 %a, i32 %b)
123304f65043SSimon Pilgrim  %max = call i32 @llvm.umax.i32(i32 %a, i32 %b)
123404f65043SSimon Pilgrim  %sub = sub i32 %min, %max
123504f65043SSimon Pilgrim  ret i32 %sub
123604f65043SSimon Pilgrim}
123704f65043SSimon Pilgrim
123804f65043SSimon Pilgrimdefine i64 @abd_minmax_i64(i64 %a, i64 %b) nounwind {
123904f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i64:
124004f65043SSimon Pilgrim; RV32I:       # %bb.0:
124104f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB16_2
124204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
124304f65043SSimon Pilgrim; RV32I-NEXT:    sltu a6, a1, a3
124404f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB16_3
124504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_2:
124604f65043SSimon Pilgrim; RV32I-NEXT:    sltu a6, a0, a2
124704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_3:
124804f65043SSimon Pilgrim; RV32I-NEXT:    mv a4, a1
124904f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, a0
125004f65043SSimon Pilgrim; RV32I-NEXT:    bnez a6, .LBB16_5
125104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.4:
125204f65043SSimon Pilgrim; RV32I-NEXT:    mv a4, a3
125304f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, a2
125404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_5:
125504f65043SSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB16_7
125604f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.6:
125704f65043SSimon Pilgrim; RV32I-NEXT:    sltu a6, a3, a1
125804f65043SSimon Pilgrim; RV32I-NEXT:    beqz a6, .LBB16_8
125904f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB16_9
126004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_7:
126104f65043SSimon Pilgrim; RV32I-NEXT:    sltu a6, a2, a0
126204f65043SSimon Pilgrim; RV32I-NEXT:    bnez a6, .LBB16_9
126304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_8:
126404f65043SSimon Pilgrim; RV32I-NEXT:    mv a1, a3
126504f65043SSimon Pilgrim; RV32I-NEXT:    mv a0, a2
126604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB16_9:
126704f65043SSimon Pilgrim; RV32I-NEXT:    sltu a2, a5, a0
126804f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a4, a1
126904f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a2
127004f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a5, a0
127104f65043SSimon Pilgrim; RV32I-NEXT:    ret
127204f65043SSimon Pilgrim;
127304f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i64:
127404f65043SSimon Pilgrim; RV64I:       # %bb.0:
127504f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a0
127604f65043SSimon Pilgrim; RV64I-NEXT:    bgeu a0, a1, .LBB16_3
127704f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
127804f65043SSimon Pilgrim; RV64I-NEXT:    bgeu a1, a0, .LBB16_4
127904f65043SSimon Pilgrim; RV64I-NEXT:  .LBB16_2:
128004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
128104f65043SSimon Pilgrim; RV64I-NEXT:    ret
128204f65043SSimon Pilgrim; RV64I-NEXT:  .LBB16_3:
128304f65043SSimon Pilgrim; RV64I-NEXT:    mv a2, a1
128404f65043SSimon Pilgrim; RV64I-NEXT:    bltu a1, a0, .LBB16_2
128504f65043SSimon Pilgrim; RV64I-NEXT:  .LBB16_4:
128604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a1
128704f65043SSimon Pilgrim; RV64I-NEXT:    ret
128804f65043SSimon Pilgrim;
128904f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i64:
129004f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
129104f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB16_2
129204f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
129304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a6, a1, a3
129404f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB16_3
129504f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_2:
129604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a6, a0, a2
129704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_3:
129804f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a4, a1
129904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a0
130004f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez a6, .LBB16_5
130104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.4:
130204f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a4, a3
130304f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a2
130404f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_5:
130504f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB16_7
130604f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.6:
130704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a6, a3, a1
130804f65043SSimon Pilgrim; RV32ZBB-NEXT:    beqz a6, .LBB16_8
130904f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB16_9
131004f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_7:
131104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a6, a2, a0
131204f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez a6, .LBB16_9
131304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_8:
131404f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a1, a3
131504f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a0, a2
131604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB16_9:
131704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a2, a5, a0
131804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a4, a1
131904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a2
132004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a5, a0
132104f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
132204f65043SSimon Pilgrim;
132304f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i64:
132404f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
132504f65043SSimon Pilgrim; RV64ZBB-NEXT:    minu a2, a0, a1
132604f65043SSimon Pilgrim; RV64ZBB-NEXT:    maxu a0, a0, a1
132704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
132804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
132904f65043SSimon Pilgrim  %min = call i64 @llvm.umin.i64(i64 %a, i64 %b)
133004f65043SSimon Pilgrim  %max = call i64 @llvm.umax.i64(i64 %a, i64 %b)
133104f65043SSimon Pilgrim  %sub = sub i64 %min, %max
133204f65043SSimon Pilgrim  ret i64 %sub
133304f65043SSimon Pilgrim}
133404f65043SSimon Pilgrim
133504f65043SSimon Pilgrimdefine i128 @abd_minmax_i128(i128 %a, i128 %b) nounwind {
133604f65043SSimon Pilgrim; RV32I-LABEL: abd_minmax_i128:
133704f65043SSimon Pilgrim; RV32I:       # %bb.0:
133804f65043SSimon Pilgrim; RV32I-NEXT:    lw a6, 4(a2)
133904f65043SSimon Pilgrim; RV32I-NEXT:    lw a7, 8(a2)
134004f65043SSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a2)
134104f65043SSimon Pilgrim; RV32I-NEXT:    lw a5, 12(a1)
134214c4f28eSAlex Bradbury; RV32I-NEXT:    lw a3, 4(a1)
134304f65043SSimon Pilgrim; RV32I-NEXT:    lw a4, 8(a1)
134404f65043SSimon Pilgrim; RV32I-NEXT:    beq a5, t0, .LBB17_2
134504f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
134604f65043SSimon Pilgrim; RV32I-NEXT:    sltu t1, a5, t0
134704f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_3
134804f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_2:
134904f65043SSimon Pilgrim; RV32I-NEXT:    sltu t1, a4, a7
135004f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_3:
135104f65043SSimon Pilgrim; RV32I-NEXT:    lw t2, 0(a2)
135204f65043SSimon Pilgrim; RV32I-NEXT:    lw a1, 0(a1)
135304f65043SSimon Pilgrim; RV32I-NEXT:    beq a3, a6, .LBB17_5
135404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.4:
135504f65043SSimon Pilgrim; RV32I-NEXT:    sltu t6, a3, a6
135604f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_6
135704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_5:
135804f65043SSimon Pilgrim; RV32I-NEXT:    sltu t6, a1, t2
135904f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_6:
136004f65043SSimon Pilgrim; RV32I-NEXT:    xor a2, a5, t0
136104f65043SSimon Pilgrim; RV32I-NEXT:    xor t3, a4, a7
136204f65043SSimon Pilgrim; RV32I-NEXT:    or t5, t3, a2
136304f65043SSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB17_8
136404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.7:
136504f65043SSimon Pilgrim; RV32I-NEXT:    mv t6, t1
136604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_8:
136704f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, a1
136804f65043SSimon Pilgrim; RV32I-NEXT:    mv t1, a3
136904f65043SSimon Pilgrim; RV32I-NEXT:    mv t4, a5
137004f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, a4
137104f65043SSimon Pilgrim; RV32I-NEXT:    bnez t6, .LBB17_10
137204f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.9:
137304f65043SSimon Pilgrim; RV32I-NEXT:    mv a2, t2
137404f65043SSimon Pilgrim; RV32I-NEXT:    mv t1, a6
137504f65043SSimon Pilgrim; RV32I-NEXT:    mv t4, t0
137604f65043SSimon Pilgrim; RV32I-NEXT:    mv t3, a7
137704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_10:
137804f65043SSimon Pilgrim; RV32I-NEXT:    beq a5, t0, .LBB17_12
137904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.11:
138004f65043SSimon Pilgrim; RV32I-NEXT:    sltu t6, t0, a5
138104f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_13
138204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_12:
138304f65043SSimon Pilgrim; RV32I-NEXT:    sltu t6, a7, a4
138404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_13:
138504f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, -16
138604f65043SSimon Pilgrim; RV32I-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
138704f65043SSimon Pilgrim; RV32I-NEXT:    beq a3, a6, .LBB17_15
138804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.14:
138904f65043SSimon Pilgrim; RV32I-NEXT:    sltu s0, a6, a3
139004f65043SSimon Pilgrim; RV32I-NEXT:    bnez t5, .LBB17_16
139104f65043SSimon Pilgrim; RV32I-NEXT:    j .LBB17_17
139204f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_15:
139304f65043SSimon Pilgrim; RV32I-NEXT:    sltu s0, t2, a1
139404f65043SSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB17_17
139504f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_16:
139604f65043SSimon Pilgrim; RV32I-NEXT:    mv s0, t6
139704f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_17:
139804f65043SSimon Pilgrim; RV32I-NEXT:    bnez s0, .LBB17_19
139904f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.18:
140004f65043SSimon Pilgrim; RV32I-NEXT:    mv a1, t2
140104f65043SSimon Pilgrim; RV32I-NEXT:    mv a3, a6
140204f65043SSimon Pilgrim; RV32I-NEXT:    mv a5, t0
140304f65043SSimon Pilgrim; RV32I-NEXT:    mv a4, a7
140404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_19:
1405*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a7, t3, a4
1406*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, t4, a5
1407*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a6, a2, a1
1408*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, a7
1409*9122c523SPengcheng Wang; RV32I-NEXT:    mv a7, a6
141004f65043SSimon Pilgrim; RV32I-NEXT:    beq t1, a3, .LBB17_21
141104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.20:
141204f65043SSimon Pilgrim; RV32I-NEXT:    sltu a7, t1, a3
141304f65043SSimon Pilgrim; RV32I-NEXT:  .LBB17_21:
141404f65043SSimon Pilgrim; RV32I-NEXT:    sub a4, t3, a4
141504f65043SSimon Pilgrim; RV32I-NEXT:    sub a3, t1, a3
141604f65043SSimon Pilgrim; RV32I-NEXT:    sub a2, a2, a1
1417*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a1, a4, a7
1418*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a4, a7
1419*9122c523SPengcheng Wang; RV32I-NEXT:    sub a3, a3, a6
1420*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, a1
142104f65043SSimon Pilgrim; RV32I-NEXT:    sw a2, 0(a0)
142204f65043SSimon Pilgrim; RV32I-NEXT:    sw a3, 4(a0)
142304f65043SSimon Pilgrim; RV32I-NEXT:    sw a4, 8(a0)
1424*9122c523SPengcheng Wang; RV32I-NEXT:    sw a5, 12(a0)
142504f65043SSimon Pilgrim; RV32I-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
142604f65043SSimon Pilgrim; RV32I-NEXT:    addi sp, sp, 16
142704f65043SSimon Pilgrim; RV32I-NEXT:    ret
142804f65043SSimon Pilgrim;
142904f65043SSimon Pilgrim; RV64I-LABEL: abd_minmax_i128:
143004f65043SSimon Pilgrim; RV64I:       # %bb.0:
143104f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB17_2
143204f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
143304f65043SSimon Pilgrim; RV64I-NEXT:    sltu a6, a1, a3
143404f65043SSimon Pilgrim; RV64I-NEXT:    j .LBB17_3
143504f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_2:
143604f65043SSimon Pilgrim; RV64I-NEXT:    sltu a6, a0, a2
143704f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_3:
143804f65043SSimon Pilgrim; RV64I-NEXT:    mv a4, a1
143904f65043SSimon Pilgrim; RV64I-NEXT:    mv a5, a0
144004f65043SSimon Pilgrim; RV64I-NEXT:    bnez a6, .LBB17_5
144104f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.4:
144204f65043SSimon Pilgrim; RV64I-NEXT:    mv a4, a3
144304f65043SSimon Pilgrim; RV64I-NEXT:    mv a5, a2
144404f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_5:
144504f65043SSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB17_7
144604f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.6:
144704f65043SSimon Pilgrim; RV64I-NEXT:    sltu a6, a3, a1
144804f65043SSimon Pilgrim; RV64I-NEXT:    beqz a6, .LBB17_8
144904f65043SSimon Pilgrim; RV64I-NEXT:    j .LBB17_9
145004f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_7:
145104f65043SSimon Pilgrim; RV64I-NEXT:    sltu a6, a2, a0
145204f65043SSimon Pilgrim; RV64I-NEXT:    bnez a6, .LBB17_9
145304f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_8:
145404f65043SSimon Pilgrim; RV64I-NEXT:    mv a1, a3
145504f65043SSimon Pilgrim; RV64I-NEXT:    mv a0, a2
145604f65043SSimon Pilgrim; RV64I-NEXT:  .LBB17_9:
145704f65043SSimon Pilgrim; RV64I-NEXT:    sltu a2, a5, a0
145804f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a4, a1
145904f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a2
146004f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a5, a0
146104f65043SSimon Pilgrim; RV64I-NEXT:    ret
146204f65043SSimon Pilgrim;
146304f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_minmax_i128:
146404f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
146504f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a6, 4(a2)
146604f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a7, 8(a2)
146704f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a2)
146804f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a5, 12(a1)
146914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a3, 4(a1)
147004f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a4, 8(a1)
147104f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a5, t0, .LBB17_2
147204f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
147304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t1, a5, t0
147404f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_3
147504f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_2:
147604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t1, a4, a7
147704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_3:
147804f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw t2, 0(a2)
147904f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 0(a1)
148004f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a3, a6, .LBB17_5
148104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.4:
148204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a3, a6
148304f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_6
148404f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_5:
148504f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a1, t2
148604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_6:
148704f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor a2, a5, t0
148804f65043SSimon Pilgrim; RV32ZBB-NEXT:    xor t3, a4, a7
148904f65043SSimon Pilgrim; RV32ZBB-NEXT:    or t5, t3, a2
149004f65043SSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB17_8
149104f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
149204f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t1
149304f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_8:
149404f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a2, a1
149504f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t1, a3
149604f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, a5
149704f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, a4
149804f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez t6, .LBB17_10
149904f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
150004f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a2, t2
150104f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t1, a6
150204f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t0
150304f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv t3, a7
150404f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_10:
150504f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a5, t0, .LBB17_12
150604f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.11:
150704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, t0, a5
150804f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_13
150904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_12:
151004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu t6, a7, a4
151104f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_13:
151204f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, -16
151304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
151404f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq a3, a6, .LBB17_15
151504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.14:
151604f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu s0, a6, a3
151704f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez t5, .LBB17_16
151804f65043SSimon Pilgrim; RV32ZBB-NEXT:    j .LBB17_17
151904f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_15:
152004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu s0, t2, a1
152104f65043SSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB17_17
152204f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_16:
152304f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv s0, t6
152404f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_17:
152504f65043SSimon Pilgrim; RV32ZBB-NEXT:    bnez s0, .LBB17_19
152604f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.18:
152704f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a1, t2
152804f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a3, a6
152904f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a5, t0
153004f65043SSimon Pilgrim; RV32ZBB-NEXT:    mv a4, a7
153104f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_19:
1532*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a7, t3, a4
1533*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, t4, a5
1534*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a6, a2, a1
1535*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, a7
1536*9122c523SPengcheng Wang; RV32ZBB-NEXT:    mv a7, a6
153704f65043SSimon Pilgrim; RV32ZBB-NEXT:    beq t1, a3, .LBB17_21
153804f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.20:
153904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a7, t1, a3
154004f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB17_21:
154104f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a4, t3, a4
154204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a3, t1, a3
154304f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a2, a2, a1
1544*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a1, a4, a7
1545*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a4, a7
1546*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a3, a3, a6
1547*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, a1
154804f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a2, 0(a0)
154904f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a3, 4(a0)
155004f65043SSimon Pilgrim; RV32ZBB-NEXT:    sw a4, 8(a0)
1551*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a5, 12(a0)
155204f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
155304f65043SSimon Pilgrim; RV32ZBB-NEXT:    addi sp, sp, 16
155404f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
155504f65043SSimon Pilgrim;
155604f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_minmax_i128:
155704f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
155804f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB17_2
155904f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
156004f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a6, a1, a3
156104f65043SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB17_3
156204f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_2:
156304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a6, a0, a2
156404f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_3:
156504f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a4, a1
156604f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a0
156704f65043SSimon Pilgrim; RV64ZBB-NEXT:    bnez a6, .LBB17_5
156804f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.4:
156904f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a4, a3
157004f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a2
157104f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_5:
157204f65043SSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB17_7
157304f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.6:
157404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a6, a3, a1
157504f65043SSimon Pilgrim; RV64ZBB-NEXT:    beqz a6, .LBB17_8
157604f65043SSimon Pilgrim; RV64ZBB-NEXT:    j .LBB17_9
157704f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_7:
157804f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a6, a2, a0
157904f65043SSimon Pilgrim; RV64ZBB-NEXT:    bnez a6, .LBB17_9
158004f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_8:
158104f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a1, a3
158204f65043SSimon Pilgrim; RV64ZBB-NEXT:    mv a0, a2
158304f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB17_9:
158404f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a2, a5, a0
158504f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a4, a1
158604f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a2
158704f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a5, a0
158804f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
158904f65043SSimon Pilgrim  %min = call i128 @llvm.umin.i128(i128 %a, i128 %b)
159004f65043SSimon Pilgrim  %max = call i128 @llvm.umax.i128(i128 %a, i128 %b)
159104f65043SSimon Pilgrim  %sub = sub i128 %min, %max
159204f65043SSimon Pilgrim  ret i128 %sub
159304f65043SSimon Pilgrim}
159404f65043SSimon Pilgrim
159504f65043SSimon Pilgrim;
159604f65043SSimon Pilgrim; select(icmp(a,b),sub(a,b),sub(b,a)) -> nabds(a,b)
159704f65043SSimon Pilgrim;
159804f65043SSimon Pilgrim
159904f65043SSimon Pilgrimdefine i8 @abd_cmp_i8(i8 %a, i8 %b) nounwind {
160004f65043SSimon Pilgrim; NOZBB-LABEL: abd_cmp_i8:
160104f65043SSimon Pilgrim; NOZBB:       # %bb.0:
160204f65043SSimon Pilgrim; NOZBB-NEXT:    andi a2, a0, 255
160304f65043SSimon Pilgrim; NOZBB-NEXT:    andi a3, a1, 255
160404f65043SSimon Pilgrim; NOZBB-NEXT:    bgeu a3, a2, .LBB18_2
160504f65043SSimon Pilgrim; NOZBB-NEXT:  # %bb.1:
160604f65043SSimon Pilgrim; NOZBB-NEXT:    sub a0, a1, a0
160704f65043SSimon Pilgrim; NOZBB-NEXT:    ret
160804f65043SSimon Pilgrim; NOZBB-NEXT:  .LBB18_2:
160904f65043SSimon Pilgrim; NOZBB-NEXT:    sub a0, a0, a1
161004f65043SSimon Pilgrim; NOZBB-NEXT:    ret
161104f65043SSimon Pilgrim;
161204f65043SSimon Pilgrim; ZBB-LABEL: abd_cmp_i8:
161304f65043SSimon Pilgrim; ZBB:       # %bb.0:
161404f65043SSimon Pilgrim; ZBB-NEXT:    andi a2, a0, 255
161504f65043SSimon Pilgrim; ZBB-NEXT:    andi a3, a1, 255
161604f65043SSimon Pilgrim; ZBB-NEXT:    bgeu a3, a2, .LBB18_2
161704f65043SSimon Pilgrim; ZBB-NEXT:  # %bb.1:
161804f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a1, a0
161904f65043SSimon Pilgrim; ZBB-NEXT:    ret
162004f65043SSimon Pilgrim; ZBB-NEXT:  .LBB18_2:
162104f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a1
162204f65043SSimon Pilgrim; ZBB-NEXT:    ret
162304f65043SSimon Pilgrim  %cmp = icmp ule i8 %a, %b
162404f65043SSimon Pilgrim  %ab = sub i8 %a, %b
162504f65043SSimon Pilgrim  %ba = sub i8 %b, %a
162604f65043SSimon Pilgrim  %sel = select i1 %cmp, i8 %ab, i8 %ba
162704f65043SSimon Pilgrim  ret i8 %sel
162804f65043SSimon Pilgrim}
162904f65043SSimon Pilgrim
163004f65043SSimon Pilgrimdefine i16 @abd_cmp_i16(i16 %a, i16 %b) nounwind {
163104f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i16:
163204f65043SSimon Pilgrim; RV32I:       # %bb.0:
163304f65043SSimon Pilgrim; RV32I-NEXT:    lui a2, 16
163404f65043SSimon Pilgrim; RV32I-NEXT:    addi a2, a2, -1
163504f65043SSimon Pilgrim; RV32I-NEXT:    and a3, a1, a2
163604f65043SSimon Pilgrim; RV32I-NEXT:    and a2, a0, a2
163704f65043SSimon Pilgrim; RV32I-NEXT:    bltu a2, a3, .LBB19_2
163804f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
163904f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
164004f65043SSimon Pilgrim; RV32I-NEXT:    ret
164104f65043SSimon Pilgrim; RV32I-NEXT:  .LBB19_2:
164204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
164304f65043SSimon Pilgrim; RV32I-NEXT:    ret
164404f65043SSimon Pilgrim;
164504f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i16:
164604f65043SSimon Pilgrim; RV64I:       # %bb.0:
164704f65043SSimon Pilgrim; RV64I-NEXT:    lui a2, 16
164804f65043SSimon Pilgrim; RV64I-NEXT:    addiw a2, a2, -1
164904f65043SSimon Pilgrim; RV64I-NEXT:    and a3, a1, a2
165004f65043SSimon Pilgrim; RV64I-NEXT:    and a2, a0, a2
165104f65043SSimon Pilgrim; RV64I-NEXT:    bltu a2, a3, .LBB19_2
165204f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
165304f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
165404f65043SSimon Pilgrim; RV64I-NEXT:    ret
165504f65043SSimon Pilgrim; RV64I-NEXT:  .LBB19_2:
165604f65043SSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
165704f65043SSimon Pilgrim; RV64I-NEXT:    ret
165804f65043SSimon Pilgrim;
165904f65043SSimon Pilgrim; ZBB-LABEL: abd_cmp_i16:
166004f65043SSimon Pilgrim; ZBB:       # %bb.0:
166104f65043SSimon Pilgrim; ZBB-NEXT:    zext.h a2, a1
166204f65043SSimon Pilgrim; ZBB-NEXT:    zext.h a3, a0
166304f65043SSimon Pilgrim; ZBB-NEXT:    bltu a3, a2, .LBB19_2
166404f65043SSimon Pilgrim; ZBB-NEXT:  # %bb.1:
166504f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a1, a0
166604f65043SSimon Pilgrim; ZBB-NEXT:    ret
166704f65043SSimon Pilgrim; ZBB-NEXT:  .LBB19_2:
166804f65043SSimon Pilgrim; ZBB-NEXT:    sub a0, a0, a1
166904f65043SSimon Pilgrim; ZBB-NEXT:    ret
167004f65043SSimon Pilgrim  %cmp = icmp ult i16 %a, %b
167104f65043SSimon Pilgrim  %ab = sub i16 %a, %b
167204f65043SSimon Pilgrim  %ba = sub i16 %b, %a
167304f65043SSimon Pilgrim  %sel = select i1 %cmp, i16 %ab, i16 %ba
167404f65043SSimon Pilgrim  ret i16 %sel
167504f65043SSimon Pilgrim}
167604f65043SSimon Pilgrim
167704f65043SSimon Pilgrimdefine i32 @abd_cmp_i32(i32 %a, i32 %b) nounwind {
167804f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i32:
167904f65043SSimon Pilgrim; RV32I:       # %bb.0:
168004f65043SSimon Pilgrim; RV32I-NEXT:    bgeu a0, a1, .LBB20_2
168104f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
168204f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a1
168304f65043SSimon Pilgrim; RV32I-NEXT:    ret
168404f65043SSimon Pilgrim; RV32I-NEXT:  .LBB20_2:
168504f65043SSimon Pilgrim; RV32I-NEXT:    sub a0, a1, a0
168604f65043SSimon Pilgrim; RV32I-NEXT:    ret
168704f65043SSimon Pilgrim;
168804f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i32:
168904f65043SSimon Pilgrim; RV64I:       # %bb.0:
169004f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a2, a1
169104f65043SSimon Pilgrim; RV64I-NEXT:    sext.w a3, a0
169204f65043SSimon Pilgrim; RV64I-NEXT:    bgeu a3, a2, .LBB20_2
169304f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
169404f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a0, a1
169504f65043SSimon Pilgrim; RV64I-NEXT:    ret
169604f65043SSimon Pilgrim; RV64I-NEXT:  .LBB20_2:
169704f65043SSimon Pilgrim; RV64I-NEXT:    subw a0, a1, a0
169804f65043SSimon Pilgrim; RV64I-NEXT:    ret
169904f65043SSimon Pilgrim;
170004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i32:
170104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
170204f65043SSimon Pilgrim; RV32ZBB-NEXT:    bgeu a0, a1, .LBB20_2
170304f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
170404f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a1
170504f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
170604f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB20_2:
170704f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a1, a0
170804f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
170904f65043SSimon Pilgrim;
171004f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i32:
171104f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
171204f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a2, a1
171304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sext.w a3, a0
171404f65043SSimon Pilgrim; RV64ZBB-NEXT:    bgeu a3, a2, .LBB20_2
171504f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
171604f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a0, a1
171704f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
171804f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB20_2:
171904f65043SSimon Pilgrim; RV64ZBB-NEXT:    subw a0, a1, a0
172004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
172104f65043SSimon Pilgrim  %cmp = icmp uge i32 %a, %b
172204f65043SSimon Pilgrim  %ab = sub i32 %a, %b
172304f65043SSimon Pilgrim  %ba = sub i32 %b, %a
172404f65043SSimon Pilgrim  %sel = select i1 %cmp, i32 %ba, i32 %ab
172504f65043SSimon Pilgrim  ret i32 %sel
172604f65043SSimon Pilgrim}
172704f65043SSimon Pilgrim
172804f65043SSimon Pilgrimdefine i64 @abd_cmp_i64(i64 %a, i64 %b) nounwind {
172904f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i64:
173004f65043SSimon Pilgrim; RV32I:       # %bb.0:
173104f65043SSimon Pilgrim; RV32I-NEXT:    sltu a4, a0, a2
17327afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv a5, a4
17337afdc6bdSSimon Pilgrim; RV32I-NEXT:    beq a1, a3, .LBB21_2
173404f65043SSimon Pilgrim; RV32I-NEXT:  # %bb.1:
17357afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a5, a1, a3
173604f65043SSimon Pilgrim; RV32I-NEXT:  .LBB21_2:
17377afdc6bdSSimon Pilgrim; RV32I-NEXT:    bnez a5, .LBB21_4
17387afdc6bdSSimon Pilgrim; RV32I-NEXT:  # %bb.3:
17397afdc6bdSSimon Pilgrim; RV32I-NEXT:    sltu a4, a2, a0
17407afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a1, a3, a1
174104f65043SSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
17427afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a0, a2, a0
17437afdc6bdSSimon Pilgrim; RV32I-NEXT:    ret
17447afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB21_4:
17457afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a3
17467afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a1, a1, a4
17477afdc6bdSSimon Pilgrim; RV32I-NEXT:    sub a0, a0, a2
174804f65043SSimon Pilgrim; RV32I-NEXT:    ret
174904f65043SSimon Pilgrim;
175004f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i64:
175104f65043SSimon Pilgrim; RV64I:       # %bb.0:
17527afdc6bdSSimon Pilgrim; RV64I-NEXT:    bltu a0, a1, .LBB21_2
175304f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
17548109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a1, a0
175504f65043SSimon Pilgrim; RV64I-NEXT:    ret
175604f65043SSimon Pilgrim; RV64I-NEXT:  .LBB21_2:
17578109e5deSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a1
175804f65043SSimon Pilgrim; RV64I-NEXT:    ret
175904f65043SSimon Pilgrim;
176004f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i64:
176104f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
176204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a0, a2
17637afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv a5, a4
17647afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beq a1, a3, .LBB21_2
176504f65043SSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
17667afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a5, a1, a3
176704f65043SSimon Pilgrim; RV32ZBB-NEXT:  .LBB21_2:
17687afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    bnez a5, .LBB21_4
17697afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
17707afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sltu a4, a2, a0
17717afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a3, a1
177204f65043SSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
17737afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a2, a0
17747afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    ret
17757afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB21_4:
17767afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a3
17777afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a1, a1, a4
17787afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    sub a0, a0, a2
177904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
178004f65043SSimon Pilgrim;
178104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i64:
178204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
17837afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    bltu a0, a1, .LBB21_2
17847afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
17857afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a1, a0
17867afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    ret
17877afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:  .LBB21_2:
17887afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a1
178904f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
179004f65043SSimon Pilgrim  %cmp = icmp ult i64 %a, %b
179104f65043SSimon Pilgrim  %ab = sub i64 %a, %b
179204f65043SSimon Pilgrim  %ba = sub i64 %b, %a
17937afdc6bdSSimon Pilgrim  %sel = select i1 %cmp, i64 %ab, i64 %ba
179404f65043SSimon Pilgrim  ret i64 %sel
179504f65043SSimon Pilgrim}
179604f65043SSimon Pilgrim
179704f65043SSimon Pilgrimdefine i128 @abd_cmp_i128(i128 %a, i128 %b) nounwind {
179804f65043SSimon Pilgrim; RV32I-LABEL: abd_cmp_i128:
179904f65043SSimon Pilgrim; RV32I:       # %bb.0:
18007afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw a3, 0(a2)
180114c4f28eSAlex Bradbury; RV32I-NEXT:    lw a4, 4(a2)
180214c4f28eSAlex Bradbury; RV32I-NEXT:    lw a5, 8(a2)
180314c4f28eSAlex Bradbury; RV32I-NEXT:    lw a7, 12(a2)
180414c4f28eSAlex Bradbury; RV32I-NEXT:    lw a6, 8(a1)
18057afdc6bdSSimon Pilgrim; RV32I-NEXT:    lw t0, 12(a1)
180614c4f28eSAlex Bradbury; RV32I-NEXT:    lw a2, 0(a1)
180704f65043SSimon Pilgrim; RV32I-NEXT:    lw a1, 4(a1)
180814c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t1, a6, a5
18097afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t4, t1
181014c4f28eSAlex Bradbury; RV32I-NEXT:    beq t0, a7, .LBB22_2
18117afdc6bdSSimon Pilgrim; RV32I-NEXT:  # %bb.1:
181214c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t4, t0, a7
18137afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_2:
181414c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t2, a2, a3
18157afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t3, t2
181614c4f28eSAlex Bradbury; RV32I-NEXT:    beq a1, a4, .LBB22_4
18177afdc6bdSSimon Pilgrim; RV32I-NEXT:  # %bb.3:
181814c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t3, a1, a4
18197afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_4:
182014c4f28eSAlex Bradbury; RV32I-NEXT:    xor t5, t0, a7
182114c4f28eSAlex Bradbury; RV32I-NEXT:    xor t6, a6, a5
18227afdc6bdSSimon Pilgrim; RV32I-NEXT:    or t5, t6, t5
18237afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t6, t3
18247afdc6bdSSimon Pilgrim; RV32I-NEXT:    beqz t5, .LBB22_6
18257afdc6bdSSimon Pilgrim; RV32I-NEXT:  # %bb.5:
18267afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t6, t4
18277afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_6:
182814c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t4, a3, a2
18297afdc6bdSSimon Pilgrim; RV32I-NEXT:    mv t5, t4
183014c4f28eSAlex Bradbury; RV32I-NEXT:    beq a1, a4, .LBB22_8
18317afdc6bdSSimon Pilgrim; RV32I-NEXT:  # %bb.7:
183214c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t5, a4, a1
18337afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_8:
18347afdc6bdSSimon Pilgrim; RV32I-NEXT:    bnez t6, .LBB22_10
18357afdc6bdSSimon Pilgrim; RV32I-NEXT:  # %bb.9:
183614c4f28eSAlex Bradbury; RV32I-NEXT:    sltu t1, a5, a6
183714c4f28eSAlex Bradbury; RV32I-NEXT:    sub a7, a7, t0
1838*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a5, a6
183914c4f28eSAlex Bradbury; RV32I-NEXT:    sub a4, a4, a1
1840*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a7, t1
1841*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a7, a5, t5
1842*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a5, t5
1843*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a4, t4
1844*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a6, a7
184514c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a3, a2
18467afdc6bdSSimon Pilgrim; RV32I-NEXT:    j .LBB22_11
18477afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_10:
184814c4f28eSAlex Bradbury; RV32I-NEXT:    sub a7, t0, a7
1849*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a6, a5
1850*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a1, a4
1851*9122c523SPengcheng Wang; RV32I-NEXT:    sub a6, a7, t1
1852*9122c523SPengcheng Wang; RV32I-NEXT:    sltu a7, a5, t3
1853*9122c523SPengcheng Wang; RV32I-NEXT:    sub a1, a5, t3
1854*9122c523SPengcheng Wang; RV32I-NEXT:    sub a5, a4, t2
1855*9122c523SPengcheng Wang; RV32I-NEXT:    sub a4, a6, a7
185614c4f28eSAlex Bradbury; RV32I-NEXT:    sub a2, a2, a3
18577afdc6bdSSimon Pilgrim; RV32I-NEXT:  .LBB22_11:
185814c4f28eSAlex Bradbury; RV32I-NEXT:    sw a2, 0(a0)
1859*9122c523SPengcheng Wang; RV32I-NEXT:    sw a5, 4(a0)
1860*9122c523SPengcheng Wang; RV32I-NEXT:    sw a1, 8(a0)
1861*9122c523SPengcheng Wang; RV32I-NEXT:    sw a4, 12(a0)
186204f65043SSimon Pilgrim; RV32I-NEXT:    ret
186304f65043SSimon Pilgrim;
186404f65043SSimon Pilgrim; RV64I-LABEL: abd_cmp_i128:
186504f65043SSimon Pilgrim; RV64I:       # %bb.0:
186604f65043SSimon Pilgrim; RV64I-NEXT:    sltu a4, a0, a2
18677afdc6bdSSimon Pilgrim; RV64I-NEXT:    mv a5, a4
18687afdc6bdSSimon Pilgrim; RV64I-NEXT:    beq a1, a3, .LBB22_2
186904f65043SSimon Pilgrim; RV64I-NEXT:  # %bb.1:
18707afdc6bdSSimon Pilgrim; RV64I-NEXT:    sltu a5, a1, a3
187104f65043SSimon Pilgrim; RV64I-NEXT:  .LBB22_2:
18727afdc6bdSSimon Pilgrim; RV64I-NEXT:    bnez a5, .LBB22_4
18737afdc6bdSSimon Pilgrim; RV64I-NEXT:  # %bb.3:
18747afdc6bdSSimon Pilgrim; RV64I-NEXT:    sltu a4, a2, a0
18757afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a1, a3, a1
187604f65043SSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
18777afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a0, a2, a0
18787afdc6bdSSimon Pilgrim; RV64I-NEXT:    ret
18797afdc6bdSSimon Pilgrim; RV64I-NEXT:  .LBB22_4:
18807afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a3
18817afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a1, a1, a4
18827afdc6bdSSimon Pilgrim; RV64I-NEXT:    sub a0, a0, a2
188304f65043SSimon Pilgrim; RV64I-NEXT:    ret
188404f65043SSimon Pilgrim;
188504f65043SSimon Pilgrim; RV32ZBB-LABEL: abd_cmp_i128:
188604f65043SSimon Pilgrim; RV32ZBB:       # %bb.0:
18877afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw a3, 0(a2)
188814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a4, 4(a2)
188914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a5, 8(a2)
189014c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a7, 12(a2)
189114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a6, 8(a1)
18927afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    lw t0, 12(a1)
189314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    lw a2, 0(a1)
189404f65043SSimon Pilgrim; RV32ZBB-NEXT:    lw a1, 4(a1)
189514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t1, a6, a5
18967afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t4, t1
189714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq t0, a7, .LBB22_2
18987afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.1:
189914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t4, t0, a7
19007afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_2:
190114c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t2, a2, a3
19027afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t3, t2
190314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a1, a4, .LBB22_4
19047afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.3:
190514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t3, a1, a4
19067afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_4:
190714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    xor t5, t0, a7
190814c4f28eSAlex Bradbury; RV32ZBB-NEXT:    xor t6, a6, a5
19097afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    or t5, t6, t5
19107afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t3
19117afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    beqz t5, .LBB22_6
19127afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.5:
19137afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t6, t4
19147afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_6:
191514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t4, a3, a2
19167afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    mv t5, t4
191714c4f28eSAlex Bradbury; RV32ZBB-NEXT:    beq a1, a4, .LBB22_8
19187afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.7:
191914c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t5, a4, a1
19207afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_8:
19217afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    bnez t6, .LBB22_10
19227afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  # %bb.9:
192314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sltu t1, a5, a6
192414c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a7, a7, t0
1925*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a5, a6
192614c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a4, a4, a1
1927*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a7, t1
1928*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a7, a5, t5
1929*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a5, t5
1930*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a4, t4
1931*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a6, a7
193214c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a3, a2
19337afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:    j .LBB22_11
19347afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_10:
193514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a7, t0, a7
1936*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a6, a5
1937*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a1, a4
1938*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a6, a7, t1
1939*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sltu a7, a5, t3
1940*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a1, a5, t3
1941*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a5, a4, t2
1942*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sub a4, a6, a7
194314c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sub a2, a2, a3
19447afdc6bdSSimon Pilgrim; RV32ZBB-NEXT:  .LBB22_11:
194514c4f28eSAlex Bradbury; RV32ZBB-NEXT:    sw a2, 0(a0)
1946*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a5, 4(a0)
1947*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a1, 8(a0)
1948*9122c523SPengcheng Wang; RV32ZBB-NEXT:    sw a4, 12(a0)
194904f65043SSimon Pilgrim; RV32ZBB-NEXT:    ret
195004f65043SSimon Pilgrim;
195104f65043SSimon Pilgrim; RV64ZBB-LABEL: abd_cmp_i128:
195204f65043SSimon Pilgrim; RV64ZBB:       # %bb.0:
195304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a0, a2
19547afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    mv a5, a4
19557afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    beq a1, a3, .LBB22_2
195604f65043SSimon Pilgrim; RV64ZBB-NEXT:  # %bb.1:
19577afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sltu a5, a1, a3
195804f65043SSimon Pilgrim; RV64ZBB-NEXT:  .LBB22_2:
19597afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    bnez a5, .LBB22_4
19607afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:  # %bb.3:
19617afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sltu a4, a2, a0
19627afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a3, a1
196304f65043SSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
19647afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a2, a0
19657afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    ret
19667afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:  .LBB22_4:
19677afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a3
19687afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a1, a1, a4
19697afdc6bdSSimon Pilgrim; RV64ZBB-NEXT:    sub a0, a0, a2
197004f65043SSimon Pilgrim; RV64ZBB-NEXT:    ret
197104f65043SSimon Pilgrim  %cmp = icmp ult i128 %a, %b
197204f65043SSimon Pilgrim  %ab = sub i128 %a, %b
197304f65043SSimon Pilgrim  %ba = sub i128 %b, %a
19747afdc6bdSSimon Pilgrim  %sel = select i1 %cmp, i128 %ab, i128 %ba
197504f65043SSimon Pilgrim  ret i128 %sel
197604f65043SSimon Pilgrim}
197704f65043SSimon Pilgrim
197804f65043SSimon Pilgrimdeclare i8 @llvm.abs.i8(i8, i1)
197904f65043SSimon Pilgrimdeclare i16 @llvm.abs.i16(i16, i1)
198004f65043SSimon Pilgrimdeclare i32 @llvm.abs.i32(i32, i1)
198104f65043SSimon Pilgrimdeclare i64 @llvm.abs.i64(i64, i1)
198204f65043SSimon Pilgrimdeclare i128 @llvm.abs.i128(i128, i1)
198304f65043SSimon Pilgrim
198404f65043SSimon Pilgrimdeclare i8 @llvm.umax.i8(i8, i8)
198504f65043SSimon Pilgrimdeclare i16 @llvm.umax.i16(i16, i16)
198604f65043SSimon Pilgrimdeclare i32 @llvm.umax.i32(i32, i32)
198704f65043SSimon Pilgrimdeclare i64 @llvm.umax.i64(i64, i64)
198804f65043SSimon Pilgrim
198904f65043SSimon Pilgrimdeclare i8 @llvm.umin.i8(i8, i8)
199004f65043SSimon Pilgrimdeclare i16 @llvm.umin.i16(i16, i16)
199104f65043SSimon Pilgrimdeclare i32 @llvm.umin.i32(i32, i32)
199204f65043SSimon Pilgrimdeclare i64 @llvm.umin.i64(i64, i64)
1993