1acfab44eSCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2acfab44eSCraig Topper; RUN: llc < %s -mtriple=riscv32 -mattr=+m | FileCheck %s --check-prefix=RV32I 3acfab44eSCraig Topper; RUN: llc < %s -mtriple=riscv64 -mattr=+m | FileCheck %s --check-prefix=RV64I 433d008b1SAlex Bradbury; RUN: llc < %s -mtriple=riscv32 -mattr=+m,+zbb | FileCheck %s --check-prefix=RV32IZbb 533d008b1SAlex Bradbury; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+zbb | FileCheck %s --check-prefix=RV64IZbb 6acfab44eSCraig Topper 7acfab44eSCraig Topperdeclare i4 @llvm.usub.sat.i4(i4, i4) 8acfab44eSCraig Topperdeclare i8 @llvm.usub.sat.i8(i8, i8) 9acfab44eSCraig Topperdeclare i16 @llvm.usub.sat.i16(i16, i16) 10acfab44eSCraig Topperdeclare i32 @llvm.usub.sat.i32(i32, i32) 11acfab44eSCraig Topperdeclare i64 @llvm.usub.sat.i64(i64, i64) 12acfab44eSCraig Topper 13acfab44eSCraig Topperdefine signext i32 @func(i32 signext %x, i32 signext %y) nounwind { 14acfab44eSCraig Topper; RV32I-LABEL: func: 15acfab44eSCraig Topper; RV32I: # %bb.0: 16acfab44eSCraig Topper; RV32I-NEXT: sub a1, a0, a1 171c41d0cbSPhilip Reames; RV32I-NEXT: sltu a0, a0, a1 181c41d0cbSPhilip Reames; RV32I-NEXT: addi a0, a0, -1 191c41d0cbSPhilip Reames; RV32I-NEXT: and a0, a0, a1 20acfab44eSCraig Topper; RV32I-NEXT: ret 21acfab44eSCraig Topper; 22acfab44eSCraig Topper; RV64I-LABEL: func: 23acfab44eSCraig Topper; RV64I: # %bb.0: 24a33ce06cSCraig Topper; RV64I-NEXT: subw a1, a0, a1 251c41d0cbSPhilip Reames; RV64I-NEXT: sltu a0, a0, a1 261c41d0cbSPhilip Reames; RV64I-NEXT: addi a0, a0, -1 271c41d0cbSPhilip Reames; RV64I-NEXT: and a0, a0, a1 28acfab44eSCraig Topper; RV64I-NEXT: ret 298860f190SCraig Topper; 308860f190SCraig Topper; RV32IZbb-LABEL: func: 318860f190SCraig Topper; RV32IZbb: # %bb.0: 328860f190SCraig Topper; RV32IZbb-NEXT: maxu a0, a0, a1 338860f190SCraig Topper; RV32IZbb-NEXT: sub a0, a0, a1 348860f190SCraig Topper; RV32IZbb-NEXT: ret 358860f190SCraig Topper; 368860f190SCraig Topper; RV64IZbb-LABEL: func: 378860f190SCraig Topper; RV64IZbb: # %bb.0: 38a33ce06cSCraig Topper; RV64IZbb-NEXT: maxu a0, a0, a1 398860f190SCraig Topper; RV64IZbb-NEXT: subw a0, a0, a1 408860f190SCraig Topper; RV64IZbb-NEXT: ret 41acfab44eSCraig Topper %tmp = call i32 @llvm.usub.sat.i32(i32 %x, i32 %y); 42acfab44eSCraig Topper ret i32 %tmp; 43acfab44eSCraig Topper} 44acfab44eSCraig Topper 45acfab44eSCraig Topperdefine i64 @func2(i64 %x, i64 %y) nounwind { 46acfab44eSCraig Topper; RV32I-LABEL: func2: 47acfab44eSCraig Topper; RV32I: # %bb.0: 48acfab44eSCraig Topper; RV32I-NEXT: sltu a4, a0, a2 49acfab44eSCraig Topper; RV32I-NEXT: sub a3, a1, a3 50*86eff6beSPhilip Reames; RV32I-NEXT: sub a3, a3, a4 51acfab44eSCraig Topper; RV32I-NEXT: sub a2, a0, a2 52acfab44eSCraig Topper; RV32I-NEXT: beq a3, a1, .LBB1_2 53acfab44eSCraig Topper; RV32I-NEXT: # %bb.1: 541c41d0cbSPhilip Reames; RV32I-NEXT: sltu a0, a1, a3 55acfab44eSCraig Topper; RV32I-NEXT: j .LBB1_3 56acfab44eSCraig Topper; RV32I-NEXT: .LBB1_2: 571c41d0cbSPhilip Reames; RV32I-NEXT: sltu a0, a0, a2 58acfab44eSCraig Topper; RV32I-NEXT: .LBB1_3: 591c41d0cbSPhilip Reames; RV32I-NEXT: addi a1, a0, -1 601c41d0cbSPhilip Reames; RV32I-NEXT: and a0, a1, a2 611c41d0cbSPhilip Reames; RV32I-NEXT: and a1, a1, a3 62acfab44eSCraig Topper; RV32I-NEXT: ret 63acfab44eSCraig Topper; 64acfab44eSCraig Topper; RV64I-LABEL: func2: 65acfab44eSCraig Topper; RV64I: # %bb.0: 66acfab44eSCraig Topper; RV64I-NEXT: sub a1, a0, a1 671c41d0cbSPhilip Reames; RV64I-NEXT: sltu a0, a0, a1 681c41d0cbSPhilip Reames; RV64I-NEXT: addi a0, a0, -1 691c41d0cbSPhilip Reames; RV64I-NEXT: and a0, a0, a1 70acfab44eSCraig Topper; RV64I-NEXT: ret 718860f190SCraig Topper; 728860f190SCraig Topper; RV32IZbb-LABEL: func2: 738860f190SCraig Topper; RV32IZbb: # %bb.0: 748860f190SCraig Topper; RV32IZbb-NEXT: sltu a4, a0, a2 758860f190SCraig Topper; RV32IZbb-NEXT: sub a3, a1, a3 76*86eff6beSPhilip Reames; RV32IZbb-NEXT: sub a3, a3, a4 778860f190SCraig Topper; RV32IZbb-NEXT: sub a2, a0, a2 788860f190SCraig Topper; RV32IZbb-NEXT: beq a3, a1, .LBB1_2 798860f190SCraig Topper; RV32IZbb-NEXT: # %bb.1: 801c41d0cbSPhilip Reames; RV32IZbb-NEXT: sltu a0, a1, a3 818860f190SCraig Topper; RV32IZbb-NEXT: j .LBB1_3 828860f190SCraig Topper; RV32IZbb-NEXT: .LBB1_2: 831c41d0cbSPhilip Reames; RV32IZbb-NEXT: sltu a0, a0, a2 848860f190SCraig Topper; RV32IZbb-NEXT: .LBB1_3: 851c41d0cbSPhilip Reames; RV32IZbb-NEXT: addi a1, a0, -1 861c41d0cbSPhilip Reames; RV32IZbb-NEXT: and a0, a1, a2 871c41d0cbSPhilip Reames; RV32IZbb-NEXT: and a1, a1, a3 888860f190SCraig Topper; RV32IZbb-NEXT: ret 898860f190SCraig Topper; 908860f190SCraig Topper; RV64IZbb-LABEL: func2: 918860f190SCraig Topper; RV64IZbb: # %bb.0: 928860f190SCraig Topper; RV64IZbb-NEXT: maxu a0, a0, a1 938860f190SCraig Topper; RV64IZbb-NEXT: sub a0, a0, a1 948860f190SCraig Topper; RV64IZbb-NEXT: ret 95acfab44eSCraig Topper %tmp = call i64 @llvm.usub.sat.i64(i64 %x, i64 %y); 96acfab44eSCraig Topper ret i64 %tmp; 97acfab44eSCraig Topper} 98acfab44eSCraig Topper 99acfab44eSCraig Topperdefine zeroext i16 @func16(i16 zeroext %x, i16 zeroext %y) nounwind { 100acfab44eSCraig Topper; RV32I-LABEL: func16: 101acfab44eSCraig Topper; RV32I: # %bb.0: 1020eb405c3SCraig Topper; RV32I-NEXT: sub a1, a0, a1 1031c41d0cbSPhilip Reames; RV32I-NEXT: sltu a0, a0, a1 1041c41d0cbSPhilip Reames; RV32I-NEXT: addi a0, a0, -1 1051c41d0cbSPhilip Reames; RV32I-NEXT: and a0, a0, a1 106acfab44eSCraig Topper; RV32I-NEXT: ret 107acfab44eSCraig Topper; 108acfab44eSCraig Topper; RV64I-LABEL: func16: 109acfab44eSCraig Topper; RV64I: # %bb.0: 1100eb405c3SCraig Topper; RV64I-NEXT: sub a1, a0, a1 1111c41d0cbSPhilip Reames; RV64I-NEXT: sltu a0, a0, a1 1121c41d0cbSPhilip Reames; RV64I-NEXT: addi a0, a0, -1 1131c41d0cbSPhilip Reames; RV64I-NEXT: and a0, a0, a1 114acfab44eSCraig Topper; RV64I-NEXT: ret 1158860f190SCraig Topper; 1168860f190SCraig Topper; RV32IZbb-LABEL: func16: 1178860f190SCraig Topper; RV32IZbb: # %bb.0: 1188860f190SCraig Topper; RV32IZbb-NEXT: maxu a0, a0, a1 1198860f190SCraig Topper; RV32IZbb-NEXT: sub a0, a0, a1 1208860f190SCraig Topper; RV32IZbb-NEXT: ret 1218860f190SCraig Topper; 1228860f190SCraig Topper; RV64IZbb-LABEL: func16: 1238860f190SCraig Topper; RV64IZbb: # %bb.0: 1248860f190SCraig Topper; RV64IZbb-NEXT: maxu a0, a0, a1 1258860f190SCraig Topper; RV64IZbb-NEXT: sub a0, a0, a1 1268860f190SCraig Topper; RV64IZbb-NEXT: ret 127acfab44eSCraig Topper %tmp = call i16 @llvm.usub.sat.i16(i16 %x, i16 %y); 128acfab44eSCraig Topper ret i16 %tmp; 129acfab44eSCraig Topper} 130acfab44eSCraig Topper 131acfab44eSCraig Topperdefine zeroext i8 @func8(i8 zeroext %x, i8 zeroext %y) nounwind { 132acfab44eSCraig Topper; RV32I-LABEL: func8: 133acfab44eSCraig Topper; RV32I: # %bb.0: 134acfab44eSCraig Topper; RV32I-NEXT: sub a1, a0, a1 1351c41d0cbSPhilip Reames; RV32I-NEXT: sltu a0, a0, a1 1361c41d0cbSPhilip Reames; RV32I-NEXT: addi a0, a0, -1 1371c41d0cbSPhilip Reames; RV32I-NEXT: and a0, a0, a1 138acfab44eSCraig Topper; RV32I-NEXT: ret 139acfab44eSCraig Topper; 140acfab44eSCraig Topper; RV64I-LABEL: func8: 141acfab44eSCraig Topper; RV64I: # %bb.0: 142acfab44eSCraig Topper; RV64I-NEXT: sub a1, a0, a1 1431c41d0cbSPhilip Reames; RV64I-NEXT: sltu a0, a0, a1 1441c41d0cbSPhilip Reames; RV64I-NEXT: addi a0, a0, -1 1451c41d0cbSPhilip Reames; RV64I-NEXT: and a0, a0, a1 146acfab44eSCraig Topper; RV64I-NEXT: ret 1478860f190SCraig Topper; 1488860f190SCraig Topper; RV32IZbb-LABEL: func8: 1498860f190SCraig Topper; RV32IZbb: # %bb.0: 1508860f190SCraig Topper; RV32IZbb-NEXT: maxu a0, a0, a1 1518860f190SCraig Topper; RV32IZbb-NEXT: sub a0, a0, a1 1528860f190SCraig Topper; RV32IZbb-NEXT: ret 1538860f190SCraig Topper; 1548860f190SCraig Topper; RV64IZbb-LABEL: func8: 1558860f190SCraig Topper; RV64IZbb: # %bb.0: 1568860f190SCraig Topper; RV64IZbb-NEXT: maxu a0, a0, a1 1578860f190SCraig Topper; RV64IZbb-NEXT: sub a0, a0, a1 1588860f190SCraig Topper; RV64IZbb-NEXT: ret 159acfab44eSCraig Topper %tmp = call i8 @llvm.usub.sat.i8(i8 %x, i8 %y); 160acfab44eSCraig Topper ret i8 %tmp; 161acfab44eSCraig Topper} 162acfab44eSCraig Topper 163acfab44eSCraig Topperdefine zeroext i4 @func3(i4 zeroext %x, i4 zeroext %y) nounwind { 164acfab44eSCraig Topper; RV32I-LABEL: func3: 165acfab44eSCraig Topper; RV32I: # %bb.0: 166acfab44eSCraig Topper; RV32I-NEXT: sub a1, a0, a1 1671c41d0cbSPhilip Reames; RV32I-NEXT: sltu a0, a0, a1 1681c41d0cbSPhilip Reames; RV32I-NEXT: addi a0, a0, -1 1691c41d0cbSPhilip Reames; RV32I-NEXT: and a0, a0, a1 170acfab44eSCraig Topper; RV32I-NEXT: ret 171acfab44eSCraig Topper; 172acfab44eSCraig Topper; RV64I-LABEL: func3: 173acfab44eSCraig Topper; RV64I: # %bb.0: 174acfab44eSCraig Topper; RV64I-NEXT: sub a1, a0, a1 1751c41d0cbSPhilip Reames; RV64I-NEXT: sltu a0, a0, a1 1761c41d0cbSPhilip Reames; RV64I-NEXT: addi a0, a0, -1 1771c41d0cbSPhilip Reames; RV64I-NEXT: and a0, a0, a1 178acfab44eSCraig Topper; RV64I-NEXT: ret 1798860f190SCraig Topper; 1808860f190SCraig Topper; RV32IZbb-LABEL: func3: 1818860f190SCraig Topper; RV32IZbb: # %bb.0: 1828860f190SCraig Topper; RV32IZbb-NEXT: maxu a0, a0, a1 1838860f190SCraig Topper; RV32IZbb-NEXT: sub a0, a0, a1 1848860f190SCraig Topper; RV32IZbb-NEXT: ret 1858860f190SCraig Topper; 1868860f190SCraig Topper; RV64IZbb-LABEL: func3: 1878860f190SCraig Topper; RV64IZbb: # %bb.0: 1888860f190SCraig Topper; RV64IZbb-NEXT: maxu a0, a0, a1 1898860f190SCraig Topper; RV64IZbb-NEXT: sub a0, a0, a1 1908860f190SCraig Topper; RV64IZbb-NEXT: ret 191acfab44eSCraig Topper %tmp = call i4 @llvm.usub.sat.i4(i4 %x, i4 %y); 192acfab44eSCraig Topper ret i4 %tmp; 193acfab44eSCraig Topper} 194