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:    adds.w.sx %s0, %s1, %s0
7; CHECK-NEXT:    sll %s0, %s0, 56
8; CHECK-NEXT:    sra.l %s0, %s0, 56
9; CHECK-NEXT:    b.l.t (, %s10)
10  %3 = add i8 %1, %0
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:    adds.w.sx %s0, %s1, %s0
18; CHECK-NEXT:    sll %s0, %s0, 48
19; CHECK-NEXT:    sra.l %s0, %s0, 48
20; CHECK-NEXT:    b.l.t (, %s10)
21  %3 = add i16 %1, %0
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:    adds.w.sx %s0, %s1, %s0
29; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
30; CHECK-NEXT:    b.l.t (, %s10)
31  %3 = add nsw i32 %1, %0
32  ret i32 %3
33}
34
35define i64 @func64s(i64 %0, i64 %1) {
36; CHECK-LABEL: func64s:
37; CHECK:       # %bb.0:
38; CHECK-NEXT:    adds.l %s0, %s1, %s0
39; CHECK-NEXT:    b.l.t (, %s10)
40  %3 = add nsw i64 %1, %0
41  ret i64 %3
42}
43
44define i128 @func128s(i128 %0, i128 %1) {
45; CHECK-LABEL: func128s:
46; CHECK:       # %bb.0:
47; CHECK-NEXT:    adds.l %s1, %s3, %s1
48; CHECK-NEXT:    adds.l %s0, %s2, %s0
49; CHECK-NEXT:    cmpu.l %s2, %s0, %s2
50; CHECK-NEXT:    or %s3, 0, (0)1
51; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s2
52; CHECK-NEXT:    adds.w.zx %s2, %s3, (0)1
53; CHECK-NEXT:    adds.l %s1, %s1, %s2
54; CHECK-NEXT:    b.l.t (, %s10)
55  %3 = add nsw i128 %1, %0
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:    adds.w.sx %s0, %s1, %s0
63; CHECK-NEXT:    and %s0, %s0, (56)0
64; CHECK-NEXT:    b.l.t (, %s10)
65  %3 = add i8 %1, %0
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:    adds.w.sx %s0, %s1, %s0
73; CHECK-NEXT:    and %s0, %s0, (48)0
74; CHECK-NEXT:    b.l.t (, %s10)
75  %3 = add i16 %1, %0
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:    adds.w.sx %s0, %s1, %s0
83; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
84; CHECK-NEXT:    b.l.t (, %s10)
85  %3 = add i32 %1, %0
86  ret i32 %3
87}
88
89define i64 @func64z(i64 %0, i64 %1) {
90; CHECK-LABEL: func64z:
91; CHECK:       # %bb.0:
92; CHECK-NEXT:    adds.l %s0, %s1, %s0
93; CHECK-NEXT:    b.l.t (, %s10)
94  %3 = add i64 %1, %0
95  ret i64 %3
96}
97
98define i128 @func128z(i128 %0, i128 %1) {
99; CHECK-LABEL: func128z:
100; CHECK:       # %bb.0:
101; CHECK-NEXT:    adds.l %s1, %s3, %s1
102; CHECK-NEXT:    adds.l %s0, %s2, %s0
103; CHECK-NEXT:    cmpu.l %s2, %s0, %s2
104; CHECK-NEXT:    or %s3, 0, (0)1
105; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s2
106; CHECK-NEXT:    adds.w.zx %s2, %s3, (0)1
107; CHECK-NEXT:    adds.l %s1, %s1, %s2
108; CHECK-NEXT:    b.l.t (, %s10)
109  %3 = add i128 %1, %0
110  ret i128 %3
111}
112
113define signext i8 @funci8s(i8 signext %0) {
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  %2 = add i8 %0, 5
121  ret i8 %2
122}
123
124define signext i16 @funci16s(i16 signext %0) {
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  %2 = add i16 %0, 5
132  ret i16 %2
133}
134
135define signext i32 @funci32s(i32 signext %0) {
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  %2 = add nsw i32 %0, 5
142  ret i32 %2
143}
144
145define i64 @funci64s(i64 %0) {
146; CHECK-LABEL: funci64s:
147; CHECK:       # %bb.0:
148; CHECK-NEXT:    lea %s0, 5(, %s0)
149; CHECK-NEXT:    b.l.t (, %s10)
150  %2 = add nsw i64 %0, 5
151  ret i64 %2
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:    adds.l %s1, %s1, %s0
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 %0) {
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  %2 = add i8 %0, 5
176  ret i8 %2
177}
178
179define zeroext i16 @funci16z(i16 zeroext %0) {
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  %2 = add i16 %0, 5
186  ret i16 %2
187}
188
189define zeroext i32 @funci32z(i32 zeroext %0) {
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  %2 = add i32 %0, 5
196  ret i32 %2
197}
198
199define i64 @funci64z(i64 %0) {
200; CHECK-LABEL: funci64z:
201; CHECK:       # %bb.0:
202; CHECK-NEXT:    lea %s0, 5(, %s0)
203; CHECK-NEXT:    b.l.t (, %s10)
204  %2 = add i64 %0, 5
205  ret i64 %2
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:    adds.l %s1, %s1, %s0
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 %0) {
224; CHECK-LABEL: funci64_2:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    lea %s1, -2147483648
227; CHECK-NEXT:    and %s1, %s1, (32)0
228; CHECK-NEXT:    adds.l %s0, %s0, %s1
229; CHECK-NEXT:    b.l.t (, %s10)
230  %2 = add nsw i64 %0, 2147483648
231  ret i64 %2
232}
233
234define i128 @funci128_2(i128 %0) {
235; CHECK-LABEL: funci128_2:
236; CHECK:       # %bb.0:
237; CHECK-NEXT:    lea %s2, -2147483648
238; CHECK-NEXT:    and %s2, %s2, (32)0
239; CHECK-NEXT:    adds.l %s2, %s0, %s2
240; CHECK-NEXT:    cmpu.l %s0, %s2, %s0
241; CHECK-NEXT:    or %s3, 0, (0)1
242; CHECK-NEXT:    cmov.l.lt %s3, (63)0, %s0
243; CHECK-NEXT:    adds.w.zx %s0, %s3, (0)1
244; CHECK-NEXT:    adds.l %s1, %s1, %s0
245; CHECK-NEXT:    or %s0, 0, %s2
246; CHECK-NEXT:    b.l.t (, %s10)
247  %2 = add nsw i128 %0, 2147483648
248  ret i128 %2
249}
250