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.uadd.sat.i4(i4, i4) 8acfab44eSCraig Topperdeclare i8 @llvm.uadd.sat.i8(i8, i8) 9acfab44eSCraig Topperdeclare i16 @llvm.uadd.sat.i16(i16, i16) 10acfab44eSCraig Topperdeclare i32 @llvm.uadd.sat.i32(i32, i32) 11acfab44eSCraig Topperdeclare i64 @llvm.uadd.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: add a1, a0, a1 1779f0413eSPhilip Reames; RV32I-NEXT: sltu a0, a1, a0 1879f0413eSPhilip Reames; RV32I-NEXT: neg a0, a0 1979f0413eSPhilip Reames; RV32I-NEXT: or a0, a0, a1 20acfab44eSCraig Topper; RV32I-NEXT: ret 21acfab44eSCraig Topper; 22acfab44eSCraig Topper; RV64I-LABEL: func: 23acfab44eSCraig Topper; RV64I: # %bb.0: 24a33ce06cSCraig Topper; RV64I-NEXT: addw a1, a0, a1 2579f0413eSPhilip Reames; RV64I-NEXT: sltu a0, a1, a0 2679f0413eSPhilip Reames; RV64I-NEXT: neg a0, a0 2779f0413eSPhilip Reames; RV64I-NEXT: or a0, a0, a1 28acfab44eSCraig Topper; RV64I-NEXT: ret 298860f190SCraig Topper; 308860f190SCraig Topper; RV32IZbb-LABEL: func: 318860f190SCraig Topper; RV32IZbb: # %bb.0: 328860f190SCraig Topper; RV32IZbb-NEXT: not a2, a1 338860f190SCraig Topper; RV32IZbb-NEXT: minu a0, a0, a2 348860f190SCraig Topper; RV32IZbb-NEXT: add a0, a0, a1 358860f190SCraig Topper; RV32IZbb-NEXT: ret 368860f190SCraig Topper; 378860f190SCraig Topper; RV64IZbb-LABEL: func: 388860f190SCraig Topper; RV64IZbb: # %bb.0: 39a33ce06cSCraig Topper; RV64IZbb-NEXT: not a2, a1 40a33ce06cSCraig Topper; RV64IZbb-NEXT: minu a0, a0, a2 41a33ce06cSCraig Topper; RV64IZbb-NEXT: addw a0, a0, a1 428860f190SCraig Topper; RV64IZbb-NEXT: ret 43acfab44eSCraig Topper %tmp = call i32 @llvm.uadd.sat.i32(i32 %x, i32 %y); 44acfab44eSCraig Topper ret i32 %tmp; 45acfab44eSCraig Topper} 46acfab44eSCraig Topper 47acfab44eSCraig Topperdefine i64 @func2(i64 %x, i64 %y) nounwind { 48acfab44eSCraig Topper; RV32I-LABEL: func2: 49acfab44eSCraig Topper; RV32I: # %bb.0: 50*86eff6beSPhilip Reames; RV32I-NEXT: add a3, a1, a3 51acfab44eSCraig Topper; RV32I-NEXT: add a2, a0, a2 5279f0413eSPhilip Reames; RV32I-NEXT: sltu a0, a2, a0 5379f0413eSPhilip Reames; RV32I-NEXT: add a3, a3, a0 54acfab44eSCraig Topper; RV32I-NEXT: beq a3, a1, .LBB1_2 55acfab44eSCraig Topper; RV32I-NEXT: # %bb.1: 5679f0413eSPhilip Reames; RV32I-NEXT: sltu a0, a3, a1 57acfab44eSCraig Topper; RV32I-NEXT: .LBB1_2: 58e68b0d58SCraig Topper; RV32I-NEXT: neg a1, a0 5979f0413eSPhilip Reames; RV32I-NEXT: or a0, a1, a2 6079f0413eSPhilip Reames; RV32I-NEXT: or a1, a1, a3 61acfab44eSCraig Topper; RV32I-NEXT: ret 62acfab44eSCraig Topper; 63acfab44eSCraig Topper; RV64I-LABEL: func2: 64acfab44eSCraig Topper; RV64I: # %bb.0: 65acfab44eSCraig Topper; RV64I-NEXT: add a1, a0, a1 6679f0413eSPhilip Reames; RV64I-NEXT: sltu a0, a1, a0 6779f0413eSPhilip Reames; RV64I-NEXT: neg a0, a0 6879f0413eSPhilip Reames; RV64I-NEXT: or a0, a0, a1 69acfab44eSCraig Topper; RV64I-NEXT: ret 708860f190SCraig Topper; 718860f190SCraig Topper; RV32IZbb-LABEL: func2: 728860f190SCraig Topper; RV32IZbb: # %bb.0: 73*86eff6beSPhilip Reames; RV32IZbb-NEXT: add a3, a1, a3 748860f190SCraig Topper; RV32IZbb-NEXT: add a2, a0, a2 7579f0413eSPhilip Reames; RV32IZbb-NEXT: sltu a0, a2, a0 7679f0413eSPhilip Reames; RV32IZbb-NEXT: add a3, a3, a0 778860f190SCraig Topper; RV32IZbb-NEXT: beq a3, a1, .LBB1_2 788860f190SCraig Topper; RV32IZbb-NEXT: # %bb.1: 7979f0413eSPhilip Reames; RV32IZbb-NEXT: sltu a0, a3, a1 808860f190SCraig Topper; RV32IZbb-NEXT: .LBB1_2: 81e68b0d58SCraig Topper; RV32IZbb-NEXT: neg a1, a0 8279f0413eSPhilip Reames; RV32IZbb-NEXT: or a0, a1, a2 8379f0413eSPhilip Reames; RV32IZbb-NEXT: or a1, a1, a3 848860f190SCraig Topper; RV32IZbb-NEXT: ret 858860f190SCraig Topper; 868860f190SCraig Topper; RV64IZbb-LABEL: func2: 878860f190SCraig Topper; RV64IZbb: # %bb.0: 888860f190SCraig Topper; RV64IZbb-NEXT: not a2, a1 898860f190SCraig Topper; RV64IZbb-NEXT: minu a0, a0, a2 908860f190SCraig Topper; RV64IZbb-NEXT: add a0, a0, a1 918860f190SCraig Topper; RV64IZbb-NEXT: ret 92acfab44eSCraig Topper %tmp = call i64 @llvm.uadd.sat.i64(i64 %x, i64 %y); 93acfab44eSCraig Topper ret i64 %tmp; 94acfab44eSCraig Topper} 95acfab44eSCraig Topper 96acfab44eSCraig Topperdefine zeroext i16 @func16(i16 zeroext %x, i16 zeroext %y) nounwind { 97acfab44eSCraig Topper; RV32I-LABEL: func16: 98acfab44eSCraig Topper; RV32I: # %bb.0: 99acfab44eSCraig Topper; RV32I-NEXT: add a0, a0, a1 100acfab44eSCraig Topper; RV32I-NEXT: lui a1, 16 101acfab44eSCraig Topper; RV32I-NEXT: addi a1, a1, -1 102acfab44eSCraig Topper; RV32I-NEXT: bltu a0, a1, .LBB2_2 103acfab44eSCraig Topper; RV32I-NEXT: # %bb.1: 104acfab44eSCraig Topper; RV32I-NEXT: mv a0, a1 105acfab44eSCraig Topper; RV32I-NEXT: .LBB2_2: 106acfab44eSCraig Topper; RV32I-NEXT: ret 107acfab44eSCraig Topper; 108acfab44eSCraig Topper; RV64I-LABEL: func16: 109acfab44eSCraig Topper; RV64I: # %bb.0: 110acfab44eSCraig Topper; RV64I-NEXT: add a0, a0, a1 111acfab44eSCraig Topper; RV64I-NEXT: lui a1, 16 112acfab44eSCraig Topper; RV64I-NEXT: addiw a1, a1, -1 113acfab44eSCraig Topper; RV64I-NEXT: bltu a0, a1, .LBB2_2 114acfab44eSCraig Topper; RV64I-NEXT: # %bb.1: 115acfab44eSCraig Topper; RV64I-NEXT: mv a0, a1 116acfab44eSCraig Topper; RV64I-NEXT: .LBB2_2: 117acfab44eSCraig Topper; RV64I-NEXT: ret 1188860f190SCraig Topper; 1198860f190SCraig Topper; RV32IZbb-LABEL: func16: 1208860f190SCraig Topper; RV32IZbb: # %bb.0: 1218860f190SCraig Topper; RV32IZbb-NEXT: add a0, a0, a1 1228860f190SCraig Topper; RV32IZbb-NEXT: lui a1, 16 1238860f190SCraig Topper; RV32IZbb-NEXT: addi a1, a1, -1 1248860f190SCraig Topper; RV32IZbb-NEXT: minu a0, a0, a1 1258860f190SCraig Topper; RV32IZbb-NEXT: ret 1268860f190SCraig Topper; 1278860f190SCraig Topper; RV64IZbb-LABEL: func16: 1288860f190SCraig Topper; RV64IZbb: # %bb.0: 1298860f190SCraig Topper; RV64IZbb-NEXT: add a0, a0, a1 1308860f190SCraig Topper; RV64IZbb-NEXT: lui a1, 16 1318860f190SCraig Topper; RV64IZbb-NEXT: addiw a1, a1, -1 1328860f190SCraig Topper; RV64IZbb-NEXT: minu a0, a0, a1 1338860f190SCraig Topper; RV64IZbb-NEXT: ret 134acfab44eSCraig Topper %tmp = call i16 @llvm.uadd.sat.i16(i16 %x, i16 %y); 135acfab44eSCraig Topper ret i16 %tmp; 136acfab44eSCraig Topper} 137acfab44eSCraig Topper 138acfab44eSCraig Topperdefine zeroext i8 @func8(i8 zeroext %x, i8 zeroext %y) nounwind { 139acfab44eSCraig Topper; RV32I-LABEL: func8: 140acfab44eSCraig Topper; RV32I: # %bb.0: 141acfab44eSCraig Topper; RV32I-NEXT: add a0, a0, a1 142af0ecfccSwangpc; RV32I-NEXT: li a1, 255 143acfab44eSCraig Topper; RV32I-NEXT: bltu a0, a1, .LBB3_2 144acfab44eSCraig Topper; RV32I-NEXT: # %bb.1: 145af0ecfccSwangpc; RV32I-NEXT: li a0, 255 146acfab44eSCraig Topper; RV32I-NEXT: .LBB3_2: 147acfab44eSCraig Topper; RV32I-NEXT: ret 148acfab44eSCraig Topper; 149acfab44eSCraig Topper; RV64I-LABEL: func8: 150acfab44eSCraig Topper; RV64I: # %bb.0: 151acfab44eSCraig Topper; RV64I-NEXT: add a0, a0, a1 152af0ecfccSwangpc; RV64I-NEXT: li a1, 255 153acfab44eSCraig Topper; RV64I-NEXT: bltu a0, a1, .LBB3_2 154acfab44eSCraig Topper; RV64I-NEXT: # %bb.1: 155af0ecfccSwangpc; RV64I-NEXT: li a0, 255 156acfab44eSCraig Topper; RV64I-NEXT: .LBB3_2: 157acfab44eSCraig Topper; RV64I-NEXT: ret 1588860f190SCraig Topper; 1598860f190SCraig Topper; RV32IZbb-LABEL: func8: 1608860f190SCraig Topper; RV32IZbb: # %bb.0: 1618860f190SCraig Topper; RV32IZbb-NEXT: add a0, a0, a1 162af0ecfccSwangpc; RV32IZbb-NEXT: li a1, 255 1638860f190SCraig Topper; RV32IZbb-NEXT: minu a0, a0, a1 1648860f190SCraig Topper; RV32IZbb-NEXT: ret 1658860f190SCraig Topper; 1668860f190SCraig Topper; RV64IZbb-LABEL: func8: 1678860f190SCraig Topper; RV64IZbb: # %bb.0: 1688860f190SCraig Topper; RV64IZbb-NEXT: add a0, a0, a1 169af0ecfccSwangpc; RV64IZbb-NEXT: li a1, 255 1708860f190SCraig Topper; RV64IZbb-NEXT: minu a0, a0, a1 1718860f190SCraig Topper; RV64IZbb-NEXT: ret 172acfab44eSCraig Topper %tmp = call i8 @llvm.uadd.sat.i8(i8 %x, i8 %y); 173acfab44eSCraig Topper ret i8 %tmp; 174acfab44eSCraig Topper} 175acfab44eSCraig Topper 176acfab44eSCraig Topperdefine zeroext i4 @func3(i4 zeroext %x, i4 zeroext %y) nounwind { 177acfab44eSCraig Topper; RV32I-LABEL: func3: 178acfab44eSCraig Topper; RV32I: # %bb.0: 179acfab44eSCraig Topper; RV32I-NEXT: add a0, a0, a1 180af0ecfccSwangpc; RV32I-NEXT: li a1, 15 181acfab44eSCraig Topper; RV32I-NEXT: bltu a0, a1, .LBB4_2 182acfab44eSCraig Topper; RV32I-NEXT: # %bb.1: 183af0ecfccSwangpc; RV32I-NEXT: li a0, 15 184acfab44eSCraig Topper; RV32I-NEXT: .LBB4_2: 185acfab44eSCraig Topper; RV32I-NEXT: ret 186acfab44eSCraig Topper; 187acfab44eSCraig Topper; RV64I-LABEL: func3: 188acfab44eSCraig Topper; RV64I: # %bb.0: 189acfab44eSCraig Topper; RV64I-NEXT: add a0, a0, a1 190af0ecfccSwangpc; RV64I-NEXT: li a1, 15 191acfab44eSCraig Topper; RV64I-NEXT: bltu a0, a1, .LBB4_2 192acfab44eSCraig Topper; RV64I-NEXT: # %bb.1: 193af0ecfccSwangpc; RV64I-NEXT: li a0, 15 194acfab44eSCraig Topper; RV64I-NEXT: .LBB4_2: 195acfab44eSCraig Topper; RV64I-NEXT: ret 1968860f190SCraig Topper; 1978860f190SCraig Topper; RV32IZbb-LABEL: func3: 1988860f190SCraig Topper; RV32IZbb: # %bb.0: 1998860f190SCraig Topper; RV32IZbb-NEXT: add a0, a0, a1 200af0ecfccSwangpc; RV32IZbb-NEXT: li a1, 15 2018860f190SCraig Topper; RV32IZbb-NEXT: minu a0, a0, a1 2028860f190SCraig Topper; RV32IZbb-NEXT: ret 2038860f190SCraig Topper; 2048860f190SCraig Topper; RV64IZbb-LABEL: func3: 2058860f190SCraig Topper; RV64IZbb: # %bb.0: 2068860f190SCraig Topper; RV64IZbb-NEXT: add a0, a0, a1 207af0ecfccSwangpc; RV64IZbb-NEXT: li a1, 15 2088860f190SCraig Topper; RV64IZbb-NEXT: minu a0, a0, a1 2098860f190SCraig Topper; RV64IZbb-NEXT: ret 210acfab44eSCraig Topper %tmp = call i4 @llvm.uadd.sat.i4(i4 %x, i4 %y); 211acfab44eSCraig Topper ret i4 %tmp; 212acfab44eSCraig Topper} 213