xref: /llvm-project/llvm/test/CodeGen/RISCV/uadd_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.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