1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV32 3; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV64 4; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV32 5; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV64 6 7target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 8 9define <2 x i8> @vslide1up_2xi8(<2 x i8> %v, i8 %b) { 10; CHECK-LABEL: vslide1up_2xi8: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 13; CHECK-NEXT: vslide1up.vx v9, v8, a0 14; CHECK-NEXT: vmv1r.v v8, v9 15; CHECK-NEXT: ret 16 %vb = insertelement <2 x i8> poison, i8 %b, i64 0 17 %v1 = shufflevector <2 x i8> %v, <2 x i8> %vb, <2 x i32> <i32 2, i32 0> 18 ret <2 x i8> %v1 19} 20 21define <4 x i8> @vslide1up_4xi8(<4 x i8> %v, i8 %b) { 22; CHECK-LABEL: vslide1up_4xi8: 23; CHECK: # %bb.0: 24; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 25; CHECK-NEXT: vslide1up.vx v9, v8, a0 26; CHECK-NEXT: vmv1r.v v8, v9 27; CHECK-NEXT: ret 28 %vb = insertelement <4 x i8> poison, i8 %b, i64 0 29 %v1 = shufflevector <4 x i8> %v, <4 x i8> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 30 ret <4 x i8> %v1 31} 32 33define <4 x i8> @vslide1up_4xi8_swapped(<4 x i8> %v, i8 %b) { 34; CHECK-LABEL: vslide1up_4xi8_swapped: 35; CHECK: # %bb.0: 36; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 37; CHECK-NEXT: vslide1up.vx v9, v8, a0 38; CHECK-NEXT: vmv1r.v v8, v9 39; CHECK-NEXT: ret 40 %vb = insertelement <4 x i8> poison, i8 %b, i64 0 41 %v1 = shufflevector <4 x i8> %vb, <4 x i8> %v, <4 x i32> <i32 0, i32 4, i32 5, i32 6> 42 ret <4 x i8> %v1 43} 44 45define <2 x i16> @vslide1up_2xi16(<2 x i16> %v, i16 %b) { 46; CHECK-LABEL: vslide1up_2xi16: 47; CHECK: # %bb.0: 48; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 49; CHECK-NEXT: vslide1up.vx v9, v8, a0 50; CHECK-NEXT: vmv1r.v v8, v9 51; CHECK-NEXT: ret 52 %vb = insertelement <2 x i16> poison, i16 %b, i64 0 53 %v1 = shufflevector <2 x i16> %v, <2 x i16> %vb, <2 x i32> <i32 2, i32 0> 54 ret <2 x i16> %v1 55} 56 57define <4 x i16> @vslide1up_4xi16(<4 x i16> %v, i16 %b) { 58; CHECK-LABEL: vslide1up_4xi16: 59; CHECK: # %bb.0: 60; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 61; CHECK-NEXT: vslide1up.vx v9, v8, a0 62; CHECK-NEXT: vmv1r.v v8, v9 63; CHECK-NEXT: ret 64 %vb = insertelement <4 x i16> poison, i16 %b, i64 0 65 %v1 = shufflevector <4 x i16> %v, <4 x i16> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 66 ret <4 x i16> %v1 67} 68 69define <2 x i32> @vslide1up_2xi32(<2 x i32> %v, i32 %b) { 70; CHECK-LABEL: vslide1up_2xi32: 71; CHECK: # %bb.0: 72; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 73; CHECK-NEXT: vslide1up.vx v9, v8, a0 74; CHECK-NEXT: vmv1r.v v8, v9 75; CHECK-NEXT: ret 76 %vb = insertelement <2 x i32> poison, i32 %b, i64 0 77 %v1 = shufflevector <2 x i32> %v, <2 x i32> %vb, <2 x i32> <i32 2, i32 0> 78 ret <2 x i32> %v1 79} 80 81define <4 x i32> @vslide1up_4xi32(<4 x i32> %v, i32 %b) { 82; CHECK-LABEL: vslide1up_4xi32: 83; CHECK: # %bb.0: 84; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 85; CHECK-NEXT: vslide1up.vx v9, v8, a0 86; CHECK-NEXT: vmv.v.v v8, v9 87; CHECK-NEXT: ret 88 %vb = insertelement <4 x i32> poison, i32 %b, i64 0 89 %v1 = shufflevector <4 x i32> %v, <4 x i32> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 90 ret <4 x i32> %v1 91} 92 93define <2 x i64> @vslide1up_2xi64(<2 x i64> %v, i64 %b) { 94; RV32-LABEL: vslide1up_2xi64: 95; RV32: # %bb.0: 96; RV32-NEXT: addi sp, sp, -16 97; RV32-NEXT: .cfi_def_cfa_offset 16 98; RV32-NEXT: sw a0, 8(sp) 99; RV32-NEXT: sw a1, 12(sp) 100; RV32-NEXT: addi a0, sp, 8 101; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 102; RV32-NEXT: vlse64.v v9, (a0), zero 103; RV32-NEXT: vslideup.vi v9, v8, 1 104; RV32-NEXT: vmv.v.v v8, v9 105; RV32-NEXT: addi sp, sp, 16 106; RV32-NEXT: .cfi_def_cfa_offset 0 107; RV32-NEXT: ret 108; 109; RV64-LABEL: vslide1up_2xi64: 110; RV64: # %bb.0: 111; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma 112; RV64-NEXT: vslide1up.vx v9, v8, a0 113; RV64-NEXT: vmv.v.v v8, v9 114; RV64-NEXT: ret 115 %vb = insertelement <2 x i64> poison, i64 %b, i64 0 116 %v1 = shufflevector <2 x i64> %v, <2 x i64> %vb, <2 x i32> <i32 2, i32 0> 117 ret <2 x i64> %v1 118} 119 120define <4 x i64> @vslide1up_4xi64(<4 x i64> %v, i64 %b) { 121; RV32-LABEL: vslide1up_4xi64: 122; RV32: # %bb.0: 123; RV32-NEXT: addi sp, sp, -16 124; RV32-NEXT: .cfi_def_cfa_offset 16 125; RV32-NEXT: sw a0, 8(sp) 126; RV32-NEXT: sw a1, 12(sp) 127; RV32-NEXT: addi a0, sp, 8 128; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 129; RV32-NEXT: vlse64.v v10, (a0), zero 130; RV32-NEXT: vslideup.vi v10, v8, 1 131; RV32-NEXT: vmv.v.v v8, v10 132; RV32-NEXT: addi sp, sp, 16 133; RV32-NEXT: .cfi_def_cfa_offset 0 134; RV32-NEXT: ret 135; 136; RV64-LABEL: vslide1up_4xi64: 137; RV64: # %bb.0: 138; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma 139; RV64-NEXT: vslide1up.vx v10, v8, a0 140; RV64-NEXT: vmv.v.v v8, v10 141; RV64-NEXT: ret 142 %vb = insertelement <4 x i64> poison, i64 %b, i64 0 143 %v1 = shufflevector <4 x i64> %v, <4 x i64> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 144 ret <4 x i64> %v1 145} 146 147define <2 x bfloat> @vslide1up_2xbf16(<2 x bfloat> %v, bfloat %b) { 148; CHECK-LABEL: vslide1up_2xbf16: 149; CHECK: # %bb.0: 150; CHECK-NEXT: fmv.x.h a0, fa0 151; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 152; CHECK-NEXT: vslide1up.vx v9, v8, a0 153; CHECK-NEXT: vmv1r.v v8, v9 154; CHECK-NEXT: ret 155 %vb = insertelement <2 x bfloat> poison, bfloat %b, i64 0 156 %v1 = shufflevector <2 x bfloat> %v, <2 x bfloat> %vb, <2 x i32> <i32 2, i32 0> 157 ret <2 x bfloat> %v1 158} 159 160define <4 x bfloat> @vslide1up_4xbf16(<4 x bfloat> %v, bfloat %b) { 161; CHECK-LABEL: vslide1up_4xbf16: 162; CHECK: # %bb.0: 163; CHECK-NEXT: fmv.x.h a0, fa0 164; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 165; CHECK-NEXT: vslide1up.vx v9, v8, a0 166; CHECK-NEXT: vmv1r.v v8, v9 167; CHECK-NEXT: ret 168 %vb = insertelement <4 x bfloat> poison, bfloat %b, i64 0 169 %v1 = shufflevector <4 x bfloat> %v, <4 x bfloat> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 170 ret <4 x bfloat> %v1 171} 172 173define <2 x half> @vslide1up_2xf16(<2 x half> %v, half %b) { 174; ZVFH-LABEL: vslide1up_2xf16: 175; ZVFH: # %bb.0: 176; ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 177; ZVFH-NEXT: vfslide1up.vf v9, v8, fa0 178; ZVFH-NEXT: vmv1r.v v8, v9 179; ZVFH-NEXT: ret 180; 181; ZVFHMIN-LABEL: vslide1up_2xf16: 182; ZVFHMIN: # %bb.0: 183; ZVFHMIN-NEXT: fmv.x.h a0, fa0 184; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 185; ZVFHMIN-NEXT: vslide1up.vx v9, v8, a0 186; ZVFHMIN-NEXT: vmv1r.v v8, v9 187; ZVFHMIN-NEXT: ret 188 %vb = insertelement <2 x half> poison, half %b, i64 0 189 %v1 = shufflevector <2 x half> %v, <2 x half> %vb, <2 x i32> <i32 2, i32 0> 190 ret <2 x half> %v1 191} 192 193define <4 x half> @vslide1up_4xf16(<4 x half> %v, half %b) { 194; ZVFH-LABEL: vslide1up_4xf16: 195; ZVFH: # %bb.0: 196; ZVFH-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 197; ZVFH-NEXT: vfslide1up.vf v9, v8, fa0 198; ZVFH-NEXT: vmv1r.v v8, v9 199; ZVFH-NEXT: ret 200; 201; ZVFHMIN-LABEL: vslide1up_4xf16: 202; ZVFHMIN: # %bb.0: 203; ZVFHMIN-NEXT: fmv.x.h a0, fa0 204; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 205; ZVFHMIN-NEXT: vslide1up.vx v9, v8, a0 206; ZVFHMIN-NEXT: vmv1r.v v8, v9 207; ZVFHMIN-NEXT: ret 208 %vb = insertelement <4 x half> poison, half %b, i64 0 209 %v1 = shufflevector <4 x half> %v, <4 x half> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 210 ret <4 x half> %v1 211} 212 213define <2 x float> @vslide1up_2xf32(<2 x float> %v, float %b) { 214; CHECK-LABEL: vslide1up_2xf32: 215; CHECK: # %bb.0: 216; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 217; CHECK-NEXT: vfslide1up.vf v9, v8, fa0 218; CHECK-NEXT: vmv1r.v v8, v9 219; CHECK-NEXT: ret 220 %vb = insertelement <2 x float> poison, float %b, i64 0 221 %v1 = shufflevector <2 x float> %v, <2 x float> %vb, <2 x i32> <i32 2, i32 0> 222 ret <2 x float> %v1 223} 224 225define <4 x float> @vslide1up_4xf32(<4 x float> %v, float %b) { 226; CHECK-LABEL: vslide1up_4xf32: 227; CHECK: # %bb.0: 228; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 229; CHECK-NEXT: vfslide1up.vf v9, v8, fa0 230; CHECK-NEXT: vmv.v.v v8, v9 231; CHECK-NEXT: ret 232 %vb = insertelement <4 x float> poison, float %b, i64 0 233 %v1 = shufflevector <4 x float> %v, <4 x float> %vb, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 234 ret <4 x float> %v1 235} 236 237define <2 x double> @vslide1up_2xf64(<2 x double> %v, double %b) { 238; CHECK-LABEL: vslide1up_2xf64: 239; CHECK: # %bb.0: 240; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 241; CHECK-NEXT: vfslide1up.vf v9, v8, fa0 242; CHECK-NEXT: vmv.v.v v8, v9 243; CHECK-NEXT: ret 244 %vb = insertelement <2 x double> poison, double %b, i64 0 245 %v1 = shufflevector <2 x double> %v, <2 x double> %vb, <2 x i32> <i32 2, i32 0> 246 ret <2 x double> %v1 247} 248 249define <4 x double> @vslide1up_4xf64(<4 x double> %v, double %b) { 250; CHECK-LABEL: vslide1up_4xf64: 251; CHECK: # %bb.0: 252; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 253; CHECK-NEXT: vfmv.v.f v10, fa0 254; CHECK-NEXT: vslideup.vi v10, v8, 3 255; CHECK-NEXT: vmv.v.v v8, v10 256; CHECK-NEXT: ret 257 %vb = insertelement <4 x double> poison, double %b, i64 0 258 %v1 = shufflevector <4 x double> %v, <4 x double> %vb, <4 x i32> <i32 4, i32 5, i32 6, i32 0> 259 ret <4 x double> %v1 260} 261 262define <4 x i8> @vslide1up_4xi8_with_splat(<4 x i8> %v, i8 %b) { 263; CHECK-LABEL: vslide1up_4xi8_with_splat: 264; CHECK: # %bb.0: 265; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 266; CHECK-NEXT: vslide1up.vx v9, v8, a0 267; CHECK-NEXT: vmv1r.v v8, v9 268; CHECK-NEXT: ret 269 %vb = insertelement <4 x i8> poison, i8 %b, i64 0 270 %v1 = shufflevector <4 x i8> %vb, <4 x i8> poison, <4 x i32> zeroinitializer 271 %v2 = shufflevector <4 x i8> %v1, <4 x i8> %v, <4 x i32> <i32 1, i32 4, i32 5, i32 6> 272 ret <4 x i8> %v2 273} 274 275define <2 x double> @vslide1up_v2f64_inverted(<2 x double> %v, double %b) { 276; CHECK-LABEL: vslide1up_v2f64_inverted: 277; CHECK: # %bb.0: 278; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 279; CHECK-NEXT: vrgather.vi v9, v8, 0 280; CHECK-NEXT: vsetvli zero, zero, e64, m1, tu, ma 281; CHECK-NEXT: vfmv.s.f v9, fa0 282; CHECK-NEXT: vmv1r.v v8, v9 283; CHECK-NEXT: ret 284 %v1 = shufflevector <2 x double> %v, <2 x double> poison, <2 x i32> <i32 0, i32 0> 285 %v2 = insertelement <2 x double> %v1, double %b, i64 0 286 ret <2 x double> %v2 287} 288 289define <4 x i8> @vslide1up_4xi8_inverted(<4 x i8> %v, i8 %b) { 290; CHECK-LABEL: vslide1up_4xi8_inverted: 291; CHECK: # %bb.0: 292; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 293; CHECK-NEXT: vslideup.vi v9, v8, 1 294; CHECK-NEXT: vsetvli zero, zero, e8, mf4, tu, ma 295; CHECK-NEXT: vmv.s.x v9, a0 296; CHECK-NEXT: vmv1r.v v8, v9 297; CHECK-NEXT: ret 298 %v1 = shufflevector <4 x i8> %v, <4 x i8> poison, <4 x i32> <i32 undef, i32 0, i32 1, i32 2> 299 %v2 = insertelement <4 x i8> %v1, i8 %b, i64 0 300 ret <4 x i8> %v2 301} 302 303define <2 x double> @vslide1up_2xf64_as_rotate(<2 x double> %v, double %b) { 304; CHECK-LABEL: vslide1up_2xf64_as_rotate: 305; CHECK: # %bb.0: 306; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 307; CHECK-NEXT: vfmv.s.f v9, fa0 308; CHECK-NEXT: vslideup.vi v8, v9, 1 309; CHECK-NEXT: vslidedown.vi v9, v8, 1 310; CHECK-NEXT: vslideup.vi v9, v8, 1 311; CHECK-NEXT: vmv.v.v v8, v9 312; CHECK-NEXT: ret 313 %v1 = insertelement <2 x double> %v, double %b, i64 1 314 %v2 = shufflevector <2 x double> %v1, <2 x double> poison, <2 x i32> <i32 1, i32 0> 315 ret <2 x double> %v2 316} 317 318define <4 x i8> @vslide1up_4xi8_as_rotate(<4 x i8> %v, i8 %b) { 319; CHECK-LABEL: vslide1up_4xi8_as_rotate: 320; CHECK: # %bb.0: 321; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 322; CHECK-NEXT: vmv.s.x v9, a0 323; CHECK-NEXT: vslideup.vi v8, v9, 3 324; CHECK-NEXT: vslidedown.vi v9, v8, 3 325; CHECK-NEXT: vslideup.vi v9, v8, 1 326; CHECK-NEXT: vmv1r.v v8, v9 327; CHECK-NEXT: ret 328 %v1 = insertelement <4 x i8> %v, i8 %b, i64 3 329 %v2 = shufflevector <4 x i8> %v1, <4 x i8> poison, <4 x i32> <i32 3, i32 0, i32 1, i32 2> 330 ret <4 x i8> %v2 331} 332 333; The length of the shift is less than the suffix, since we'd have to 334; materailize the splat, using the vslide1up doesn't help us. 335define <4 x i32> @vslide1up_4xi32_neg1(<4 x i32> %v, i32 %b) { 336; CHECK-LABEL: vslide1up_4xi32_neg1: 337; CHECK: # %bb.0: 338; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 339; CHECK-NEXT: vmv.v.x v9, a0 340; CHECK-NEXT: vsetivli zero, 3, e32, m1, tu, ma 341; CHECK-NEXT: vslideup.vi v9, v8, 1 342; CHECK-NEXT: vmv1r.v v8, v9 343; CHECK-NEXT: ret 344 %vb = insertelement <4 x i32> poison, i32 %b, i64 0 345 %vb2 = insertelement <4 x i32> %vb, i32 %b, i64 3 346 %v1 = shufflevector <4 x i32> %v, <4 x i32> %vb2, <4 x i32> <i32 4, i32 0, i32 1, i32 7> 347 ret <4 x i32> %v1 348} 349 350; We don't know the scalar to do the vslide1up 351define <4 x i32> @vslide1up_4xi32_neg2(<4 x i32> %v1, <4 x i32> %v2) { 352; CHECK-LABEL: vslide1up_4xi32_neg2: 353; CHECK: # %bb.0: 354; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 355; CHECK-NEXT: vslideup.vi v9, v8, 1 356; CHECK-NEXT: vmv.v.v v8, v9 357; CHECK-NEXT: ret 358 %res = shufflevector <4 x i32> %v1, <4 x i32> %v2, <4 x i32> <i32 4, i32 0, i32 1, i32 2> 359 ret <4 x i32> %res 360} 361 362; Not profitable - can just use a slideup instead 363define <4 x i8> @vslide1up_4xi8_neg_undef_insert(<4 x i8> %v, i8 %b) { 364; CHECK-LABEL: vslide1up_4xi8_neg_undef_insert: 365; CHECK: # %bb.0: 366; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 367; CHECK-NEXT: vslideup.vi v9, v8, 1 368; CHECK-NEXT: vmv1r.v v8, v9 369; CHECK-NEXT: ret 370 %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 0, i32 4, i32 5, i32 6> 371 ret <4 x i8> %v2 372} 373 374define <4 x i8> @vslide1up_4xi8_neg_incorrect_insert(<4 x i8> %v, i8 %b) { 375; CHECK-LABEL: vslide1up_4xi8_neg_incorrect_insert: 376; CHECK: # %bb.0: 377; CHECK-NEXT: lui a0, 8208 378; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 379; CHECK-NEXT: vmv.s.x v10, a0 380; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma 381; CHECK-NEXT: vrgather.vv v9, v8, v10 382; CHECK-NEXT: vmv1r.v v8, v9 383; CHECK-NEXT: ret 384 %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 4, i32 4, i32 5, i32 6> 385 ret <4 x i8> %v2 386} 387 388define <4 x i8> @vslide1up_4xi8_neg_incorrect_insert2(<4 x i8> %v, i8 %b) { 389; CHECK-LABEL: vslide1up_4xi8_neg_incorrect_insert2: 390; CHECK: # %bb.0: 391; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 392; CHECK-NEXT: vslidedown.vi v9, v8, 3 393; CHECK-NEXT: vslideup.vi v9, v8, 1 394; CHECK-NEXT: vmv1r.v v8, v9 395; CHECK-NEXT: ret 396 %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 7, i32 4, i32 5, i32 6> 397 ret <4 x i8> %v2 398} 399 400define <4 x i8> @vslide1up_4xi8_neg_incorrect_insert3(<4 x i8> %v, i8 %b) { 401; CHECK-LABEL: vslide1up_4xi8_neg_incorrect_insert3: 402; CHECK: # %bb.0: 403; CHECK-NEXT: lui a0, 8208 404; CHECK-NEXT: addi a0, a0, 1 405; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 406; CHECK-NEXT: vmv.s.x v10, a0 407; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma 408; CHECK-NEXT: vrgather.vv v9, v8, v10 409; CHECK-NEXT: vmv1r.v v8, v9 410; CHECK-NEXT: ret 411 %v2 = shufflevector <4 x i8> poison, <4 x i8> %v, <4 x i32> <i32 5, i32 4, i32 5, i32 6> 412 ret <4 x i8> %v2 413} 414 415define <2 x i8> @vslide1up_4xi8_neg_length_changing(<4 x i8> %v, i8 %b) { 416; CHECK-LABEL: vslide1up_4xi8_neg_length_changing: 417; CHECK: # %bb.0: 418; CHECK-NEXT: vsetivli zero, 1, e8, m1, tu, ma 419; CHECK-NEXT: vmv1r.v v9, v8 420; CHECK-NEXT: vmv.s.x v9, a0 421; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 422; CHECK-NEXT: vslideup.vi v9, v8, 1 423; CHECK-NEXT: vmv1r.v v8, v9 424; CHECK-NEXT: ret 425 %v1 = insertelement <4 x i8> %v, i8 %b, i64 0 426 %v2 = shufflevector <4 x i8> %v1, <4 x i8> %v, <2 x i32> <i32 0, i32 4> 427 ret <2 x i8> %v2 428} 429