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