1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefixes=CHECK,RV32 4; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s \ 5; RUN: | FileCheck %s --check-prefixes=CHECK,RV64 6 7declare <8 x i7> @llvm.vp.smax.v8i7(<8 x i7>, <8 x i7>, <8 x i1>, i32) 8 9define <8 x i7> @vmax_vv_v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 zeroext %evl) { 10; CHECK-LABEL: vmax_vv_v8i7: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 13; CHECK-NEXT: vsll.vi v9, v9, 1, v0.t 14; CHECK-NEXT: vsra.vi v9, v9, 1, v0.t 15; CHECK-NEXT: vsll.vi v8, v8, 1, v0.t 16; CHECK-NEXT: vsra.vi v8, v8, 1, v0.t 17; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 18; CHECK-NEXT: ret 19 %v = call <8 x i7> @llvm.vp.smax.v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 %evl) 20 ret <8 x i7> %v 21} 22 23declare <2 x i8> @llvm.vp.smax.v2i8(<2 x i8>, <2 x i8>, <2 x i1>, i32) 24 25define <2 x i8> @vmax_vv_v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 zeroext %evl) { 26; CHECK-LABEL: vmax_vv_v2i8: 27; CHECK: # %bb.0: 28; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 29; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 30; CHECK-NEXT: ret 31 %v = call <2 x i8> @llvm.vp.smax.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 %evl) 32 ret <2 x i8> %v 33} 34 35define <2 x i8> @vmax_vv_v2i8_unmasked(<2 x i8> %va, <2 x i8> %b, i32 zeroext %evl) { 36; CHECK-LABEL: vmax_vv_v2i8_unmasked: 37; CHECK: # %bb.0: 38; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 39; CHECK-NEXT: vmax.vv v8, v8, v9 40; CHECK-NEXT: ret 41 %v = call <2 x i8> @llvm.vp.smax.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> splat (i1 true), i32 %evl) 42 ret <2 x i8> %v 43} 44 45define <2 x i8> @vmax_vx_v2i8(<2 x i8> %va, i8 %b, <2 x i1> %m, i32 zeroext %evl) { 46; CHECK-LABEL: vmax_vx_v2i8: 47; CHECK: # %bb.0: 48; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 49; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 50; CHECK-NEXT: ret 51 %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0 52 %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer 53 %v = call <2 x i8> @llvm.vp.smax.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> %m, i32 %evl) 54 ret <2 x i8> %v 55} 56 57define <2 x i8> @vmax_vx_v2i8_unmasked(<2 x i8> %va, i8 %b, i32 zeroext %evl) { 58; CHECK-LABEL: vmax_vx_v2i8_unmasked: 59; CHECK: # %bb.0: 60; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 61; CHECK-NEXT: vmax.vx v8, v8, a0 62; CHECK-NEXT: ret 63 %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0 64 %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer 65 %v = call <2 x i8> @llvm.vp.smax.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> splat (i1 true), i32 %evl) 66 ret <2 x i8> %v 67} 68 69declare <4 x i8> @llvm.vp.smax.v4i8(<4 x i8>, <4 x i8>, <4 x i1>, i32) 70 71define <4 x i8> @vmax_vv_v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 zeroext %evl) { 72; CHECK-LABEL: vmax_vv_v4i8: 73; CHECK: # %bb.0: 74; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 75; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 76; CHECK-NEXT: ret 77 %v = call <4 x i8> @llvm.vp.smax.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 %evl) 78 ret <4 x i8> %v 79} 80 81define <4 x i8> @vmax_vv_v4i8_unmasked(<4 x i8> %va, <4 x i8> %b, i32 zeroext %evl) { 82; CHECK-LABEL: vmax_vv_v4i8_unmasked: 83; CHECK: # %bb.0: 84; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 85; CHECK-NEXT: vmax.vv v8, v8, v9 86; CHECK-NEXT: ret 87 %v = call <4 x i8> @llvm.vp.smax.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> splat (i1 true), i32 %evl) 88 ret <4 x i8> %v 89} 90 91define <4 x i8> @vmax_vx_v4i8(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) { 92; CHECK-LABEL: vmax_vx_v4i8: 93; CHECK: # %bb.0: 94; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 95; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 96; CHECK-NEXT: ret 97 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 98 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 99 %v = call <4 x i8> @llvm.vp.smax.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> %m, i32 %evl) 100 ret <4 x i8> %v 101} 102 103define <4 x i8> @vmax_vx_v4i8_commute(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) { 104; CHECK-LABEL: vmax_vx_v4i8_commute: 105; CHECK: # %bb.0: 106; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 107; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 108; CHECK-NEXT: ret 109 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 110 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 111 %v = call <4 x i8> @llvm.vp.smax.v4i8(<4 x i8> %vb, <4 x i8> %va, <4 x i1> %m, i32 %evl) 112 ret <4 x i8> %v 113} 114 115define <4 x i8> @vmax_vx_v4i8_unmasked(<4 x i8> %va, i8 %b, i32 zeroext %evl) { 116; CHECK-LABEL: vmax_vx_v4i8_unmasked: 117; CHECK: # %bb.0: 118; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 119; CHECK-NEXT: vmax.vx v8, v8, a0 120; CHECK-NEXT: ret 121 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 122 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 123 %v = call <4 x i8> @llvm.vp.smax.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> splat (i1 true), i32 %evl) 124 ret <4 x i8> %v 125} 126 127declare <5 x i8> @llvm.vp.smax.v5i8(<5 x i8>, <5 x i8>, <5 x i1>, i32) 128 129define <5 x i8> @vmax_vv_v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 zeroext %evl) { 130; CHECK-LABEL: vmax_vv_v5i8: 131; CHECK: # %bb.0: 132; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 133; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 134; CHECK-NEXT: ret 135 %v = call <5 x i8> @llvm.vp.smax.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 %evl) 136 ret <5 x i8> %v 137} 138 139define <5 x i8> @vmax_vv_v5i8_unmasked(<5 x i8> %va, <5 x i8> %b, i32 zeroext %evl) { 140; CHECK-LABEL: vmax_vv_v5i8_unmasked: 141; CHECK: # %bb.0: 142; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 143; CHECK-NEXT: vmax.vv v8, v8, v9 144; CHECK-NEXT: ret 145 %v = call <5 x i8> @llvm.vp.smax.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> splat (i1 true), i32 %evl) 146 ret <5 x i8> %v 147} 148 149define <5 x i8> @vmax_vx_v5i8(<5 x i8> %va, i8 %b, <5 x i1> %m, i32 zeroext %evl) { 150; CHECK-LABEL: vmax_vx_v5i8: 151; CHECK: # %bb.0: 152; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 153; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 154; CHECK-NEXT: ret 155 %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0 156 %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer 157 %v = call <5 x i8> @llvm.vp.smax.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> %m, i32 %evl) 158 ret <5 x i8> %v 159} 160 161define <5 x i8> @vmax_vx_v5i8_unmasked(<5 x i8> %va, i8 %b, i32 zeroext %evl) { 162; CHECK-LABEL: vmax_vx_v5i8_unmasked: 163; CHECK: # %bb.0: 164; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 165; CHECK-NEXT: vmax.vx v8, v8, a0 166; CHECK-NEXT: ret 167 %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0 168 %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer 169 %v = call <5 x i8> @llvm.vp.smax.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> splat (i1 true), i32 %evl) 170 ret <5 x i8> %v 171} 172 173declare <8 x i8> @llvm.vp.smax.v8i8(<8 x i8>, <8 x i8>, <8 x i1>, i32) 174 175define <8 x i8> @vmax_vv_v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 zeroext %evl) { 176; CHECK-LABEL: vmax_vv_v8i8: 177; CHECK: # %bb.0: 178; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 179; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 180; CHECK-NEXT: ret 181 %v = call <8 x i8> @llvm.vp.smax.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 %evl) 182 ret <8 x i8> %v 183} 184 185define <8 x i8> @vmax_vv_v8i8_unmasked(<8 x i8> %va, <8 x i8> %b, i32 zeroext %evl) { 186; CHECK-LABEL: vmax_vv_v8i8_unmasked: 187; CHECK: # %bb.0: 188; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 189; CHECK-NEXT: vmax.vv v8, v8, v9 190; CHECK-NEXT: ret 191 %v = call <8 x i8> @llvm.vp.smax.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> splat (i1 true), i32 %evl) 192 ret <8 x i8> %v 193} 194 195define <8 x i8> @vmax_vx_v8i8(<8 x i8> %va, i8 %b, <8 x i1> %m, i32 zeroext %evl) { 196; CHECK-LABEL: vmax_vx_v8i8: 197; CHECK: # %bb.0: 198; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 199; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 200; CHECK-NEXT: ret 201 %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0 202 %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer 203 %v = call <8 x i8> @llvm.vp.smax.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> %m, i32 %evl) 204 ret <8 x i8> %v 205} 206 207define <8 x i8> @vmax_vx_v8i8_unmasked(<8 x i8> %va, i8 %b, i32 zeroext %evl) { 208; CHECK-LABEL: vmax_vx_v8i8_unmasked: 209; CHECK: # %bb.0: 210; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 211; CHECK-NEXT: vmax.vx v8, v8, a0 212; CHECK-NEXT: ret 213 %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0 214 %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer 215 %v = call <8 x i8> @llvm.vp.smax.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> splat (i1 true), i32 %evl) 216 ret <8 x i8> %v 217} 218 219declare <16 x i8> @llvm.vp.smax.v16i8(<16 x i8>, <16 x i8>, <16 x i1>, i32) 220 221define <16 x i8> @vmax_vv_v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 zeroext %evl) { 222; CHECK-LABEL: vmax_vv_v16i8: 223; CHECK: # %bb.0: 224; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 225; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 226; CHECK-NEXT: ret 227 %v = call <16 x i8> @llvm.vp.smax.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 %evl) 228 ret <16 x i8> %v 229} 230 231define <16 x i8> @vmax_vv_v16i8_unmasked(<16 x i8> %va, <16 x i8> %b, i32 zeroext %evl) { 232; CHECK-LABEL: vmax_vv_v16i8_unmasked: 233; CHECK: # %bb.0: 234; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 235; CHECK-NEXT: vmax.vv v8, v8, v9 236; CHECK-NEXT: ret 237 %v = call <16 x i8> @llvm.vp.smax.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> splat (i1 true), i32 %evl) 238 ret <16 x i8> %v 239} 240 241define <16 x i8> @vmax_vx_v16i8(<16 x i8> %va, i8 %b, <16 x i1> %m, i32 zeroext %evl) { 242; CHECK-LABEL: vmax_vx_v16i8: 243; CHECK: # %bb.0: 244; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 245; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 246; CHECK-NEXT: ret 247 %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0 248 %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer 249 %v = call <16 x i8> @llvm.vp.smax.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> %m, i32 %evl) 250 ret <16 x i8> %v 251} 252 253define <16 x i8> @vmax_vx_v16i8_unmasked(<16 x i8> %va, i8 %b, i32 zeroext %evl) { 254; CHECK-LABEL: vmax_vx_v16i8_unmasked: 255; CHECK: # %bb.0: 256; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 257; CHECK-NEXT: vmax.vx v8, v8, a0 258; CHECK-NEXT: ret 259 %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0 260 %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer 261 %v = call <16 x i8> @llvm.vp.smax.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> splat (i1 true), i32 %evl) 262 ret <16 x i8> %v 263} 264 265declare <256 x i8> @llvm.vp.smax.v258i8(<256 x i8>, <256 x i8>, <256 x i1>, i32) 266 267define <256 x i8> @vmax_vx_v258i8(<256 x i8> %va, i8 %b, <256 x i1> %m, i32 zeroext %evl) { 268; CHECK-LABEL: vmax_vx_v258i8: 269; CHECK: # %bb.0: 270; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 271; CHECK-NEXT: vmv1r.v v24, v0 272; CHECK-NEXT: li a3, 128 273; CHECK-NEXT: vsetvli zero, a3, e8, m8, ta, ma 274; CHECK-NEXT: vlm.v v0, (a1) 275; CHECK-NEXT: addi a1, a2, -128 276; CHECK-NEXT: sltu a4, a2, a1 277; CHECK-NEXT: addi a4, a4, -1 278; CHECK-NEXT: and a1, a4, a1 279; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 280; CHECK-NEXT: vmax.vx v16, v16, a0, v0.t 281; CHECK-NEXT: bltu a2, a3, .LBB22_2 282; CHECK-NEXT: # %bb.1: 283; CHECK-NEXT: li a2, 128 284; CHECK-NEXT: .LBB22_2: 285; CHECK-NEXT: vmv1r.v v0, v24 286; CHECK-NEXT: vsetvli zero, a2, e8, m8, ta, ma 287; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 288; CHECK-NEXT: ret 289 %elt.head = insertelement <256 x i8> poison, i8 %b, i32 0 290 %vb = shufflevector <256 x i8> %elt.head, <256 x i8> poison, <256 x i32> zeroinitializer 291 %v = call <256 x i8> @llvm.vp.smax.v258i8(<256 x i8> %va, <256 x i8> %vb, <256 x i1> %m, i32 %evl) 292 ret <256 x i8> %v 293} 294 295define <256 x i8> @vmax_vx_v258i8_unmasked(<256 x i8> %va, i8 %b, i32 zeroext %evl) { 296; CHECK-LABEL: vmax_vx_v258i8_unmasked: 297; CHECK: # %bb.0: 298; CHECK-NEXT: li a3, 128 299; CHECK-NEXT: mv a2, a1 300; CHECK-NEXT: bltu a1, a3, .LBB23_2 301; CHECK-NEXT: # %bb.1: 302; CHECK-NEXT: li a2, 128 303; CHECK-NEXT: .LBB23_2: 304; CHECK-NEXT: vsetvli zero, a2, e8, m8, ta, ma 305; CHECK-NEXT: vmax.vx v8, v8, a0 306; CHECK-NEXT: addi a2, a1, -128 307; CHECK-NEXT: sltu a1, a1, a2 308; CHECK-NEXT: addi a1, a1, -1 309; CHECK-NEXT: and a1, a1, a2 310; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 311; CHECK-NEXT: vmax.vx v16, v16, a0 312; CHECK-NEXT: ret 313 %elt.head = insertelement <256 x i8> poison, i8 %b, i32 0 314 %vb = shufflevector <256 x i8> %elt.head, <256 x i8> poison, <256 x i32> zeroinitializer 315 %v = call <256 x i8> @llvm.vp.smax.v258i8(<256 x i8> %va, <256 x i8> %vb, <256 x i1> splat (i1 true), i32 %evl) 316 ret <256 x i8> %v 317} 318 319; Test splitting when the %evl is a known constant. 320 321define <256 x i8> @vmax_vx_v258i8_evl129(<256 x i8> %va, i8 %b, <256 x i1> %m) { 322; CHECK-LABEL: vmax_vx_v258i8_evl129: 323; CHECK: # %bb.0: 324; CHECK-NEXT: li a2, 128 325; CHECK-NEXT: vsetvli zero, a2, e8, m8, ta, ma 326; CHECK-NEXT: vlm.v v24, (a1) 327; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 328; CHECK-NEXT: vmv1r.v v0, v24 329; CHECK-NEXT: vsetivli zero, 1, e8, m8, ta, ma 330; CHECK-NEXT: vmax.vx v16, v16, a0, v0.t 331; CHECK-NEXT: ret 332 %elt.head = insertelement <256 x i8> poison, i8 %b, i32 0 333 %vb = shufflevector <256 x i8> %elt.head, <256 x i8> poison, <256 x i32> zeroinitializer 334 %v = call <256 x i8> @llvm.vp.smax.v258i8(<256 x i8> %va, <256 x i8> %vb, <256 x i1> %m, i32 129) 335 ret <256 x i8> %v 336} 337 338; The upper half is doing nothing. 339 340define <256 x i8> @vmax_vx_v258i8_evl128(<256 x i8> %va, i8 %b, <256 x i1> %m) { 341; CHECK-LABEL: vmax_vx_v258i8_evl128: 342; CHECK: # %bb.0: 343; CHECK-NEXT: li a1, 128 344; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 345; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 346; CHECK-NEXT: ret 347 %elt.head = insertelement <256 x i8> poison, i8 %b, i32 0 348 %vb = shufflevector <256 x i8> %elt.head, <256 x i8> poison, <256 x i32> zeroinitializer 349 %v = call <256 x i8> @llvm.vp.smax.v258i8(<256 x i8> %va, <256 x i8> %vb, <256 x i1> %m, i32 128) 350 ret <256 x i8> %v 351} 352 353declare <2 x i16> @llvm.vp.smax.v2i16(<2 x i16>, <2 x i16>, <2 x i1>, i32) 354 355define <2 x i16> @vmax_vv_v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 zeroext %evl) { 356; CHECK-LABEL: vmax_vv_v2i16: 357; CHECK: # %bb.0: 358; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 359; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 360; CHECK-NEXT: ret 361 %v = call <2 x i16> @llvm.vp.smax.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 %evl) 362 ret <2 x i16> %v 363} 364 365define <2 x i16> @vmax_vv_v2i16_unmasked(<2 x i16> %va, <2 x i16> %b, i32 zeroext %evl) { 366; CHECK-LABEL: vmax_vv_v2i16_unmasked: 367; CHECK: # %bb.0: 368; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 369; CHECK-NEXT: vmax.vv v8, v8, v9 370; CHECK-NEXT: ret 371 %v = call <2 x i16> @llvm.vp.smax.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> splat (i1 true), i32 %evl) 372 ret <2 x i16> %v 373} 374 375define <2 x i16> @vmax_vx_v2i16(<2 x i16> %va, i16 %b, <2 x i1> %m, i32 zeroext %evl) { 376; CHECK-LABEL: vmax_vx_v2i16: 377; CHECK: # %bb.0: 378; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 379; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 380; CHECK-NEXT: ret 381 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0 382 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer 383 %v = call <2 x i16> @llvm.vp.smax.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 %evl) 384 ret <2 x i16> %v 385} 386 387define <2 x i16> @vmax_vx_v2i16_unmasked(<2 x i16> %va, i16 %b, i32 zeroext %evl) { 388; CHECK-LABEL: vmax_vx_v2i16_unmasked: 389; CHECK: # %bb.0: 390; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 391; CHECK-NEXT: vmax.vx v8, v8, a0 392; CHECK-NEXT: ret 393 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0 394 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer 395 %v = call <2 x i16> @llvm.vp.smax.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> splat (i1 true), i32 %evl) 396 ret <2 x i16> %v 397} 398 399declare <4 x i16> @llvm.vp.smax.v4i16(<4 x i16>, <4 x i16>, <4 x i1>, i32) 400 401define <4 x i16> @vmax_vv_v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 zeroext %evl) { 402; CHECK-LABEL: vmax_vv_v4i16: 403; CHECK: # %bb.0: 404; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 405; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 406; CHECK-NEXT: ret 407 %v = call <4 x i16> @llvm.vp.smax.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 %evl) 408 ret <4 x i16> %v 409} 410 411define <4 x i16> @vmax_vv_v4i16_unmasked(<4 x i16> %va, <4 x i16> %b, i32 zeroext %evl) { 412; CHECK-LABEL: vmax_vv_v4i16_unmasked: 413; CHECK: # %bb.0: 414; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 415; CHECK-NEXT: vmax.vv v8, v8, v9 416; CHECK-NEXT: ret 417 %v = call <4 x i16> @llvm.vp.smax.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> splat (i1 true), i32 %evl) 418 ret <4 x i16> %v 419} 420 421define <4 x i16> @vmax_vx_v4i16(<4 x i16> %va, i16 %b, <4 x i1> %m, i32 zeroext %evl) { 422; CHECK-LABEL: vmax_vx_v4i16: 423; CHECK: # %bb.0: 424; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 425; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 426; CHECK-NEXT: ret 427 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0 428 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer 429 %v = call <4 x i16> @llvm.vp.smax.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 %evl) 430 ret <4 x i16> %v 431} 432 433define <4 x i16> @vmax_vx_v4i16_unmasked(<4 x i16> %va, i16 %b, i32 zeroext %evl) { 434; CHECK-LABEL: vmax_vx_v4i16_unmasked: 435; CHECK: # %bb.0: 436; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 437; CHECK-NEXT: vmax.vx v8, v8, a0 438; CHECK-NEXT: ret 439 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0 440 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer 441 %v = call <4 x i16> @llvm.vp.smax.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> splat (i1 true), i32 %evl) 442 ret <4 x i16> %v 443} 444 445declare <8 x i16> @llvm.vp.smax.v8i16(<8 x i16>, <8 x i16>, <8 x i1>, i32) 446 447define <8 x i16> @vmax_vv_v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 zeroext %evl) { 448; CHECK-LABEL: vmax_vv_v8i16: 449; CHECK: # %bb.0: 450; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 451; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 452; CHECK-NEXT: ret 453 %v = call <8 x i16> @llvm.vp.smax.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 %evl) 454 ret <8 x i16> %v 455} 456 457define <8 x i16> @vmax_vv_v8i16_unmasked(<8 x i16> %va, <8 x i16> %b, i32 zeroext %evl) { 458; CHECK-LABEL: vmax_vv_v8i16_unmasked: 459; CHECK: # %bb.0: 460; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 461; CHECK-NEXT: vmax.vv v8, v8, v9 462; CHECK-NEXT: ret 463 %v = call <8 x i16> @llvm.vp.smax.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> splat (i1 true), i32 %evl) 464 ret <8 x i16> %v 465} 466 467define <8 x i16> @vmax_vx_v8i16(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) { 468; CHECK-LABEL: vmax_vx_v8i16: 469; CHECK: # %bb.0: 470; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 471; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 472; CHECK-NEXT: ret 473 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0 474 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer 475 %v = call <8 x i16> @llvm.vp.smax.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 %evl) 476 ret <8 x i16> %v 477} 478 479define <8 x i16> @vmax_vx_v8i16_unmasked(<8 x i16> %va, i16 %b, i32 zeroext %evl) { 480; CHECK-LABEL: vmax_vx_v8i16_unmasked: 481; CHECK: # %bb.0: 482; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 483; CHECK-NEXT: vmax.vx v8, v8, a0 484; CHECK-NEXT: ret 485 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0 486 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer 487 %v = call <8 x i16> @llvm.vp.smax.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> splat (i1 true), i32 %evl) 488 ret <8 x i16> %v 489} 490 491declare <16 x i16> @llvm.vp.smax.v16i16(<16 x i16>, <16 x i16>, <16 x i1>, i32) 492 493define <16 x i16> @vmax_vv_v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 zeroext %evl) { 494; CHECK-LABEL: vmax_vv_v16i16: 495; CHECK: # %bb.0: 496; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 497; CHECK-NEXT: vmax.vv v8, v8, v10, v0.t 498; CHECK-NEXT: ret 499 %v = call <16 x i16> @llvm.vp.smax.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 %evl) 500 ret <16 x i16> %v 501} 502 503define <16 x i16> @vmax_vv_v16i16_unmasked(<16 x i16> %va, <16 x i16> %b, i32 zeroext %evl) { 504; CHECK-LABEL: vmax_vv_v16i16_unmasked: 505; CHECK: # %bb.0: 506; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 507; CHECK-NEXT: vmax.vv v8, v8, v10 508; CHECK-NEXT: ret 509 %v = call <16 x i16> @llvm.vp.smax.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> splat (i1 true), i32 %evl) 510 ret <16 x i16> %v 511} 512 513define <16 x i16> @vmax_vx_v16i16(<16 x i16> %va, i16 %b, <16 x i1> %m, i32 zeroext %evl) { 514; CHECK-LABEL: vmax_vx_v16i16: 515; CHECK: # %bb.0: 516; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 517; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 518; CHECK-NEXT: ret 519 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0 520 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer 521 %v = call <16 x i16> @llvm.vp.smax.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 %evl) 522 ret <16 x i16> %v 523} 524 525define <16 x i16> @vmax_vx_v16i16_unmasked(<16 x i16> %va, i16 %b, i32 zeroext %evl) { 526; CHECK-LABEL: vmax_vx_v16i16_unmasked: 527; CHECK: # %bb.0: 528; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 529; CHECK-NEXT: vmax.vx v8, v8, a0 530; CHECK-NEXT: ret 531 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0 532 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer 533 %v = call <16 x i16> @llvm.vp.smax.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> splat (i1 true), i32 %evl) 534 ret <16 x i16> %v 535} 536 537declare <2 x i32> @llvm.vp.smax.v2i32(<2 x i32>, <2 x i32>, <2 x i1>, i32) 538 539define <2 x i32> @vmax_vv_v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 zeroext %evl) { 540; CHECK-LABEL: vmax_vv_v2i32: 541; CHECK: # %bb.0: 542; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 543; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 544; CHECK-NEXT: ret 545 %v = call <2 x i32> @llvm.vp.smax.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 %evl) 546 ret <2 x i32> %v 547} 548 549define <2 x i32> @vmax_vv_v2i32_unmasked(<2 x i32> %va, <2 x i32> %b, i32 zeroext %evl) { 550; CHECK-LABEL: vmax_vv_v2i32_unmasked: 551; CHECK: # %bb.0: 552; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 553; CHECK-NEXT: vmax.vv v8, v8, v9 554; CHECK-NEXT: ret 555 %v = call <2 x i32> @llvm.vp.smax.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> splat (i1 true), i32 %evl) 556 ret <2 x i32> %v 557} 558 559define <2 x i32> @vmax_vx_v2i32(<2 x i32> %va, i32 %b, <2 x i1> %m, i32 zeroext %evl) { 560; CHECK-LABEL: vmax_vx_v2i32: 561; CHECK: # %bb.0: 562; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 563; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 564; CHECK-NEXT: ret 565 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0 566 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer 567 %v = call <2 x i32> @llvm.vp.smax.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 %evl) 568 ret <2 x i32> %v 569} 570 571define <2 x i32> @vmax_vx_v2i32_unmasked(<2 x i32> %va, i32 %b, i32 zeroext %evl) { 572; CHECK-LABEL: vmax_vx_v2i32_unmasked: 573; CHECK: # %bb.0: 574; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 575; CHECK-NEXT: vmax.vx v8, v8, a0 576; CHECK-NEXT: ret 577 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0 578 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer 579 %v = call <2 x i32> @llvm.vp.smax.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> splat (i1 true), i32 %evl) 580 ret <2 x i32> %v 581} 582 583declare <4 x i32> @llvm.vp.smax.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32) 584 585define <4 x i32> @vmax_vv_v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 zeroext %evl) { 586; CHECK-LABEL: vmax_vv_v4i32: 587; CHECK: # %bb.0: 588; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 589; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 590; CHECK-NEXT: ret 591 %v = call <4 x i32> @llvm.vp.smax.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 %evl) 592 ret <4 x i32> %v 593} 594 595define <4 x i32> @vmax_vv_v4i32_unmasked(<4 x i32> %va, <4 x i32> %b, i32 zeroext %evl) { 596; CHECK-LABEL: vmax_vv_v4i32_unmasked: 597; CHECK: # %bb.0: 598; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 599; CHECK-NEXT: vmax.vv v8, v8, v9 600; CHECK-NEXT: ret 601 %v = call <4 x i32> @llvm.vp.smax.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> splat (i1 true), i32 %evl) 602 ret <4 x i32> %v 603} 604 605define <4 x i32> @vmax_vx_v4i32(<4 x i32> %va, i32 %b, <4 x i1> %m, i32 zeroext %evl) { 606; CHECK-LABEL: vmax_vx_v4i32: 607; CHECK: # %bb.0: 608; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 609; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 610; CHECK-NEXT: ret 611 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0 612 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer 613 %v = call <4 x i32> @llvm.vp.smax.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl) 614 ret <4 x i32> %v 615} 616 617define <4 x i32> @vmax_vx_v4i32_unmasked(<4 x i32> %va, i32 %b, i32 zeroext %evl) { 618; CHECK-LABEL: vmax_vx_v4i32_unmasked: 619; CHECK: # %bb.0: 620; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 621; CHECK-NEXT: vmax.vx v8, v8, a0 622; CHECK-NEXT: ret 623 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0 624 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer 625 %v = call <4 x i32> @llvm.vp.smax.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> splat (i1 true), i32 %evl) 626 ret <4 x i32> %v 627} 628 629declare <8 x i32> @llvm.vp.smax.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) 630 631define <8 x i32> @vmax_vv_v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 zeroext %evl) { 632; CHECK-LABEL: vmax_vv_v8i32: 633; CHECK: # %bb.0: 634; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 635; CHECK-NEXT: vmax.vv v8, v8, v10, v0.t 636; CHECK-NEXT: ret 637 %v = call <8 x i32> @llvm.vp.smax.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 %evl) 638 ret <8 x i32> %v 639} 640 641define <8 x i32> @vmax_vv_v8i32_unmasked(<8 x i32> %va, <8 x i32> %b, i32 zeroext %evl) { 642; CHECK-LABEL: vmax_vv_v8i32_unmasked: 643; CHECK: # %bb.0: 644; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 645; CHECK-NEXT: vmax.vv v8, v8, v10 646; CHECK-NEXT: ret 647 %v = call <8 x i32> @llvm.vp.smax.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> splat (i1 true), i32 %evl) 648 ret <8 x i32> %v 649} 650 651define <8 x i32> @vmax_vx_v8i32(<8 x i32> %va, i32 %b, <8 x i1> %m, i32 zeroext %evl) { 652; CHECK-LABEL: vmax_vx_v8i32: 653; CHECK: # %bb.0: 654; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 655; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 656; CHECK-NEXT: ret 657 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0 658 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer 659 %v = call <8 x i32> @llvm.vp.smax.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 %evl) 660 ret <8 x i32> %v 661} 662 663define <8 x i32> @vmax_vx_v8i32_unmasked(<8 x i32> %va, i32 %b, i32 zeroext %evl) { 664; CHECK-LABEL: vmax_vx_v8i32_unmasked: 665; CHECK: # %bb.0: 666; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 667; CHECK-NEXT: vmax.vx v8, v8, a0 668; CHECK-NEXT: ret 669 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0 670 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer 671 %v = call <8 x i32> @llvm.vp.smax.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> splat (i1 true), i32 %evl) 672 ret <8 x i32> %v 673} 674 675declare <16 x i32> @llvm.vp.smax.v16i32(<16 x i32>, <16 x i32>, <16 x i1>, i32) 676 677define <16 x i32> @vmax_vv_v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 zeroext %evl) { 678; CHECK-LABEL: vmax_vv_v16i32: 679; CHECK: # %bb.0: 680; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 681; CHECK-NEXT: vmax.vv v8, v8, v12, v0.t 682; CHECK-NEXT: ret 683 %v = call <16 x i32> @llvm.vp.smax.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 %evl) 684 ret <16 x i32> %v 685} 686 687define <16 x i32> @vmax_vv_v16i32_unmasked(<16 x i32> %va, <16 x i32> %b, i32 zeroext %evl) { 688; CHECK-LABEL: vmax_vv_v16i32_unmasked: 689; CHECK: # %bb.0: 690; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 691; CHECK-NEXT: vmax.vv v8, v8, v12 692; CHECK-NEXT: ret 693 %v = call <16 x i32> @llvm.vp.smax.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> splat (i1 true), i32 %evl) 694 ret <16 x i32> %v 695} 696 697define <16 x i32> @vmax_vx_v16i32(<16 x i32> %va, i32 %b, <16 x i1> %m, i32 zeroext %evl) { 698; CHECK-LABEL: vmax_vx_v16i32: 699; CHECK: # %bb.0: 700; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 701; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 702; CHECK-NEXT: ret 703 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0 704 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer 705 %v = call <16 x i32> @llvm.vp.smax.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 %evl) 706 ret <16 x i32> %v 707} 708 709define <16 x i32> @vmax_vx_v16i32_unmasked(<16 x i32> %va, i32 %b, i32 zeroext %evl) { 710; CHECK-LABEL: vmax_vx_v16i32_unmasked: 711; CHECK: # %bb.0: 712; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 713; CHECK-NEXT: vmax.vx v8, v8, a0 714; CHECK-NEXT: ret 715 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0 716 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer 717 %v = call <16 x i32> @llvm.vp.smax.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> splat (i1 true), i32 %evl) 718 ret <16 x i32> %v 719} 720 721declare <2 x i64> @llvm.vp.smax.v2i64(<2 x i64>, <2 x i64>, <2 x i1>, i32) 722 723define <2 x i64> @vmax_vv_v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 zeroext %evl) { 724; CHECK-LABEL: vmax_vv_v2i64: 725; CHECK: # %bb.0: 726; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 727; CHECK-NEXT: vmax.vv v8, v8, v9, v0.t 728; CHECK-NEXT: ret 729 %v = call <2 x i64> @llvm.vp.smax.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 %evl) 730 ret <2 x i64> %v 731} 732 733define <2 x i64> @vmax_vv_v2i64_unmasked(<2 x i64> %va, <2 x i64> %b, i32 zeroext %evl) { 734; CHECK-LABEL: vmax_vv_v2i64_unmasked: 735; CHECK: # %bb.0: 736; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 737; CHECK-NEXT: vmax.vv v8, v8, v9 738; CHECK-NEXT: ret 739 %v = call <2 x i64> @llvm.vp.smax.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> splat (i1 true), i32 %evl) 740 ret <2 x i64> %v 741} 742 743define <2 x i64> @vmax_vx_v2i64(<2 x i64> %va, i64 %b, <2 x i1> %m, i32 zeroext %evl) { 744; RV32-LABEL: vmax_vx_v2i64: 745; RV32: # %bb.0: 746; RV32-NEXT: addi sp, sp, -16 747; RV32-NEXT: .cfi_def_cfa_offset 16 748; RV32-NEXT: sw a0, 8(sp) 749; RV32-NEXT: sw a1, 12(sp) 750; RV32-NEXT: addi a0, sp, 8 751; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 752; RV32-NEXT: vlse64.v v9, (a0), zero 753; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 754; RV32-NEXT: vmax.vv v8, v8, v9, v0.t 755; RV32-NEXT: addi sp, sp, 16 756; RV32-NEXT: .cfi_def_cfa_offset 0 757; RV32-NEXT: ret 758; 759; RV64-LABEL: vmax_vx_v2i64: 760; RV64: # %bb.0: 761; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 762; RV64-NEXT: vmax.vx v8, v8, a0, v0.t 763; RV64-NEXT: ret 764 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0 765 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer 766 %v = call <2 x i64> @llvm.vp.smax.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 %evl) 767 ret <2 x i64> %v 768} 769 770define <2 x i64> @vmax_vx_v2i64_unmasked(<2 x i64> %va, i64 %b, i32 zeroext %evl) { 771; RV32-LABEL: vmax_vx_v2i64_unmasked: 772; RV32: # %bb.0: 773; RV32-NEXT: addi sp, sp, -16 774; RV32-NEXT: .cfi_def_cfa_offset 16 775; RV32-NEXT: sw a0, 8(sp) 776; RV32-NEXT: sw a1, 12(sp) 777; RV32-NEXT: addi a0, sp, 8 778; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 779; RV32-NEXT: vlse64.v v9, (a0), zero 780; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 781; RV32-NEXT: vmax.vv v8, v8, v9 782; RV32-NEXT: addi sp, sp, 16 783; RV32-NEXT: .cfi_def_cfa_offset 0 784; RV32-NEXT: ret 785; 786; RV64-LABEL: vmax_vx_v2i64_unmasked: 787; RV64: # %bb.0: 788; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 789; RV64-NEXT: vmax.vx v8, v8, a0 790; RV64-NEXT: ret 791 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0 792 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer 793 %v = call <2 x i64> @llvm.vp.smax.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> splat (i1 true), i32 %evl) 794 ret <2 x i64> %v 795} 796 797declare <4 x i64> @llvm.vp.smax.v4i64(<4 x i64>, <4 x i64>, <4 x i1>, i32) 798 799define <4 x i64> @vmax_vv_v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 zeroext %evl) { 800; CHECK-LABEL: vmax_vv_v4i64: 801; CHECK: # %bb.0: 802; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 803; CHECK-NEXT: vmax.vv v8, v8, v10, v0.t 804; CHECK-NEXT: ret 805 %v = call <4 x i64> @llvm.vp.smax.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 %evl) 806 ret <4 x i64> %v 807} 808 809define <4 x i64> @vmax_vv_v4i64_unmasked(<4 x i64> %va, <4 x i64> %b, i32 zeroext %evl) { 810; CHECK-LABEL: vmax_vv_v4i64_unmasked: 811; CHECK: # %bb.0: 812; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 813; CHECK-NEXT: vmax.vv v8, v8, v10 814; CHECK-NEXT: ret 815 %v = call <4 x i64> @llvm.vp.smax.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> splat (i1 true), i32 %evl) 816 ret <4 x i64> %v 817} 818 819define <4 x i64> @vmax_vx_v4i64(<4 x i64> %va, i64 %b, <4 x i1> %m, i32 zeroext %evl) { 820; RV32-LABEL: vmax_vx_v4i64: 821; RV32: # %bb.0: 822; RV32-NEXT: addi sp, sp, -16 823; RV32-NEXT: .cfi_def_cfa_offset 16 824; RV32-NEXT: sw a0, 8(sp) 825; RV32-NEXT: sw a1, 12(sp) 826; RV32-NEXT: addi a0, sp, 8 827; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 828; RV32-NEXT: vlse64.v v10, (a0), zero 829; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 830; RV32-NEXT: vmax.vv v8, v8, v10, v0.t 831; RV32-NEXT: addi sp, sp, 16 832; RV32-NEXT: .cfi_def_cfa_offset 0 833; RV32-NEXT: ret 834; 835; RV64-LABEL: vmax_vx_v4i64: 836; RV64: # %bb.0: 837; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 838; RV64-NEXT: vmax.vx v8, v8, a0, v0.t 839; RV64-NEXT: ret 840 %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0 841 %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer 842 %v = call <4 x i64> @llvm.vp.smax.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 %evl) 843 ret <4 x i64> %v 844} 845 846define <4 x i64> @vmax_vx_v4i64_unmasked(<4 x i64> %va, i64 %b, i32 zeroext %evl) { 847; RV32-LABEL: vmax_vx_v4i64_unmasked: 848; RV32: # %bb.0: 849; RV32-NEXT: addi sp, sp, -16 850; RV32-NEXT: .cfi_def_cfa_offset 16 851; RV32-NEXT: sw a0, 8(sp) 852; RV32-NEXT: sw a1, 12(sp) 853; RV32-NEXT: addi a0, sp, 8 854; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 855; RV32-NEXT: vlse64.v v10, (a0), zero 856; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 857; RV32-NEXT: vmax.vv v8, v8, v10 858; RV32-NEXT: addi sp, sp, 16 859; RV32-NEXT: .cfi_def_cfa_offset 0 860; RV32-NEXT: ret 861; 862; RV64-LABEL: vmax_vx_v4i64_unmasked: 863; RV64: # %bb.0: 864; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 865; RV64-NEXT: vmax.vx v8, v8, a0 866; RV64-NEXT: ret 867 %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0 868 %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer 869 %v = call <4 x i64> @llvm.vp.smax.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> splat (i1 true), i32 %evl) 870 ret <4 x i64> %v 871} 872 873declare <8 x i64> @llvm.vp.smax.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32) 874 875define <8 x i64> @vmax_vv_v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 zeroext %evl) { 876; CHECK-LABEL: vmax_vv_v8i64: 877; CHECK: # %bb.0: 878; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 879; CHECK-NEXT: vmax.vv v8, v8, v12, v0.t 880; CHECK-NEXT: ret 881 %v = call <8 x i64> @llvm.vp.smax.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 %evl) 882 ret <8 x i64> %v 883} 884 885define <8 x i64> @vmax_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %b, i32 zeroext %evl) { 886; CHECK-LABEL: vmax_vv_v8i64_unmasked: 887; CHECK: # %bb.0: 888; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 889; CHECK-NEXT: vmax.vv v8, v8, v12 890; CHECK-NEXT: ret 891 %v = call <8 x i64> @llvm.vp.smax.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> splat (i1 true), i32 %evl) 892 ret <8 x i64> %v 893} 894 895define <8 x i64> @vmax_vx_v8i64(<8 x i64> %va, i64 %b, <8 x i1> %m, i32 zeroext %evl) { 896; RV32-LABEL: vmax_vx_v8i64: 897; RV32: # %bb.0: 898; RV32-NEXT: addi sp, sp, -16 899; RV32-NEXT: .cfi_def_cfa_offset 16 900; RV32-NEXT: sw a0, 8(sp) 901; RV32-NEXT: sw a1, 12(sp) 902; RV32-NEXT: addi a0, sp, 8 903; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 904; RV32-NEXT: vlse64.v v12, (a0), zero 905; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 906; RV32-NEXT: vmax.vv v8, v8, v12, v0.t 907; RV32-NEXT: addi sp, sp, 16 908; RV32-NEXT: .cfi_def_cfa_offset 0 909; RV32-NEXT: ret 910; 911; RV64-LABEL: vmax_vx_v8i64: 912; RV64: # %bb.0: 913; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 914; RV64-NEXT: vmax.vx v8, v8, a0, v0.t 915; RV64-NEXT: ret 916 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0 917 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 918 %v = call <8 x i64> @llvm.vp.smax.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 919 ret <8 x i64> %v 920} 921 922define <8 x i64> @vmax_vx_v8i64_unmasked(<8 x i64> %va, i64 %b, i32 zeroext %evl) { 923; RV32-LABEL: vmax_vx_v8i64_unmasked: 924; RV32: # %bb.0: 925; RV32-NEXT: addi sp, sp, -16 926; RV32-NEXT: .cfi_def_cfa_offset 16 927; RV32-NEXT: sw a0, 8(sp) 928; RV32-NEXT: sw a1, 12(sp) 929; RV32-NEXT: addi a0, sp, 8 930; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 931; RV32-NEXT: vlse64.v v12, (a0), zero 932; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 933; RV32-NEXT: vmax.vv v8, v8, v12 934; RV32-NEXT: addi sp, sp, 16 935; RV32-NEXT: .cfi_def_cfa_offset 0 936; RV32-NEXT: ret 937; 938; RV64-LABEL: vmax_vx_v8i64_unmasked: 939; RV64: # %bb.0: 940; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 941; RV64-NEXT: vmax.vx v8, v8, a0 942; RV64-NEXT: ret 943 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0 944 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 945 %v = call <8 x i64> @llvm.vp.smax.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> splat (i1 true), i32 %evl) 946 ret <8 x i64> %v 947} 948 949declare <16 x i64> @llvm.vp.smax.v16i64(<16 x i64>, <16 x i64>, <16 x i1>, i32) 950 951define <16 x i64> @vmax_vv_v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 zeroext %evl) { 952; CHECK-LABEL: vmax_vv_v16i64: 953; CHECK: # %bb.0: 954; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 955; CHECK-NEXT: vmax.vv v8, v8, v16, v0.t 956; CHECK-NEXT: ret 957 %v = call <16 x i64> @llvm.vp.smax.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 %evl) 958 ret <16 x i64> %v 959} 960 961define <16 x i64> @vmax_vv_v16i64_unmasked(<16 x i64> %va, <16 x i64> %b, i32 zeroext %evl) { 962; CHECK-LABEL: vmax_vv_v16i64_unmasked: 963; CHECK: # %bb.0: 964; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 965; CHECK-NEXT: vmax.vv v8, v8, v16 966; CHECK-NEXT: ret 967 %v = call <16 x i64> @llvm.vp.smax.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> splat (i1 true), i32 %evl) 968 ret <16 x i64> %v 969} 970 971define <16 x i64> @vmax_vx_v16i64(<16 x i64> %va, i64 %b, <16 x i1> %m, i32 zeroext %evl) { 972; RV32-LABEL: vmax_vx_v16i64: 973; RV32: # %bb.0: 974; RV32-NEXT: addi sp, sp, -16 975; RV32-NEXT: .cfi_def_cfa_offset 16 976; RV32-NEXT: sw a0, 8(sp) 977; RV32-NEXT: sw a1, 12(sp) 978; RV32-NEXT: addi a0, sp, 8 979; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 980; RV32-NEXT: vlse64.v v16, (a0), zero 981; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 982; RV32-NEXT: vmax.vv v8, v8, v16, v0.t 983; RV32-NEXT: addi sp, sp, 16 984; RV32-NEXT: .cfi_def_cfa_offset 0 985; RV32-NEXT: ret 986; 987; RV64-LABEL: vmax_vx_v16i64: 988; RV64: # %bb.0: 989; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 990; RV64-NEXT: vmax.vx v8, v8, a0, v0.t 991; RV64-NEXT: ret 992 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0 993 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer 994 %v = call <16 x i64> @llvm.vp.smax.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 %evl) 995 ret <16 x i64> %v 996} 997 998define <16 x i64> @vmax_vx_v16i64_unmasked(<16 x i64> %va, i64 %b, i32 zeroext %evl) { 999; RV32-LABEL: vmax_vx_v16i64_unmasked: 1000; RV32: # %bb.0: 1001; RV32-NEXT: addi sp, sp, -16 1002; RV32-NEXT: .cfi_def_cfa_offset 16 1003; RV32-NEXT: sw a0, 8(sp) 1004; RV32-NEXT: sw a1, 12(sp) 1005; RV32-NEXT: addi a0, sp, 8 1006; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 1007; RV32-NEXT: vlse64.v v16, (a0), zero 1008; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 1009; RV32-NEXT: vmax.vv v8, v8, v16 1010; RV32-NEXT: addi sp, sp, 16 1011; RV32-NEXT: .cfi_def_cfa_offset 0 1012; RV32-NEXT: ret 1013; 1014; RV64-LABEL: vmax_vx_v16i64_unmasked: 1015; RV64: # %bb.0: 1016; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1017; RV64-NEXT: vmax.vx v8, v8, a0 1018; RV64-NEXT: ret 1019 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0 1020 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer 1021 %v = call <16 x i64> @llvm.vp.smax.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> splat (i1 true), i32 %evl) 1022 ret <16 x i64> %v 1023} 1024 1025; Test that split-legalization works as expected. 1026 1027declare <32 x i64> @llvm.vp.smax.v32i64(<32 x i64>, <32 x i64>, <32 x i1>, i32) 1028 1029define <32 x i64> @vmax_vx_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) { 1030; CHECK-LABEL: vmax_vx_v32i64: 1031; CHECK: # %bb.0: 1032; CHECK-NEXT: li a2, 16 1033; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 1034; CHECK-NEXT: vslidedown.vi v24, v0, 2 1035; CHECK-NEXT: mv a1, a0 1036; CHECK-NEXT: bltu a0, a2, .LBB74_2 1037; CHECK-NEXT: # %bb.1: 1038; CHECK-NEXT: li a1, 16 1039; CHECK-NEXT: .LBB74_2: 1040; CHECK-NEXT: li a2, -1 1041; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1042; CHECK-NEXT: vmax.vx v8, v8, a2, v0.t 1043; CHECK-NEXT: addi a1, a0, -16 1044; CHECK-NEXT: sltu a0, a0, a1 1045; CHECK-NEXT: addi a0, a0, -1 1046; CHECK-NEXT: and a0, a0, a1 1047; CHECK-NEXT: vmv1r.v v0, v24 1048; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1049; CHECK-NEXT: vmax.vx v16, v16, a2, v0.t 1050; CHECK-NEXT: ret 1051 %v = call <32 x i64> @llvm.vp.smax.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 %evl) 1052 ret <32 x i64> %v 1053} 1054