1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 3; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 4; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 5; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 6 7; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+zvfhmin,+zvfbfmin -early-live-intervals -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 8; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+zvfhmin,+zvfbfmin -early-live-intervals -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 9; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+zvfh,+zvfbfmin -early-live-intervals -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 10; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+zvfh,+zvfbfmin -early-live-intervals -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,VLA 11 12; RUN: llc < %s -mtriple=riscv32 -mattr=+m,+v,+zvfhmin,+zvfbfmin -riscv-v-vector-bits-max=128 -verify-machineinstrs | FileCheck -check-prefixes=CHECK,VLS %s 13; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+v,+zvfhmin,+zvfbfmin -riscv-v-vector-bits-max=128 -verify-machineinstrs | FileCheck -check-prefixes=CHECK,VLS %s 14; RUN: llc < %s -mtriple=riscv32 -mattr=+m,+v,+zvfh,+zvfbfmin -riscv-v-vector-bits-max=128 -verify-machineinstrs | FileCheck -check-prefixes=CHECK,VLS %s 15; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+v,+zvfh,+zvfbfmin -riscv-v-vector-bits-max=128 -verify-machineinstrs | FileCheck -check-prefixes=CHECK,VLS %s 16 17define void @extract_v2i8_v4i8_0(ptr %x, ptr %y) { 18; CHECK-LABEL: extract_v2i8_v4i8_0: 19; CHECK: # %bb.0: 20; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 21; CHECK-NEXT: vle8.v v8, (a0) 22; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 23; CHECK-NEXT: vse8.v v8, (a1) 24; CHECK-NEXT: ret 25 %a = load <4 x i8>, ptr %x 26 %c = call <2 x i8> @llvm.vector.extract.v2i8.v4i8(<4 x i8> %a, i64 0) 27 store <2 x i8> %c, ptr %y 28 ret void 29} 30 31define void @extract_v2i8_v4i8_2(ptr %x, ptr %y) { 32; CHECK-LABEL: extract_v2i8_v4i8_2: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 35; CHECK-NEXT: vle8.v v8, (a0) 36; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 37; CHECK-NEXT: vslidedown.vi v8, v8, 2 38; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 39; CHECK-NEXT: vse8.v v8, (a1) 40; CHECK-NEXT: ret 41 %a = load <4 x i8>, ptr %x 42 %c = call <2 x i8> @llvm.vector.extract.v2i8.v4i8(<4 x i8> %a, i64 2) 43 store <2 x i8> %c, ptr %y 44 ret void 45} 46 47define void @extract_v2i8_v8i8_0(ptr %x, ptr %y) { 48; CHECK-LABEL: extract_v2i8_v8i8_0: 49; CHECK: # %bb.0: 50; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 51; CHECK-NEXT: vle8.v v8, (a0) 52; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 53; CHECK-NEXT: vse8.v v8, (a1) 54; CHECK-NEXT: ret 55 %a = load <8 x i8>, ptr %x 56 %c = call <2 x i8> @llvm.vector.extract.v2i8.v8i8(<8 x i8> %a, i64 0) 57 store <2 x i8> %c, ptr %y 58 ret void 59} 60 61define void @extract_v2i8_v8i8_6(ptr %x, ptr %y) { 62; CHECK-LABEL: extract_v2i8_v8i8_6: 63; CHECK: # %bb.0: 64; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 65; CHECK-NEXT: vle8.v v8, (a0) 66; CHECK-NEXT: vsetivli zero, 2, e8, mf2, ta, ma 67; CHECK-NEXT: vslidedown.vi v8, v8, 6 68; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 69; CHECK-NEXT: vse8.v v8, (a1) 70; CHECK-NEXT: ret 71 %a = load <8 x i8>, ptr %x 72 %c = call <2 x i8> @llvm.vector.extract.v2i8.v8i8(<8 x i8> %a, i64 6) 73 store <2 x i8> %c, ptr %y 74 ret void 75} 76 77define void @extract_v1i32_v8i32_4(ptr %x, ptr %y) { 78; VLA-LABEL: extract_v1i32_v8i32_4: 79; VLA: # %bb.0: 80; VLA-NEXT: vsetivli zero, 8, e32, m2, ta, ma 81; VLA-NEXT: vle32.v v8, (a0) 82; VLA-NEXT: vslidedown.vi v8, v8, 4 83; VLA-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 84; VLA-NEXT: vse32.v v8, (a1) 85; VLA-NEXT: ret 86; 87; VLS-LABEL: extract_v1i32_v8i32_4: 88; VLS: # %bb.0: 89; VLS-NEXT: vl2re32.v v8, (a0) 90; VLS-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 91; VLS-NEXT: vse32.v v9, (a1) 92; VLS-NEXT: ret 93 %a = load <8 x i32>, ptr %x 94 %c = call <1 x i32> @llvm.vector.extract.v1i32.v8i32(<8 x i32> %a, i64 4) 95 store <1 x i32> %c, ptr %y 96 ret void 97} 98 99define void @extract_v1i32_v8i32_5(ptr %x, ptr %y) { 100; VLA-LABEL: extract_v1i32_v8i32_5: 101; VLA: # %bb.0: 102; VLA-NEXT: vsetivli zero, 8, e32, m2, ta, ma 103; VLA-NEXT: vle32.v v8, (a0) 104; VLA-NEXT: vslidedown.vi v8, v8, 5 105; VLA-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 106; VLA-NEXT: vse32.v v8, (a1) 107; VLA-NEXT: ret 108; 109; VLS-LABEL: extract_v1i32_v8i32_5: 110; VLS: # %bb.0: 111; VLS-NEXT: vl2re32.v v8, (a0) 112; VLS-NEXT: vsetivli zero, 1, e32, m1, ta, ma 113; VLS-NEXT: vslidedown.vi v8, v9, 1 114; VLS-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 115; VLS-NEXT: vse32.v v8, (a1) 116; VLS-NEXT: ret 117 %a = load <8 x i32>, ptr %x 118 %c = call <1 x i32> @llvm.vector.extract.v1i32.v8i32(<8 x i32> %a, i64 5) 119 store <1 x i32> %c, ptr %y 120 ret void 121} 122 123define void @extract_v2i32_v8i32_0(ptr %x, ptr %y) { 124; VLA-LABEL: extract_v2i32_v8i32_0: 125; VLA: # %bb.0: 126; VLA-NEXT: vsetivli zero, 8, e32, m2, ta, ma 127; VLA-NEXT: vle32.v v8, (a0) 128; VLA-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 129; VLA-NEXT: vse32.v v8, (a1) 130; VLA-NEXT: ret 131; 132; VLS-LABEL: extract_v2i32_v8i32_0: 133; VLS: # %bb.0: 134; VLS-NEXT: vl2re32.v v8, (a0) 135; VLS-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 136; VLS-NEXT: vse32.v v8, (a1) 137; VLS-NEXT: ret 138 %a = load <8 x i32>, ptr %x 139 %c = call <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 0) 140 store <2 x i32> %c, ptr %y 141 ret void 142} 143 144define void @extract_v2i32_v8i32_2(ptr %x, ptr %y) { 145; VLA-LABEL: extract_v2i32_v8i32_2: 146; VLA: # %bb.0: 147; VLA-NEXT: vsetivli zero, 8, e32, m2, ta, ma 148; VLA-NEXT: vle32.v v8, (a0) 149; VLA-NEXT: vsetivli zero, 2, e32, m1, ta, ma 150; VLA-NEXT: vslidedown.vi v8, v8, 2 151; VLA-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 152; VLA-NEXT: vse32.v v8, (a1) 153; VLA-NEXT: ret 154; 155; VLS-LABEL: extract_v2i32_v8i32_2: 156; VLS: # %bb.0: 157; VLS-NEXT: vl2re32.v v8, (a0) 158; VLS-NEXT: vsetivli zero, 2, e32, m1, ta, ma 159; VLS-NEXT: vslidedown.vi v8, v8, 2 160; VLS-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 161; VLS-NEXT: vse32.v v8, (a1) 162; VLS-NEXT: ret 163 %a = load <8 x i32>, ptr %x 164 %c = call <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 2) 165 store <2 x i32> %c, ptr %y 166 ret void 167} 168 169define void @extract_v2i32_v8i32_4(ptr %x, ptr %y) { 170; VLA-LABEL: extract_v2i32_v8i32_4: 171; VLA: # %bb.0: 172; VLA-NEXT: vsetivli zero, 8, e32, m2, ta, ma 173; VLA-NEXT: vle32.v v8, (a0) 174; VLA-NEXT: vsetivli zero, 2, e32, m2, ta, ma 175; VLA-NEXT: vslidedown.vi v8, v8, 4 176; VLA-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 177; VLA-NEXT: vse32.v v8, (a1) 178; VLA-NEXT: ret 179; 180; VLS-LABEL: extract_v2i32_v8i32_4: 181; VLS: # %bb.0: 182; VLS-NEXT: vl2re32.v v8, (a0) 183; VLS-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 184; VLS-NEXT: vse32.v v9, (a1) 185; VLS-NEXT: ret 186 %a = load <8 x i32>, ptr %x 187 %c = call <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 4) 188 store <2 x i32> %c, ptr %y 189 ret void 190} 191 192define void @extract_v2i32_v8i32_6(ptr %x, ptr %y) { 193; VLA-LABEL: extract_v2i32_v8i32_6: 194; VLA: # %bb.0: 195; VLA-NEXT: vsetivli zero, 8, e32, m2, ta, ma 196; VLA-NEXT: vle32.v v8, (a0) 197; VLA-NEXT: vsetivli zero, 2, e32, m2, ta, ma 198; VLA-NEXT: vslidedown.vi v8, v8, 6 199; VLA-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 200; VLA-NEXT: vse32.v v8, (a1) 201; VLA-NEXT: ret 202; 203; VLS-LABEL: extract_v2i32_v8i32_6: 204; VLS: # %bb.0: 205; VLS-NEXT: vl2re32.v v8, (a0) 206; VLS-NEXT: vsetivli zero, 2, e32, m1, ta, ma 207; VLS-NEXT: vslidedown.vi v8, v9, 2 208; VLS-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 209; VLS-NEXT: vse32.v v8, (a1) 210; VLS-NEXT: ret 211 %a = load <8 x i32>, ptr %x 212 %c = call <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32> %a, i64 6) 213 store <2 x i32> %c, ptr %y 214 ret void 215} 216 217define void @extract_v2i32_nxv16i32_0(<vscale x 16 x i32> %x, ptr %y) { 218; CHECK-LABEL: extract_v2i32_nxv16i32_0: 219; CHECK: # %bb.0: 220; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 221; CHECK-NEXT: vse32.v v8, (a0) 222; CHECK-NEXT: ret 223 %c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 0) 224 store <2 x i32> %c, ptr %y 225 ret void 226} 227 228 229define void @extract_v2i32_nxv16i32_2(<vscale x 16 x i32> %x, ptr %y) { 230; CHECK-LABEL: extract_v2i32_nxv16i32_2: 231; CHECK: # %bb.0: 232; CHECK-NEXT: vsetivli zero, 2, e32, m1, ta, ma 233; CHECK-NEXT: vslidedown.vi v8, v8, 2 234; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 235; CHECK-NEXT: vse32.v v8, (a0) 236; CHECK-NEXT: ret 237 %c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 2) 238 store <2 x i32> %c, ptr %y 239 ret void 240} 241 242define void @extract_v2i32_nxv16i32_4(<vscale x 16 x i32> %x, ptr %y) { 243; VLA-LABEL: extract_v2i32_nxv16i32_4: 244; VLA: # %bb.0: 245; VLA-NEXT: vsetivli zero, 2, e32, m2, ta, ma 246; VLA-NEXT: vslidedown.vi v8, v8, 4 247; VLA-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 248; VLA-NEXT: vse32.v v8, (a0) 249; VLA-NEXT: ret 250; 251; VLS-LABEL: extract_v2i32_nxv16i32_4: 252; VLS: # %bb.0: 253; VLS-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 254; VLS-NEXT: vse32.v v9, (a0) 255; VLS-NEXT: ret 256 %c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 4) 257 store <2 x i32> %c, ptr %y 258 ret void 259} 260 261define void @extract_v2i32_nxv16i32_6(<vscale x 16 x i32> %x, ptr %y) { 262; VLA-LABEL: extract_v2i32_nxv16i32_6: 263; VLA: # %bb.0: 264; VLA-NEXT: vsetivli zero, 2, e32, m2, ta, ma 265; VLA-NEXT: vslidedown.vi v8, v8, 6 266; VLA-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 267; VLA-NEXT: vse32.v v8, (a0) 268; VLA-NEXT: ret 269; 270; VLS-LABEL: extract_v2i32_nxv16i32_6: 271; VLS: # %bb.0: 272; VLS-NEXT: vsetivli zero, 2, e32, m1, ta, ma 273; VLS-NEXT: vslidedown.vi v8, v9, 2 274; VLS-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 275; VLS-NEXT: vse32.v v8, (a0) 276; VLS-NEXT: ret 277 %c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 6) 278 store <2 x i32> %c, ptr %y 279 ret void 280} 281 282define void @extract_v2i32_nxv16i32_8(<vscale x 16 x i32> %x, ptr %y) { 283; VLA-LABEL: extract_v2i32_nxv16i32_8: 284; VLA: # %bb.0: 285; VLA-NEXT: vsetivli zero, 2, e32, m4, ta, ma 286; VLA-NEXT: vslidedown.vi v8, v8, 8 287; VLA-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 288; VLA-NEXT: vse32.v v8, (a0) 289; VLA-NEXT: ret 290; 291; VLS-LABEL: extract_v2i32_nxv16i32_8: 292; VLS: # %bb.0: 293; VLS-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 294; VLS-NEXT: vse32.v v10, (a0) 295; VLS-NEXT: ret 296 %c = call <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %x, i64 8) 297 store <2 x i32> %c, ptr %y 298 ret void 299} 300 301define void @extract_v2i8_nxv2i8_0(<vscale x 2 x i8> %x, ptr %y) { 302; CHECK-LABEL: extract_v2i8_nxv2i8_0: 303; CHECK: # %bb.0: 304; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 305; CHECK-NEXT: vse8.v v8, (a0) 306; CHECK-NEXT: ret 307 %c = call <2 x i8> @llvm.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 0) 308 store <2 x i8> %c, ptr %y 309 ret void 310} 311 312define void @extract_v2i8_nxv2i8_2(<vscale x 2 x i8> %x, ptr %y) { 313; CHECK-LABEL: extract_v2i8_nxv2i8_2: 314; CHECK: # %bb.0: 315; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 316; CHECK-NEXT: vslidedown.vi v8, v8, 2 317; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 318; CHECK-NEXT: vse8.v v8, (a0) 319; CHECK-NEXT: ret 320 %c = call <2 x i8> @llvm.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 2) 321 store <2 x i8> %c, ptr %y 322 ret void 323} 324 325define void @extract_v2i8_nxv2i8_4(<vscale x 2 x i8> %x, ptr %y) { 326; CHECK-LABEL: extract_v2i8_nxv2i8_4: 327; CHECK: # %bb.0: 328; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 329; CHECK-NEXT: vslidedown.vi v8, v8, 4 330; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 331; CHECK-NEXT: vse8.v v8, (a0) 332; CHECK-NEXT: ret 333 %c = call <2 x i8> @llvm.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 4) 334 store <2 x i8> %c, ptr %y 335 ret void 336} 337 338define void @extract_v2i8_nxv2i8_6(<vscale x 2 x i8> %x, ptr %y) { 339; CHECK-LABEL: extract_v2i8_nxv2i8_6: 340; CHECK: # %bb.0: 341; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 342; CHECK-NEXT: vslidedown.vi v8, v8, 6 343; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 344; CHECK-NEXT: vse8.v v8, (a0) 345; CHECK-NEXT: ret 346 %c = call <2 x i8> @llvm.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %x, i64 6) 347 store <2 x i8> %c, ptr %y 348 ret void 349} 350 351define void @extract_v8i32_nxv16i32_8(<vscale x 16 x i32> %x, ptr %y) { 352; VLA-LABEL: extract_v8i32_nxv16i32_8: 353; VLA: # %bb.0: 354; VLA-NEXT: vsetivli zero, 8, e32, m4, ta, ma 355; VLA-NEXT: vslidedown.vi v8, v8, 8 356; VLA-NEXT: vsetivli zero, 8, e32, m2, ta, ma 357; VLA-NEXT: vse32.v v8, (a0) 358; VLA-NEXT: ret 359; 360; VLS-LABEL: extract_v8i32_nxv16i32_8: 361; VLS: # %bb.0: 362; VLS-NEXT: vs2r.v v10, (a0) 363; VLS-NEXT: ret 364 %c = call <8 x i32> @llvm.vector.extract.v8i32.nxv16i32(<vscale x 16 x i32> %x, i64 8) 365 store <8 x i32> %c, ptr %y 366 ret void 367} 368 369define void @extract_v8i1_v64i1_0(ptr %x, ptr %y) { 370; VLA-LABEL: extract_v8i1_v64i1_0: 371; VLA: # %bb.0: 372; VLA-NEXT: li a2, 64 373; VLA-NEXT: vsetvli zero, a2, e8, m4, ta, ma 374; VLA-NEXT: vlm.v v8, (a0) 375; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 376; VLA-NEXT: vsm.v v8, (a1) 377; VLA-NEXT: ret 378; 379; VLS-LABEL: extract_v8i1_v64i1_0: 380; VLS: # %bb.0: 381; VLS-NEXT: vsetvli a2, zero, e8, m4, ta, ma 382; VLS-NEXT: vlm.v v8, (a0) 383; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 384; VLS-NEXT: vsm.v v8, (a1) 385; VLS-NEXT: ret 386 %a = load <64 x i1>, ptr %x 387 %c = call <8 x i1> @llvm.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 0) 388 store <8 x i1> %c, ptr %y 389 ret void 390} 391 392define void @extract_v8i1_v64i1_8(ptr %x, ptr %y) { 393; VLA-LABEL: extract_v8i1_v64i1_8: 394; VLA: # %bb.0: 395; VLA-NEXT: li a2, 64 396; VLA-NEXT: vsetvli zero, a2, e8, m4, ta, ma 397; VLA-NEXT: vlm.v v8, (a0) 398; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 399; VLA-NEXT: vslidedown.vi v8, v8, 1 400; VLA-NEXT: vsm.v v8, (a1) 401; VLA-NEXT: ret 402; 403; VLS-LABEL: extract_v8i1_v64i1_8: 404; VLS: # %bb.0: 405; VLS-NEXT: vsetvli a2, zero, e8, m4, ta, ma 406; VLS-NEXT: vlm.v v8, (a0) 407; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 408; VLS-NEXT: vslidedown.vi v8, v8, 1 409; VLS-NEXT: vsm.v v8, (a1) 410; VLS-NEXT: ret 411 %a = load <64 x i1>, ptr %x 412 %c = call <8 x i1> @llvm.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 8) 413 store <8 x i1> %c, ptr %y 414 ret void 415} 416 417define void @extract_v8i1_v64i1_48(ptr %x, ptr %y) { 418; VLA-LABEL: extract_v8i1_v64i1_48: 419; VLA: # %bb.0: 420; VLA-NEXT: li a2, 64 421; VLA-NEXT: vsetvli zero, a2, e8, m4, ta, ma 422; VLA-NEXT: vlm.v v8, (a0) 423; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 424; VLA-NEXT: vslidedown.vi v8, v8, 6 425; VLA-NEXT: vsm.v v8, (a1) 426; VLA-NEXT: ret 427; 428; VLS-LABEL: extract_v8i1_v64i1_48: 429; VLS: # %bb.0: 430; VLS-NEXT: vsetvli a2, zero, e8, m4, ta, ma 431; VLS-NEXT: vlm.v v8, (a0) 432; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 433; VLS-NEXT: vslidedown.vi v8, v8, 6 434; VLS-NEXT: vsm.v v8, (a1) 435; VLS-NEXT: ret 436 %a = load <64 x i1>, ptr %x 437 %c = call <8 x i1> @llvm.vector.extract.v8i1.v64i1(<64 x i1> %a, i64 48) 438 store <8 x i1> %c, ptr %y 439 ret void 440} 441 442define void @extract_v8i1_nxv2i1_0(<vscale x 2 x i1> %x, ptr %y) { 443; CHECK-LABEL: extract_v8i1_nxv2i1_0: 444; CHECK: # %bb.0: 445; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 446; CHECK-NEXT: vsm.v v0, (a0) 447; CHECK-NEXT: ret 448 %c = call <8 x i1> @llvm.vector.extract.v8i1.nxv2i1(<vscale x 2 x i1> %x, i64 0) 449 store <8 x i1> %c, ptr %y 450 ret void 451} 452 453define void @extract_v8i1_nxv64i1_0(<vscale x 64 x i1> %x, ptr %y) { 454; CHECK-LABEL: extract_v8i1_nxv64i1_0: 455; CHECK: # %bb.0: 456; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 457; CHECK-NEXT: vsm.v v0, (a0) 458; CHECK-NEXT: ret 459 %c = call <8 x i1> @llvm.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 0) 460 store <8 x i1> %c, ptr %y 461 ret void 462} 463 464define void @extract_v8i1_nxv64i1_8(<vscale x 64 x i1> %x, ptr %y) { 465; CHECK-LABEL: extract_v8i1_nxv64i1_8: 466; CHECK: # %bb.0: 467; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 468; CHECK-NEXT: vslidedown.vi v8, v0, 1 469; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 470; CHECK-NEXT: vsm.v v8, (a0) 471; CHECK-NEXT: ret 472 %c = call <8 x i1> @llvm.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 8) 473 store <8 x i1> %c, ptr %y 474 ret void 475} 476 477define void @extract_v8i1_nxv64i1_48(<vscale x 64 x i1> %x, ptr %y) { 478; CHECK-LABEL: extract_v8i1_nxv64i1_48: 479; CHECK: # %bb.0: 480; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 481; CHECK-NEXT: vslidedown.vi v8, v0, 6 482; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 483; CHECK-NEXT: vsm.v v8, (a0) 484; CHECK-NEXT: ret 485 %c = call <8 x i1> @llvm.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 48) 486 store <8 x i1> %c, ptr %y 487 ret void 488} 489 490define void @extract_v8i1_nxv64i1_128(<vscale x 64 x i1> %x, ptr %y) { 491; CHECK-LABEL: extract_v8i1_nxv64i1_128: 492; CHECK: # %bb.0: 493; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 494; CHECK-NEXT: vslidedown.vi v8, v0, 16 495; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 496; CHECK-NEXT: vsm.v v8, (a0) 497; CHECK-NEXT: ret 498 %c = call <8 x i1> @llvm.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 128) 499 store <8 x i1> %c, ptr %y 500 ret void 501} 502 503define void @extract_v8i1_nxv64i1_192(<vscale x 64 x i1> %x, ptr %y) { 504; CHECK-LABEL: extract_v8i1_nxv64i1_192: 505; CHECK: # %bb.0: 506; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 507; CHECK-NEXT: vslidedown.vi v8, v0, 24 508; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 509; CHECK-NEXT: vsm.v v8, (a0) 510; CHECK-NEXT: ret 511 %c = call <8 x i1> @llvm.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %x, i64 192) 512 store <8 x i1> %c, ptr %y 513 ret void 514} 515 516define void @extract_v2i1_v64i1_0(ptr %x, ptr %y) { 517; VLA-LABEL: extract_v2i1_v64i1_0: 518; VLA: # %bb.0: 519; VLA-NEXT: li a2, 64 520; VLA-NEXT: vsetvli zero, a2, e8, m4, ta, ma 521; VLA-NEXT: vlm.v v0, (a0) 522; VLA-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 523; VLA-NEXT: vmv.v.i v8, 0 524; VLA-NEXT: vmerge.vim v8, v8, 1, v0 525; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 526; VLA-NEXT: vmv.v.i v9, 0 527; VLA-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 528; VLA-NEXT: vmv.v.v v9, v8 529; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 530; VLA-NEXT: vmsne.vi v8, v9, 0 531; VLA-NEXT: vsm.v v8, (a1) 532; VLA-NEXT: ret 533; 534; VLS-LABEL: extract_v2i1_v64i1_0: 535; VLS: # %bb.0: 536; VLS-NEXT: vsetvli a2, zero, e8, m4, ta, ma 537; VLS-NEXT: vlm.v v0, (a0) 538; VLS-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 539; VLS-NEXT: vmv.v.i v8, 0 540; VLS-NEXT: vmerge.vim v8, v8, 1, v0 541; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 542; VLS-NEXT: vmv.v.i v9, 0 543; VLS-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 544; VLS-NEXT: vmv.v.v v9, v8 545; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 546; VLS-NEXT: vmsne.vi v8, v9, 0 547; VLS-NEXT: vsm.v v8, (a1) 548; VLS-NEXT: ret 549 %a = load <64 x i1>, ptr %x 550 %c = call <2 x i1> @llvm.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 0) 551 store <2 x i1> %c, ptr %y 552 ret void 553} 554 555define void @extract_v2i1_v64i1_2(ptr %x, ptr %y) { 556; VLA-LABEL: extract_v2i1_v64i1_2: 557; VLA: # %bb.0: 558; VLA-NEXT: li a2, 64 559; VLA-NEXT: vsetvli zero, a2, e8, m4, ta, ma 560; VLA-NEXT: vlm.v v0, (a0) 561; VLA-NEXT: vmv.v.i v8, 0 562; VLA-NEXT: vmerge.vim v8, v8, 1, v0 563; VLA-NEXT: vsetivli zero, 2, e8, m1, ta, ma 564; VLA-NEXT: vslidedown.vi v8, v8, 2 565; VLA-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 566; VLA-NEXT: vmsne.vi v0, v8, 0 567; VLA-NEXT: vmv.v.i v8, 0 568; VLA-NEXT: vmerge.vim v8, v8, 1, v0 569; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 570; VLA-NEXT: vmv.v.i v9, 0 571; VLA-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 572; VLA-NEXT: vmv.v.v v9, v8 573; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 574; VLA-NEXT: vmsne.vi v8, v9, 0 575; VLA-NEXT: vsm.v v8, (a1) 576; VLA-NEXT: ret 577; 578; VLS-LABEL: extract_v2i1_v64i1_2: 579; VLS: # %bb.0: 580; VLS-NEXT: vsetvli a2, zero, e8, m4, ta, ma 581; VLS-NEXT: vlm.v v0, (a0) 582; VLS-NEXT: vmv.v.i v8, 0 583; VLS-NEXT: vmerge.vim v8, v8, 1, v0 584; VLS-NEXT: vsetivli zero, 2, e8, m1, ta, ma 585; VLS-NEXT: vslidedown.vi v8, v8, 2 586; VLS-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 587; VLS-NEXT: vmsne.vi v0, v8, 0 588; VLS-NEXT: vmv.v.i v8, 0 589; VLS-NEXT: vmerge.vim v8, v8, 1, v0 590; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 591; VLS-NEXT: vmv.v.i v9, 0 592; VLS-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 593; VLS-NEXT: vmv.v.v v9, v8 594; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 595; VLS-NEXT: vmsne.vi v8, v9, 0 596; VLS-NEXT: vsm.v v8, (a1) 597; VLS-NEXT: ret 598 %a = load <64 x i1>, ptr %x 599 %c = call <2 x i1> @llvm.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 2) 600 store <2 x i1> %c, ptr %y 601 ret void 602} 603 604define void @extract_v2i1_v64i1_42(ptr %x, ptr %y) { 605; VLA-LABEL: extract_v2i1_v64i1_42: 606; VLA: # %bb.0: 607; VLA-NEXT: li a2, 64 608; VLA-NEXT: vsetvli zero, a2, e8, m4, ta, ma 609; VLA-NEXT: vlm.v v0, (a0) 610; VLA-NEXT: li a0, 42 611; VLA-NEXT: vmv.v.i v8, 0 612; VLA-NEXT: vmerge.vim v8, v8, 1, v0 613; VLA-NEXT: vsetivli zero, 2, e8, m4, ta, ma 614; VLA-NEXT: vslidedown.vx v8, v8, a0 615; VLA-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 616; VLA-NEXT: vmsne.vi v0, v8, 0 617; VLA-NEXT: vmv.v.i v8, 0 618; VLA-NEXT: vmerge.vim v8, v8, 1, v0 619; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 620; VLA-NEXT: vmv.v.i v9, 0 621; VLA-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 622; VLA-NEXT: vmv.v.v v9, v8 623; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 624; VLA-NEXT: vmsne.vi v8, v9, 0 625; VLA-NEXT: vsm.v v8, (a1) 626; VLA-NEXT: ret 627; 628; VLS-LABEL: extract_v2i1_v64i1_42: 629; VLS: # %bb.0: 630; VLS-NEXT: vsetvli a2, zero, e8, m4, ta, ma 631; VLS-NEXT: vlm.v v0, (a0) 632; VLS-NEXT: vmv.v.i v8, 0 633; VLS-NEXT: vmerge.vim v8, v8, 1, v0 634; VLS-NEXT: vsetivli zero, 2, e8, m1, ta, ma 635; VLS-NEXT: vslidedown.vi v8, v10, 10 636; VLS-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 637; VLS-NEXT: vmsne.vi v0, v8, 0 638; VLS-NEXT: vmv.v.i v8, 0 639; VLS-NEXT: vmerge.vim v8, v8, 1, v0 640; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 641; VLS-NEXT: vmv.v.i v9, 0 642; VLS-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 643; VLS-NEXT: vmv.v.v v9, v8 644; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 645; VLS-NEXT: vmsne.vi v8, v9, 0 646; VLS-NEXT: vsm.v v8, (a1) 647; VLS-NEXT: ret 648 %a = load <64 x i1>, ptr %x 649 %c = call <2 x i1> @llvm.vector.extract.v2i1.v64i1(<64 x i1> %a, i64 42) 650 store <2 x i1> %c, ptr %y 651 ret void 652} 653 654define void @extract_v2i1_nxv2i1_0(<vscale x 2 x i1> %x, ptr %y) { 655; CHECK-LABEL: extract_v2i1_nxv2i1_0: 656; CHECK: # %bb.0: 657; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 658; CHECK-NEXT: vmv.v.i v8, 0 659; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 660; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 661; CHECK-NEXT: vmv.v.i v9, 0 662; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 663; CHECK-NEXT: vmv.v.v v9, v8 664; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 665; CHECK-NEXT: vmsne.vi v8, v9, 0 666; CHECK-NEXT: vsm.v v8, (a0) 667; CHECK-NEXT: ret 668 %c = call <2 x i1> @llvm.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %x, i64 0) 669 store <2 x i1> %c, ptr %y 670 ret void 671} 672 673define void @extract_v2i1_nxv2i1_2(<vscale x 2 x i1> %x, ptr %y) { 674; VLA-LABEL: extract_v2i1_nxv2i1_2: 675; VLA: # %bb.0: 676; VLA-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 677; VLA-NEXT: vmv.v.i v8, 0 678; VLA-NEXT: vmerge.vim v8, v8, 1, v0 679; VLA-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 680; VLA-NEXT: vslidedown.vi v8, v8, 2 681; VLA-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 682; VLA-NEXT: vmsne.vi v0, v8, 0 683; VLA-NEXT: vmv.v.i v8, 0 684; VLA-NEXT: vmerge.vim v8, v8, 1, v0 685; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 686; VLA-NEXT: vmv.v.i v9, 0 687; VLA-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 688; VLA-NEXT: vmv.v.v v9, v8 689; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 690; VLA-NEXT: vmsne.vi v8, v9, 0 691; VLA-NEXT: vsm.v v8, (a0) 692; VLA-NEXT: ret 693; 694; VLS-LABEL: extract_v2i1_nxv2i1_2: 695; VLS: # %bb.0: 696; VLS-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 697; VLS-NEXT: vmv.v.i v8, 0 698; VLS-NEXT: vmerge.vim v8, v8, 1, v0 699; VLS-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 700; VLS-NEXT: vslidedown.vi v8, v8, 2 701; VLS-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 702; VLS-NEXT: vmsne.vi v0, v8, 0 703; VLS-NEXT: vmv.v.i v8, 0 704; VLS-NEXT: vmerge.vim v8, v8, 1, v0 705; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 706; VLS-NEXT: vmv.v.i v9, 0 707; VLS-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 708; VLS-NEXT: vmv.v.v v9, v8 709; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 710; VLS-NEXT: vmsne.vi v8, v9, 0 711; VLS-NEXT: vsm.v v8, (a0) 712; VLS-NEXT: ret 713 %c = call <2 x i1> @llvm.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %x, i64 2) 714 store <2 x i1> %c, ptr %y 715 ret void 716} 717 718define void @extract_v2i1_nxv64i1_0(<vscale x 64 x i1> %x, ptr %y) { 719; CHECK-LABEL: extract_v2i1_nxv64i1_0: 720; CHECK: # %bb.0: 721; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 722; CHECK-NEXT: vmv.v.i v8, 0 723; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 724; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 725; CHECK-NEXT: vmv.v.i v9, 0 726; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 727; CHECK-NEXT: vmv.v.v v9, v8 728; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 729; CHECK-NEXT: vmsne.vi v8, v9, 0 730; CHECK-NEXT: vsm.v v8, (a0) 731; CHECK-NEXT: ret 732 %c = call <2 x i1> @llvm.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 0) 733 store <2 x i1> %c, ptr %y 734 ret void 735} 736 737define void @extract_v2i1_nxv64i1_2(<vscale x 64 x i1> %x, ptr %y) { 738; CHECK-LABEL: extract_v2i1_nxv64i1_2: 739; CHECK: # %bb.0: 740; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 741; CHECK-NEXT: vmv.v.i v8, 0 742; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 743; CHECK-NEXT: vsetivli zero, 2, e8, m1, ta, ma 744; CHECK-NEXT: vslidedown.vi v8, v8, 2 745; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 746; CHECK-NEXT: vmsne.vi v0, v8, 0 747; CHECK-NEXT: vmv.v.i v8, 0 748; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 749; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 750; CHECK-NEXT: vmv.v.i v9, 0 751; CHECK-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 752; CHECK-NEXT: vmv.v.v v9, v8 753; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 754; CHECK-NEXT: vmsne.vi v8, v9, 0 755; CHECK-NEXT: vsm.v v8, (a0) 756; CHECK-NEXT: ret 757 %c = call <2 x i1> @llvm.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 2) 758 store <2 x i1> %c, ptr %y 759 ret void 760} 761 762define void @extract_v2i1_nxv64i1_42(<vscale x 64 x i1> %x, ptr %y) { 763; VLA-LABEL: extract_v2i1_nxv64i1_42: 764; VLA: # %bb.0: 765; VLA-NEXT: vsetvli a1, zero, e8, m8, ta, ma 766; VLA-NEXT: vmv.v.i v8, 0 767; VLA-NEXT: li a1, 42 768; VLA-NEXT: vmerge.vim v8, v8, 1, v0 769; VLA-NEXT: vsetivli zero, 2, e8, m4, ta, ma 770; VLA-NEXT: vslidedown.vx v8, v8, a1 771; VLA-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 772; VLA-NEXT: vmsne.vi v0, v8, 0 773; VLA-NEXT: vmv.v.i v8, 0 774; VLA-NEXT: vmerge.vim v8, v8, 1, v0 775; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 776; VLA-NEXT: vmv.v.i v9, 0 777; VLA-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 778; VLA-NEXT: vmv.v.v v9, v8 779; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 780; VLA-NEXT: vmsne.vi v8, v9, 0 781; VLA-NEXT: vsm.v v8, (a0) 782; VLA-NEXT: ret 783; 784; VLS-LABEL: extract_v2i1_nxv64i1_42: 785; VLS: # %bb.0: 786; VLS-NEXT: vsetvli a1, zero, e8, m8, ta, ma 787; VLS-NEXT: vmv.v.i v8, 0 788; VLS-NEXT: vmerge.vim v8, v8, 1, v0 789; VLS-NEXT: vsetivli zero, 2, e8, m1, ta, ma 790; VLS-NEXT: vslidedown.vi v8, v10, 10 791; VLS-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 792; VLS-NEXT: vmsne.vi v0, v8, 0 793; VLS-NEXT: vmv.v.i v8, 0 794; VLS-NEXT: vmerge.vim v8, v8, 1, v0 795; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 796; VLS-NEXT: vmv.v.i v9, 0 797; VLS-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 798; VLS-NEXT: vmv.v.v v9, v8 799; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 800; VLS-NEXT: vmsne.vi v8, v9, 0 801; VLS-NEXT: vsm.v v8, (a0) 802; VLS-NEXT: ret 803 %c = call <2 x i1> @llvm.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %x, i64 42) 804 store <2 x i1> %c, ptr %y 805 ret void 806} 807 808define void @extract_v2i1_nxv32i1_26(<vscale x 32 x i1> %x, ptr %y) { 809; VLA-LABEL: extract_v2i1_nxv32i1_26: 810; VLA: # %bb.0: 811; VLA-NEXT: vsetvli a1, zero, e8, m4, ta, ma 812; VLA-NEXT: vmv.v.i v8, 0 813; VLA-NEXT: vmerge.vim v8, v8, 1, v0 814; VLA-NEXT: vsetivli zero, 2, e8, m2, ta, ma 815; VLA-NEXT: vslidedown.vi v8, v8, 26 816; VLA-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 817; VLA-NEXT: vmsne.vi v0, v8, 0 818; VLA-NEXT: vmv.v.i v8, 0 819; VLA-NEXT: vmerge.vim v8, v8, 1, v0 820; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 821; VLA-NEXT: vmv.v.i v9, 0 822; VLA-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 823; VLA-NEXT: vmv.v.v v9, v8 824; VLA-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 825; VLA-NEXT: vmsne.vi v8, v9, 0 826; VLA-NEXT: vsm.v v8, (a0) 827; VLA-NEXT: ret 828; 829; VLS-LABEL: extract_v2i1_nxv32i1_26: 830; VLS: # %bb.0: 831; VLS-NEXT: vsetvli a1, zero, e8, m4, ta, ma 832; VLS-NEXT: vmv.v.i v8, 0 833; VLS-NEXT: vmerge.vim v8, v8, 1, v0 834; VLS-NEXT: vsetivli zero, 2, e8, m1, ta, ma 835; VLS-NEXT: vslidedown.vi v8, v9, 10 836; VLS-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 837; VLS-NEXT: vmsne.vi v0, v8, 0 838; VLS-NEXT: vmv.v.i v8, 0 839; VLS-NEXT: vmerge.vim v8, v8, 1, v0 840; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 841; VLS-NEXT: vmv.v.i v9, 0 842; VLS-NEXT: vsetivli zero, 2, e8, mf2, tu, ma 843; VLS-NEXT: vmv.v.v v9, v8 844; VLS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 845; VLS-NEXT: vmsne.vi v8, v9, 0 846; VLS-NEXT: vsm.v v8, (a0) 847; VLS-NEXT: ret 848 %c = call <2 x i1> @llvm.vector.extract.v2i1.nxv32i1(<vscale x 32 x i1> %x, i64 26) 849 store <2 x i1> %c, ptr %y 850 ret void 851} 852 853define void @extract_v8i1_nxv32i1_16(<vscale x 32 x i1> %x, ptr %y) { 854; CHECK-LABEL: extract_v8i1_nxv32i1_16: 855; CHECK: # %bb.0: 856; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 857; CHECK-NEXT: vslidedown.vi v8, v0, 2 858; CHECK-NEXT: vsm.v v8, (a0) 859; CHECK-NEXT: ret 860 %c = call <8 x i1> @llvm.vector.extract.v8i1.nxv32i1(<vscale x 32 x i1> %x, i64 16) 861 store <8 x i1> %c, ptr %y 862 ret void 863} 864 865define <1 x i64> @extract_v1i64_v2i64_1(<2 x i64> %x) { 866; CHECK-LABEL: extract_v1i64_v2i64_1: 867; CHECK: # %bb.0: 868; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma 869; CHECK-NEXT: vslidedown.vi v8, v8, 1 870; CHECK-NEXT: ret 871 %v = call <1 x i64> @llvm.vector.extract.v1i64.v2i64(<2 x i64> %x, i64 1) 872 ret <1 x i64> %v 873} 874 875define void @extract_v2bf16_v4bf16_0(ptr %x, ptr %y) { 876; CHECK-LABEL: extract_v2bf16_v4bf16_0: 877; CHECK: # %bb.0: 878; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 879; CHECK-NEXT: vle16.v v8, (a0) 880; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 881; CHECK-NEXT: vse16.v v8, (a1) 882; CHECK-NEXT: ret 883 %a = load <4 x bfloat>, ptr %x 884 %c = call <2 x bfloat> @llvm.vector.extract.v2bf16.v4bf16(<4 x bfloat> %a, i64 0) 885 store <2 x bfloat> %c, ptr %y 886 ret void 887} 888 889define void @extract_v2bf16_v4bf16_2(ptr %x, ptr %y) { 890; CHECK-LABEL: extract_v2bf16_v4bf16_2: 891; CHECK: # %bb.0: 892; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 893; CHECK-NEXT: vle16.v v8, (a0) 894; CHECK-NEXT: vsetivli zero, 2, e16, mf2, ta, ma 895; CHECK-NEXT: vslidedown.vi v8, v8, 2 896; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 897; CHECK-NEXT: vse16.v v8, (a1) 898; CHECK-NEXT: ret 899 %a = load <4 x bfloat>, ptr %x 900 %c = call <2 x bfloat> @llvm.vector.extract.v2bf16.v4bf16(<4 x bfloat> %a, i64 2) 901 store <2 x bfloat> %c, ptr %y 902 ret void 903} 904 905define void @extract_v2f16_v4f16_0(ptr %x, ptr %y) { 906; CHECK-LABEL: extract_v2f16_v4f16_0: 907; CHECK: # %bb.0: 908; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 909; CHECK-NEXT: vle16.v v8, (a0) 910; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 911; CHECK-NEXT: vse16.v v8, (a1) 912; CHECK-NEXT: ret 913 %a = load <4 x half>, ptr %x 914 %c = call <2 x half> @llvm.vector.extract.v2f16.v4f16(<4 x half> %a, i64 0) 915 store <2 x half> %c, ptr %y 916 ret void 917} 918 919define void @extract_v2f16_v4f16_2(ptr %x, ptr %y) { 920; CHECK-LABEL: extract_v2f16_v4f16_2: 921; CHECK: # %bb.0: 922; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 923; CHECK-NEXT: vle16.v v8, (a0) 924; CHECK-NEXT: vsetivli zero, 2, e16, mf2, ta, ma 925; CHECK-NEXT: vslidedown.vi v8, v8, 2 926; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 927; CHECK-NEXT: vse16.v v8, (a1) 928; CHECK-NEXT: ret 929 %a = load <4 x half>, ptr %x 930 %c = call <2 x half> @llvm.vector.extract.v2f16.v4f16(<4 x half> %a, i64 2) 931 store <2 x half> %c, ptr %y 932 ret void 933} 934 935declare <2 x i1> @llvm.vector.extract.v2i1.v64i1(<64 x i1> %vec, i64 %idx) 936declare <8 x i1> @llvm.vector.extract.v8i1.v64i1(<64 x i1> %vec, i64 %idx) 937 938declare <2 x i1> @llvm.vector.extract.v2i1.nxv2i1(<vscale x 2 x i1> %vec, i64 %idx) 939declare <8 x i1> @llvm.vector.extract.v8i1.nxv2i1(<vscale x 2 x i1> %vec, i64 %idx) 940 941declare <2 x i1> @llvm.vector.extract.v2i1.nxv32i1(<vscale x 32 x i1> %vec, i64 %idx) 942declare <8 x i1> @llvm.vector.extract.v8i1.nxv32i1(<vscale x 32 x i1> %vec, i64 %idx) 943 944declare <2 x i1> @llvm.vector.extract.v2i1.nxv64i1(<vscale x 64 x i1> %vec, i64 %idx) 945declare <8 x i1> @llvm.vector.extract.v8i1.nxv64i1(<vscale x 64 x i1> %vec, i64 %idx) 946 947declare <2 x i8> @llvm.vector.extract.v2i8.v4i8(<4 x i8> %vec, i64 %idx) 948declare <2 x i8> @llvm.vector.extract.v2i8.v8i8(<8 x i8> %vec, i64 %idx) 949 950declare <1 x i32> @llvm.vector.extract.v1i32.v8i32(<8 x i32> %vec, i64 %idx) 951declare <2 x i32> @llvm.vector.extract.v2i32.v8i32(<8 x i32> %vec, i64 %idx) 952 953declare <2 x i8> @llvm.vector.extract.v2i8.nxv2i8(<vscale x 2 x i8> %vec, i64 %idx) 954 955declare <2 x i32> @llvm.vector.extract.v2i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx) 956declare <8 x i32> @llvm.vector.extract.v8i32.nxv16i32(<vscale x 16 x i32> %vec, i64 %idx) 957