xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/smax.ll (revision bc7f11ccb01cbc2ae6c1631535ea5c181f70cb1e)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc < %s -mtriple=ve | FileCheck %s
3
4;;; Test ‘llvm.smax.*’ intrinsic
5;;;
6;;; Syntax:
7;;;   This is an overloaded intrinsic. You can use @llvm.smax on any
8;;;   integer bit width or any vector of integer elements.
9;;;
10;;; declare i32 @llvm.smax.i32(i32 %a, i32 %b)
11;;; declare <4 x i32> @llvm.smax.v4i32(<4 x i32> %a, <4 x i32> %b)
12;;;
13;;; Overview:
14;;;   Return the larger of %a and %b comparing the values as signed
15;;;   integers. Vector intrinsics operate on a per-element basis.
16;;;   The larger element of %a and %b at a given index is returned
17;;;   for that index.
18;;;
19;;; Arguments:
20;;;   The arguments (%a and %b) may be of any integer type or a vector
21;;;   with integer element type. The argument types must match each
22;;;   other, and the return type must match the argument type.
23;;;
24;;; Note:
25;;;   We test only i8/i16/i32/i64/i128.
26
27; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
28define signext i8 @func_smax_var_i8(i8 noundef signext %0, i8 noundef signext %1) {
29; CHECK-LABEL: func_smax_var_i8:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    maxs.w.sx %s0, %s0, %s1
32; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
33; CHECK-NEXT:    b.l.t (, %s10)
34  %3 = tail call i8 @llvm.smax.i8(i8 %0, i8 %1)
35  ret i8 %3
36}
37
38; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
39define signext i16 @func_smax_var_i16(i16 noundef signext %0, i16 noundef signext %1) {
40; CHECK-LABEL: func_smax_var_i16:
41; CHECK:       # %bb.0:
42; CHECK-NEXT:    maxs.w.sx %s0, %s0, %s1
43; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
44; CHECK-NEXT:    b.l.t (, %s10)
45  %3 = tail call i16 @llvm.smax.i16(i16 %0, i16 %1)
46  ret i16 %3
47}
48
49; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
50define signext i32 @func_smax_var_i32(i32 noundef signext %0, i32 noundef signext %1) {
51; CHECK-LABEL: func_smax_var_i32:
52; CHECK:       # %bb.0:
53; CHECK-NEXT:    maxs.w.sx %s0, %s0, %s1
54; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
55; CHECK-NEXT:    b.l.t (, %s10)
56  %3 = tail call i32 @llvm.smax.i32(i32 %0, i32 %1)
57  ret i32 %3
58}
59
60; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
61define i64 @func_smax_var_i64(i64 noundef %0, i64 noundef %1) {
62; CHECK-LABEL: func_smax_var_i64:
63; CHECK:       # %bb.0:
64; CHECK-NEXT:    maxs.l %s0, %s0, %s1
65; CHECK-NEXT:    b.l.t (, %s10)
66  %3 = tail call i64 @llvm.smax.i64(i64 %0, i64 %1)
67  ret i64 %3
68}
69
70; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
71define i128 @func_smax_var_i128(i128 noundef %0, i128 noundef %1) {
72; CHECK-LABEL: func_smax_var_i128:
73; CHECK:       # %bb.0:
74; CHECK-NEXT:    cmpu.l %s4, %s1, %s3
75; CHECK-NEXT:    cmps.l %s5, %s1, %s3
76; CHECK-NEXT:    or %s6, 0, (0)1
77; CHECK-NEXT:    or %s7, 0, (0)1
78; CHECK-NEXT:    cmov.l.gt %s7, (63)0, %s5
79; CHECK-NEXT:    cmpu.l %s5, %s0, %s2
80; CHECK-NEXT:    cmov.l.gt %s6, (63)0, %s5
81; CHECK-NEXT:    cmov.l.eq %s7, %s6, %s4
82; CHECK-NEXT:    cmov.w.ne %s2, %s0, %s7
83; CHECK-NEXT:    cmov.w.ne %s3, %s1, %s7
84; CHECK-NEXT:    or %s0, 0, %s2
85; CHECK-NEXT:    or %s1, 0, %s3
86; CHECK-NEXT:    b.l.t (, %s10)
87  %3 = tail call i128 @llvm.smax.i128(i128 %0, i128 %1)
88  ret i128 %3
89}
90
91; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
92define signext i8 @func_smax_fore_zero_i8(i8 noundef signext %0) {
93; CHECK-LABEL: func_smax_fore_zero_i8:
94; CHECK:       # %bb.0:
95; CHECK-NEXT:    maxs.w.sx %s0, 0, %s0
96; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
97; CHECK-NEXT:    b.l.t (, %s10)
98  %2 = tail call i8 @llvm.smax.i8(i8 %0, i8 0)
99  ret i8 %2
100}
101
102; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
103define signext i16 @func_smax_fore_zero_i16(i16 noundef signext %0) {
104; CHECK-LABEL: func_smax_fore_zero_i16:
105; CHECK:       # %bb.0:
106; CHECK-NEXT:    maxs.w.sx %s0, 0, %s0
107; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
108; CHECK-NEXT:    b.l.t (, %s10)
109  %2 = tail call i16 @llvm.smax.i16(i16 %0, i16 0)
110  ret i16 %2
111}
112
113; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
114define signext i32 @func_smax_fore_zero_i32(i32 noundef signext %0) {
115; CHECK-LABEL: func_smax_fore_zero_i32:
116; CHECK:       # %bb.0:
117; CHECK-NEXT:    maxs.w.sx %s0, 0, %s0
118; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
119; CHECK-NEXT:    b.l.t (, %s10)
120  %2 = tail call i32 @llvm.smax.i32(i32 %0, i32 0)
121  ret i32 %2
122}
123
124; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
125define i64 @func_smax_fore_zero_i64(i64 noundef %0) {
126; CHECK-LABEL: func_smax_fore_zero_i64:
127; CHECK:       # %bb.0:
128; CHECK-NEXT:    maxs.l %s0, 0, %s0
129; CHECK-NEXT:    b.l.t (, %s10)
130  %2 = tail call i64 @llvm.smax.i64(i64 %0, i64 0)
131  ret i64 %2
132}
133
134; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
135define i128 @func_smax_fore_zero_i128(i128 noundef %0) {
136; CHECK-LABEL: func_smax_fore_zero_i128:
137; CHECK:       # %bb.0:
138; CHECK-NEXT:    cmov.l.lt %s0, (0)1, %s1
139; CHECK-NEXT:    maxs.l %s1, 0, %s1
140; CHECK-NEXT:    b.l.t (, %s10)
141  %2 = tail call i128 @llvm.smax.i128(i128 %0, i128 0)
142  ret i128 %2
143}
144
145; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
146define signext i8 @func_smax_back_zero_i8(i8 noundef signext %0) {
147; CHECK-LABEL: func_smax_back_zero_i8:
148; CHECK:       # %bb.0:
149; CHECK-NEXT:    maxs.w.sx %s0, 0, %s0
150; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
151; CHECK-NEXT:    b.l.t (, %s10)
152  %2 = tail call i8 @llvm.smax.i8(i8 %0, i8 0)
153  ret i8 %2
154}
155
156; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
157define signext i16 @func_smax_back_zero_i16(i16 noundef signext %0) {
158; CHECK-LABEL: func_smax_back_zero_i16:
159; CHECK:       # %bb.0:
160; CHECK-NEXT:    maxs.w.sx %s0, 0, %s0
161; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
162; CHECK-NEXT:    b.l.t (, %s10)
163  %2 = tail call i16 @llvm.smax.i16(i16 %0, i16 0)
164  ret i16 %2
165}
166
167; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
168define signext i32 @func_smax_back_zero_i32(i32 noundef signext %0) {
169; CHECK-LABEL: func_smax_back_zero_i32:
170; CHECK:       # %bb.0:
171; CHECK-NEXT:    maxs.w.sx %s0, 0, %s0
172; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
173; CHECK-NEXT:    b.l.t (, %s10)
174  %2 = tail call i32 @llvm.smax.i32(i32 %0, i32 0)
175  ret i32 %2
176}
177
178; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
179define i64 @func_smax_back_zero_i64(i64 noundef %0) {
180; CHECK-LABEL: func_smax_back_zero_i64:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    maxs.l %s0, 0, %s0
183; CHECK-NEXT:    b.l.t (, %s10)
184  %2 = tail call i64 @llvm.smax.i64(i64 %0, i64 0)
185  ret i64 %2
186}
187
188; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
189define i128 @func_smax_back_zero_i128(i128 noundef %0) {
190; CHECK-LABEL: func_smax_back_zero_i128:
191; CHECK:       # %bb.0:
192; CHECK-NEXT:    cmov.l.lt %s0, (0)1, %s1
193; CHECK-NEXT:    maxs.l %s1, 0, %s1
194; CHECK-NEXT:    b.l.t (, %s10)
195  %2 = tail call i128 @llvm.smax.i128(i128 %0, i128 0)
196  ret i128 %2
197}
198
199; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
200define signext i8 @func_smax_fore_const_i8(i8 noundef signext %0) {
201; CHECK-LABEL: func_smax_fore_const_i8:
202; CHECK:       # %bb.0:
203; CHECK-NEXT:    maxs.w.sx %s0, -1, %s0
204; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
205; CHECK-NEXT:    b.l.t (, %s10)
206  %2 = tail call i8 @llvm.smax.i8(i8 %0, i8 -1)
207  ret i8 %2
208}
209
210; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
211define signext i16 @func_smax_fore_const_i16(i16 noundef signext %0) {
212; CHECK-LABEL: func_smax_fore_const_i16:
213; CHECK:       # %bb.0:
214; CHECK-NEXT:    maxs.w.sx %s0, %s0, (56)0
215; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
216; CHECK-NEXT:    b.l.t (, %s10)
217  %2 = tail call i16 @llvm.smax.i16(i16 %0, i16 255)
218  ret i16 %2
219}
220
221; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
222define signext i32 @func_smax_fore_const_i32(i32 noundef signext %0) {
223; CHECK-LABEL: func_smax_fore_const_i32:
224; CHECK:       # %bb.0:
225; CHECK-NEXT:    maxs.w.sx %s0, %s0, (56)0
226; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
227; CHECK-NEXT:    b.l.t (, %s10)
228  %2 = tail call i32 @llvm.smax.i32(i32 %0, i32 255)
229  ret i32 %2
230}
231
232; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
233define i64 @func_smax_fore_const_i64(i64 noundef %0) {
234; CHECK-LABEL: func_smax_fore_const_i64:
235; CHECK:       # %bb.0:
236; CHECK-NEXT:    maxs.l %s0, %s0, (56)0
237; CHECK-NEXT:    b.l.t (, %s10)
238  %2 = tail call i64 @llvm.smax.i64(i64 %0, i64 255)
239  ret i64 %2
240}
241
242; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
243define i128 @func_smax_fore_const_i128(i128 noundef %0) {
244; CHECK-LABEL: func_smax_fore_const_i128:
245; CHECK:       # %bb.0:
246; CHECK-NEXT:    or %s2, 0, (0)1
247; CHECK-NEXT:    cmps.l %s3, %s1, (0)1
248; CHECK-NEXT:    or %s4, 0, (0)1
249; CHECK-NEXT:    cmov.l.gt %s4, (63)0, %s3
250; CHECK-NEXT:    cmpu.l %s3, %s0, (56)0
251; CHECK-NEXT:    cmov.l.gt %s2, (63)0, %s3
252; CHECK-NEXT:    cmov.l.eq %s4, %s2, %s1
253; CHECK-NEXT:    cmov.w.eq %s0, (56)0, %s4
254; CHECK-NEXT:    cmov.w.eq %s1, (0)1, %s4
255; CHECK-NEXT:    b.l.t (, %s10)
256  %2 = tail call i128 @llvm.smax.i128(i128 %0, i128 255)
257  ret i128 %2
258}
259
260; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
261define signext i8 @func_smax_back_const_i8(i8 noundef signext %0) {
262; CHECK-LABEL: func_smax_back_const_i8:
263; CHECK:       # %bb.0:
264; CHECK-NEXT:    maxs.w.sx %s0, -1, %s0
265; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
266; CHECK-NEXT:    b.l.t (, %s10)
267  %2 = tail call i8 @llvm.smax.i8(i8 %0, i8 -1)
268  ret i8 %2
269}
270
271; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
272define signext i16 @func_smax_back_const_i16(i16 noundef signext %0) {
273; CHECK-LABEL: func_smax_back_const_i16:
274; CHECK:       # %bb.0:
275; CHECK-NEXT:    maxs.w.sx %s0, %s0, (56)0
276; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
277; CHECK-NEXT:    b.l.t (, %s10)
278  %2 = tail call i16 @llvm.smax.i16(i16 %0, i16 255)
279  ret i16 %2
280}
281
282; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
283define signext i32 @func_smax_back_const_i32(i32 noundef signext %0) {
284; CHECK-LABEL: func_smax_back_const_i32:
285; CHECK:       # %bb.0:
286; CHECK-NEXT:    maxs.w.sx %s0, %s0, (56)0
287; CHECK-NEXT:    adds.w.zx %s0, %s0, (0)1
288; CHECK-NEXT:    b.l.t (, %s10)
289  %2 = tail call i32 @llvm.smax.i32(i32 %0, i32 255)
290  ret i32 %2
291}
292
293; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
294define i64 @func_smax_back_const_i64(i64 noundef %0) {
295; CHECK-LABEL: func_smax_back_const_i64:
296; CHECK:       # %bb.0:
297; CHECK-NEXT:    maxs.l %s0, %s0, (56)0
298; CHECK-NEXT:    b.l.t (, %s10)
299  %2 = tail call i64 @llvm.smax.i64(i64 %0, i64 255)
300  ret i64 %2
301}
302
303; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
304define i128 @func_smax_back_const_i128(i128 noundef %0) {
305; CHECK-LABEL: func_smax_back_const_i128:
306; CHECK:       # %bb.0:
307; CHECK-NEXT:    or %s2, 0, (0)1
308; CHECK-NEXT:    cmps.l %s3, %s1, (0)1
309; CHECK-NEXT:    or %s4, 0, (0)1
310; CHECK-NEXT:    cmov.l.gt %s4, (63)0, %s3
311; CHECK-NEXT:    cmpu.l %s3, %s0, (56)0
312; CHECK-NEXT:    cmov.l.gt %s2, (63)0, %s3
313; CHECK-NEXT:    cmov.l.eq %s4, %s2, %s1
314; CHECK-NEXT:    cmov.w.eq %s0, (56)0, %s4
315; CHECK-NEXT:    cmov.w.eq %s1, (0)1, %s4
316; CHECK-NEXT:    b.l.t (, %s10)
317  %2 = tail call i128 @llvm.smax.i128(i128 %0, i128 255)
318  ret i128 %2
319}
320
321; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
322declare i32 @llvm.smax.i32(i32, i32)
323
324; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
325declare i8 @llvm.smax.i8(i8, i8)
326
327; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
328declare i16 @llvm.smax.i16(i16, i16)
329
330; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
331declare i64 @llvm.smax.i64(i64, i64)
332
333; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
334declare i128 @llvm.smax.i128(i128, i128)
335