xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/subtraction.ll (revision 44a4f9392546649f7d6247af1b816aa1f346dee0)
1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
2
3define signext i8 @func8s(i8 signext %0, i8 signext %1) {
4; CHECK-LABEL: func8s:
5; CHECK:       # %bb.0:
6; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
7; CHECK-NEXT:    sll %s0, %s0, 56
8; CHECK-NEXT:    sra.l %s0, %s0, 56
9; CHECK-NEXT:    b.l.t (, %s10)
10  %3 = sub i8 %0, %1
11  ret i8 %3
12}
13
14define signext i16 @func16s(i16 signext %0, i16 signext %1) {
15; CHECK-LABEL: func16s:
16; CHECK:       # %bb.0:
17; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
18; CHECK-NEXT:    sll %s0, %s0, 48
19; CHECK-NEXT:    sra.l %s0, %s0, 48
20; CHECK-NEXT:    b.l.t (, %s10)
21  %3 = sub i16 %0, %1
22  ret i16 %3
23}
24
25define signext i32 @func32s(i32 signext %0, i32 signext %1) {
26; CHECK-LABEL: func32s:
27; CHECK:       # %bb.0:
28; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
29; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
30; CHECK-NEXT:    b.l.t (, %s10)
31  %3 = sub nsw i32 %0, %1
32  ret i32 %3
33}
34
35define i64 @func64s(i64 %0, i64 %1) {
36; CHECK-LABEL: func64s:
37; CHECK:       # %bb.0:
38; CHECK-NEXT:    subs.l %s0, %s0, %s1
39; CHECK-NEXT:    b.l.t (, %s10)
40  %3 = sub nsw i64 %0, %1
41  ret i64 %3
42}
43
44define i128 @func128s(i128 %0, i128 %1) {
45; CHECK-LABEL: func128s:
46; CHECK:       # %bb.0:
47; CHECK-NEXT:    subs.l %s1, %s1, %s3
48; CHECK-NEXT:    cmpu.l %s3, %s0, %s2
49; CHECK-NEXT:    or %s4, 0, (0)1
50; CHECK-NEXT:    cmov.l.lt %s4, (63)0, %s3
51; CHECK-NEXT:    adds.w.zx %s3, %s4, (0)1
52; CHECK-NEXT:    subs.l %s1, %s1, %s3
53; CHECK-NEXT:    subs.l %s0, %s0, %s2
54; CHECK-NEXT:    b.l.t (, %s10)
55  %3 = sub nsw i128 %0, %1
56  ret i128 %3
57}
58
59define zeroext i8 @func8z(i8 zeroext %0, i8 zeroext %1) {
60; CHECK-LABEL: func8z:
61; CHECK:       # %bb.0:
62; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
63; CHECK-NEXT:    and %s0, %s0, (56)0
64; CHECK-NEXT:    b.l.t (, %s10)
65  %3 = sub i8 %0, %1
66  ret i8 %3
67}
68
69define zeroext i16 @func16z(i16 zeroext %0, i16 zeroext %1) {
70; CHECK-LABEL: func16z:
71; CHECK:       # %bb.0:
72; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
73; CHECK-NEXT:    and %s0, %s0, (48)0
74; CHECK-NEXT:    b.l.t (, %s10)
75  %3 = sub i16 %0, %1
76  ret i16 %3
77}
78
79define zeroext i32 @func32z(i32 zeroext %0, i32 zeroext %1) {
80; CHECK-LABEL: func32z:
81; CHECK:       # %bb.0:
82; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
83; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
84; CHECK-NEXT:    b.l.t (, %s10)
85  %3 = sub i32 %0, %1
86  ret i32 %3
87}
88
89define i64 @func64z(i64 %0, i64 %1) {
90; CHECK-LABEL: func64z:
91; CHECK:       # %bb.0:
92; CHECK-NEXT:    subs.l %s0, %s0, %s1
93; CHECK-NEXT:    b.l.t (, %s10)
94  %3 = sub i64 %0, %1
95  ret i64 %3
96}
97
98define i128 @func128z(i128 %0, i128 %1) {
99; CHECK-LABEL: func128z:
100; CHECK:       # %bb.0:
101; CHECK-NEXT:    subs.l %s1, %s1, %s3
102; CHECK-NEXT:    cmpu.l %s3, %s0, %s2
103; CHECK-NEXT:    or %s4, 0, (0)1
104; CHECK-NEXT:    cmov.l.lt %s4, (63)0, %s3
105; CHECK-NEXT:    adds.w.zx %s3, %s4, (0)1
106; CHECK-NEXT:    subs.l %s1, %s1, %s3
107; CHECK-NEXT:    subs.l %s0, %s0, %s2
108; CHECK-NEXT:    b.l.t (, %s10)
109  %3 = sub i128 %0, %1
110  ret i128 %3
111}
112
113define signext i8 @funci8s(i8 signext %a) {
114; CHECK-LABEL: funci8s:
115; CHECK:       # %bb.0:
116; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
117; CHECK-NEXT:    sll %s0, %s0, 56
118; CHECK-NEXT:    sra.l %s0, %s0, 56
119; CHECK-NEXT:    b.l.t (, %s10)
120  %ret = add i8 %a, -5
121  ret i8 %ret
122}
123
124define signext i16 @funci16s(i16 signext %a) {
125; CHECK-LABEL: funci16s:
126; CHECK:       # %bb.0:
127; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
128; CHECK-NEXT:    sll %s0, %s0, 48
129; CHECK-NEXT:    sra.l %s0, %s0, 48
130; CHECK-NEXT:    b.l.t (, %s10)
131  %ret = add i16 %a, -5
132  ret i16 %ret
133}
134
135define signext i32 @funci32s(i32 signext %a) {
136; CHECK-LABEL: funci32s:
137; CHECK:       # %bb.0:
138; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
139; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
140; CHECK-NEXT:    b.l.t (, %s10)
141  %ret = add i32 %a, -5
142  ret i32 %ret
143}
144
145define i64 @funci64s(i64 %a) {
146; CHECK-LABEL: funci64s:
147; CHECK:       # %bb.0:
148; CHECK-NEXT:    lea %s0, -5(, %s0)
149; CHECK-NEXT:    b.l.t (, %s10)
150  %ret = add nsw i64 %a, -5
151  ret i64 %ret
152}
153
154define i128 @funci128s(i128 %0) {
155; CHECK-LABEL: funci128s:
156; CHECK:       # %bb.0:
157; CHECK-NEXT:    lea %s2, -5(, %s0)
158; CHECK-NEXT:    cmpu.l %s0, %s2, %s0
159; CHECK-NEXT:    or %s3, 0, (0)1
160; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s0
161; CHECK-NEXT:    adds.w.zx %s0, %s3, (0)1
162; CHECK-NEXT:    lea %s1, -1(%s0, %s1)
163; CHECK-NEXT:    or %s0, 0, %s2
164; CHECK-NEXT:    b.l.t (, %s10)
165  %2 = add nsw i128 %0, -5
166  ret i128 %2
167}
168
169define zeroext i8 @funci8z(i8 zeroext %a) {
170; CHECK-LABEL: funci8z:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
173; CHECK-NEXT:    and %s0, %s0, (56)0
174; CHECK-NEXT:    b.l.t (, %s10)
175  %ret = add i8 %a, -5
176  ret i8 %ret
177}
178
179define zeroext i16 @funci16z(i16 zeroext %a) {
180; CHECK-LABEL: funci16z:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
183; CHECK-NEXT:    and %s0, %s0, (48)0
184; CHECK-NEXT:    b.l.t (, %s10)
185  %ret = add i16 %a, -5
186  ret i16 %ret
187}
188
189define zeroext i32 @funci32z(i32 zeroext %a) {
190; CHECK-LABEL: funci32z:
191; CHECK:       # %bb.0:
192; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
193; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
194; CHECK-NEXT:    b.l.t (, %s10)
195  %ret = add i32 %a, -5
196  ret i32 %ret
197}
198
199define i64 @funci64z(i64 %a) {
200; CHECK-LABEL: funci64z:
201; CHECK:       # %bb.0:
202; CHECK-NEXT:    lea %s0, -5(, %s0)
203; CHECK-NEXT:    b.l.t (, %s10)
204  %ret = add i64 %a, -5
205  ret i64 %ret
206}
207
208define i128 @funci128z(i128 %0) {
209; CHECK-LABEL: funci128z:
210; CHECK:       # %bb.0:
211; CHECK-NEXT:    lea %s2, -5(, %s0)
212; CHECK-NEXT:    cmpu.l %s0, %s2, %s0
213; CHECK-NEXT:    or %s3, 0, (0)1
214; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s0
215; CHECK-NEXT:    adds.w.zx %s0, %s3, (0)1
216; CHECK-NEXT:    lea %s1, -1(%s0, %s1)
217; CHECK-NEXT:    or %s0, 0, %s2
218; CHECK-NEXT:    b.l.t (, %s10)
219  %2 = add i128 %0, -5
220  ret i128 %2
221}
222
223define i64 @funci64_2(i64 %a) {
224; CHECK-LABEL: funci64_2:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    lea %s0, -2147483648(, %s0)
227; CHECK-NEXT:    b.l.t (, %s10)
228  %ret = add nsw i64 %a, -2147483648
229  ret i64 %ret
230}
231
232define i128 @funci128_2(i128 %0) {
233; CHECK-LABEL: funci128_2:
234; CHECK:       # %bb.0:
235; CHECK-NEXT:    lea %s2, -2147483648(, %s0)
236; CHECK-NEXT:    cmpu.l %s0, %s2, %s0
237; CHECK-NEXT:    or %s3, 0, (0)1
238; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s0
239; CHECK-NEXT:    adds.w.zx %s0, %s3, (0)1
240; CHECK-NEXT:    lea %s1, -1(%s0, %s1)
241; CHECK-NEXT:    or %s0, 0, %s2
242; CHECK-NEXT:    b.l.t (, %s10)
243  %2 = add nsw i128 %0, -2147483648
244  ret i128 %2
245}
246