1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 3; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 4 5; RUN: llc -mtriple=riscv32 -target-abi=ilp32d -mattr=+v,+zbs -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32ZBS 6; RUN: llc -mtriple=riscv64 -target-abi=lp64d -mattr=+v,+zbs -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64ZBS 7 8define i1 @extractelt_v1i1(ptr %x, i64 %idx) nounwind { 9; CHECK-LABEL: extractelt_v1i1: 10; CHECK: # %bb.0: 11; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 12; CHECK-NEXT: vle8.v v8, (a0) 13; CHECK-NEXT: vmseq.vi v0, v8, 0 14; CHECK-NEXT: vmv.s.x v8, zero 15; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 16; CHECK-NEXT: vslidedown.vx v8, v8, a1 17; CHECK-NEXT: vmv.x.s a0, v8 18; CHECK-NEXT: ret 19 %a = load <1 x i8>, ptr %x 20 %b = icmp eq <1 x i8> %a, zeroinitializer 21 %c = extractelement <1 x i1> %b, i64 %idx 22 ret i1 %c 23} 24 25define i1 @extractelt_v2i1(ptr %x, i64 %idx) nounwind { 26; CHECK-LABEL: extractelt_v2i1: 27; CHECK: # %bb.0: 28; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 29; CHECK-NEXT: vle8.v v8, (a0) 30; CHECK-NEXT: vmseq.vi v0, v8, 0 31; CHECK-NEXT: vmv.v.i v8, 0 32; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 33; CHECK-NEXT: vslidedown.vx v8, v8, a1 34; CHECK-NEXT: vmv.x.s a0, v8 35; CHECK-NEXT: ret 36 %a = load <2 x i8>, ptr %x 37 %b = icmp eq <2 x i8> %a, zeroinitializer 38 %c = extractelement <2 x i1> %b, i64 %idx 39 ret i1 %c 40} 41 42define i1 @extractelt_v4i1(ptr %x, i64 %idx) nounwind { 43; CHECK-LABEL: extractelt_v4i1: 44; CHECK: # %bb.0: 45; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 46; CHECK-NEXT: vle8.v v8, (a0) 47; CHECK-NEXT: vmseq.vi v0, v8, 0 48; CHECK-NEXT: vmv.v.i v8, 0 49; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 50; CHECK-NEXT: vslidedown.vx v8, v8, a1 51; CHECK-NEXT: vmv.x.s a0, v8 52; CHECK-NEXT: ret 53 %a = load <4 x i8>, ptr %x 54 %b = icmp eq <4 x i8> %a, zeroinitializer 55 %c = extractelement <4 x i1> %b, i64 %idx 56 ret i1 %c 57} 58 59define i1 @extractelt_v8i1(ptr %x, i64 %idx) nounwind { 60; RV32-LABEL: extractelt_v8i1: 61; RV32: # %bb.0: 62; RV32-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 63; RV32-NEXT: vle8.v v8, (a0) 64; RV32-NEXT: vmseq.vi v8, v8, 0 65; RV32-NEXT: vmv.x.s a0, v8 66; RV32-NEXT: srl a0, a0, a1 67; RV32-NEXT: andi a0, a0, 1 68; RV32-NEXT: ret 69; 70; RV64-LABEL: extractelt_v8i1: 71; RV64: # %bb.0: 72; RV64-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 73; RV64-NEXT: vle8.v v8, (a0) 74; RV64-NEXT: vmseq.vi v8, v8, 0 75; RV64-NEXT: vmv.x.s a0, v8 76; RV64-NEXT: srl a0, a0, a1 77; RV64-NEXT: andi a0, a0, 1 78; RV64-NEXT: ret 79; 80; RV32ZBS-LABEL: extractelt_v8i1: 81; RV32ZBS: # %bb.0: 82; RV32ZBS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 83; RV32ZBS-NEXT: vle8.v v8, (a0) 84; RV32ZBS-NEXT: vmseq.vi v8, v8, 0 85; RV32ZBS-NEXT: vmv.x.s a0, v8 86; RV32ZBS-NEXT: bext a0, a0, a1 87; RV32ZBS-NEXT: ret 88; 89; RV64ZBS-LABEL: extractelt_v8i1: 90; RV64ZBS: # %bb.0: 91; RV64ZBS-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 92; RV64ZBS-NEXT: vle8.v v8, (a0) 93; RV64ZBS-NEXT: vmseq.vi v8, v8, 0 94; RV64ZBS-NEXT: vmv.x.s a0, v8 95; RV64ZBS-NEXT: bext a0, a0, a1 96; RV64ZBS-NEXT: ret 97 %a = load <8 x i8>, ptr %x 98 %b = icmp eq <8 x i8> %a, zeroinitializer 99 %c = extractelement <8 x i1> %b, i64 %idx 100 ret i1 %c 101} 102 103define i1 @extractelt_v16i1(ptr %x, i64 %idx) nounwind { 104; RV32-LABEL: extractelt_v16i1: 105; RV32: # %bb.0: 106; RV32-NEXT: vsetivli zero, 16, e8, m1, ta, ma 107; RV32-NEXT: vle8.v v8, (a0) 108; RV32-NEXT: vmseq.vi v8, v8, 0 109; RV32-NEXT: vsetvli zero, zero, e16, m2, ta, ma 110; RV32-NEXT: vmv.x.s a0, v8 111; RV32-NEXT: srl a0, a0, a1 112; RV32-NEXT: andi a0, a0, 1 113; RV32-NEXT: ret 114; 115; RV64-LABEL: extractelt_v16i1: 116; RV64: # %bb.0: 117; RV64-NEXT: vsetivli zero, 16, e8, m1, ta, ma 118; RV64-NEXT: vle8.v v8, (a0) 119; RV64-NEXT: vmseq.vi v8, v8, 0 120; RV64-NEXT: vsetvli zero, zero, e16, m2, ta, ma 121; RV64-NEXT: vmv.x.s a0, v8 122; RV64-NEXT: srl a0, a0, a1 123; RV64-NEXT: andi a0, a0, 1 124; RV64-NEXT: ret 125; 126; RV32ZBS-LABEL: extractelt_v16i1: 127; RV32ZBS: # %bb.0: 128; RV32ZBS-NEXT: vsetivli zero, 16, e8, m1, ta, ma 129; RV32ZBS-NEXT: vle8.v v8, (a0) 130; RV32ZBS-NEXT: vmseq.vi v8, v8, 0 131; RV32ZBS-NEXT: vsetvli zero, zero, e16, m2, ta, ma 132; RV32ZBS-NEXT: vmv.x.s a0, v8 133; RV32ZBS-NEXT: bext a0, a0, a1 134; RV32ZBS-NEXT: ret 135; 136; RV64ZBS-LABEL: extractelt_v16i1: 137; RV64ZBS: # %bb.0: 138; RV64ZBS-NEXT: vsetivli zero, 16, e8, m1, ta, ma 139; RV64ZBS-NEXT: vle8.v v8, (a0) 140; RV64ZBS-NEXT: vmseq.vi v8, v8, 0 141; RV64ZBS-NEXT: vsetvli zero, zero, e16, m2, ta, ma 142; RV64ZBS-NEXT: vmv.x.s a0, v8 143; RV64ZBS-NEXT: bext a0, a0, a1 144; RV64ZBS-NEXT: ret 145 %a = load <16 x i8>, ptr %x 146 %b = icmp eq <16 x i8> %a, zeroinitializer 147 %c = extractelement <16 x i1> %b, i64 %idx 148 ret i1 %c 149} 150 151define i1 @extractelt_v32i1(ptr %x, i64 %idx) nounwind { 152; RV32-LABEL: extractelt_v32i1: 153; RV32: # %bb.0: 154; RV32-NEXT: li a2, 32 155; RV32-NEXT: vsetvli zero, a2, e8, m2, ta, ma 156; RV32-NEXT: vle8.v v8, (a0) 157; RV32-NEXT: vmseq.vi v10, v8, 0 158; RV32-NEXT: vsetvli zero, zero, e32, m8, ta, ma 159; RV32-NEXT: vmv.x.s a0, v10 160; RV32-NEXT: srl a0, a0, a1 161; RV32-NEXT: andi a0, a0, 1 162; RV32-NEXT: ret 163; 164; RV64-LABEL: extractelt_v32i1: 165; RV64: # %bb.0: 166; RV64-NEXT: li a2, 32 167; RV64-NEXT: vsetvli zero, a2, e8, m2, ta, ma 168; RV64-NEXT: vle8.v v8, (a0) 169; RV64-NEXT: vmseq.vi v10, v8, 0 170; RV64-NEXT: vsetvli zero, zero, e32, m8, ta, ma 171; RV64-NEXT: vmv.x.s a0, v10 172; RV64-NEXT: srl a0, a0, a1 173; RV64-NEXT: andi a0, a0, 1 174; RV64-NEXT: ret 175; 176; RV32ZBS-LABEL: extractelt_v32i1: 177; RV32ZBS: # %bb.0: 178; RV32ZBS-NEXT: li a2, 32 179; RV32ZBS-NEXT: vsetvli zero, a2, e8, m2, ta, ma 180; RV32ZBS-NEXT: vle8.v v8, (a0) 181; RV32ZBS-NEXT: vmseq.vi v10, v8, 0 182; RV32ZBS-NEXT: vsetvli zero, zero, e32, m8, ta, ma 183; RV32ZBS-NEXT: vmv.x.s a0, v10 184; RV32ZBS-NEXT: bext a0, a0, a1 185; RV32ZBS-NEXT: ret 186; 187; RV64ZBS-LABEL: extractelt_v32i1: 188; RV64ZBS: # %bb.0: 189; RV64ZBS-NEXT: li a2, 32 190; RV64ZBS-NEXT: vsetvli zero, a2, e8, m2, ta, ma 191; RV64ZBS-NEXT: vle8.v v8, (a0) 192; RV64ZBS-NEXT: vmseq.vi v10, v8, 0 193; RV64ZBS-NEXT: vsetvli zero, zero, e32, m8, ta, ma 194; RV64ZBS-NEXT: vmv.x.s a0, v10 195; RV64ZBS-NEXT: bext a0, a0, a1 196; RV64ZBS-NEXT: ret 197 %a = load <32 x i8>, ptr %x 198 %b = icmp eq <32 x i8> %a, zeroinitializer 199 %c = extractelement <32 x i1> %b, i64 %idx 200 ret i1 %c 201} 202 203define i1 @extractelt_v64i1(ptr %x, i64 %idx) nounwind { 204; RV32-LABEL: extractelt_v64i1: 205; RV32: # %bb.0: 206; RV32-NEXT: li a2, 64 207; RV32-NEXT: vsetvli zero, a2, e8, m4, ta, ma 208; RV32-NEXT: vle8.v v8, (a0) 209; RV32-NEXT: vmseq.vi v12, v8, 0 210; RV32-NEXT: srli a0, a1, 5 211; RV32-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 212; RV32-NEXT: vslidedown.vx v8, v12, a0 213; RV32-NEXT: vmv.x.s a0, v8 214; RV32-NEXT: srl a0, a0, a1 215; RV32-NEXT: andi a0, a0, 1 216; RV32-NEXT: ret 217; 218; RV64-LABEL: extractelt_v64i1: 219; RV64: # %bb.0: 220; RV64-NEXT: li a2, 64 221; RV64-NEXT: vsetvli zero, a2, e8, m4, ta, ma 222; RV64-NEXT: vle8.v v8, (a0) 223; RV64-NEXT: vmseq.vi v12, v8, 0 224; RV64-NEXT: vsetvli zero, a2, e64, m1, ta, ma 225; RV64-NEXT: vmv.x.s a0, v12 226; RV64-NEXT: srl a0, a0, a1 227; RV64-NEXT: andi a0, a0, 1 228; RV64-NEXT: ret 229; 230; RV32ZBS-LABEL: extractelt_v64i1: 231; RV32ZBS: # %bb.0: 232; RV32ZBS-NEXT: li a2, 64 233; RV32ZBS-NEXT: vsetvli zero, a2, e8, m4, ta, ma 234; RV32ZBS-NEXT: vle8.v v8, (a0) 235; RV32ZBS-NEXT: vmseq.vi v12, v8, 0 236; RV32ZBS-NEXT: srli a0, a1, 5 237; RV32ZBS-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 238; RV32ZBS-NEXT: vslidedown.vx v8, v12, a0 239; RV32ZBS-NEXT: vmv.x.s a0, v8 240; RV32ZBS-NEXT: bext a0, a0, a1 241; RV32ZBS-NEXT: ret 242; 243; RV64ZBS-LABEL: extractelt_v64i1: 244; RV64ZBS: # %bb.0: 245; RV64ZBS-NEXT: li a2, 64 246; RV64ZBS-NEXT: vsetvli zero, a2, e8, m4, ta, ma 247; RV64ZBS-NEXT: vle8.v v8, (a0) 248; RV64ZBS-NEXT: vmseq.vi v12, v8, 0 249; RV64ZBS-NEXT: vsetvli zero, a2, e64, m1, ta, ma 250; RV64ZBS-NEXT: vmv.x.s a0, v12 251; RV64ZBS-NEXT: bext a0, a0, a1 252; RV64ZBS-NEXT: ret 253 %a = load <64 x i8>, ptr %x 254 %b = icmp eq <64 x i8> %a, zeroinitializer 255 %c = extractelement <64 x i1> %b, i64 %idx 256 ret i1 %c 257} 258 259define i1 @extractelt_v128i1(ptr %x, i64 %idx) nounwind { 260; RV32-LABEL: extractelt_v128i1: 261; RV32: # %bb.0: 262; RV32-NEXT: li a2, 128 263; RV32-NEXT: vsetvli zero, a2, e8, m8, ta, ma 264; RV32-NEXT: vle8.v v8, (a0) 265; RV32-NEXT: vmseq.vi v16, v8, 0 266; RV32-NEXT: srli a0, a1, 5 267; RV32-NEXT: vsetivli zero, 1, e32, m1, ta, ma 268; RV32-NEXT: vslidedown.vx v8, v16, a0 269; RV32-NEXT: vmv.x.s a0, v8 270; RV32-NEXT: srl a0, a0, a1 271; RV32-NEXT: andi a0, a0, 1 272; RV32-NEXT: ret 273; 274; RV64-LABEL: extractelt_v128i1: 275; RV64: # %bb.0: 276; RV64-NEXT: li a2, 128 277; RV64-NEXT: vsetvli zero, a2, e8, m8, ta, ma 278; RV64-NEXT: vle8.v v8, (a0) 279; RV64-NEXT: vmseq.vi v16, v8, 0 280; RV64-NEXT: srli a0, a1, 6 281; RV64-NEXT: vsetivli zero, 1, e64, m1, ta, ma 282; RV64-NEXT: vslidedown.vx v8, v16, a0 283; RV64-NEXT: vmv.x.s a0, v8 284; RV64-NEXT: srl a0, a0, a1 285; RV64-NEXT: andi a0, a0, 1 286; RV64-NEXT: ret 287; 288; RV32ZBS-LABEL: extractelt_v128i1: 289; RV32ZBS: # %bb.0: 290; RV32ZBS-NEXT: li a2, 128 291; RV32ZBS-NEXT: vsetvli zero, a2, e8, m8, ta, ma 292; RV32ZBS-NEXT: vle8.v v8, (a0) 293; RV32ZBS-NEXT: vmseq.vi v16, v8, 0 294; RV32ZBS-NEXT: srli a0, a1, 5 295; RV32ZBS-NEXT: vsetivli zero, 1, e32, m1, ta, ma 296; RV32ZBS-NEXT: vslidedown.vx v8, v16, a0 297; RV32ZBS-NEXT: vmv.x.s a0, v8 298; RV32ZBS-NEXT: bext a0, a0, a1 299; RV32ZBS-NEXT: ret 300; 301; RV64ZBS-LABEL: extractelt_v128i1: 302; RV64ZBS: # %bb.0: 303; RV64ZBS-NEXT: li a2, 128 304; RV64ZBS-NEXT: vsetvli zero, a2, e8, m8, ta, ma 305; RV64ZBS-NEXT: vle8.v v8, (a0) 306; RV64ZBS-NEXT: vmseq.vi v16, v8, 0 307; RV64ZBS-NEXT: srli a0, a1, 6 308; RV64ZBS-NEXT: vsetivli zero, 1, e64, m1, ta, ma 309; RV64ZBS-NEXT: vslidedown.vx v8, v16, a0 310; RV64ZBS-NEXT: vmv.x.s a0, v8 311; RV64ZBS-NEXT: bext a0, a0, a1 312; RV64ZBS-NEXT: ret 313 %a = load <128 x i8>, ptr %x 314 %b = icmp eq <128 x i8> %a, zeroinitializer 315 %c = extractelement <128 x i1> %b, i64 %idx 316 ret i1 %c 317} 318 319define i1 @extractelt_v256i1(ptr %x, i64 %idx) nounwind { 320; RV32-LABEL: extractelt_v256i1: 321; RV32: # %bb.0: 322; RV32-NEXT: addi sp, sp, -384 323; RV32-NEXT: sw ra, 380(sp) # 4-byte Folded Spill 324; RV32-NEXT: sw s0, 376(sp) # 4-byte Folded Spill 325; RV32-NEXT: addi s0, sp, 384 326; RV32-NEXT: andi sp, sp, -128 327; RV32-NEXT: andi a1, a1, 255 328; RV32-NEXT: mv a2, sp 329; RV32-NEXT: li a3, 128 330; RV32-NEXT: vsetvli zero, a3, e8, m8, ta, ma 331; RV32-NEXT: vle8.v v8, (a0) 332; RV32-NEXT: addi a0, a0, 128 333; RV32-NEXT: vle8.v v16, (a0) 334; RV32-NEXT: add a1, a2, a1 335; RV32-NEXT: vmseq.vi v0, v8, 0 336; RV32-NEXT: vmv.v.i v24, 0 337; RV32-NEXT: vmseq.vi v8, v16, 0 338; RV32-NEXT: vmerge.vim v16, v24, 1, v0 339; RV32-NEXT: vse8.v v16, (a2) 340; RV32-NEXT: vmv1r.v v0, v8 341; RV32-NEXT: vmerge.vim v8, v24, 1, v0 342; RV32-NEXT: addi a0, sp, 128 343; RV32-NEXT: vse8.v v8, (a0) 344; RV32-NEXT: lbu a0, 0(a1) 345; RV32-NEXT: addi sp, s0, -384 346; RV32-NEXT: lw ra, 380(sp) # 4-byte Folded Reload 347; RV32-NEXT: lw s0, 376(sp) # 4-byte Folded Reload 348; RV32-NEXT: addi sp, sp, 384 349; RV32-NEXT: ret 350; 351; RV64-LABEL: extractelt_v256i1: 352; RV64: # %bb.0: 353; RV64-NEXT: addi sp, sp, -384 354; RV64-NEXT: sd ra, 376(sp) # 8-byte Folded Spill 355; RV64-NEXT: sd s0, 368(sp) # 8-byte Folded Spill 356; RV64-NEXT: addi s0, sp, 384 357; RV64-NEXT: andi sp, sp, -128 358; RV64-NEXT: andi a1, a1, 255 359; RV64-NEXT: mv a2, sp 360; RV64-NEXT: li a3, 128 361; RV64-NEXT: vsetvli zero, a3, e8, m8, ta, ma 362; RV64-NEXT: vle8.v v8, (a0) 363; RV64-NEXT: addi a0, a0, 128 364; RV64-NEXT: vle8.v v16, (a0) 365; RV64-NEXT: add a1, a2, a1 366; RV64-NEXT: vmseq.vi v0, v8, 0 367; RV64-NEXT: vmv.v.i v24, 0 368; RV64-NEXT: vmseq.vi v8, v16, 0 369; RV64-NEXT: vmerge.vim v16, v24, 1, v0 370; RV64-NEXT: vse8.v v16, (a2) 371; RV64-NEXT: vmv1r.v v0, v8 372; RV64-NEXT: vmerge.vim v8, v24, 1, v0 373; RV64-NEXT: addi a0, sp, 128 374; RV64-NEXT: vse8.v v8, (a0) 375; RV64-NEXT: lbu a0, 0(a1) 376; RV64-NEXT: addi sp, s0, -384 377; RV64-NEXT: ld ra, 376(sp) # 8-byte Folded Reload 378; RV64-NEXT: ld s0, 368(sp) # 8-byte Folded Reload 379; RV64-NEXT: addi sp, sp, 384 380; RV64-NEXT: ret 381; 382; RV32ZBS-LABEL: extractelt_v256i1: 383; RV32ZBS: # %bb.0: 384; RV32ZBS-NEXT: addi sp, sp, -384 385; RV32ZBS-NEXT: sw ra, 380(sp) # 4-byte Folded Spill 386; RV32ZBS-NEXT: sw s0, 376(sp) # 4-byte Folded Spill 387; RV32ZBS-NEXT: addi s0, sp, 384 388; RV32ZBS-NEXT: andi sp, sp, -128 389; RV32ZBS-NEXT: andi a1, a1, 255 390; RV32ZBS-NEXT: mv a2, sp 391; RV32ZBS-NEXT: li a3, 128 392; RV32ZBS-NEXT: vsetvli zero, a3, e8, m8, ta, ma 393; RV32ZBS-NEXT: vle8.v v8, (a0) 394; RV32ZBS-NEXT: addi a0, a0, 128 395; RV32ZBS-NEXT: vle8.v v16, (a0) 396; RV32ZBS-NEXT: add a1, a2, a1 397; RV32ZBS-NEXT: vmseq.vi v0, v8, 0 398; RV32ZBS-NEXT: vmv.v.i v24, 0 399; RV32ZBS-NEXT: vmseq.vi v8, v16, 0 400; RV32ZBS-NEXT: vmerge.vim v16, v24, 1, v0 401; RV32ZBS-NEXT: vse8.v v16, (a2) 402; RV32ZBS-NEXT: vmv1r.v v0, v8 403; RV32ZBS-NEXT: vmerge.vim v8, v24, 1, v0 404; RV32ZBS-NEXT: addi a0, sp, 128 405; RV32ZBS-NEXT: vse8.v v8, (a0) 406; RV32ZBS-NEXT: lbu a0, 0(a1) 407; RV32ZBS-NEXT: addi sp, s0, -384 408; RV32ZBS-NEXT: lw ra, 380(sp) # 4-byte Folded Reload 409; RV32ZBS-NEXT: lw s0, 376(sp) # 4-byte Folded Reload 410; RV32ZBS-NEXT: addi sp, sp, 384 411; RV32ZBS-NEXT: ret 412; 413; RV64ZBS-LABEL: extractelt_v256i1: 414; RV64ZBS: # %bb.0: 415; RV64ZBS-NEXT: addi sp, sp, -384 416; RV64ZBS-NEXT: sd ra, 376(sp) # 8-byte Folded Spill 417; RV64ZBS-NEXT: sd s0, 368(sp) # 8-byte Folded Spill 418; RV64ZBS-NEXT: addi s0, sp, 384 419; RV64ZBS-NEXT: andi sp, sp, -128 420; RV64ZBS-NEXT: andi a1, a1, 255 421; RV64ZBS-NEXT: mv a2, sp 422; RV64ZBS-NEXT: li a3, 128 423; RV64ZBS-NEXT: vsetvli zero, a3, e8, m8, ta, ma 424; RV64ZBS-NEXT: vle8.v v8, (a0) 425; RV64ZBS-NEXT: addi a0, a0, 128 426; RV64ZBS-NEXT: vle8.v v16, (a0) 427; RV64ZBS-NEXT: add a1, a2, a1 428; RV64ZBS-NEXT: vmseq.vi v0, v8, 0 429; RV64ZBS-NEXT: vmv.v.i v24, 0 430; RV64ZBS-NEXT: vmseq.vi v8, v16, 0 431; RV64ZBS-NEXT: vmerge.vim v16, v24, 1, v0 432; RV64ZBS-NEXT: vse8.v v16, (a2) 433; RV64ZBS-NEXT: vmv1r.v v0, v8 434; RV64ZBS-NEXT: vmerge.vim v8, v24, 1, v0 435; RV64ZBS-NEXT: addi a0, sp, 128 436; RV64ZBS-NEXT: vse8.v v8, (a0) 437; RV64ZBS-NEXT: lbu a0, 0(a1) 438; RV64ZBS-NEXT: addi sp, s0, -384 439; RV64ZBS-NEXT: ld ra, 376(sp) # 8-byte Folded Reload 440; RV64ZBS-NEXT: ld s0, 368(sp) # 8-byte Folded Reload 441; RV64ZBS-NEXT: addi sp, sp, 384 442; RV64ZBS-NEXT: ret 443 %a = load <256 x i8>, ptr %x 444 %b = icmp eq <256 x i8> %a, zeroinitializer 445 %c = extractelement <256 x i1> %b, i64 %idx 446 ret i1 %c 447} 448 449define i1 @extractelt_v1i1_idx0(ptr %x) nounwind { 450; CHECK-LABEL: extractelt_v1i1_idx0: 451; CHECK: # %bb.0: 452; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 453; CHECK-NEXT: vle8.v v8, (a0) 454; CHECK-NEXT: vmseq.vi v8, v8, 0 455; CHECK-NEXT: vfirst.m a0, v8 456; CHECK-NEXT: seqz a0, a0 457; CHECK-NEXT: ret 458 %a = load <1 x i8>, ptr %x 459 %b = icmp eq <1 x i8> %a, zeroinitializer 460 %c = extractelement <1 x i1> %b, i64 0 461 ret i1 %c 462} 463 464define i1 @extractelt_v2i1_idx0(ptr %x) nounwind { 465; CHECK-LABEL: extractelt_v2i1_idx0: 466; CHECK: # %bb.0: 467; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 468; CHECK-NEXT: vle8.v v8, (a0) 469; CHECK-NEXT: vmseq.vi v8, v8, 0 470; CHECK-NEXT: vfirst.m a0, v8 471; CHECK-NEXT: seqz a0, a0 472; CHECK-NEXT: ret 473 %a = load <2 x i8>, ptr %x 474 %b = icmp eq <2 x i8> %a, zeroinitializer 475 %c = extractelement <2 x i1> %b, i64 0 476 ret i1 %c 477} 478 479define i1 @extractelt_v4i1_idx0(ptr %x) nounwind { 480; CHECK-LABEL: extractelt_v4i1_idx0: 481; CHECK: # %bb.0: 482; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 483; CHECK-NEXT: vle8.v v8, (a0) 484; CHECK-NEXT: vmseq.vi v8, v8, 0 485; CHECK-NEXT: vfirst.m a0, v8 486; CHECK-NEXT: seqz a0, a0 487; CHECK-NEXT: ret 488 %a = load <4 x i8>, ptr %x 489 %b = icmp eq <4 x i8> %a, zeroinitializer 490 %c = extractelement <4 x i1> %b, i64 0 491 ret i1 %c 492} 493 494define i1 @extractelt_v8i1_idx0(ptr %x) nounwind { 495; CHECK-LABEL: extractelt_v8i1_idx0: 496; CHECK: # %bb.0: 497; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 498; CHECK-NEXT: vle8.v v8, (a0) 499; CHECK-NEXT: vmseq.vi v8, v8, 0 500; CHECK-NEXT: vfirst.m a0, v8 501; CHECK-NEXT: seqz a0, a0 502; CHECK-NEXT: ret 503 %a = load <8 x i8>, ptr %x 504 %b = icmp eq <8 x i8> %a, zeroinitializer 505 %c = extractelement <8 x i1> %b, i64 0 506 ret i1 %c 507} 508 509define i1 @extractelt_v16i1_idx0(ptr %x) nounwind { 510; CHECK-LABEL: extractelt_v16i1_idx0: 511; CHECK: # %bb.0: 512; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 513; CHECK-NEXT: vle8.v v8, (a0) 514; CHECK-NEXT: vmseq.vi v8, v8, 0 515; CHECK-NEXT: vfirst.m a0, v8 516; CHECK-NEXT: seqz a0, a0 517; CHECK-NEXT: ret 518 %a = load <16 x i8>, ptr %x 519 %b = icmp eq <16 x i8> %a, zeroinitializer 520 %c = extractelement <16 x i1> %b, i64 0 521 ret i1 %c 522} 523 524define i1 @extractelt_v32i1_idx0(ptr %x) nounwind { 525; CHECK-LABEL: extractelt_v32i1_idx0: 526; CHECK: # %bb.0: 527; CHECK-NEXT: li a1, 32 528; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma 529; CHECK-NEXT: vle8.v v8, (a0) 530; CHECK-NEXT: vmseq.vi v10, v8, 0 531; CHECK-NEXT: vfirst.m a0, v10 532; CHECK-NEXT: seqz a0, a0 533; CHECK-NEXT: ret 534 %a = load <32 x i8>, ptr %x 535 %b = icmp eq <32 x i8> %a, zeroinitializer 536 %c = extractelement <32 x i1> %b, i64 0 537 ret i1 %c 538} 539 540define i1 @extractelt_v64i1_idx0(ptr %x) nounwind { 541; CHECK-LABEL: extractelt_v64i1_idx0: 542; CHECK: # %bb.0: 543; CHECK-NEXT: li a1, 64 544; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma 545; CHECK-NEXT: vle8.v v8, (a0) 546; CHECK-NEXT: vmseq.vi v12, v8, 0 547; CHECK-NEXT: vfirst.m a0, v12 548; CHECK-NEXT: seqz a0, a0 549; CHECK-NEXT: ret 550 %a = load <64 x i8>, ptr %x 551 %b = icmp eq <64 x i8> %a, zeroinitializer 552 %c = extractelement <64 x i1> %b, i64 0 553 ret i1 %c 554} 555 556define i1 @extractelt_v128i1_idx0(ptr %x) nounwind { 557; CHECK-LABEL: extractelt_v128i1_idx0: 558; CHECK: # %bb.0: 559; CHECK-NEXT: li a1, 128 560; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 561; CHECK-NEXT: vle8.v v8, (a0) 562; CHECK-NEXT: vmseq.vi v16, v8, 0 563; CHECK-NEXT: vfirst.m a0, v16 564; CHECK-NEXT: seqz a0, a0 565; CHECK-NEXT: ret 566 %a = load <128 x i8>, ptr %x 567 %b = icmp eq <128 x i8> %a, zeroinitializer 568 %c = extractelement <128 x i1> %b, i64 0 569 ret i1 %c 570} 571 572define i1 @extractelt_v256i1_idx0(ptr %x) nounwind { 573; CHECK-LABEL: extractelt_v256i1_idx0: 574; CHECK: # %bb.0: 575; CHECK-NEXT: li a1, 128 576; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 577; CHECK-NEXT: vle8.v v8, (a0) 578; CHECK-NEXT: vmseq.vi v16, v8, 0 579; CHECK-NEXT: vfirst.m a0, v16 580; CHECK-NEXT: seqz a0, a0 581; CHECK-NEXT: ret 582 %a = load <256 x i8>, ptr %x 583 %b = icmp eq <256 x i8> %a, zeroinitializer 584 %c = extractelement <256 x i1> %b, i64 0 585 ret i1 %c 586} 587