xref: /llvm-project/llvm/test/CodeGen/RISCV/usub_sat.ll (revision 86eff6be686a1e41e13c08ebfc2db4dd4d58e7c6)
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