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