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