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