337 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=ve | FileCheck %s3 4;;; Test ‘llvm.smin.*’ intrinsic5;;;6;;; Syntax:7;;; This is an overloaded intrinsic. You can use @llvm.smin on any8;;; 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 signed15;;; integers. Vector intrinsics operate on a per-element basis.16;;; The smaller element of %a and %b at a given index is returned17;;; for that index.18;;;19;;; Arguments:20;;; The arguments (%a and %b) may be of any integer type or a vector21;;; with integer element type. The argument types must match each22;;; 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 willreturn28define 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, %s132; CHECK-NEXT: adds.w.sx %s0, %s0, (0)133; CHECK-NEXT: b.l.t (, %s10)34 %3 = tail call i8 @llvm.smin.i8(i8 %0, i8 %1)35 ret i8 %336}37 38; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn39define 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, %s143; CHECK-NEXT: adds.w.sx %s0, %s0, (0)144; CHECK-NEXT: b.l.t (, %s10)45 %3 = tail call i16 @llvm.smin.i16(i16 %0, i16 %1)46 ret i16 %347}48 49; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn50define 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, %s154; CHECK-NEXT: adds.w.sx %s0, %s0, (0)155; CHECK-NEXT: b.l.t (, %s10)56 %3 = tail call i32 @llvm.smin.i32(i32 %0, i32 %1)57 ret i32 %358}59 60; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn61define 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, %s165; CHECK-NEXT: b.l.t (, %s10)66 %3 = tail call i64 @llvm.smin.i64(i64 %0, i64 %1)67 ret i64 %368}69 70; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn71define 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, %s375; CHECK-NEXT: cmps.l %s5, %s1, %s376; CHECK-NEXT: or %s6, 0, (0)177; CHECK-NEXT: or %s7, 0, (0)178; CHECK-NEXT: cmov.l.lt %s7, (63)0, %s579; CHECK-NEXT: cmpu.l %s5, %s0, %s280; CHECK-NEXT: cmov.l.lt %s6, (63)0, %s581; CHECK-NEXT: cmov.l.eq %s7, %s6, %s482; CHECK-NEXT: cmov.w.ne %s2, %s0, %s783; CHECK-NEXT: cmov.w.ne %s3, %s1, %s784; CHECK-NEXT: or %s0, 0, %s285; CHECK-NEXT: or %s1, 0, %s386; CHECK-NEXT: b.l.t (, %s10)87 %3 = tail call i128 @llvm.smin.i128(i128 %0, i128 %1)88 ret i128 %389}90 91; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn92define 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, %s096; CHECK-NEXT: adds.w.sx %s0, %s0, (0)197; CHECK-NEXT: b.l.t (, %s10)98 %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 0)99 ret i8 %2100}101 102; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn103define 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, %s0107; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1108; CHECK-NEXT: b.l.t (, %s10)109 %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 0)110 ret i16 %2111}112 113; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn114define 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, %s0118; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1119; CHECK-NEXT: b.l.t (, %s10)120 %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 0)121 ret i32 %2122}123 124; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn125define 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, %s0129; CHECK-NEXT: b.l.t (, %s10)130 %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 0)131 ret i64 %2132}133 134; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn135define 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, 63139; CHECK-NEXT: and %s0, %s2, %s0140; CHECK-NEXT: and %s1, %s2, %s1141; CHECK-NEXT: b.l.t (, %s10)142 %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 0)143 ret i128 %2144}145 146; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn147define 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, %s0151; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1152; CHECK-NEXT: b.l.t (, %s10)153 %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 0)154 ret i8 %2155}156 157; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn158define 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, %s0162; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1163; CHECK-NEXT: b.l.t (, %s10)164 %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 0)165 ret i16 %2166}167 168; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn169define 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, %s0173; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1174; CHECK-NEXT: b.l.t (, %s10)175 %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 0)176 ret i32 %2177}178 179; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn180define 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, %s0184; CHECK-NEXT: b.l.t (, %s10)185 %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 0)186 ret i64 %2187}188 189; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn190define 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, 63194; CHECK-NEXT: and %s0, %s2, %s0195; CHECK-NEXT: and %s1, %s2, %s1196; CHECK-NEXT: b.l.t (, %s10)197 %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 0)198 ret i128 %2199}200 201; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn202define 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, %s0206; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1207; CHECK-NEXT: b.l.t (, %s10)208 %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 -1)209 ret i8 %2210}211 212; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn213define 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)0217; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1218; CHECK-NEXT: b.l.t (, %s10)219 %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 255)220 ret i16 %2221}222 223; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn224define 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)0228; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1229; CHECK-NEXT: b.l.t (, %s10)230 %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 255)231 ret i32 %2232}233 234; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn235define 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)0239; CHECK-NEXT: b.l.t (, %s10)240 %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 255)241 ret i64 %2242}243 244; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn245define 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)1249; CHECK-NEXT: cmps.l %s3, %s1, (0)1250; CHECK-NEXT: or %s4, 0, (0)1251; CHECK-NEXT: cmov.l.lt %s4, (63)0, %s3252; CHECK-NEXT: cmpu.l %s3, %s0, (56)0253; CHECK-NEXT: cmov.l.lt %s2, (63)0, %s3254; CHECK-NEXT: cmov.l.eq %s4, %s2, %s1255; CHECK-NEXT: cmov.w.eq %s0, (56)0, %s4256; CHECK-NEXT: cmov.w.eq %s1, (0)1, %s4257; CHECK-NEXT: b.l.t (, %s10)258 %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 255)259 ret i128 %2260}261 262; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn263define 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, %s0267; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1268; CHECK-NEXT: b.l.t (, %s10)269 %2 = tail call i8 @llvm.smin.i8(i8 %0, i8 -1)270 ret i8 %2271}272 273; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn274define 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)0278; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1279; CHECK-NEXT: b.l.t (, %s10)280 %2 = tail call i16 @llvm.smin.i16(i16 %0, i16 255)281 ret i16 %2282}283 284; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn285define 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)0289; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1290; CHECK-NEXT: b.l.t (, %s10)291 %2 = tail call i32 @llvm.smin.i32(i32 %0, i32 255)292 ret i32 %2293}294 295; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn296define 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)0300; CHECK-NEXT: b.l.t (, %s10)301 %2 = tail call i64 @llvm.smin.i64(i64 %0, i64 255)302 ret i64 %2303}304 305; Function Attrs: mustprogress nofree nosync nounwind readnone willreturn306define 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)1310; CHECK-NEXT: cmps.l %s3, %s1, (0)1311; CHECK-NEXT: or %s4, 0, (0)1312; CHECK-NEXT: cmov.l.lt %s4, (63)0, %s3313; CHECK-NEXT: cmpu.l %s3, %s0, (56)0314; CHECK-NEXT: cmov.l.lt %s2, (63)0, %s3315; CHECK-NEXT: cmov.l.eq %s4, %s2, %s1316; CHECK-NEXT: cmov.w.eq %s0, (56)0, %s4317; CHECK-NEXT: cmov.w.eq %s1, (0)1, %s4318; CHECK-NEXT: b.l.t (, %s10)319 %2 = tail call i128 @llvm.smin.i128(i128 %0, i128 255)320 ret i128 %2321}322 323; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn324declare i32 @llvm.smin.i32(i32, i32)325 326; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn327declare i8 @llvm.smin.i8(i8, i8)328 329; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn330declare i16 @llvm.smin.i16(i16, i16)331 332; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn333declare i64 @llvm.smin.i64(i64, i64)334 335; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn336declare i128 @llvm.smin.i128(i128, i128)337