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.mul.v8i7(<8 x i7>, <8 x i7>, <8 x i1>, i32) 8 9define <8 x i7> @vmul_vv_v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 zeroext %evl) { 10; CHECK-LABEL: vmul_vv_v8i7: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 13; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 14; CHECK-NEXT: ret 15 %v = call <8 x i7> @llvm.vp.mul.v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 %evl) 16 ret <8 x i7> %v 17} 18 19declare <2 x i8> @llvm.vp.mul.v2i8(<2 x i8>, <2 x i8>, <2 x i1>, i32) 20 21define <2 x i8> @vmul_vv_v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 zeroext %evl) { 22; CHECK-LABEL: vmul_vv_v2i8: 23; CHECK: # %bb.0: 24; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 25; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 26; CHECK-NEXT: ret 27 %v = call <2 x i8> @llvm.vp.mul.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 %evl) 28 ret <2 x i8> %v 29} 30 31define <2 x i8> @vmul_vv_v2i8_unmasked(<2 x i8> %va, <2 x i8> %b, i32 zeroext %evl) { 32; CHECK-LABEL: vmul_vv_v2i8_unmasked: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 35; CHECK-NEXT: vmul.vv v8, v8, v9 36; CHECK-NEXT: ret 37 %v = call <2 x i8> @llvm.vp.mul.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> splat (i1 true), i32 %evl) 38 ret <2 x i8> %v 39} 40 41define <2 x i8> @vmul_vx_v2i8(<2 x i8> %va, i8 %b, <2 x i1> %m, i32 zeroext %evl) { 42; CHECK-LABEL: vmul_vx_v2i8: 43; CHECK: # %bb.0: 44; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 45; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 46; CHECK-NEXT: ret 47 %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0 48 %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer 49 %v = call <2 x i8> @llvm.vp.mul.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> %m, i32 %evl) 50 ret <2 x i8> %v 51} 52 53define <2 x i8> @vmul_vx_v2i8_unmasked(<2 x i8> %va, i8 %b, i32 zeroext %evl) { 54; CHECK-LABEL: vmul_vx_v2i8_unmasked: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 57; CHECK-NEXT: vmul.vx v8, v8, a0 58; CHECK-NEXT: ret 59 %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0 60 %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer 61 %v = call <2 x i8> @llvm.vp.mul.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> splat (i1 true), i32 %evl) 62 ret <2 x i8> %v 63} 64 65declare <4 x i8> @llvm.vp.mul.v4i8(<4 x i8>, <4 x i8>, <4 x i1>, i32) 66 67define <4 x i8> @vmul_vv_v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 zeroext %evl) { 68; CHECK-LABEL: vmul_vv_v4i8: 69; CHECK: # %bb.0: 70; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 71; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 72; CHECK-NEXT: ret 73 %v = call <4 x i8> @llvm.vp.mul.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 %evl) 74 ret <4 x i8> %v 75} 76 77define <4 x i8> @vmul_vv_v4i8_unmasked(<4 x i8> %va, <4 x i8> %b, i32 zeroext %evl) { 78; CHECK-LABEL: vmul_vv_v4i8_unmasked: 79; CHECK: # %bb.0: 80; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 81; CHECK-NEXT: vmul.vv v8, v8, v9 82; CHECK-NEXT: ret 83 %v = call <4 x i8> @llvm.vp.mul.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> splat (i1 true), i32 %evl) 84 ret <4 x i8> %v 85} 86 87define <4 x i8> @vmul_vx_v4i8(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) { 88; CHECK-LABEL: vmul_vx_v4i8: 89; CHECK: # %bb.0: 90; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 91; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 92; CHECK-NEXT: ret 93 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 94 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 95 %v = call <4 x i8> @llvm.vp.mul.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> %m, i32 %evl) 96 ret <4 x i8> %v 97} 98 99define <4 x i8> @vmul_vx_v4i8_unmasked(<4 x i8> %va, i8 %b, i32 zeroext %evl) { 100; CHECK-LABEL: vmul_vx_v4i8_unmasked: 101; CHECK: # %bb.0: 102; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 103; CHECK-NEXT: vmul.vx v8, v8, a0 104; CHECK-NEXT: ret 105 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 106 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 107 %v = call <4 x i8> @llvm.vp.mul.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> splat (i1 true), i32 %evl) 108 ret <4 x i8> %v 109} 110 111declare <8 x i8> @llvm.vp.mul.v8i8(<8 x i8>, <8 x i8>, <8 x i1>, i32) 112 113define <8 x i8> @vmul_vv_v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 zeroext %evl) { 114; CHECK-LABEL: vmul_vv_v8i8: 115; CHECK: # %bb.0: 116; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 117; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 118; CHECK-NEXT: ret 119 %v = call <8 x i8> @llvm.vp.mul.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 %evl) 120 ret <8 x i8> %v 121} 122 123define <8 x i8> @vmul_vv_v8i8_unmasked(<8 x i8> %va, <8 x i8> %b, i32 zeroext %evl) { 124; CHECK-LABEL: vmul_vv_v8i8_unmasked: 125; CHECK: # %bb.0: 126; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 127; CHECK-NEXT: vmul.vv v8, v8, v9 128; CHECK-NEXT: ret 129 %v = call <8 x i8> @llvm.vp.mul.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> splat (i1 true), i32 %evl) 130 ret <8 x i8> %v 131} 132 133define <8 x i8> @vmul_vx_v8i8(<8 x i8> %va, i8 %b, <8 x i1> %m, i32 zeroext %evl) { 134; CHECK-LABEL: vmul_vx_v8i8: 135; CHECK: # %bb.0: 136; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 137; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 138; CHECK-NEXT: ret 139 %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0 140 %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer 141 %v = call <8 x i8> @llvm.vp.mul.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> %m, i32 %evl) 142 ret <8 x i8> %v 143} 144 145define <8 x i8> @vmul_vx_v8i8_unmasked(<8 x i8> %va, i8 %b, i32 zeroext %evl) { 146; CHECK-LABEL: vmul_vx_v8i8_unmasked: 147; CHECK: # %bb.0: 148; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 149; CHECK-NEXT: vmul.vx v8, v8, a0 150; CHECK-NEXT: ret 151 %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0 152 %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer 153 %v = call <8 x i8> @llvm.vp.mul.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> splat (i1 true), i32 %evl) 154 ret <8 x i8> %v 155} 156 157declare <16 x i8> @llvm.vp.mul.v16i8(<16 x i8>, <16 x i8>, <16 x i1>, i32) 158 159define <16 x i8> @vmul_vv_v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 zeroext %evl) { 160; CHECK-LABEL: vmul_vv_v16i8: 161; CHECK: # %bb.0: 162; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 163; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 164; CHECK-NEXT: ret 165 %v = call <16 x i8> @llvm.vp.mul.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 %evl) 166 ret <16 x i8> %v 167} 168 169define <16 x i8> @vmul_vv_v16i8_unmasked(<16 x i8> %va, <16 x i8> %b, i32 zeroext %evl) { 170; CHECK-LABEL: vmul_vv_v16i8_unmasked: 171; CHECK: # %bb.0: 172; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 173; CHECK-NEXT: vmul.vv v8, v8, v9 174; CHECK-NEXT: ret 175 %v = call <16 x i8> @llvm.vp.mul.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> splat (i1 true), i32 %evl) 176 ret <16 x i8> %v 177} 178 179define <16 x i8> @vmul_vx_v16i8(<16 x i8> %va, i8 %b, <16 x i1> %m, i32 zeroext %evl) { 180; CHECK-LABEL: vmul_vx_v16i8: 181; CHECK: # %bb.0: 182; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 183; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 184; CHECK-NEXT: ret 185 %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0 186 %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer 187 %v = call <16 x i8> @llvm.vp.mul.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> %m, i32 %evl) 188 ret <16 x i8> %v 189} 190 191define <16 x i8> @vmul_vx_v16i8_unmasked(<16 x i8> %va, i8 %b, i32 zeroext %evl) { 192; CHECK-LABEL: vmul_vx_v16i8_unmasked: 193; CHECK: # %bb.0: 194; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 195; CHECK-NEXT: vmul.vx v8, v8, a0 196; CHECK-NEXT: ret 197 %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0 198 %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer 199 %v = call <16 x i8> @llvm.vp.mul.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> splat (i1 true), i32 %evl) 200 ret <16 x i8> %v 201} 202 203declare <2 x i16> @llvm.vp.mul.v2i16(<2 x i16>, <2 x i16>, <2 x i1>, i32) 204 205define <2 x i16> @vmul_vv_v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 zeroext %evl) { 206; CHECK-LABEL: vmul_vv_v2i16: 207; CHECK: # %bb.0: 208; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 209; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 210; CHECK-NEXT: ret 211 %v = call <2 x i16> @llvm.vp.mul.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 %evl) 212 ret <2 x i16> %v 213} 214 215define <2 x i16> @vmul_vv_v2i16_unmasked(<2 x i16> %va, <2 x i16> %b, i32 zeroext %evl) { 216; CHECK-LABEL: vmul_vv_v2i16_unmasked: 217; CHECK: # %bb.0: 218; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 219; CHECK-NEXT: vmul.vv v8, v8, v9 220; CHECK-NEXT: ret 221 %v = call <2 x i16> @llvm.vp.mul.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> splat (i1 true), i32 %evl) 222 ret <2 x i16> %v 223} 224 225define <2 x i16> @vmul_vx_v2i16(<2 x i16> %va, i16 %b, <2 x i1> %m, i32 zeroext %evl) { 226; CHECK-LABEL: vmul_vx_v2i16: 227; CHECK: # %bb.0: 228; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 229; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 230; CHECK-NEXT: ret 231 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0 232 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer 233 %v = call <2 x i16> @llvm.vp.mul.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 %evl) 234 ret <2 x i16> %v 235} 236 237define <2 x i16> @vmul_vx_v2i16_unmasked(<2 x i16> %va, i16 %b, i32 zeroext %evl) { 238; CHECK-LABEL: vmul_vx_v2i16_unmasked: 239; CHECK: # %bb.0: 240; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 241; CHECK-NEXT: vmul.vx v8, v8, a0 242; CHECK-NEXT: ret 243 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0 244 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer 245 %v = call <2 x i16> @llvm.vp.mul.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> splat (i1 true), i32 %evl) 246 ret <2 x i16> %v 247} 248 249declare <4 x i16> @llvm.vp.mul.v4i16(<4 x i16>, <4 x i16>, <4 x i1>, i32) 250 251define <4 x i16> @vmul_vv_v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 zeroext %evl) { 252; CHECK-LABEL: vmul_vv_v4i16: 253; CHECK: # %bb.0: 254; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 255; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 256; CHECK-NEXT: ret 257 %v = call <4 x i16> @llvm.vp.mul.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 %evl) 258 ret <4 x i16> %v 259} 260 261define <4 x i16> @vmul_vv_v4i16_unmasked(<4 x i16> %va, <4 x i16> %b, i32 zeroext %evl) { 262; CHECK-LABEL: vmul_vv_v4i16_unmasked: 263; CHECK: # %bb.0: 264; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 265; CHECK-NEXT: vmul.vv v8, v8, v9 266; CHECK-NEXT: ret 267 %v = call <4 x i16> @llvm.vp.mul.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> splat (i1 true), i32 %evl) 268 ret <4 x i16> %v 269} 270 271define <4 x i16> @vmul_vx_v4i16(<4 x i16> %va, i16 %b, <4 x i1> %m, i32 zeroext %evl) { 272; CHECK-LABEL: vmul_vx_v4i16: 273; CHECK: # %bb.0: 274; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 275; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 276; CHECK-NEXT: ret 277 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0 278 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer 279 %v = call <4 x i16> @llvm.vp.mul.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 %evl) 280 ret <4 x i16> %v 281} 282 283define <4 x i16> @vmul_vx_v4i16_unmasked(<4 x i16> %va, i16 %b, i32 zeroext %evl) { 284; CHECK-LABEL: vmul_vx_v4i16_unmasked: 285; CHECK: # %bb.0: 286; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 287; CHECK-NEXT: vmul.vx v8, v8, a0 288; CHECK-NEXT: ret 289 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0 290 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer 291 %v = call <4 x i16> @llvm.vp.mul.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> splat (i1 true), i32 %evl) 292 ret <4 x i16> %v 293} 294 295declare <8 x i16> @llvm.vp.mul.v8i16(<8 x i16>, <8 x i16>, <8 x i1>, i32) 296 297define <8 x i16> @vmul_vv_v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 zeroext %evl) { 298; CHECK-LABEL: vmul_vv_v8i16: 299; CHECK: # %bb.0: 300; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 301; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 302; CHECK-NEXT: ret 303 %v = call <8 x i16> @llvm.vp.mul.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 %evl) 304 ret <8 x i16> %v 305} 306 307define <8 x i16> @vmul_vv_v8i16_unmasked(<8 x i16> %va, <8 x i16> %b, i32 zeroext %evl) { 308; CHECK-LABEL: vmul_vv_v8i16_unmasked: 309; CHECK: # %bb.0: 310; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 311; CHECK-NEXT: vmul.vv v8, v8, v9 312; CHECK-NEXT: ret 313 %v = call <8 x i16> @llvm.vp.mul.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> splat (i1 true), i32 %evl) 314 ret <8 x i16> %v 315} 316 317define <8 x i16> @vmul_vx_v8i16(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) { 318; CHECK-LABEL: vmul_vx_v8i16: 319; CHECK: # %bb.0: 320; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 321; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 322; CHECK-NEXT: ret 323 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0 324 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer 325 %v = call <8 x i16> @llvm.vp.mul.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 %evl) 326 ret <8 x i16> %v 327} 328 329define <8 x i16> @vmul_vx_v8i16_commute(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) { 330; CHECK-LABEL: vmul_vx_v8i16_commute: 331; CHECK: # %bb.0: 332; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 333; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 334; CHECK-NEXT: ret 335 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0 336 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer 337 %v = call <8 x i16> @llvm.vp.mul.v8i16(<8 x i16> %vb, <8 x i16> %va, <8 x i1> %m, i32 %evl) 338 ret <8 x i16> %v 339} 340 341define <8 x i16> @vmul_vx_v8i16_unmasked(<8 x i16> %va, i16 %b, i32 zeroext %evl) { 342; CHECK-LABEL: vmul_vx_v8i16_unmasked: 343; CHECK: # %bb.0: 344; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 345; CHECK-NEXT: vmul.vx v8, v8, a0 346; CHECK-NEXT: ret 347 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0 348 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer 349 %v = call <8 x i16> @llvm.vp.mul.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> splat (i1 true), i32 %evl) 350 ret <8 x i16> %v 351} 352 353declare <12 x i16> @llvm.vp.mul.v12i16(<12 x i16>, <12 x i16>, <12 x i1>, i32) 354 355define <12 x i16> @vmul_vv_v12i16(<12 x i16> %va, <12 x i16> %b, <12 x i1> %m, i32 zeroext %evl) { 356; CHECK-LABEL: vmul_vv_v12i16: 357; CHECK: # %bb.0: 358; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 359; CHECK-NEXT: vmul.vv v8, v8, v10, v0.t 360; CHECK-NEXT: ret 361 %v = call <12 x i16> @llvm.vp.mul.v12i16(<12 x i16> %va, <12 x i16> %b, <12 x i1> %m, i32 %evl) 362 ret <12 x i16> %v 363} 364 365define <12 x i16> @vmul_vv_v12i16_unmasked(<12 x i16> %va, <12 x i16> %b, i32 zeroext %evl) { 366; CHECK-LABEL: vmul_vv_v12i16_unmasked: 367; CHECK: # %bb.0: 368; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 369; CHECK-NEXT: vmul.vv v8, v8, v10 370; CHECK-NEXT: ret 371 %v = call <12 x i16> @llvm.vp.mul.v12i16(<12 x i16> %va, <12 x i16> %b, <12 x i1> splat (i1 true), i32 %evl) 372 ret <12 x i16> %v 373} 374 375define <12 x i16> @vmul_vx_v12i16(<12 x i16> %va, i16 %b, <12 x i1> %m, i32 zeroext %evl) { 376; CHECK-LABEL: vmul_vx_v12i16: 377; CHECK: # %bb.0: 378; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 379; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 380; CHECK-NEXT: ret 381 %elt.head = insertelement <12 x i16> poison, i16 %b, i32 0 382 %vb = shufflevector <12 x i16> %elt.head, <12 x i16> poison, <12 x i32> zeroinitializer 383 %v = call <12 x i16> @llvm.vp.mul.v12i16(<12 x i16> %va, <12 x i16> %vb, <12 x i1> %m, i32 %evl) 384 ret <12 x i16> %v 385} 386 387define <12 x i16> @vmul_vx_v12i16_unmasked(<12 x i16> %va, i16 %b, i32 zeroext %evl) { 388; CHECK-LABEL: vmul_vx_v12i16_unmasked: 389; CHECK: # %bb.0: 390; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 391; CHECK-NEXT: vmul.vx v8, v8, a0 392; CHECK-NEXT: ret 393 %elt.head = insertelement <12 x i16> poison, i16 %b, i32 0 394 %vb = shufflevector <12 x i16> %elt.head, <12 x i16> poison, <12 x i32> zeroinitializer 395 %v = call <12 x i16> @llvm.vp.mul.v12i16(<12 x i16> %va, <12 x i16> %vb, <12 x i1> splat (i1 true), i32 %evl) 396 ret <12 x i16> %v 397} 398 399declare <16 x i16> @llvm.vp.mul.v16i16(<16 x i16>, <16 x i16>, <16 x i1>, i32) 400 401define <16 x i16> @vmul_vv_v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 zeroext %evl) { 402; CHECK-LABEL: vmul_vv_v16i16: 403; CHECK: # %bb.0: 404; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 405; CHECK-NEXT: vmul.vv v8, v8, v10, v0.t 406; CHECK-NEXT: ret 407 %v = call <16 x i16> @llvm.vp.mul.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 %evl) 408 ret <16 x i16> %v 409} 410 411define <16 x i16> @vmul_vv_v16i16_unmasked(<16 x i16> %va, <16 x i16> %b, i32 zeroext %evl) { 412; CHECK-LABEL: vmul_vv_v16i16_unmasked: 413; CHECK: # %bb.0: 414; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 415; CHECK-NEXT: vmul.vv v8, v8, v10 416; CHECK-NEXT: ret 417 %v = call <16 x i16> @llvm.vp.mul.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> splat (i1 true), i32 %evl) 418 ret <16 x i16> %v 419} 420 421define <16 x i16> @vmul_vx_v16i16(<16 x i16> %va, i16 %b, <16 x i1> %m, i32 zeroext %evl) { 422; CHECK-LABEL: vmul_vx_v16i16: 423; CHECK: # %bb.0: 424; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 425; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 426; CHECK-NEXT: ret 427 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0 428 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer 429 %v = call <16 x i16> @llvm.vp.mul.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 %evl) 430 ret <16 x i16> %v 431} 432 433define <16 x i16> @vmul_vx_v16i16_unmasked(<16 x i16> %va, i16 %b, i32 zeroext %evl) { 434; CHECK-LABEL: vmul_vx_v16i16_unmasked: 435; CHECK: # %bb.0: 436; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 437; CHECK-NEXT: vmul.vx v8, v8, a0 438; CHECK-NEXT: ret 439 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0 440 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer 441 %v = call <16 x i16> @llvm.vp.mul.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> splat (i1 true), i32 %evl) 442 ret <16 x i16> %v 443} 444 445declare <2 x i32> @llvm.vp.mul.v2i32(<2 x i32>, <2 x i32>, <2 x i1>, i32) 446 447define <2 x i32> @vmul_vv_v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 zeroext %evl) { 448; CHECK-LABEL: vmul_vv_v2i32: 449; CHECK: # %bb.0: 450; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 451; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 452; CHECK-NEXT: ret 453 %v = call <2 x i32> @llvm.vp.mul.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 %evl) 454 ret <2 x i32> %v 455} 456 457define <2 x i32> @vmul_vv_v2i32_unmasked(<2 x i32> %va, <2 x i32> %b, i32 zeroext %evl) { 458; CHECK-LABEL: vmul_vv_v2i32_unmasked: 459; CHECK: # %bb.0: 460; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 461; CHECK-NEXT: vmul.vv v8, v8, v9 462; CHECK-NEXT: ret 463 %v = call <2 x i32> @llvm.vp.mul.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> splat (i1 true), i32 %evl) 464 ret <2 x i32> %v 465} 466 467define <2 x i32> @vmul_vx_v2i32(<2 x i32> %va, i32 %b, <2 x i1> %m, i32 zeroext %evl) { 468; CHECK-LABEL: vmul_vx_v2i32: 469; CHECK: # %bb.0: 470; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 471; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 472; CHECK-NEXT: ret 473 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0 474 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer 475 %v = call <2 x i32> @llvm.vp.mul.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 %evl) 476 ret <2 x i32> %v 477} 478 479define <2 x i32> @vmul_vx_v2i32_unmasked(<2 x i32> %va, i32 %b, i32 zeroext %evl) { 480; CHECK-LABEL: vmul_vx_v2i32_unmasked: 481; CHECK: # %bb.0: 482; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 483; CHECK-NEXT: vmul.vx v8, v8, a0 484; CHECK-NEXT: ret 485 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0 486 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer 487 %v = call <2 x i32> @llvm.vp.mul.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> splat (i1 true), i32 %evl) 488 ret <2 x i32> %v 489} 490 491declare <4 x i32> @llvm.vp.mul.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32) 492 493define <4 x i32> @vmul_vv_v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 zeroext %evl) { 494; CHECK-LABEL: vmul_vv_v4i32: 495; CHECK: # %bb.0: 496; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 497; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 498; CHECK-NEXT: ret 499 %v = call <4 x i32> @llvm.vp.mul.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 %evl) 500 ret <4 x i32> %v 501} 502 503define <4 x i32> @vmul_vv_v4i32_unmasked(<4 x i32> %va, <4 x i32> %b, i32 zeroext %evl) { 504; CHECK-LABEL: vmul_vv_v4i32_unmasked: 505; CHECK: # %bb.0: 506; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 507; CHECK-NEXT: vmul.vv v8, v8, v9 508; CHECK-NEXT: ret 509 %v = call <4 x i32> @llvm.vp.mul.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> splat (i1 true), i32 %evl) 510 ret <4 x i32> %v 511} 512 513define <4 x i32> @vmul_vx_v4i32(<4 x i32> %va, i32 %b, <4 x i1> %m, i32 zeroext %evl) { 514; CHECK-LABEL: vmul_vx_v4i32: 515; CHECK: # %bb.0: 516; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 517; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 518; CHECK-NEXT: ret 519 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0 520 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer 521 %v = call <4 x i32> @llvm.vp.mul.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl) 522 ret <4 x i32> %v 523} 524 525define <4 x i32> @vmul_vx_v4i32_unmasked(<4 x i32> %va, i32 %b, i32 zeroext %evl) { 526; CHECK-LABEL: vmul_vx_v4i32_unmasked: 527; CHECK: # %bb.0: 528; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 529; CHECK-NEXT: vmul.vx v8, v8, a0 530; CHECK-NEXT: ret 531 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0 532 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer 533 %v = call <4 x i32> @llvm.vp.mul.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> splat (i1 true), i32 %evl) 534 ret <4 x i32> %v 535} 536 537declare <8 x i32> @llvm.vp.mul.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) 538 539define <8 x i32> @vmul_vv_v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 zeroext %evl) { 540; CHECK-LABEL: vmul_vv_v8i32: 541; CHECK: # %bb.0: 542; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 543; CHECK-NEXT: vmul.vv v8, v8, v10, v0.t 544; CHECK-NEXT: ret 545 %v = call <8 x i32> @llvm.vp.mul.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 %evl) 546 ret <8 x i32> %v 547} 548 549define <8 x i32> @vmul_vv_v8i32_unmasked(<8 x i32> %va, <8 x i32> %b, i32 zeroext %evl) { 550; CHECK-LABEL: vmul_vv_v8i32_unmasked: 551; CHECK: # %bb.0: 552; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 553; CHECK-NEXT: vmul.vv v8, v8, v10 554; CHECK-NEXT: ret 555 %v = call <8 x i32> @llvm.vp.mul.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> splat (i1 true), i32 %evl) 556 ret <8 x i32> %v 557} 558 559define <8 x i32> @vmul_vx_v8i32(<8 x i32> %va, i32 %b, <8 x i1> %m, i32 zeroext %evl) { 560; CHECK-LABEL: vmul_vx_v8i32: 561; CHECK: # %bb.0: 562; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 563; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 564; CHECK-NEXT: ret 565 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0 566 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer 567 %v = call <8 x i32> @llvm.vp.mul.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 %evl) 568 ret <8 x i32> %v 569} 570 571define <8 x i32> @vmul_vx_v8i32_unmasked(<8 x i32> %va, i32 %b, i32 zeroext %evl) { 572; CHECK-LABEL: vmul_vx_v8i32_unmasked: 573; CHECK: # %bb.0: 574; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 575; CHECK-NEXT: vmul.vx v8, v8, a0 576; CHECK-NEXT: ret 577 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0 578 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer 579 %v = call <8 x i32> @llvm.vp.mul.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> splat (i1 true), i32 %evl) 580 ret <8 x i32> %v 581} 582 583declare <16 x i32> @llvm.vp.mul.v16i32(<16 x i32>, <16 x i32>, <16 x i1>, i32) 584 585define <16 x i32> @vmul_vv_v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 zeroext %evl) { 586; CHECK-LABEL: vmul_vv_v16i32: 587; CHECK: # %bb.0: 588; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 589; CHECK-NEXT: vmul.vv v8, v8, v12, v0.t 590; CHECK-NEXT: ret 591 %v = call <16 x i32> @llvm.vp.mul.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 %evl) 592 ret <16 x i32> %v 593} 594 595define <16 x i32> @vmul_vv_v16i32_unmasked(<16 x i32> %va, <16 x i32> %b, i32 zeroext %evl) { 596; CHECK-LABEL: vmul_vv_v16i32_unmasked: 597; CHECK: # %bb.0: 598; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 599; CHECK-NEXT: vmul.vv v8, v8, v12 600; CHECK-NEXT: ret 601 %v = call <16 x i32> @llvm.vp.mul.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> splat (i1 true), i32 %evl) 602 ret <16 x i32> %v 603} 604 605define <16 x i32> @vmul_vx_v16i32(<16 x i32> %va, i32 %b, <16 x i1> %m, i32 zeroext %evl) { 606; CHECK-LABEL: vmul_vx_v16i32: 607; CHECK: # %bb.0: 608; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 609; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 610; CHECK-NEXT: ret 611 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0 612 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer 613 %v = call <16 x i32> @llvm.vp.mul.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 %evl) 614 ret <16 x i32> %v 615} 616 617define <16 x i32> @vmul_vx_v16i32_unmasked(<16 x i32> %va, i32 %b, i32 zeroext %evl) { 618; CHECK-LABEL: vmul_vx_v16i32_unmasked: 619; CHECK: # %bb.0: 620; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 621; CHECK-NEXT: vmul.vx v8, v8, a0 622; CHECK-NEXT: ret 623 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0 624 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer 625 %v = call <16 x i32> @llvm.vp.mul.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> splat (i1 true), i32 %evl) 626 ret <16 x i32> %v 627} 628 629declare <2 x i64> @llvm.vp.mul.v2i64(<2 x i64>, <2 x i64>, <2 x i1>, i32) 630 631define <2 x i64> @vmul_vv_v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 zeroext %evl) { 632; CHECK-LABEL: vmul_vv_v2i64: 633; CHECK: # %bb.0: 634; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 635; CHECK-NEXT: vmul.vv v8, v8, v9, v0.t 636; CHECK-NEXT: ret 637 %v = call <2 x i64> @llvm.vp.mul.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 %evl) 638 ret <2 x i64> %v 639} 640 641define <2 x i64> @vmul_vv_v2i64_unmasked(<2 x i64> %va, <2 x i64> %b, i32 zeroext %evl) { 642; CHECK-LABEL: vmul_vv_v2i64_unmasked: 643; CHECK: # %bb.0: 644; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 645; CHECK-NEXT: vmul.vv v8, v8, v9 646; CHECK-NEXT: ret 647 %v = call <2 x i64> @llvm.vp.mul.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> splat (i1 true), i32 %evl) 648 ret <2 x i64> %v 649} 650 651define <2 x i64> @vmul_vx_v2i64(<2 x i64> %va, i64 %b, <2 x i1> %m, i32 zeroext %evl) { 652; RV32-LABEL: vmul_vx_v2i64: 653; RV32: # %bb.0: 654; RV32-NEXT: addi sp, sp, -16 655; RV32-NEXT: .cfi_def_cfa_offset 16 656; RV32-NEXT: sw a0, 8(sp) 657; RV32-NEXT: sw a1, 12(sp) 658; RV32-NEXT: addi a0, sp, 8 659; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 660; RV32-NEXT: vlse64.v v9, (a0), zero 661; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 662; RV32-NEXT: vmul.vv v8, v8, v9, v0.t 663; RV32-NEXT: addi sp, sp, 16 664; RV32-NEXT: .cfi_def_cfa_offset 0 665; RV32-NEXT: ret 666; 667; RV64-LABEL: vmul_vx_v2i64: 668; RV64: # %bb.0: 669; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 670; RV64-NEXT: vmul.vx v8, v8, a0, v0.t 671; RV64-NEXT: ret 672 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0 673 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer 674 %v = call <2 x i64> @llvm.vp.mul.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 %evl) 675 ret <2 x i64> %v 676} 677 678define <2 x i64> @vmul_vx_v2i64_unmasked(<2 x i64> %va, i64 %b, i32 zeroext %evl) { 679; RV32-LABEL: vmul_vx_v2i64_unmasked: 680; RV32: # %bb.0: 681; RV32-NEXT: addi sp, sp, -16 682; RV32-NEXT: .cfi_def_cfa_offset 16 683; RV32-NEXT: sw a0, 8(sp) 684; RV32-NEXT: sw a1, 12(sp) 685; RV32-NEXT: addi a0, sp, 8 686; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 687; RV32-NEXT: vlse64.v v9, (a0), zero 688; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 689; RV32-NEXT: vmul.vv v8, v8, v9 690; RV32-NEXT: addi sp, sp, 16 691; RV32-NEXT: .cfi_def_cfa_offset 0 692; RV32-NEXT: ret 693; 694; RV64-LABEL: vmul_vx_v2i64_unmasked: 695; RV64: # %bb.0: 696; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 697; RV64-NEXT: vmul.vx v8, v8, a0 698; RV64-NEXT: ret 699 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0 700 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer 701 %v = call <2 x i64> @llvm.vp.mul.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> splat (i1 true), i32 %evl) 702 ret <2 x i64> %v 703} 704 705declare <4 x i64> @llvm.vp.mul.v4i64(<4 x i64>, <4 x i64>, <4 x i1>, i32) 706 707define <4 x i64> @vmul_vv_v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 zeroext %evl) { 708; CHECK-LABEL: vmul_vv_v4i64: 709; CHECK: # %bb.0: 710; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 711; CHECK-NEXT: vmul.vv v8, v8, v10, v0.t 712; CHECK-NEXT: ret 713 %v = call <4 x i64> @llvm.vp.mul.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 %evl) 714 ret <4 x i64> %v 715} 716 717define <4 x i64> @vmul_vv_v4i64_unmasked(<4 x i64> %va, <4 x i64> %b, i32 zeroext %evl) { 718; CHECK-LABEL: vmul_vv_v4i64_unmasked: 719; CHECK: # %bb.0: 720; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 721; CHECK-NEXT: vmul.vv v8, v8, v10 722; CHECK-NEXT: ret 723 %v = call <4 x i64> @llvm.vp.mul.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> splat (i1 true), i32 %evl) 724 ret <4 x i64> %v 725} 726 727define <4 x i64> @vmul_vx_v4i64(<4 x i64> %va, i64 %b, <4 x i1> %m, i32 zeroext %evl) { 728; RV32-LABEL: vmul_vx_v4i64: 729; RV32: # %bb.0: 730; RV32-NEXT: addi sp, sp, -16 731; RV32-NEXT: .cfi_def_cfa_offset 16 732; RV32-NEXT: sw a0, 8(sp) 733; RV32-NEXT: sw a1, 12(sp) 734; RV32-NEXT: addi a0, sp, 8 735; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 736; RV32-NEXT: vlse64.v v10, (a0), zero 737; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 738; RV32-NEXT: vmul.vv v8, v8, v10, v0.t 739; RV32-NEXT: addi sp, sp, 16 740; RV32-NEXT: .cfi_def_cfa_offset 0 741; RV32-NEXT: ret 742; 743; RV64-LABEL: vmul_vx_v4i64: 744; RV64: # %bb.0: 745; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 746; RV64-NEXT: vmul.vx v8, v8, a0, v0.t 747; RV64-NEXT: ret 748 %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0 749 %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer 750 %v = call <4 x i64> @llvm.vp.mul.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 %evl) 751 ret <4 x i64> %v 752} 753 754define <4 x i64> @vmul_vx_v4i64_unmasked(<4 x i64> %va, i64 %b, i32 zeroext %evl) { 755; RV32-LABEL: vmul_vx_v4i64_unmasked: 756; RV32: # %bb.0: 757; RV32-NEXT: addi sp, sp, -16 758; RV32-NEXT: .cfi_def_cfa_offset 16 759; RV32-NEXT: sw a0, 8(sp) 760; RV32-NEXT: sw a1, 12(sp) 761; RV32-NEXT: addi a0, sp, 8 762; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 763; RV32-NEXT: vlse64.v v10, (a0), zero 764; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 765; RV32-NEXT: vmul.vv v8, v8, v10 766; RV32-NEXT: addi sp, sp, 16 767; RV32-NEXT: .cfi_def_cfa_offset 0 768; RV32-NEXT: ret 769; 770; RV64-LABEL: vmul_vx_v4i64_unmasked: 771; RV64: # %bb.0: 772; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 773; RV64-NEXT: vmul.vx v8, v8, a0 774; RV64-NEXT: ret 775 %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0 776 %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer 777 %v = call <4 x i64> @llvm.vp.mul.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> splat (i1 true), i32 %evl) 778 ret <4 x i64> %v 779} 780 781declare <8 x i64> @llvm.vp.mul.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32) 782 783define <8 x i64> @vmul_vv_v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 zeroext %evl) { 784; CHECK-LABEL: vmul_vv_v8i64: 785; CHECK: # %bb.0: 786; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 787; CHECK-NEXT: vmul.vv v8, v8, v12, v0.t 788; CHECK-NEXT: ret 789 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 %evl) 790 ret <8 x i64> %v 791} 792 793define <8 x i64> @vmul_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %b, i32 zeroext %evl) { 794; CHECK-LABEL: vmul_vv_v8i64_unmasked: 795; CHECK: # %bb.0: 796; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 797; CHECK-NEXT: vmul.vv v8, v8, v12 798; CHECK-NEXT: ret 799 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> splat (i1 true), i32 %evl) 800 ret <8 x i64> %v 801} 802 803define <8 x i64> @vmul_vx_v8i64(<8 x i64> %va, i64 %b, <8 x i1> %m, i32 zeroext %evl) { 804; RV32-LABEL: vmul_vx_v8i64: 805; RV32: # %bb.0: 806; RV32-NEXT: addi sp, sp, -16 807; RV32-NEXT: .cfi_def_cfa_offset 16 808; RV32-NEXT: sw a0, 8(sp) 809; RV32-NEXT: sw a1, 12(sp) 810; RV32-NEXT: addi a0, sp, 8 811; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 812; RV32-NEXT: vlse64.v v12, (a0), zero 813; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 814; RV32-NEXT: vmul.vv v8, v8, v12, v0.t 815; RV32-NEXT: addi sp, sp, 16 816; RV32-NEXT: .cfi_def_cfa_offset 0 817; RV32-NEXT: ret 818; 819; RV64-LABEL: vmul_vx_v8i64: 820; RV64: # %bb.0: 821; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 822; RV64-NEXT: vmul.vx v8, v8, a0, v0.t 823; RV64-NEXT: ret 824 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0 825 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 826 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 827 ret <8 x i64> %v 828} 829 830define <8 x i64> @vmul_vx_v8i64_unmasked(<8 x i64> %va, i64 %b, i32 zeroext %evl) { 831; RV32-LABEL: vmul_vx_v8i64_unmasked: 832; RV32: # %bb.0: 833; RV32-NEXT: addi sp, sp, -16 834; RV32-NEXT: .cfi_def_cfa_offset 16 835; RV32-NEXT: sw a0, 8(sp) 836; RV32-NEXT: sw a1, 12(sp) 837; RV32-NEXT: addi a0, sp, 8 838; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 839; RV32-NEXT: vlse64.v v12, (a0), zero 840; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 841; RV32-NEXT: vmul.vv v8, v8, v12 842; RV32-NEXT: addi sp, sp, 16 843; RV32-NEXT: .cfi_def_cfa_offset 0 844; RV32-NEXT: ret 845; 846; RV64-LABEL: vmul_vx_v8i64_unmasked: 847; RV64: # %bb.0: 848; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 849; RV64-NEXT: vmul.vx v8, v8, a0 850; RV64-NEXT: ret 851 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0 852 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 853 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> splat (i1 true), i32 %evl) 854 ret <8 x i64> %v 855} 856 857declare <16 x i64> @llvm.vp.mul.v16i64(<16 x i64>, <16 x i64>, <16 x i1>, i32) 858 859define <16 x i64> @vmul_vv_v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 zeroext %evl) { 860; CHECK-LABEL: vmul_vv_v16i64: 861; CHECK: # %bb.0: 862; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 863; CHECK-NEXT: vmul.vv v8, v8, v16, v0.t 864; CHECK-NEXT: ret 865 %v = call <16 x i64> @llvm.vp.mul.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 %evl) 866 ret <16 x i64> %v 867} 868 869define <16 x i64> @vmul_vv_v16i64_unmasked(<16 x i64> %va, <16 x i64> %b, i32 zeroext %evl) { 870; CHECK-LABEL: vmul_vv_v16i64_unmasked: 871; CHECK: # %bb.0: 872; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 873; CHECK-NEXT: vmul.vv v8, v8, v16 874; CHECK-NEXT: ret 875 %v = call <16 x i64> @llvm.vp.mul.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> splat (i1 true), i32 %evl) 876 ret <16 x i64> %v 877} 878 879define <16 x i64> @vmul_vx_v16i64(<16 x i64> %va, i64 %b, <16 x i1> %m, i32 zeroext %evl) { 880; RV32-LABEL: vmul_vx_v16i64: 881; RV32: # %bb.0: 882; RV32-NEXT: addi sp, sp, -16 883; RV32-NEXT: .cfi_def_cfa_offset 16 884; RV32-NEXT: sw a0, 8(sp) 885; RV32-NEXT: sw a1, 12(sp) 886; RV32-NEXT: addi a0, sp, 8 887; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 888; RV32-NEXT: vlse64.v v16, (a0), zero 889; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 890; RV32-NEXT: vmul.vv v8, v8, v16, v0.t 891; RV32-NEXT: addi sp, sp, 16 892; RV32-NEXT: .cfi_def_cfa_offset 0 893; RV32-NEXT: ret 894; 895; RV64-LABEL: vmul_vx_v16i64: 896; RV64: # %bb.0: 897; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 898; RV64-NEXT: vmul.vx v8, v8, a0, v0.t 899; RV64-NEXT: ret 900 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0 901 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer 902 %v = call <16 x i64> @llvm.vp.mul.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 %evl) 903 ret <16 x i64> %v 904} 905 906define <16 x i64> @vmul_vx_v16i64_unmasked(<16 x i64> %va, i64 %b, i32 zeroext %evl) { 907; RV32-LABEL: vmul_vx_v16i64_unmasked: 908; RV32: # %bb.0: 909; RV32-NEXT: addi sp, sp, -16 910; RV32-NEXT: .cfi_def_cfa_offset 16 911; RV32-NEXT: sw a0, 8(sp) 912; RV32-NEXT: sw a1, 12(sp) 913; RV32-NEXT: addi a0, sp, 8 914; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 915; RV32-NEXT: vlse64.v v16, (a0), zero 916; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 917; RV32-NEXT: vmul.vv v8, v8, v16 918; RV32-NEXT: addi sp, sp, 16 919; RV32-NEXT: .cfi_def_cfa_offset 0 920; RV32-NEXT: ret 921; 922; RV64-LABEL: vmul_vx_v16i64_unmasked: 923; RV64: # %bb.0: 924; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 925; RV64-NEXT: vmul.vx v8, v8, a0 926; RV64-NEXT: ret 927 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0 928 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer 929 %v = call <16 x i64> @llvm.vp.mul.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> splat (i1 true), i32 %evl) 930 ret <16 x i64> %v 931} 932 933 934define <8 x i64> @vmul_vv_undef_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 935; RV32-LABEL: vmul_vv_undef_v8i64: 936; RV32: # %bb.0: 937; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, ma 938; RV32-NEXT: vmv.v.i v8, 0 939; RV32-NEXT: ret 940; 941; RV64-LABEL: vmul_vv_undef_v8i64: 942; RV64: # %bb.0: 943; RV64-NEXT: vsetivli zero, 8, e64, m4, ta, ma 944; RV64-NEXT: vmv.v.i v8, 0 945; RV64-NEXT: ret 946 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> undef, <8 x i1> %m, i32 %evl) 947 ret <8 x i64> %v 948} 949 950define <8 x i64> @vmul_vx_undef_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 951; RV32-LABEL: vmul_vx_undef_v8i64_unmasked: 952; RV32: # %bb.0: 953; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, ma 954; RV32-NEXT: vmv.v.i v8, 0 955; RV32-NEXT: ret 956; 957; RV64-LABEL: vmul_vx_undef_v8i64_unmasked: 958; RV64: # %bb.0: 959; RV64-NEXT: vsetivli zero, 8, e64, m4, ta, ma 960; RV64-NEXT: vmv.v.i v8, 0 961; RV64-NEXT: ret 962 %head = insertelement <8 x i1> poison, i1 true, i32 0 963 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 964 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> undef, <8 x i1> %m, i32 %evl) 965 ret <8 x i64> %v 966} 967 968define <8 x i64> @vmul_vx_zero_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 969; RV32-LABEL: vmul_vx_zero_v8i64: 970; RV32: # %bb.0: 971; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, ma 972; RV32-NEXT: vmv.v.i v8, 0 973; RV32-NEXT: ret 974; 975; RV64-LABEL: vmul_vx_zero_v8i64: 976; RV64: # %bb.0: 977; RV64-NEXT: vsetivli zero, 8, e64, m4, ta, ma 978; RV64-NEXT: vmv.v.i v8, 0 979; RV64-NEXT: ret 980 %elt.head = insertelement <8 x i64> poison, i64 0, i32 0 981 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 982 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 983 ret <8 x i64> %v 984} 985 986define <8 x i64> @vmul_vx_zero_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 987; RV32-LABEL: vmul_vx_zero_v8i64_unmasked: 988; RV32: # %bb.0: 989; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, ma 990; RV32-NEXT: vmv.v.i v8, 0 991; RV32-NEXT: ret 992; 993; RV64-LABEL: vmul_vx_zero_v8i64_unmasked: 994; RV64: # %bb.0: 995; RV64-NEXT: vsetivli zero, 8, e64, m4, ta, ma 996; RV64-NEXT: vmv.v.i v8, 0 997; RV64-NEXT: ret 998 %elt.head = insertelement <8 x i64> poison, i64 0, i32 0 999 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1000 %head = insertelement <8 x i1> poison, i1 true, i32 0 1001 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1002 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1003 ret <8 x i64> %v 1004} 1005 1006define <8 x i64> @vmul_vx_one_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 1007; CHECK-LABEL: vmul_vx_one_v8i64: 1008; CHECK: # %bb.0: 1009; CHECK-NEXT: ret 1010 %elt.head = insertelement <8 x i64> poison, i64 1, i32 0 1011 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1012 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1013 ret <8 x i64> %v 1014} 1015 1016define <8 x i64> @vmul_vx_one_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 1017; CHECK-LABEL: vmul_vx_one_v8i64_unmasked: 1018; CHECK: # %bb.0: 1019; CHECK-NEXT: ret 1020 %elt.head = insertelement <8 x i64> poison, i64 1, i32 0 1021 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1022 %head = insertelement <8 x i1> poison, i1 true, i32 0 1023 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1024 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1025 ret <8 x i64> %v 1026} 1027 1028define <8 x i64> @vmul_vx_negone_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 1029; CHECK-LABEL: vmul_vx_negone_v8i64: 1030; CHECK: # %bb.0: 1031; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1032; CHECK-NEXT: vrsub.vi v8, v8, 0, v0.t 1033; CHECK-NEXT: ret 1034 %elt.head = insertelement <8 x i64> poison, i64 -1, i32 0 1035 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1036 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1037 ret <8 x i64> %v 1038} 1039 1040define <8 x i64> @vmul_vx_negone_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 1041; CHECK-LABEL: vmul_vx_negone_v8i64_unmasked: 1042; CHECK: # %bb.0: 1043; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1044; CHECK-NEXT: vrsub.vi v8, v8, 0 1045; CHECK-NEXT: ret 1046 %elt.head = insertelement <8 x i64> poison, i64 -1, i32 0 1047 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1048 %head = insertelement <8 x i1> poison, i1 true, i32 0 1049 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1050 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1051 ret <8 x i64> %v 1052} 1053 1054define <8 x i64> @vmul_vx_pow2_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 1055; CHECK-LABEL: vmul_vx_pow2_v8i64: 1056; CHECK: # %bb.0: 1057; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1058; CHECK-NEXT: vsll.vi v8, v8, 6, v0.t 1059; CHECK-NEXT: ret 1060 %elt.head = insertelement <8 x i64> poison, i64 64, i32 0 1061 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1062 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1063 ret <8 x i64> %v 1064} 1065 1066define <8 x i64> @vmul_vx_pow2_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 1067; CHECK-LABEL: vmul_vx_pow2_v8i64_unmasked: 1068; CHECK: # %bb.0: 1069; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1070; CHECK-NEXT: vsll.vi v8, v8, 6 1071; CHECK-NEXT: ret 1072 %elt.head = insertelement <8 x i64> poison, i64 64, i32 0 1073 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1074 %head = insertelement <8 x i1> poison, i1 true, i32 0 1075 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1076 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1077 ret <8 x i64> %v 1078} 1079 1080define <8 x i64> @vmul_vx_negpow2_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 1081; CHECK-LABEL: vmul_vx_negpow2_v8i64: 1082; CHECK: # %bb.0: 1083; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1084; CHECK-NEXT: vsll.vi v8, v8, 6, v0.t 1085; CHECK-NEXT: vrsub.vi v8, v8, 0, v0.t 1086; CHECK-NEXT: ret 1087 %elt.head = insertelement <8 x i64> poison, i64 -64, i32 0 1088 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1089 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1090 ret <8 x i64> %v 1091} 1092 1093define <8 x i64> @vmul_vx_negpow2_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 1094; CHECK-LABEL: vmul_vx_negpow2_v8i64_unmasked: 1095; CHECK: # %bb.0: 1096; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1097; CHECK-NEXT: vsll.vi v8, v8, 6 1098; CHECK-NEXT: vrsub.vi v8, v8, 0 1099; CHECK-NEXT: ret 1100 %elt.head = insertelement <8 x i64> poison, i64 -64, i32 0 1101 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1102 %head = insertelement <8 x i1> poison, i1 true, i32 0 1103 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1104 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1105 ret <8 x i64> %v 1106} 1107 1108declare <8 x i64> @llvm.vp.shl.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32) 1109 1110define <8 x i64> @vmul_vshl_vx_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 1111; CHECK-LABEL: vmul_vshl_vx_v8i64: 1112; CHECK: # %bb.0: 1113; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1114; CHECK-NEXT: vsll.vi v8, v8, 3, v0.t 1115; CHECK-NEXT: li a0, 7 1116; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 1117; CHECK-NEXT: ret 1118 %elt.head1 = insertelement <8 x i64> poison, i64 3, i32 0 1119 %vb = shufflevector <8 x i64> %elt.head1, <8 x i64> poison, <8 x i32> zeroinitializer 1120 %elt.head2 = insertelement <8 x i64> poison, i64 7, i32 0 1121 %vc = shufflevector <8 x i64> %elt.head2, <8 x i64> poison, <8 x i32> zeroinitializer 1122 %vshl = call <8 x i64> @llvm.vp.shl.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1123 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %vshl, <8 x i64> %vc, <8 x i1> %m, i32 %evl) 1124 ret <8 x i64> %v 1125} 1126 1127define <8 x i64> @vmul_vshl_vx_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 1128; CHECK-LABEL: vmul_vshl_vx_v8i64_unmasked: 1129; CHECK: # %bb.0: 1130; CHECK-NEXT: li a0, 56 1131; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 1132; CHECK-NEXT: vmul.vx v8, v8, a0 1133; CHECK-NEXT: ret 1134 %head = insertelement <8 x i1> poison, i1 true, i32 0 1135 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1136 %elt.head1 = insertelement <8 x i64> poison, i64 3, i32 0 1137 %vb = shufflevector <8 x i64> %elt.head1, <8 x i64> poison, <8 x i32> zeroinitializer 1138 %elt.head2 = insertelement <8 x i64> poison, i64 7, i32 0 1139 %vc = shufflevector <8 x i64> %elt.head2, <8 x i64> poison, <8 x i32> zeroinitializer 1140 %vshl = call <8 x i64> @llvm.vp.shl.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1141 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %vshl, <8 x i64> %vc, <8 x i1> %m, i32 %evl) 1142 ret <8 x i64> %v 1143} 1144 1145define <8 x i64> @vmul_vshl_vv_v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 zeroext %evl) { 1146; CHECK-LABEL: vmul_vshl_vv_v8i64: 1147; CHECK: # %bb.0: 1148; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1149; CHECK-NEXT: vsll.vi v8, v8, 7, v0.t 1150; CHECK-NEXT: vmul.vv v8, v8, v12, v0.t 1151; CHECK-NEXT: ret 1152 %elt.head = insertelement <8 x i64> poison, i64 7, i32 0 1153 %vc = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1154 %vshl = call <8 x i64> @llvm.vp.shl.v8i64(<8 x i64> %va, <8 x i64> %vc, <8 x i1> %m, i32 %evl) 1155 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %vshl, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1156 ret <8 x i64> %v 1157} 1158 1159define <8 x i64> @vmul_vshl_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %vb, i32 zeroext %evl) { 1160; CHECK-LABEL: vmul_vshl_vv_v8i64_unmasked: 1161; CHECK: # %bb.0: 1162; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1163; CHECK-NEXT: vmul.vv v8, v8, v12 1164; CHECK-NEXT: vsll.vi v8, v8, 7 1165; CHECK-NEXT: ret 1166 %head = insertelement <8 x i1> poison, i1 true, i32 0 1167 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1168 %elt.head = insertelement <8 x i64> poison, i64 7, i32 0 1169 %vc = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1170 %vshl = call <8 x i64> @llvm.vp.shl.v8i64(<8 x i64> %va, <8 x i64> %vc, <8 x i1> %m, i32 %evl) 1171 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %vshl, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1172 ret <8 x i64> %v 1173} 1174 1175declare <8 x i64> @llvm.vp.add.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32) 1176 1177define <8 x i64> @vmul_vadd_vx_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 1178; CHECK-LABEL: vmul_vadd_vx_v8i64: 1179; CHECK: # %bb.0: 1180; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1181; CHECK-NEXT: vadd.vi v8, v8, 3, v0.t 1182; CHECK-NEXT: li a0, 7 1183; CHECK-NEXT: vmul.vx v8, v8, a0, v0.t 1184; CHECK-NEXT: ret 1185 %elt.head1 = insertelement <8 x i64> poison, i64 3, i32 0 1186 %vb = shufflevector <8 x i64> %elt.head1, <8 x i64> poison, <8 x i32> zeroinitializer 1187 %elt.head2 = insertelement <8 x i64> poison, i64 7, i32 0 1188 %vc = shufflevector <8 x i64> %elt.head2, <8 x i64> poison, <8 x i32> zeroinitializer 1189 %vadd = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1190 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %vadd, <8 x i64> %vc, <8 x i1> %m, i32 %evl) 1191 ret <8 x i64> %v 1192} 1193 1194define <8 x i64> @vmul_vadd_vx_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 1195; CHECK-LABEL: vmul_vadd_vx_v8i64_unmasked: 1196; CHECK: # %bb.0: 1197; CHECK-NEXT: li a1, 21 1198; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 1199; CHECK-NEXT: vmv.v.x v12, a1 1200; CHECK-NEXT: li a1, 7 1201; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1202; CHECK-NEXT: vmadd.vx v8, a1, v12 1203; CHECK-NEXT: ret 1204 %head = insertelement <8 x i1> poison, i1 true, i32 0 1205 %m = shufflevector <8 x i1> %head, <8 x i1> poison, <8 x i32> zeroinitializer 1206 %elt.head1 = insertelement <8 x i64> poison, i64 3, i32 0 1207 %vb = shufflevector <8 x i64> %elt.head1, <8 x i64> poison, <8 x i32> zeroinitializer 1208 %elt.head2 = insertelement <8 x i64> poison, i64 7, i32 0 1209 %vc = shufflevector <8 x i64> %elt.head2, <8 x i64> poison, <8 x i32> zeroinitializer 1210 %vadd = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1211 %v = call <8 x i64> @llvm.vp.mul.v8i64(<8 x i64> %vadd, <8 x i64> %vc, <8 x i1> %m, i32 %evl) 1212 ret <8 x i64> %v 1213} 1214