xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/smin.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.smin.*’ intrinsic
5;;;
6;;; Syntax:
7;;;   This is an overloaded intrinsic. You can use @llvm.smin on any
8;;;   integer bit width or any vector of integer elements.
9;;;
10;;; declare i32 @llvm.smin.i32(i32 %a, i32 %b)
11;;; declare <4 x i32> @llvm.smin.v4i32(<4 x i32> %a, <4 x i32> %b)
12;;;
13;;; Overview:
14;;;   Return the smaller of %a and %b comparing the values as signed
15;;;   integers. Vector intrinsics operate on a per-element basis.
16;;;   The smaller 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_smin_var_i8(i8 noundef signext %0, i8 noundef signext %1) {
29; CHECK-LABEL: func_smin_var_i8:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    mins.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.smin.i8(i8 %0, i8 %1)
35  ret i8 %3
36}
37
38; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
39define signext i16 @func_smin_var_i16(i16 noundef signext %0, i16 noundef signext %1) {
40; CHECK-LABEL: func_smin_var_i16:
41; CHECK:       # %bb.0:
42; CHECK-NEXT:    mins.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.smin.i16(i16 %0, i16 %1)
46  ret i16 %3
47}
48
49; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
50define signext i32 @func_smin_var_i32(i32 noundef signext %0, i32 noundef signext %1) {
51; CHECK-LABEL: func_smin_var_i32:
52; CHECK:       # %bb.0:
53; CHECK-NEXT:    mins.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.smin.i32(i32 %0, i32 %1)
57  ret i32 %3
58}
59
60; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
61define i64 @func_smin_var_i64(i64 noundef %0, i64 noundef %1) {
62; CHECK-LABEL: func_smin_var_i64:
63; CHECK:       # %bb.0:
64; CHECK-NEXT:    mins.l %s0, %s0, %s1
65; CHECK-NEXT:    b.l.t (, %s10)
66  %3 = tail call i64 @llvm.smin.i64(i64 %0, i64 %1)
67  ret i64 %3
68}
69
70; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
71define i128 @func_smin_var_i128(i128 noundef %0, i128 noundef %1) {
72; CHECK-LABEL: func_smin_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.lt %s7, (63)0, %s5
79; CHECK-NEXT:    cmpu.l %s5, %s0, %s2
80; CHECK-NEXT:    cmov.l.lt %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.smin.i128(i128 %0, i128 %1)
88  ret i128 %3
89}
90
91; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
92define signext i8 @func_smin_fore_zero_i8(i8 noundef signext %0) {
93; CHECK-LABEL: func_smin_fore_zero_i8:
94; CHECK:       # %bb.0:
95; CHECK-NEXT:    mins.w.sx %s0, 0, %s0
96; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
97; CHECK-NEXT:    b.l.t (, %s10)
98  %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 0)
99  ret i8 %2
100}
101
102; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
103define signext i16 @func_smin_fore_zero_i16(i16 noundef signext %0) {
104; CHECK-LABEL: func_smin_fore_zero_i16:
105; CHECK:       # %bb.0:
106; CHECK-NEXT:    mins.w.sx %s0, 0, %s0
107; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
108; CHECK-NEXT:    b.l.t (, %s10)
109  %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 0)
110  ret i16 %2
111}
112
113; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
114define signext i32 @func_smin_fore_zero_i32(i32 noundef signext %0) {
115; CHECK-LABEL: func_smin_fore_zero_i32:
116; CHECK:       # %bb.0:
117; CHECK-NEXT:    mins.w.sx %s0, 0, %s0
118; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
119; CHECK-NEXT:    b.l.t (, %s10)
120  %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 0)
121  ret i32 %2
122}
123
124; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
125define i64 @func_smin_fore_zero_i64(i64 noundef %0) {
126; CHECK-LABEL: func_smin_fore_zero_i64:
127; CHECK:       # %bb.0:
128; CHECK-NEXT:    mins.l %s0, 0, %s0
129; CHECK-NEXT:    b.l.t (, %s10)
130  %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 0)
131  ret i64 %2
132}
133
134; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
135define i128 @func_smin_fore_zero_i128(i128 noundef %0) {
136; CHECK-LABEL: func_smin_fore_zero_i128:
137; CHECK:       # %bb.0:
138; CHECK-NEXT:    sra.l %s2, %s1, 63
139; CHECK-NEXT:    and %s0, %s2, %s0
140; CHECK-NEXT:    and %s1, %s2, %s1
141; CHECK-NEXT:    b.l.t (, %s10)
142  %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 0)
143  ret i128 %2
144}
145
146; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
147define signext i8 @func_smin_back_zero_i8(i8 noundef signext %0) {
148; CHECK-LABEL: func_smin_back_zero_i8:
149; CHECK:       # %bb.0:
150; CHECK-NEXT:    mins.w.sx %s0, 0, %s0
151; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
152; CHECK-NEXT:    b.l.t (, %s10)
153  %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 0)
154  ret i8 %2
155}
156
157; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
158define signext i16 @func_smin_back_zero_i16(i16 noundef signext %0) {
159; CHECK-LABEL: func_smin_back_zero_i16:
160; CHECK:       # %bb.0:
161; CHECK-NEXT:    mins.w.sx %s0, 0, %s0
162; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
163; CHECK-NEXT:    b.l.t (, %s10)
164  %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 0)
165  ret i16 %2
166}
167
168; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
169define signext i32 @func_smin_back_zero_i32(i32 noundef signext %0) {
170; CHECK-LABEL: func_smin_back_zero_i32:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    mins.w.sx %s0, 0, %s0
173; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
174; CHECK-NEXT:    b.l.t (, %s10)
175  %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 0)
176  ret i32 %2
177}
178
179; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
180define i64 @func_smin_back_zero_i64(i64 noundef %0) {
181; CHECK-LABEL: func_smin_back_zero_i64:
182; CHECK:       # %bb.0:
183; CHECK-NEXT:    mins.l %s0, 0, %s0
184; CHECK-NEXT:    b.l.t (, %s10)
185  %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 0)
186  ret i64 %2
187}
188
189; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
190define i128 @func_smin_back_zero_i128(i128 noundef %0) {
191; CHECK-LABEL: func_smin_back_zero_i128:
192; CHECK:       # %bb.0:
193; CHECK-NEXT:    sra.l %s2, %s1, 63
194; CHECK-NEXT:    and %s0, %s2, %s0
195; CHECK-NEXT:    and %s1, %s2, %s1
196; CHECK-NEXT:    b.l.t (, %s10)
197  %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 0)
198  ret i128 %2
199}
200
201; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
202define signext i8 @func_smin_fore_const_i8(i8 noundef signext %0) {
203; CHECK-LABEL: func_smin_fore_const_i8:
204; CHECK:       # %bb.0:
205; CHECK-NEXT:    mins.w.sx %s0, -1, %s0
206; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
207; CHECK-NEXT:    b.l.t (, %s10)
208  %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 -1)
209  ret i8 %2
210}
211
212; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
213define signext i16 @func_smin_fore_const_i16(i16 noundef signext %0) {
214; CHECK-LABEL: func_smin_fore_const_i16:
215; CHECK:       # %bb.0:
216; CHECK-NEXT:    mins.w.sx %s0, %s0, (56)0
217; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
218; CHECK-NEXT:    b.l.t (, %s10)
219  %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 255)
220  ret i16 %2
221}
222
223; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
224define signext i32 @func_smin_fore_const_i32(i32 noundef signext %0) {
225; CHECK-LABEL: func_smin_fore_const_i32:
226; CHECK:       # %bb.0:
227; CHECK-NEXT:    mins.w.sx %s0, %s0, (56)0
228; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
229; CHECK-NEXT:    b.l.t (, %s10)
230  %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 255)
231  ret i32 %2
232}
233
234; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
235define i64 @func_smin_fore_const_i64(i64 noundef %0) {
236; CHECK-LABEL: func_smin_fore_const_i64:
237; CHECK:       # %bb.0:
238; CHECK-NEXT:    mins.l %s0, %s0, (56)0
239; CHECK-NEXT:    b.l.t (, %s10)
240  %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 255)
241  ret i64 %2
242}
243
244; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
245define i128 @func_smin_fore_const_i128(i128 noundef %0) {
246; CHECK-LABEL: func_smin_fore_const_i128:
247; CHECK:       # %bb.0:
248; CHECK-NEXT:    or %s2, 0, (0)1
249; CHECK-NEXT:    cmps.l %s3, %s1, (0)1
250; CHECK-NEXT:    or %s4, 0, (0)1
251; CHECK-NEXT:    cmov.l.lt %s4, (63)0, %s3
252; CHECK-NEXT:    cmpu.l %s3, %s0, (56)0
253; CHECK-NEXT:    cmov.l.lt %s2, (63)0, %s3
254; CHECK-NEXT:    cmov.l.eq %s4, %s2, %s1
255; CHECK-NEXT:    cmov.w.eq %s0, (56)0, %s4
256; CHECK-NEXT:    cmov.w.eq %s1, (0)1, %s4
257; CHECK-NEXT:    b.l.t (, %s10)
258  %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 255)
259  ret i128 %2
260}
261
262; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
263define signext i8 @func_smin_back_const_i8(i8 noundef signext %0) {
264; CHECK-LABEL: func_smin_back_const_i8:
265; CHECK:       # %bb.0:
266; CHECK-NEXT:    mins.w.sx %s0, -1, %s0
267; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
268; CHECK-NEXT:    b.l.t (, %s10)
269  %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 -1)
270  ret i8 %2
271}
272
273; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
274define signext i16 @func_smin_back_const_i16(i16 noundef signext %0) {
275; CHECK-LABEL: func_smin_back_const_i16:
276; CHECK:       # %bb.0:
277; CHECK-NEXT:    mins.w.sx %s0, %s0, (56)0
278; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
279; CHECK-NEXT:    b.l.t (, %s10)
280  %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 255)
281  ret i16 %2
282}
283
284; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
285define signext i32 @func_smin_back_const_i32(i32 noundef signext %0) {
286; CHECK-LABEL: func_smin_back_const_i32:
287; CHECK:       # %bb.0:
288; CHECK-NEXT:    mins.w.sx %s0, %s0, (56)0
289; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
290; CHECK-NEXT:    b.l.t (, %s10)
291  %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 255)
292  ret i32 %2
293}
294
295; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
296define i64 @func_smin_back_const_i64(i64 noundef %0) {
297; CHECK-LABEL: func_smin_back_const_i64:
298; CHECK:       # %bb.0:
299; CHECK-NEXT:    mins.l %s0, %s0, (56)0
300; CHECK-NEXT:    b.l.t (, %s10)
301  %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 255)
302  ret i64 %2
303}
304
305; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn
306define i128 @func_smin_back_const_i128(i128 noundef %0) {
307; CHECK-LABEL: func_smin_back_const_i128:
308; CHECK:       # %bb.0:
309; CHECK-NEXT:    or %s2, 0, (0)1
310; CHECK-NEXT:    cmps.l %s3, %s1, (0)1
311; CHECK-NEXT:    or %s4, 0, (0)1
312; CHECK-NEXT:    cmov.l.lt %s4, (63)0, %s3
313; CHECK-NEXT:    cmpu.l %s3, %s0, (56)0
314; CHECK-NEXT:    cmov.l.lt %s2, (63)0, %s3
315; CHECK-NEXT:    cmov.l.eq %s4, %s2, %s1
316; CHECK-NEXT:    cmov.w.eq %s0, (56)0, %s4
317; CHECK-NEXT:    cmov.w.eq %s1, (0)1, %s4
318; CHECK-NEXT:    b.l.t (, %s10)
319  %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 255)
320  ret i128 %2
321}
322
323; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
324declare i32 @llvm.smin.i32(i32, i32)
325
326; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
327declare i8 @llvm.smin.i8(i8, i8)
328
329; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
330declare i16 @llvm.smin.i16(i16, i16)
331
332; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
333declare i64 @llvm.smin.i64(i64, i64)
334
335; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
336declare i128 @llvm.smin.i128(i128, i128)
337