1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX2 3; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,LMULMAX1 4 5define void @extract_v2i8_v4i8_0(<4 x i8>* %x, <2 x i8>* %y) { 6; CHECK-LABEL: extract_v2i8_v4i8_0: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, mu 9; CHECK-NEXT: vle8.v v25, (a0) 10; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 11; CHECK-NEXT: vse8.v v25, (a1) 12; CHECK-NEXT: ret 13 %a = load <4 x i8>, <4 x i8>* %x 14 %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v4i8(<4 x i8> %a, i64 0) 15 store <2 x i8> %c, <2 x i8>* %y 16 ret void 17} 18 19define void @extract_v2i8_v4i8_2(<4 x i8>* %x, <2 x i8>* %y) { 20; CHECK-LABEL: extract_v2i8_v4i8_2: 21; CHECK: # %bb.0: 22; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, mu 23; CHECK-NEXT: vle8.v v25, (a0) 24; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, mu 25; CHECK-NEXT: vslidedown.vi v25, v25, 2 26; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 27; CHECK-NEXT: vse8.v v25, (a1) 28; CHECK-NEXT: ret 29 %a = load <4 x i8>, <4 x i8>* %x 30 %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v4i8(<4 x i8> %a, i64 2) 31 store <2 x i8> %c, <2 x i8>* %y 32 ret void 33} 34 35define void @extract_v2i8_v8i8_0(<8 x i8>* %x, <2 x i8>* %y) { 36; CHECK-LABEL: extract_v2i8_v8i8_0: 37; CHECK: # %bb.0: 38; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 39; CHECK-NEXT: vle8.v v25, (a0) 40; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 41; CHECK-NEXT: vse8.v v25, (a1) 42; CHECK-NEXT: ret 43 %a = load <8 x i8>, <8 x i8>* %x 44 %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v8i8(<8 x i8> %a, i64 0) 45 store <2 x i8> %c, <2 x i8>* %y 46 ret void 47} 48 49define void @extract_v2i8_v8i8_6(<8 x i8>* %x, <2 x i8>* %y) { 50; CHECK-LABEL: extract_v2i8_v8i8_6: 51; CHECK: # %bb.0: 52; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 53; CHECK-NEXT: vle8.v v25, (a0) 54; CHECK-NEXT: vsetivli zero, 2, e8, mf2, ta, mu 55; CHECK-NEXT: vslidedown.vi v25, v25, 6 56; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 57; CHECK-NEXT: vse8.v v25, (a1) 58; CHECK-NEXT: ret 59 %a = load <8 x i8>, <8 x i8>* %x 60 %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.v8i8(<8 x i8> %a, i64 6) 61 store <2 x i8> %c, <2 x i8>* %y 62 ret void 63} 64 65define void @extract_v2i32_v8i32_0(<8 x i32>* %x, <2 x i32>* %y) { 66; LMULMAX2-LABEL: extract_v2i32_v8i32_0: 67; LMULMAX2: # %bb.0: 68; LMULMAX2-NEXT: vsetivli zero, 8, e32, m2, ta, mu 69; LMULMAX2-NEXT: vle32.v v26, (a0) 70; LMULMAX2-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 71; LMULMAX2-NEXT: vse32.v v26, (a1) 72; LMULMAX2-NEXT: ret 73; 74; LMULMAX1-LABEL: extract_v2i32_v8i32_0: 75; LMULMAX1: # %bb.0: 76; LMULMAX1-NEXT: vsetivli zero, 4, e32, m1, ta, mu 77; LMULMAX1-NEXT: vle32.v v25, (a0) 78; LMULMAX1-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 79; LMULMAX1-NEXT: vse32.v v25, (a1) 80; LMULMAX1-NEXT: ret 81 %a = load <8 x i32>, <8 x i32>* %x 82 %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 0) 83 store <2 x i32> %c, <2 x i32>* %y 84 ret void 85} 86 87define void @extract_v2i32_v8i32_2(<8 x i32>* %x, <2 x i32>* %y) { 88; LMULMAX2-LABEL: extract_v2i32_v8i32_2: 89; LMULMAX2: # %bb.0: 90; LMULMAX2-NEXT: vsetivli zero, 8, e32, m2, ta, mu 91; LMULMAX2-NEXT: vle32.v v26, (a0) 92; LMULMAX2-NEXT: vsetivli zero, 2, e32, m2, ta, mu 93; LMULMAX2-NEXT: vslidedown.vi v26, v26, 2 94; LMULMAX2-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 95; LMULMAX2-NEXT: vse32.v v26, (a1) 96; LMULMAX2-NEXT: ret 97; 98; LMULMAX1-LABEL: extract_v2i32_v8i32_2: 99; LMULMAX1: # %bb.0: 100; LMULMAX1-NEXT: vsetivli zero, 4, e32, m1, ta, mu 101; LMULMAX1-NEXT: vle32.v v25, (a0) 102; LMULMAX1-NEXT: vsetivli zero, 2, e32, m1, ta, mu 103; LMULMAX1-NEXT: vslidedown.vi v25, v25, 2 104; LMULMAX1-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 105; LMULMAX1-NEXT: vse32.v v25, (a1) 106; LMULMAX1-NEXT: ret 107 %a = load <8 x i32>, <8 x i32>* %x 108 %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 2) 109 store <2 x i32> %c, <2 x i32>* %y 110 ret void 111} 112 113define void @extract_v2i32_v8i32_6(<8 x i32>* %x, <2 x i32>* %y) { 114; LMULMAX2-LABEL: extract_v2i32_v8i32_6: 115; LMULMAX2: # %bb.0: 116; LMULMAX2-NEXT: vsetivli zero, 8, e32, m2, ta, mu 117; LMULMAX2-NEXT: vle32.v v26, (a0) 118; LMULMAX2-NEXT: vsetivli zero, 2, e32, m2, ta, mu 119; LMULMAX2-NEXT: vslidedown.vi v26, v26, 6 120; LMULMAX2-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 121; LMULMAX2-NEXT: vse32.v v26, (a1) 122; LMULMAX2-NEXT: ret 123; 124; LMULMAX1-LABEL: extract_v2i32_v8i32_6: 125; LMULMAX1: # %bb.0: 126; LMULMAX1-NEXT: addi a0, a0, 16 127; LMULMAX1-NEXT: vsetivli zero, 4, e32, m1, ta, mu 128; LMULMAX1-NEXT: vle32.v v25, (a0) 129; LMULMAX1-NEXT: vsetivli zero, 2, e32, m1, ta, mu 130; LMULMAX1-NEXT: vslidedown.vi v25, v25, 2 131; LMULMAX1-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 132; LMULMAX1-NEXT: vse32.v v25, (a1) 133; LMULMAX1-NEXT: ret 134 %a = load <8 x i32>, <8 x i32>* %x 135 %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 6) 136 store <2 x i32> %c, <2 x i32>* %y 137 ret void 138} 139 140define void @extract_v2i32_nxv16i32_0(<vscale x 16 x i32> %x, <2 x i32>* %y) { 141; CHECK-LABEL: extract_v2i32_nxv16i32_0: 142; CHECK: # %bb.0: 143; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 144; CHECK-NEXT: vse32.v v8, (a0) 145; CHECK-NEXT: ret 146 %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 0) 147 store <2 x i32> %c, <2 x i32>* %y 148 ret void 149} 150 151define void @extract_v2i32_nxv16i32_8(<vscale x 16 x i32> %x, <2 x i32>* %y) { 152; CHECK-LABEL: extract_v2i32_nxv16i32_8: 153; CHECK: # %bb.0: 154; CHECK-NEXT: vsetivli zero, 2, e32, m8, ta, mu 155; CHECK-NEXT: vslidedown.vi v8, v8, 6 156; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, mu 157; CHECK-NEXT: vse32.v v8, (a0) 158; CHECK-NEXT: ret 159 %c = call <2 x i32> @llvm.experimental.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 6) 160 store <2 x i32> %c, <2 x i32>* %y 161 ret void 162} 163 164define void @extract_v2i8_nxv2i8_0(<vscale x 2 x i8> %x, <2 x i8>* %y) { 165; CHECK-LABEL: extract_v2i8_nxv2i8_0: 166; CHECK: # %bb.0: 167; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 168; CHECK-NEXT: vse8.v v8, (a0) 169; CHECK-NEXT: ret 170 %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 0) 171 store <2 x i8> %c, <2 x i8>* %y 172 ret void 173} 174 175define void @extract_v2i8_nxv2i8_2(<vscale x 2 x i8> %x, <2 x i8>* %y) { 176; CHECK-LABEL: extract_v2i8_nxv2i8_2: 177; CHECK: # %bb.0: 178; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, mu 179; CHECK-NEXT: vslidedown.vi v25, v8, 2 180; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 181; CHECK-NEXT: vse8.v v25, (a0) 182; CHECK-NEXT: ret 183 %c = call <2 x i8> @llvm.experimental.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 2) 184 store <2 x i8> %c, <2 x i8>* %y 185 ret void 186} 187 188define void @extract_v8i32_nxv16i32_8(<vscale x 16 x i32> %x, <8 x i32>* %y) { 189; LMULMAX2-LABEL: extract_v8i32_nxv16i32_8: 190; LMULMAX2: # %bb.0: 191; LMULMAX2-NEXT: vsetivli zero, 8, e32, m8, ta, mu 192; LMULMAX2-NEXT: vslidedown.vi v8, v8, 8 193; LMULMAX2-NEXT: vsetivli zero, 8, e32, m2, ta, mu 194; LMULMAX2-NEXT: vse32.v v8, (a0) 195; LMULMAX2-NEXT: ret 196; 197; LMULMAX1-LABEL: extract_v8i32_nxv16i32_8: 198; LMULMAX1: # %bb.0: 199; LMULMAX1-NEXT: vsetivli zero, 4, e32, m8, ta, mu 200; LMULMAX1-NEXT: vslidedown.vi v16, v8, 8 201; LMULMAX1-NEXT: vslidedown.vi v8, v8, 12 202; LMULMAX1-NEXT: addi a1, a0, 16 203; LMULMAX1-NEXT: vsetivli zero, 4, e32, m1, ta, mu 204; LMULMAX1-NEXT: vse32.v v8, (a1) 205; LMULMAX1-NEXT: vse32.v v16, (a0) 206; LMULMAX1-NEXT: ret 207 %c = call <8 x i32> @llvm.experimental.vector.extract.v8i32.nxv16i32(<vscale x 16 x i32> %x, i64 8) 208 store <8 x i32> %c, <8 x i32>* %y 209 ret void 210} 211 212define void @extract_v8i1_v64i1_0(<64 x i1>* %x, <8 x i1>* %y) { 213; LMULMAX2-LABEL: extract_v8i1_v64i1_0: 214; LMULMAX2: # %bb.0: 215; LMULMAX2-NEXT: addi a2, zero, 32 216; LMULMAX2-NEXT: vsetvli zero, a2, e8, m2, ta, mu 217; LMULMAX2-NEXT: vle1.v v25, (a0) 218; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 219; LMULMAX2-NEXT: vse1.v v25, (a1) 220; LMULMAX2-NEXT: ret 221; 222; LMULMAX1-LABEL: extract_v8i1_v64i1_0: 223; LMULMAX1: # %bb.0: 224; LMULMAX1-NEXT: vsetivli zero, 16, e8, m1, ta, mu 225; LMULMAX1-NEXT: vle1.v v25, (a0) 226; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 227; LMULMAX1-NEXT: vse1.v v25, (a1) 228; LMULMAX1-NEXT: ret 229 %a = load <64 x i1>, <64 x i1>* %x 230 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 0) 231 store <8 x i1> %c, <8 x i1>* %y 232 ret void 233} 234 235define void @extract_v8i1_v64i1_8(<64 x i1>* %x, <8 x i1>* %y) { 236; LMULMAX2-LABEL: extract_v8i1_v64i1_8: 237; LMULMAX2: # %bb.0: 238; LMULMAX2-NEXT: addi a2, zero, 32 239; LMULMAX2-NEXT: vsetvli zero, a2, e8, m2, ta, mu 240; LMULMAX2-NEXT: vle1.v v25, (a0) 241; LMULMAX2-NEXT: vsetivli zero, 1, e8, mf4, ta, mu 242; LMULMAX2-NEXT: vslidedown.vi v25, v25, 1 243; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 244; LMULMAX2-NEXT: vse1.v v25, (a1) 245; LMULMAX2-NEXT: ret 246; 247; LMULMAX1-LABEL: extract_v8i1_v64i1_8: 248; LMULMAX1: # %bb.0: 249; LMULMAX1-NEXT: vsetivli zero, 16, e8, m1, ta, mu 250; LMULMAX1-NEXT: vle1.v v25, (a0) 251; LMULMAX1-NEXT: vsetivli zero, 1, e8, mf8, ta, mu 252; LMULMAX1-NEXT: vslidedown.vi v25, v25, 1 253; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 254; LMULMAX1-NEXT: vse1.v v25, (a1) 255; LMULMAX1-NEXT: ret 256 %a = load <64 x i1>, <64 x i1>* %x 257 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 8) 258 store <8 x i1> %c, <8 x i1>* %y 259 ret void 260} 261 262define void @extract_v8i1_v64i1_48(<64 x i1>* %x, <8 x i1>* %y) { 263; LMULMAX2-LABEL: extract_v8i1_v64i1_48: 264; LMULMAX2: # %bb.0: 265; LMULMAX2-NEXT: addi a0, a0, 4 266; LMULMAX2-NEXT: addi a2, zero, 32 267; LMULMAX2-NEXT: vsetvli zero, a2, e8, m2, ta, mu 268; LMULMAX2-NEXT: vle1.v v25, (a0) 269; LMULMAX2-NEXT: vsetivli zero, 1, e8, mf4, ta, mu 270; LMULMAX2-NEXT: vslidedown.vi v25, v25, 2 271; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 272; LMULMAX2-NEXT: vse1.v v25, (a1) 273; LMULMAX2-NEXT: ret 274; 275; LMULMAX1-LABEL: extract_v8i1_v64i1_48: 276; LMULMAX1: # %bb.0: 277; LMULMAX1-NEXT: addi a0, a0, 6 278; LMULMAX1-NEXT: vsetivli zero, 16, e8, m1, ta, mu 279; LMULMAX1-NEXT: vle1.v v25, (a0) 280; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 281; LMULMAX1-NEXT: vse1.v v25, (a1) 282; LMULMAX1-NEXT: ret 283 %a = load <64 x i1>, <64 x i1>* %x 284 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 48) 285 store <8 x i1> %c, <8 x i1>* %y 286 ret void 287} 288 289define void @extract_v8i1_nxv2i1_0(<vscale x 2 x i1> %x, <8 x i1>* %y) { 290; CHECK-LABEL: extract_v8i1_nxv2i1_0: 291; CHECK: # %bb.0: 292; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 293; CHECK-NEXT: vse1.v v0, (a0) 294; CHECK-NEXT: ret 295 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv2i1(<vscale x 2 x i1> %x, i64 0) 296 store <8 x i1> %c, <8 x i1>* %y 297 ret void 298} 299 300define void @extract_v8i1_nxv64i1_0(<vscale x 64 x i1> %x, <8 x i1>* %y) { 301; CHECK-LABEL: extract_v8i1_nxv64i1_0: 302; CHECK: # %bb.0: 303; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 304; CHECK-NEXT: vse1.v v0, (a0) 305; CHECK-NEXT: ret 306 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 0) 307 store <8 x i1> %c, <8 x i1>* %y 308 ret void 309} 310 311define void @extract_v8i1_nxv64i1_8(<vscale x 64 x i1> %x, <8 x i1>* %y) { 312; CHECK-LABEL: extract_v8i1_nxv64i1_8: 313; CHECK: # %bb.0: 314; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, mu 315; CHECK-NEXT: vslidedown.vi v25, v0, 1 316; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 317; CHECK-NEXT: vse1.v v25, (a0) 318; CHECK-NEXT: ret 319 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 8) 320 store <8 x i1> %c, <8 x i1>* %y 321 ret void 322} 323 324define void @extract_v8i1_nxv64i1_48(<vscale x 64 x i1> %x, <8 x i1>* %y) { 325; CHECK-LABEL: extract_v8i1_nxv64i1_48: 326; CHECK: # %bb.0: 327; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, mu 328; CHECK-NEXT: vslidedown.vi v25, v0, 6 329; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 330; CHECK-NEXT: vse1.v v25, (a0) 331; CHECK-NEXT: ret 332 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 48) 333 store <8 x i1> %c, <8 x i1>* %y 334 ret void 335} 336 337 338define void @extract_v2i1_v64i1_0(<64 x i1>* %x, <2 x i1>* %y) { 339; LMULMAX2-LABEL: extract_v2i1_v64i1_0: 340; LMULMAX2: # %bb.0: 341; LMULMAX2-NEXT: addi a2, zero, 32 342; LMULMAX2-NEXT: vsetvli zero, a2, e8, m2, ta, mu 343; LMULMAX2-NEXT: vle1.v v0, (a0) 344; LMULMAX2-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 345; LMULMAX2-NEXT: vmv.v.i v25, 0 346; LMULMAX2-NEXT: vmerge.vim v25, v25, 1, v0 347; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 348; LMULMAX2-NEXT: vmv.v.i v26, 0 349; LMULMAX2-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 350; LMULMAX2-NEXT: vslideup.vi v26, v25, 0 351; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 352; LMULMAX2-NEXT: vmsne.vi v25, v26, 0 353; LMULMAX2-NEXT: vse1.v v25, (a1) 354; LMULMAX2-NEXT: ret 355; 356; LMULMAX1-LABEL: extract_v2i1_v64i1_0: 357; LMULMAX1: # %bb.0: 358; LMULMAX1-NEXT: vsetivli zero, 16, e8, m1, ta, mu 359; LMULMAX1-NEXT: vle1.v v0, (a0) 360; LMULMAX1-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 361; LMULMAX1-NEXT: vmv.v.i v25, 0 362; LMULMAX1-NEXT: vmerge.vim v25, v25, 1, v0 363; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 364; LMULMAX1-NEXT: vmv.v.i v26, 0 365; LMULMAX1-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 366; LMULMAX1-NEXT: vslideup.vi v26, v25, 0 367; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 368; LMULMAX1-NEXT: vmsne.vi v25, v26, 0 369; LMULMAX1-NEXT: vse1.v v25, (a1) 370; LMULMAX1-NEXT: ret 371 %a = load <64 x i1>, <64 x i1>* %x 372 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 0) 373 store <2 x i1> %c, <2 x i1>* %y 374 ret void 375} 376 377define void @extract_v2i1_v64i1_2(<64 x i1>* %x, <2 x i1>* %y) { 378; LMULMAX2-LABEL: extract_v2i1_v64i1_2: 379; LMULMAX2: # %bb.0: 380; LMULMAX2-NEXT: addi a2, zero, 32 381; LMULMAX2-NEXT: vsetvli zero, a2, e8, m2, ta, mu 382; LMULMAX2-NEXT: vle1.v v0, (a0) 383; LMULMAX2-NEXT: vmv.v.i v26, 0 384; LMULMAX2-NEXT: vmerge.vim v26, v26, 1, v0 385; LMULMAX2-NEXT: vsetivli zero, 2, e8, m2, ta, mu 386; LMULMAX2-NEXT: vslidedown.vi v26, v26, 2 387; LMULMAX2-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 388; LMULMAX2-NEXT: vmsne.vi v0, v26, 0 389; LMULMAX2-NEXT: vmv.v.i v25, 0 390; LMULMAX2-NEXT: vmerge.vim v25, v25, 1, v0 391; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 392; LMULMAX2-NEXT: vmv.v.i v26, 0 393; LMULMAX2-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 394; LMULMAX2-NEXT: vslideup.vi v26, v25, 0 395; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 396; LMULMAX2-NEXT: vmsne.vi v25, v26, 0 397; LMULMAX2-NEXT: vse1.v v25, (a1) 398; LMULMAX2-NEXT: ret 399; 400; LMULMAX1-LABEL: extract_v2i1_v64i1_2: 401; LMULMAX1: # %bb.0: 402; LMULMAX1-NEXT: vsetivli zero, 16, e8, m1, ta, mu 403; LMULMAX1-NEXT: vle1.v v0, (a0) 404; LMULMAX1-NEXT: vmv.v.i v25, 0 405; LMULMAX1-NEXT: vmerge.vim v25, v25, 1, v0 406; LMULMAX1-NEXT: vsetivli zero, 2, e8, m1, ta, mu 407; LMULMAX1-NEXT: vslidedown.vi v25, v25, 2 408; LMULMAX1-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 409; LMULMAX1-NEXT: vmsne.vi v0, v25, 0 410; LMULMAX1-NEXT: vmv.v.i v25, 0 411; LMULMAX1-NEXT: vmerge.vim v25, v25, 1, v0 412; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 413; LMULMAX1-NEXT: vmv.v.i v26, 0 414; LMULMAX1-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 415; LMULMAX1-NEXT: vslideup.vi v26, v25, 0 416; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 417; LMULMAX1-NEXT: vmsne.vi v25, v26, 0 418; LMULMAX1-NEXT: vse1.v v25, (a1) 419; LMULMAX1-NEXT: ret 420 %a = load <64 x i1>, <64 x i1>* %x 421 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 2) 422 store <2 x i1> %c, <2 x i1>* %y 423 ret void 424} 425 426define void @extract_v2i1_v64i1_42(<64 x i1>* %x, <2 x i1>* %y) { 427; LMULMAX2-LABEL: extract_v2i1_v64i1_42: 428; LMULMAX2: # %bb.0: 429; LMULMAX2-NEXT: addi a0, a0, 4 430; LMULMAX2-NEXT: addi a2, zero, 32 431; LMULMAX2-NEXT: vsetvli zero, a2, e8, m2, ta, mu 432; LMULMAX2-NEXT: vle1.v v0, (a0) 433; LMULMAX2-NEXT: vmv.v.i v26, 0 434; LMULMAX2-NEXT: vmerge.vim v26, v26, 1, v0 435; LMULMAX2-NEXT: vsetivli zero, 2, e8, m2, ta, mu 436; LMULMAX2-NEXT: vslidedown.vi v26, v26, 10 437; LMULMAX2-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 438; LMULMAX2-NEXT: vmsne.vi v0, v26, 0 439; LMULMAX2-NEXT: vmv.v.i v25, 0 440; LMULMAX2-NEXT: vmerge.vim v25, v25, 1, v0 441; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 442; LMULMAX2-NEXT: vmv.v.i v26, 0 443; LMULMAX2-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 444; LMULMAX2-NEXT: vslideup.vi v26, v25, 0 445; LMULMAX2-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 446; LMULMAX2-NEXT: vmsne.vi v25, v26, 0 447; LMULMAX2-NEXT: vse1.v v25, (a1) 448; LMULMAX2-NEXT: ret 449; 450; LMULMAX1-LABEL: extract_v2i1_v64i1_42: 451; LMULMAX1: # %bb.0: 452; LMULMAX1-NEXT: addi a0, a0, 4 453; LMULMAX1-NEXT: vsetivli zero, 16, e8, m1, ta, mu 454; LMULMAX1-NEXT: vle1.v v0, (a0) 455; LMULMAX1-NEXT: vmv.v.i v25, 0 456; LMULMAX1-NEXT: vmerge.vim v25, v25, 1, v0 457; LMULMAX1-NEXT: vsetivli zero, 2, e8, m1, ta, mu 458; LMULMAX1-NEXT: vslidedown.vi v25, v25, 10 459; LMULMAX1-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 460; LMULMAX1-NEXT: vmsne.vi v0, v25, 0 461; LMULMAX1-NEXT: vmv.v.i v25, 0 462; LMULMAX1-NEXT: vmerge.vim v25, v25, 1, v0 463; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 464; LMULMAX1-NEXT: vmv.v.i v26, 0 465; LMULMAX1-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 466; LMULMAX1-NEXT: vslideup.vi v26, v25, 0 467; LMULMAX1-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 468; LMULMAX1-NEXT: vmsne.vi v25, v26, 0 469; LMULMAX1-NEXT: vse1.v v25, (a1) 470; LMULMAX1-NEXT: ret 471 %a = load <64 x i1>, <64 x i1>* %x 472 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 42) 473 store <2 x i1> %c, <2 x i1>* %y 474 ret void 475} 476 477define void @extract_v2i1_nxv2i1_0(<vscale x 2 x i1> %x, <2 x i1>* %y) { 478; CHECK-LABEL: extract_v2i1_nxv2i1_0: 479; CHECK: # %bb.0: 480; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 481; CHECK-NEXT: vmv.v.i v25, 0 482; CHECK-NEXT: vmerge.vim v25, v25, 1, v0 483; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 484; CHECK-NEXT: vmv.v.i v26, 0 485; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 486; CHECK-NEXT: vslideup.vi v26, v25, 0 487; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 488; CHECK-NEXT: vmsne.vi v25, v26, 0 489; CHECK-NEXT: vse1.v v25, (a0) 490; CHECK-NEXT: ret 491 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %x, i64 0) 492 store <2 x i1> %c, <2 x i1>* %y 493 ret void 494} 495 496define void @extract_v2i1_nxv2i1_2(<vscale x 2 x i1> %x, <2 x i1>* %y) { 497; CHECK-LABEL: extract_v2i1_nxv2i1_2: 498; CHECK: # %bb.0: 499; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, mu 500; CHECK-NEXT: vmv.v.i v25, 0 501; CHECK-NEXT: vmerge.vim v25, v25, 1, v0 502; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, mu 503; CHECK-NEXT: vslidedown.vi v25, v25, 2 504; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 505; CHECK-NEXT: vmsne.vi v0, v25, 0 506; CHECK-NEXT: vmv.v.i v25, 0 507; CHECK-NEXT: vmerge.vim v25, v25, 1, v0 508; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 509; CHECK-NEXT: vmv.v.i v26, 0 510; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 511; CHECK-NEXT: vslideup.vi v26, v25, 0 512; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 513; CHECK-NEXT: vmsne.vi v25, v26, 0 514; CHECK-NEXT: vse1.v v25, (a0) 515; CHECK-NEXT: ret 516 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %x, i64 2) 517 store <2 x i1> %c, <2 x i1>* %y 518 ret void 519} 520 521define void @extract_v2i1_nxv64i1_0(<vscale x 64 x i1> %x, <2 x i1>* %y) { 522; CHECK-LABEL: extract_v2i1_nxv64i1_0: 523; CHECK: # %bb.0: 524; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 525; CHECK-NEXT: vmv.v.i v25, 0 526; CHECK-NEXT: vmerge.vim v25, v25, 1, v0 527; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 528; CHECK-NEXT: vmv.v.i v26, 0 529; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 530; CHECK-NEXT: vslideup.vi v26, v25, 0 531; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 532; CHECK-NEXT: vmsne.vi v25, v26, 0 533; CHECK-NEXT: vse1.v v25, (a0) 534; CHECK-NEXT: ret 535 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 0) 536 store <2 x i1> %c, <2 x i1>* %y 537 ret void 538} 539 540define void @extract_v2i1_nxv64i1_2(<vscale x 64 x i1> %x, <2 x i1>* %y) { 541; CHECK-LABEL: extract_v2i1_nxv64i1_2: 542; CHECK: # %bb.0: 543; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, mu 544; CHECK-NEXT: vmv.v.i v8, 0 545; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 546; CHECK-NEXT: vsetivli zero, 2, e8, m8, ta, mu 547; CHECK-NEXT: vslidedown.vi v8, v8, 2 548; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 549; CHECK-NEXT: vmsne.vi v0, v8, 0 550; CHECK-NEXT: vmv.v.i v25, 0 551; CHECK-NEXT: vmerge.vim v25, v25, 1, v0 552; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 553; CHECK-NEXT: vmv.v.i v26, 0 554; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 555; CHECK-NEXT: vslideup.vi v26, v25, 0 556; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 557; CHECK-NEXT: vmsne.vi v25, v26, 0 558; CHECK-NEXT: vse1.v v25, (a0) 559; CHECK-NEXT: ret 560 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 2) 561 store <2 x i1> %c, <2 x i1>* %y 562 ret void 563} 564 565define void @extract_v2i1_nxv64i1_42(<vscale x 64 x i1> %x, <2 x i1>* %y) { 566; CHECK-LABEL: extract_v2i1_nxv64i1_42: 567; CHECK: # %bb.0: 568; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, mu 569; CHECK-NEXT: vmv.v.i v8, 0 570; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 571; CHECK-NEXT: addi a1, zero, 42 572; CHECK-NEXT: vsetivli zero, 2, e8, m8, ta, mu 573; CHECK-NEXT: vslidedown.vx v8, v8, a1 574; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 575; CHECK-NEXT: vmsne.vi v0, v8, 0 576; CHECK-NEXT: vmv.v.i v25, 0 577; CHECK-NEXT: vmerge.vim v25, v25, 1, v0 578; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 579; CHECK-NEXT: vmv.v.i v26, 0 580; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 581; CHECK-NEXT: vslideup.vi v26, v25, 0 582; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 583; CHECK-NEXT: vmsne.vi v25, v26, 0 584; CHECK-NEXT: vse1.v v25, (a0) 585; CHECK-NEXT: ret 586 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 42) 587 store <2 x i1> %c, <2 x i1>* %y 588 ret void 589} 590 591define void @extract_v2i1_nxv32i1_26(<vscale x 32 x i1> %x, <2 x i1>* %y) { 592; CHECK-LABEL: extract_v2i1_nxv32i1_26: 593; CHECK: # %bb.0: 594; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, mu 595; CHECK-NEXT: vmv.v.i v28, 0 596; CHECK-NEXT: vmerge.vim v28, v28, 1, v0 597; CHECK-NEXT: vsetivli zero, 2, e8, m4, ta, mu 598; CHECK-NEXT: vslidedown.vi v28, v28, 26 599; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu 600; CHECK-NEXT: vmsne.vi v0, v28, 0 601; CHECK-NEXT: vmv.v.i v25, 0 602; CHECK-NEXT: vmerge.vim v25, v25, 1, v0 603; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 604; CHECK-NEXT: vmv.v.i v26, 0 605; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, mu 606; CHECK-NEXT: vslideup.vi v26, v25, 0 607; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 608; CHECK-NEXT: vmsne.vi v25, v26, 0 609; CHECK-NEXT: vse1.v v25, (a0) 610; CHECK-NEXT: ret 611 %c = call <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv32i1(<vscale x 32 x i1> %x, i64 26) 612 store <2 x i1> %c, <2 x i1>* %y 613 ret void 614} 615 616define void @extract_v8i1_nxv32i1_16(<vscale x 32 x i1> %x, <8 x i1>* %y) { 617; CHECK-LABEL: extract_v8i1_nxv32i1_16: 618; CHECK: # %bb.0: 619; CHECK-NEXT: vsetivli zero, 1, e8, mf2, ta, mu 620; CHECK-NEXT: vslidedown.vi v25, v0, 2 621; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu 622; CHECK-NEXT: vse1.v v25, (a0) 623; CHECK-NEXT: ret 624 %c = call <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv32i1(<vscale x 32 x i1> %x, i64 16) 625 store <8 x i1> %c, <8 x i1>* %y 626 ret void 627} 628 629declare <2 x i1> @llvm.experimental.vector.extract.v2i1.v64i1(<64 x i1> %vec, i64 %idx) 630declare <8 x i1> @llvm.experimental.vector.extract.v8i1.v64i1(<64 x i1> %vec, i64 %idx) 631 632declare <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %vec, i64 %idx) 633declare <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv2i1(<vscale x 2 x i1> %vec, i64 %idx) 634 635declare <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv32i1(<vscale x 32 x i1> %vec, i64 %idx) 636declare <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv32i1(<vscale x 32 x i1> %vec, i64 %idx) 637 638declare <2 x i1> @llvm.experimental.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %vec, i64 %idx) 639declare <8 x i1> @llvm.experimental.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %vec, i64 %idx) 640 641declare <2 x i8> @llvm.experimental.vector.extract.v2i8.v4i8(<4 x i8> %vec, i64 %idx) 642declare <2 x i8> @llvm.experimental.vector.extract.v2i8.v8i8(<8 x i8> %vec, i64 %idx) 643declare <2 x i32> @llvm.experimental.vector.extract.v2i32.v8i32(<8 x i32> %vec, i64 %idx) 644 645declare <2 x i8> @llvm.experimental.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %vec, i64 %idx) 646 647declare <2 x i32> @llvm.experimental.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx) 648declare <8 x i32> @llvm.experimental.vector.extract.v8i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx) 649