1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 4 5define i1 @extractelt_nxv1i1(ptr %x, i64 %idx) nounwind { 6; CHECK-LABEL: extractelt_nxv1i1: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetvli a2, zero, e8, mf8, ta, ma 9; CHECK-NEXT: vle8.v v8, (a0) 10; CHECK-NEXT: vmseq.vi v0, v8, 0 11; CHECK-NEXT: vmv.v.i v8, 0 12; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 13; CHECK-NEXT: vslidedown.vx v8, v8, a1 14; CHECK-NEXT: vmv.x.s a0, v8 15; CHECK-NEXT: ret 16 %a = load <vscale x 1 x i8>, ptr %x 17 %b = icmp eq <vscale x 1 x i8> %a, zeroinitializer 18 %c = extractelement <vscale x 1 x i1> %b, i64 %idx 19 ret i1 %c 20} 21 22define i1 @extractelt_nxv2i1(ptr %x, i64 %idx) nounwind { 23; CHECK-LABEL: extractelt_nxv2i1: 24; CHECK: # %bb.0: 25; CHECK-NEXT: vsetvli a2, zero, e8, mf4, ta, ma 26; CHECK-NEXT: vle8.v v8, (a0) 27; CHECK-NEXT: vmseq.vi v0, v8, 0 28; CHECK-NEXT: vmv.v.i v8, 0 29; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 30; CHECK-NEXT: vslidedown.vx v8, v8, a1 31; CHECK-NEXT: vmv.x.s a0, v8 32; CHECK-NEXT: ret 33 %a = load <vscale x 2 x i8>, ptr %x 34 %b = icmp eq <vscale x 2 x i8> %a, zeroinitializer 35 %c = extractelement <vscale x 2 x i1> %b, i64 %idx 36 ret i1 %c 37} 38 39define i1 @extractelt_nxv4i1(ptr %x, i64 %idx) nounwind { 40; CHECK-LABEL: extractelt_nxv4i1: 41; CHECK: # %bb.0: 42; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, ma 43; CHECK-NEXT: vle8.v v8, (a0) 44; CHECK-NEXT: vmseq.vi v0, v8, 0 45; CHECK-NEXT: vmv.v.i v8, 0 46; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 47; CHECK-NEXT: vslidedown.vx v8, v8, a1 48; CHECK-NEXT: vmv.x.s a0, v8 49; CHECK-NEXT: ret 50 %a = load <vscale x 4 x i8>, ptr %x 51 %b = icmp eq <vscale x 4 x i8> %a, zeroinitializer 52 %c = extractelement <vscale x 4 x i1> %b, i64 %idx 53 ret i1 %c 54} 55 56define i1 @extractelt_nxv8i1(ptr %x, i64 %idx) nounwind { 57; CHECK-LABEL: extractelt_nxv8i1: 58; CHECK: # %bb.0: 59; CHECK-NEXT: vl1r.v v8, (a0) 60; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 61; CHECK-NEXT: vmseq.vi v0, v8, 0 62; CHECK-NEXT: vmv.v.i v8, 0 63; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 64; CHECK-NEXT: vslidedown.vx v8, v8, a1 65; CHECK-NEXT: vmv.x.s a0, v8 66; CHECK-NEXT: ret 67 %a = load <vscale x 8 x i8>, ptr %x 68 %b = icmp eq <vscale x 8 x i8> %a, zeroinitializer 69 %c = extractelement <vscale x 8 x i1> %b, i64 %idx 70 ret i1 %c 71} 72 73define i1 @extractelt_nxv16i1(ptr %x, i64 %idx) nounwind { 74; CHECK-LABEL: extractelt_nxv16i1: 75; CHECK: # %bb.0: 76; CHECK-NEXT: vl2r.v v8, (a0) 77; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 78; CHECK-NEXT: vmseq.vi v0, v8, 0 79; CHECK-NEXT: vmv.v.i v8, 0 80; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 81; CHECK-NEXT: vslidedown.vx v8, v8, a1 82; CHECK-NEXT: vmv.x.s a0, v8 83; CHECK-NEXT: ret 84 %a = load <vscale x 16 x i8>, ptr %x 85 %b = icmp eq <vscale x 16 x i8> %a, zeroinitializer 86 %c = extractelement <vscale x 16 x i1> %b, i64 %idx 87 ret i1 %c 88} 89 90define i1 @extractelt_nxv32i1(ptr %x, i64 %idx) nounwind { 91; CHECK-LABEL: extractelt_nxv32i1: 92; CHECK: # %bb.0: 93; CHECK-NEXT: vl4r.v v8, (a0) 94; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 95; CHECK-NEXT: vmseq.vi v0, v8, 0 96; CHECK-NEXT: vmv.v.i v8, 0 97; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 98; CHECK-NEXT: vslidedown.vx v8, v8, a1 99; CHECK-NEXT: vmv.x.s a0, v8 100; CHECK-NEXT: ret 101 %a = load <vscale x 32 x i8>, ptr %x 102 %b = icmp eq <vscale x 32 x i8> %a, zeroinitializer 103 %c = extractelement <vscale x 32 x i1> %b, i64 %idx 104 ret i1 %c 105} 106 107define i1 @extractelt_nxv64i1(ptr %x, i64 %idx) nounwind { 108; CHECK-LABEL: extractelt_nxv64i1: 109; CHECK: # %bb.0: 110; CHECK-NEXT: vl8r.v v8, (a0) 111; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 112; CHECK-NEXT: vmseq.vi v0, v8, 0 113; CHECK-NEXT: vmv.v.i v8, 0 114; CHECK-NEXT: vmerge.vim v8, v8, 1, v0 115; CHECK-NEXT: vslidedown.vx v8, v8, a1 116; CHECK-NEXT: vmv.x.s a0, v8 117; CHECK-NEXT: ret 118 %a = load <vscale x 64 x i8>, ptr %x 119 %b = icmp eq <vscale x 64 x i8> %a, zeroinitializer 120 %c = extractelement <vscale x 64 x i1> %b, i64 %idx 121 ret i1 %c 122} 123 124define i1 @extractelt_nxv128i1(ptr %x, i64 %idx) nounwind { 125; RV32-LABEL: extractelt_nxv128i1: 126; RV32: # %bb.0: 127; RV32-NEXT: csrr a2, vlenb 128; RV32-NEXT: slli a3, a2, 4 129; RV32-NEXT: addi a3, a3, -1 130; RV32-NEXT: bltu a1, a3, .LBB7_2 131; RV32-NEXT: # %bb.1: 132; RV32-NEXT: mv a1, a3 133; RV32-NEXT: .LBB7_2: 134; RV32-NEXT: addi sp, sp, -80 135; RV32-NEXT: sw ra, 76(sp) # 4-byte Folded Spill 136; RV32-NEXT: sw s0, 72(sp) # 4-byte Folded Spill 137; RV32-NEXT: addi s0, sp, 80 138; RV32-NEXT: csrr a3, vlenb 139; RV32-NEXT: slli a3, a3, 4 140; RV32-NEXT: sub sp, sp, a3 141; RV32-NEXT: andi sp, sp, -64 142; RV32-NEXT: addi a3, sp, 64 143; RV32-NEXT: vl8r.v v8, (a0) 144; RV32-NEXT: slli a2, a2, 3 145; RV32-NEXT: add a0, a0, a2 146; RV32-NEXT: vl8r.v v24, (a0) 147; RV32-NEXT: vsetvli a0, zero, e8, m8, ta, ma 148; RV32-NEXT: vmseq.vi v0, v8, 0 149; RV32-NEXT: vmv.v.i v16, 0 150; RV32-NEXT: add a1, a3, a1 151; RV32-NEXT: add a2, a3, a2 152; RV32-NEXT: vmseq.vi v8, v24, 0 153; RV32-NEXT: vmerge.vim v24, v16, 1, v0 154; RV32-NEXT: vs8r.v v24, (a3) 155; RV32-NEXT: vmv1r.v v0, v8 156; RV32-NEXT: vmerge.vim v8, v16, 1, v0 157; RV32-NEXT: vs8r.v v8, (a2) 158; RV32-NEXT: lbu a0, 0(a1) 159; RV32-NEXT: addi sp, s0, -80 160; RV32-NEXT: lw ra, 76(sp) # 4-byte Folded Reload 161; RV32-NEXT: lw s0, 72(sp) # 4-byte Folded Reload 162; RV32-NEXT: addi sp, sp, 80 163; RV32-NEXT: ret 164; 165; RV64-LABEL: extractelt_nxv128i1: 166; RV64: # %bb.0: 167; RV64-NEXT: csrr a2, vlenb 168; RV64-NEXT: slli a3, a2, 4 169; RV64-NEXT: addi a3, a3, -1 170; RV64-NEXT: bltu a1, a3, .LBB7_2 171; RV64-NEXT: # %bb.1: 172; RV64-NEXT: mv a1, a3 173; RV64-NEXT: .LBB7_2: 174; RV64-NEXT: addi sp, sp, -80 175; RV64-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 176; RV64-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 177; RV64-NEXT: addi s0, sp, 80 178; RV64-NEXT: csrr a3, vlenb 179; RV64-NEXT: slli a3, a3, 4 180; RV64-NEXT: sub sp, sp, a3 181; RV64-NEXT: andi sp, sp, -64 182; RV64-NEXT: addi a3, sp, 64 183; RV64-NEXT: vl8r.v v8, (a0) 184; RV64-NEXT: slli a2, a2, 3 185; RV64-NEXT: add a0, a0, a2 186; RV64-NEXT: vl8r.v v24, (a0) 187; RV64-NEXT: vsetvli a0, zero, e8, m8, ta, ma 188; RV64-NEXT: vmseq.vi v0, v8, 0 189; RV64-NEXT: vmv.v.i v16, 0 190; RV64-NEXT: add a1, a3, a1 191; RV64-NEXT: add a2, a3, a2 192; RV64-NEXT: vmseq.vi v8, v24, 0 193; RV64-NEXT: vmerge.vim v24, v16, 1, v0 194; RV64-NEXT: vs8r.v v24, (a3) 195; RV64-NEXT: vmv1r.v v0, v8 196; RV64-NEXT: vmerge.vim v8, v16, 1, v0 197; RV64-NEXT: vs8r.v v8, (a2) 198; RV64-NEXT: lbu a0, 0(a1) 199; RV64-NEXT: addi sp, s0, -80 200; RV64-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 201; RV64-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 202; RV64-NEXT: addi sp, sp, 80 203; RV64-NEXT: ret 204 %a = load <vscale x 128 x i8>, ptr %x 205 %b = icmp eq <vscale x 128 x i8> %a, zeroinitializer 206 %c = extractelement <vscale x 128 x i1> %b, i64 %idx 207 ret i1 %c 208} 209 210define i1 @extractelt_nxv1i1_idx0(ptr %x) nounwind { 211; CHECK-LABEL: extractelt_nxv1i1_idx0: 212; CHECK: # %bb.0: 213; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 214; CHECK-NEXT: vle8.v v8, (a0) 215; CHECK-NEXT: vmseq.vi v8, v8, 0 216; CHECK-NEXT: vfirst.m a0, v8 217; CHECK-NEXT: seqz a0, a0 218; CHECK-NEXT: ret 219 %a = load <vscale x 1 x i8>, ptr %x 220 %b = icmp eq <vscale x 1 x i8> %a, zeroinitializer 221 %c = extractelement <vscale x 1 x i1> %b, i64 0 222 ret i1 %c 223} 224 225define i1 @extractelt_nxv2i1_idx0(ptr %x) nounwind { 226; CHECK-LABEL: extractelt_nxv2i1_idx0: 227; CHECK: # %bb.0: 228; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 229; CHECK-NEXT: vle8.v v8, (a0) 230; CHECK-NEXT: vmseq.vi v8, v8, 0 231; CHECK-NEXT: vfirst.m a0, v8 232; CHECK-NEXT: seqz a0, a0 233; CHECK-NEXT: ret 234 %a = load <vscale x 2 x i8>, ptr %x 235 %b = icmp eq <vscale x 2 x i8> %a, zeroinitializer 236 %c = extractelement <vscale x 2 x i1> %b, i64 0 237 ret i1 %c 238} 239 240define i1 @extractelt_nxv4i1_idx0(ptr %x) nounwind { 241; CHECK-LABEL: extractelt_nxv4i1_idx0: 242; CHECK: # %bb.0: 243; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 244; CHECK-NEXT: vle8.v v8, (a0) 245; CHECK-NEXT: vmseq.vi v8, v8, 0 246; CHECK-NEXT: vfirst.m a0, v8 247; CHECK-NEXT: seqz a0, a0 248; CHECK-NEXT: ret 249 %a = load <vscale x 4 x i8>, ptr %x 250 %b = icmp eq <vscale x 4 x i8> %a, zeroinitializer 251 %c = extractelement <vscale x 4 x i1> %b, i64 0 252 ret i1 %c 253} 254 255define i1 @extractelt_nxv8i1_idx0(ptr %x) nounwind { 256; CHECK-LABEL: extractelt_nxv8i1_idx0: 257; CHECK: # %bb.0: 258; CHECK-NEXT: vl1r.v v8, (a0) 259; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 260; CHECK-NEXT: vmseq.vi v8, v8, 0 261; CHECK-NEXT: vfirst.m a0, v8 262; CHECK-NEXT: seqz a0, a0 263; CHECK-NEXT: ret 264 %a = load <vscale x 8 x i8>, ptr %x 265 %b = icmp eq <vscale x 8 x i8> %a, zeroinitializer 266 %c = extractelement <vscale x 8 x i1> %b, i64 0 267 ret i1 %c 268} 269 270define i1 @extractelt_nxv16i1_idx0(ptr %x) nounwind { 271; CHECK-LABEL: extractelt_nxv16i1_idx0: 272; CHECK: # %bb.0: 273; CHECK-NEXT: vl2r.v v8, (a0) 274; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 275; CHECK-NEXT: vmseq.vi v10, v8, 0 276; CHECK-NEXT: vfirst.m a0, v10 277; CHECK-NEXT: seqz a0, a0 278; CHECK-NEXT: ret 279 %a = load <vscale x 16 x i8>, ptr %x 280 %b = icmp eq <vscale x 16 x i8> %a, zeroinitializer 281 %c = extractelement <vscale x 16 x i1> %b, i64 0 282 ret i1 %c 283} 284 285define i1 @extractelt_nxv32i1_idx0(ptr %x) nounwind { 286; CHECK-LABEL: extractelt_nxv32i1_idx0: 287; CHECK: # %bb.0: 288; CHECK-NEXT: vl4r.v v8, (a0) 289; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 290; CHECK-NEXT: vmseq.vi v12, v8, 0 291; CHECK-NEXT: vfirst.m a0, v12 292; CHECK-NEXT: seqz a0, a0 293; CHECK-NEXT: ret 294 %a = load <vscale x 32 x i8>, ptr %x 295 %b = icmp eq <vscale x 32 x i8> %a, zeroinitializer 296 %c = extractelement <vscale x 32 x i1> %b, i64 0 297 ret i1 %c 298} 299 300define i1 @extractelt_nxv64i1_idx0(ptr %x) nounwind { 301; CHECK-LABEL: extractelt_nxv64i1_idx0: 302; CHECK: # %bb.0: 303; CHECK-NEXT: vl8r.v v8, (a0) 304; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 305; CHECK-NEXT: vmseq.vi v16, v8, 0 306; CHECK-NEXT: vfirst.m a0, v16 307; CHECK-NEXT: seqz a0, a0 308; CHECK-NEXT: ret 309 %a = load <vscale x 64 x i8>, ptr %x 310 %b = icmp eq <vscale x 64 x i8> %a, zeroinitializer 311 %c = extractelement <vscale x 64 x i1> %b, i64 0 312 ret i1 %c 313} 314