1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV32 3; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV64 4 5define <vscale x 16 x i1> @match_nxv16i8_v1i8(<vscale x 16 x i8> %op1, <1 x i8> %op2, <vscale x 16 x i1> %mask) { 6; CHECK-LABEL: match_nxv16i8_v1i8: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 9; CHECK-NEXT: vrgather.vi v12, v10, 0 10; CHECK-NEXT: vmseq.vv v10, v8, v12 11; CHECK-NEXT: vmand.mm v0, v10, v0 12; CHECK-NEXT: ret 13 %r = tail call <vscale x 16 x i1> @llvm.experimental.vector.match(<vscale x 16 x i8> %op1, <1 x i8> %op2, <vscale x 16 x i1> %mask) 14 ret <vscale x 16 x i1> %r 15} 16 17define <vscale x 16 x i1> @match_nxv16i8_v2i8(<vscale x 16 x i8> %op1, <2 x i8> %op2, <vscale x 16 x i1> %mask) { 18; CHECK-LABEL: match_nxv16i8_v2i8: 19; CHECK: # %bb.0: 20; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 21; CHECK-NEXT: vrgather.vi v12, v10, 1 22; CHECK-NEXT: vmseq.vv v14, v8, v12 23; CHECK-NEXT: vrgather.vi v12, v10, 0 24; CHECK-NEXT: vmseq.vv v10, v8, v12 25; CHECK-NEXT: vmor.mm v8, v10, v14 26; CHECK-NEXT: vmand.mm v0, v8, v0 27; CHECK-NEXT: ret 28 %r = tail call <vscale x 16 x i1> @llvm.experimental.vector.match(<vscale x 16 x i8> %op1, <2 x i8> %op2, <vscale x 16 x i1> %mask) 29 ret <vscale x 16 x i1> %r 30} 31 32define <vscale x 16 x i1> @match_nxv16i8_v4i8(<vscale x 16 x i8> %op1, <4 x i8> %op2, <vscale x 16 x i1> %mask) { 33; CHECK-LABEL: match_nxv16i8_v4i8: 34; CHECK: # %bb.0: 35; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 36; CHECK-NEXT: vrgather.vi v12, v10, 1 37; CHECK-NEXT: vmseq.vv v14, v8, v12 38; CHECK-NEXT: vrgather.vi v12, v10, 0 39; CHECK-NEXT: vmseq.vv v15, v8, v12 40; CHECK-NEXT: vmor.mm v12, v15, v14 41; CHECK-NEXT: vrgather.vi v14, v10, 2 42; CHECK-NEXT: vmseq.vv v13, v8, v14 43; CHECK-NEXT: vrgather.vi v14, v10, 3 44; CHECK-NEXT: vmor.mm v10, v12, v13 45; CHECK-NEXT: vmseq.vv v11, v8, v14 46; CHECK-NEXT: vmor.mm v8, v10, v11 47; CHECK-NEXT: vmand.mm v0, v8, v0 48; CHECK-NEXT: ret 49 %r = tail call <vscale x 16 x i1> @llvm.experimental.vector.match(<vscale x 16 x i8> %op1, <4 x i8> %op2, <vscale x 16 x i1> %mask) 50 ret <vscale x 16 x i1> %r 51} 52 53define <vscale x 16 x i1> @match_nxv16i8_v8i8(<vscale x 16 x i8> %op1, <8 x i8> %op2, <vscale x 16 x i1> %mask) { 54; CHECK-LABEL: match_nxv16i8_v8i8: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 57; CHECK-NEXT: vrgather.vi v12, v10, 1 58; CHECK-NEXT: vmseq.vv v14, v8, v12 59; CHECK-NEXT: vrgather.vi v12, v10, 0 60; CHECK-NEXT: vmseq.vv v15, v8, v12 61; CHECK-NEXT: vmor.mm v12, v15, v14 62; CHECK-NEXT: vrgather.vi v14, v10, 2 63; CHECK-NEXT: vmseq.vv v13, v8, v14 64; CHECK-NEXT: vmor.mm v12, v12, v13 65; CHECK-NEXT: vrgather.vi v14, v10, 3 66; CHECK-NEXT: vmseq.vv v13, v8, v14 67; CHECK-NEXT: vmor.mm v12, v12, v13 68; CHECK-NEXT: vrgather.vi v14, v10, 4 69; CHECK-NEXT: vmseq.vv v13, v8, v14 70; CHECK-NEXT: vmor.mm v12, v12, v13 71; CHECK-NEXT: vrgather.vi v14, v10, 5 72; CHECK-NEXT: vmseq.vv v13, v8, v14 73; CHECK-NEXT: vmor.mm v12, v12, v13 74; CHECK-NEXT: vrgather.vi v14, v10, 6 75; CHECK-NEXT: vmseq.vv v13, v8, v14 76; CHECK-NEXT: vrgather.vi v14, v10, 7 77; CHECK-NEXT: vmor.mm v10, v12, v13 78; CHECK-NEXT: vmseq.vv v11, v8, v14 79; CHECK-NEXT: vmor.mm v8, v10, v11 80; CHECK-NEXT: vmand.mm v0, v8, v0 81; CHECK-NEXT: ret 82 %r = tail call <vscale x 16 x i1> @llvm.experimental.vector.match(<vscale x 16 x i8> %op1, <8 x i8> %op2, <vscale x 16 x i1> %mask) 83 ret <vscale x 16 x i1> %r 84} 85 86define <vscale x 16 x i1> @match_nxv16i8_v16i8(<vscale x 16 x i8> %op1, <16 x i8> %op2, <vscale x 16 x i1> %mask) { 87; CHECK-LABEL: match_nxv16i8_v16i8: 88; CHECK: # %bb.0: 89; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 90; CHECK-NEXT: vrgather.vi v12, v10, 1 91; CHECK-NEXT: vmseq.vv v14, v8, v12 92; CHECK-NEXT: vrgather.vi v12, v10, 0 93; CHECK-NEXT: vmseq.vv v15, v8, v12 94; CHECK-NEXT: vmor.mm v12, v15, v14 95; CHECK-NEXT: vrgather.vi v14, v10, 2 96; CHECK-NEXT: vmseq.vv v13, v8, v14 97; CHECK-NEXT: vmor.mm v12, v12, v13 98; CHECK-NEXT: vrgather.vi v14, v10, 3 99; CHECK-NEXT: vmseq.vv v13, v8, v14 100; CHECK-NEXT: vmor.mm v12, v12, v13 101; CHECK-NEXT: vrgather.vi v14, v10, 4 102; CHECK-NEXT: vmseq.vv v13, v8, v14 103; CHECK-NEXT: vmor.mm v12, v12, v13 104; CHECK-NEXT: vrgather.vi v14, v10, 5 105; CHECK-NEXT: vmseq.vv v13, v8, v14 106; CHECK-NEXT: vmor.mm v12, v12, v13 107; CHECK-NEXT: vrgather.vi v14, v10, 6 108; CHECK-NEXT: vmseq.vv v13, v8, v14 109; CHECK-NEXT: vmor.mm v12, v12, v13 110; CHECK-NEXT: vrgather.vi v14, v10, 7 111; CHECK-NEXT: vmseq.vv v13, v8, v14 112; CHECK-NEXT: vmor.mm v12, v12, v13 113; CHECK-NEXT: vrgather.vi v14, v10, 8 114; CHECK-NEXT: vmseq.vv v13, v8, v14 115; CHECK-NEXT: vmor.mm v12, v12, v13 116; CHECK-NEXT: vrgather.vi v14, v10, 9 117; CHECK-NEXT: vmseq.vv v13, v8, v14 118; CHECK-NEXT: vmor.mm v12, v12, v13 119; CHECK-NEXT: vrgather.vi v14, v10, 10 120; CHECK-NEXT: vmseq.vv v13, v8, v14 121; CHECK-NEXT: vmor.mm v12, v12, v13 122; CHECK-NEXT: vrgather.vi v14, v10, 11 123; CHECK-NEXT: vmseq.vv v13, v8, v14 124; CHECK-NEXT: vmor.mm v12, v12, v13 125; CHECK-NEXT: vrgather.vi v14, v10, 12 126; CHECK-NEXT: vmseq.vv v13, v8, v14 127; CHECK-NEXT: vmor.mm v12, v12, v13 128; CHECK-NEXT: vrgather.vi v14, v10, 13 129; CHECK-NEXT: vmseq.vv v13, v8, v14 130; CHECK-NEXT: vmor.mm v12, v12, v13 131; CHECK-NEXT: vrgather.vi v14, v10, 14 132; CHECK-NEXT: vmseq.vv v13, v8, v14 133; CHECK-NEXT: vrgather.vi v14, v10, 15 134; CHECK-NEXT: vmor.mm v10, v12, v13 135; CHECK-NEXT: vmseq.vv v11, v8, v14 136; CHECK-NEXT: vmor.mm v8, v10, v11 137; CHECK-NEXT: vmand.mm v0, v8, v0 138; CHECK-NEXT: ret 139 %r = tail call <vscale x 16 x i1> @llvm.experimental.vector.match(<vscale x 16 x i8> %op1, <16 x i8> %op2, <vscale x 16 x i1> %mask) 140 ret <vscale x 16 x i1> %r 141} 142 143define <16 x i1> @match_v16i8_v1i8(<16 x i8> %op1, <1 x i8> %op2, <16 x i1> %mask) { 144; CHECK-LABEL: match_v16i8_v1i8: 145; CHECK: # %bb.0: 146; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 147; CHECK-NEXT: vrgather.vi v10, v9, 0 148; CHECK-NEXT: vmseq.vv v8, v8, v10 149; CHECK-NEXT: vmand.mm v0, v8, v0 150; CHECK-NEXT: ret 151 %r = tail call <16 x i1> @llvm.experimental.vector.match(<16 x i8> %op1, <1 x i8> %op2, <16 x i1> %mask) 152 ret <16 x i1> %r 153} 154 155define <16 x i1> @match_v16i8_v2i8(<16 x i8> %op1, <2 x i8> %op2, <16 x i1> %mask) { 156; CHECK-LABEL: match_v16i8_v2i8: 157; CHECK: # %bb.0: 158; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 159; CHECK-NEXT: vrgather.vi v10, v9, 1 160; CHECK-NEXT: vrgather.vi v11, v9, 0 161; CHECK-NEXT: vmseq.vv v9, v8, v10 162; CHECK-NEXT: vmseq.vv v8, v8, v11 163; CHECK-NEXT: vmor.mm v8, v8, v9 164; CHECK-NEXT: vmand.mm v0, v8, v0 165; CHECK-NEXT: ret 166 %r = tail call <16 x i1> @llvm.experimental.vector.match(<16 x i8> %op1, <2 x i8> %op2, <16 x i1> %mask) 167 ret <16 x i1> %r 168} 169 170define <16 x i1> @match_v16i8_v4i8(<16 x i8> %op1, <4 x i8> %op2, <16 x i1> %mask) { 171; CHECK-LABEL: match_v16i8_v4i8: 172; CHECK: # %bb.0: 173; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 174; CHECK-NEXT: vrgather.vi v10, v9, 1 175; CHECK-NEXT: vrgather.vi v11, v9, 0 176; CHECK-NEXT: vmseq.vv v10, v8, v10 177; CHECK-NEXT: vmseq.vv v11, v8, v11 178; CHECK-NEXT: vmor.mm v10, v11, v10 179; CHECK-NEXT: vrgather.vi v11, v9, 2 180; CHECK-NEXT: vrgather.vi v12, v9, 3 181; CHECK-NEXT: vmseq.vv v9, v8, v11 182; CHECK-NEXT: vmor.mm v9, v10, v9 183; CHECK-NEXT: vmseq.vv v8, v8, v12 184; CHECK-NEXT: vmor.mm v8, v9, v8 185; CHECK-NEXT: vmand.mm v0, v8, v0 186; CHECK-NEXT: ret 187 %r = tail call <16 x i1> @llvm.experimental.vector.match(<16 x i8> %op1, <4 x i8> %op2, <16 x i1> %mask) 188 ret <16 x i1> %r 189} 190 191define <16 x i1> @match_v16i8_v8i8(<16 x i8> %op1, <8 x i8> %op2, <16 x i1> %mask) { 192; CHECK-LABEL: match_v16i8_v8i8: 193; CHECK: # %bb.0: 194; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 195; CHECK-NEXT: vrgather.vi v10, v9, 1 196; CHECK-NEXT: vrgather.vi v11, v9, 0 197; CHECK-NEXT: vmseq.vv v10, v8, v10 198; CHECK-NEXT: vmseq.vv v11, v8, v11 199; CHECK-NEXT: vmor.mm v10, v11, v10 200; CHECK-NEXT: vrgather.vi v11, v9, 2 201; CHECK-NEXT: vmseq.vv v11, v8, v11 202; CHECK-NEXT: vmor.mm v10, v10, v11 203; CHECK-NEXT: vrgather.vi v11, v9, 3 204; CHECK-NEXT: vmseq.vv v11, v8, v11 205; CHECK-NEXT: vmor.mm v10, v10, v11 206; CHECK-NEXT: vrgather.vi v11, v9, 4 207; CHECK-NEXT: vmseq.vv v11, v8, v11 208; CHECK-NEXT: vmor.mm v10, v10, v11 209; CHECK-NEXT: vrgather.vi v11, v9, 5 210; CHECK-NEXT: vmseq.vv v11, v8, v11 211; CHECK-NEXT: vmor.mm v10, v10, v11 212; CHECK-NEXT: vrgather.vi v11, v9, 6 213; CHECK-NEXT: vrgather.vi v12, v9, 7 214; CHECK-NEXT: vmseq.vv v9, v8, v11 215; CHECK-NEXT: vmor.mm v9, v10, v9 216; CHECK-NEXT: vmseq.vv v8, v8, v12 217; CHECK-NEXT: vmor.mm v8, v9, v8 218; CHECK-NEXT: vmand.mm v0, v8, v0 219; CHECK-NEXT: ret 220 %r = tail call <16 x i1> @llvm.experimental.vector.match(<16 x i8> %op1, <8 x i8> %op2, <16 x i1> %mask) 221 ret <16 x i1> %r 222} 223 224define <16 x i1> @match_v16i8_v16i8(<16 x i8> %op1, <16 x i8> %op2, <16 x i1> %mask) { 225; CHECK-LABEL: match_v16i8_v16i8: 226; CHECK: # %bb.0: 227; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 228; CHECK-NEXT: vrgather.vi v10, v9, 1 229; CHECK-NEXT: vrgather.vi v11, v9, 0 230; CHECK-NEXT: vmseq.vv v10, v8, v10 231; CHECK-NEXT: vmseq.vv v11, v8, v11 232; CHECK-NEXT: vmor.mm v10, v11, v10 233; CHECK-NEXT: vrgather.vi v11, v9, 2 234; CHECK-NEXT: vmseq.vv v11, v8, v11 235; CHECK-NEXT: vmor.mm v10, v10, v11 236; CHECK-NEXT: vrgather.vi v11, v9, 3 237; CHECK-NEXT: vmseq.vv v11, v8, v11 238; CHECK-NEXT: vmor.mm v10, v10, v11 239; CHECK-NEXT: vrgather.vi v11, v9, 4 240; CHECK-NEXT: vmseq.vv v11, v8, v11 241; CHECK-NEXT: vmor.mm v10, v10, v11 242; CHECK-NEXT: vrgather.vi v11, v9, 5 243; CHECK-NEXT: vmseq.vv v11, v8, v11 244; CHECK-NEXT: vmor.mm v10, v10, v11 245; CHECK-NEXT: vrgather.vi v11, v9, 6 246; CHECK-NEXT: vmseq.vv v11, v8, v11 247; CHECK-NEXT: vmor.mm v10, v10, v11 248; CHECK-NEXT: vrgather.vi v11, v9, 7 249; CHECK-NEXT: vmseq.vv v11, v8, v11 250; CHECK-NEXT: vmor.mm v10, v10, v11 251; CHECK-NEXT: vrgather.vi v11, v9, 8 252; CHECK-NEXT: vmseq.vv v11, v8, v11 253; CHECK-NEXT: vmor.mm v10, v10, v11 254; CHECK-NEXT: vrgather.vi v11, v9, 9 255; CHECK-NEXT: vmseq.vv v11, v8, v11 256; CHECK-NEXT: vmor.mm v10, v10, v11 257; CHECK-NEXT: vrgather.vi v11, v9, 10 258; CHECK-NEXT: vmseq.vv v11, v8, v11 259; CHECK-NEXT: vmor.mm v10, v10, v11 260; CHECK-NEXT: vrgather.vi v11, v9, 11 261; CHECK-NEXT: vmseq.vv v11, v8, v11 262; CHECK-NEXT: vmor.mm v10, v10, v11 263; CHECK-NEXT: vrgather.vi v11, v9, 12 264; CHECK-NEXT: vmseq.vv v11, v8, v11 265; CHECK-NEXT: vmor.mm v10, v10, v11 266; CHECK-NEXT: vrgather.vi v11, v9, 13 267; CHECK-NEXT: vmseq.vv v11, v8, v11 268; CHECK-NEXT: vmor.mm v10, v10, v11 269; CHECK-NEXT: vrgather.vi v11, v9, 14 270; CHECK-NEXT: vrgather.vi v12, v9, 15 271; CHECK-NEXT: vmseq.vv v9, v8, v11 272; CHECK-NEXT: vmor.mm v9, v10, v9 273; CHECK-NEXT: vmseq.vv v8, v8, v12 274; CHECK-NEXT: vmor.mm v8, v9, v8 275; CHECK-NEXT: vmand.mm v0, v8, v0 276; CHECK-NEXT: ret 277 %r = tail call <16 x i1> @llvm.experimental.vector.match(<16 x i8> %op1, <16 x i8> %op2, <16 x i1> %mask) 278 ret <16 x i1> %r 279} 280 281define <8 x i1> @match_v8i8_v8i8(<8 x i8> %op1, <8 x i8> %op2, <8 x i1> %mask) { 282; CHECK-LABEL: match_v8i8_v8i8: 283; CHECK: # %bb.0: 284; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 285; CHECK-NEXT: vrgather.vi v10, v9, 1 286; CHECK-NEXT: vrgather.vi v11, v9, 0 287; CHECK-NEXT: vmseq.vv v10, v8, v10 288; CHECK-NEXT: vmseq.vv v11, v8, v11 289; CHECK-NEXT: vmor.mm v10, v11, v10 290; CHECK-NEXT: vrgather.vi v11, v9, 2 291; CHECK-NEXT: vmseq.vv v11, v8, v11 292; CHECK-NEXT: vmor.mm v10, v10, v11 293; CHECK-NEXT: vrgather.vi v11, v9, 3 294; CHECK-NEXT: vmseq.vv v11, v8, v11 295; CHECK-NEXT: vmor.mm v10, v10, v11 296; CHECK-NEXT: vrgather.vi v11, v9, 4 297; CHECK-NEXT: vmseq.vv v11, v8, v11 298; CHECK-NEXT: vmor.mm v10, v10, v11 299; CHECK-NEXT: vrgather.vi v11, v9, 5 300; CHECK-NEXT: vmseq.vv v11, v8, v11 301; CHECK-NEXT: vmor.mm v10, v10, v11 302; CHECK-NEXT: vrgather.vi v11, v9, 6 303; CHECK-NEXT: vrgather.vi v12, v9, 7 304; CHECK-NEXT: vmseq.vv v9, v8, v11 305; CHECK-NEXT: vmor.mm v9, v10, v9 306; CHECK-NEXT: vmseq.vv v8, v8, v12 307; CHECK-NEXT: vmor.mm v8, v9, v8 308; CHECK-NEXT: vmand.mm v0, v8, v0 309; CHECK-NEXT: ret 310 %r = tail call <8 x i1> @llvm.experimental.vector.match(<8 x i8> %op1, <8 x i8> %op2, <8 x i1> %mask) 311 ret <8 x i1> %r 312} 313 314define <vscale x 8 x i1> @match_nxv8i16_v8i16(<vscale x 8 x i16> %op1, <8 x i16> %op2, <vscale x 8 x i1> %mask) { 315; CHECK-LABEL: match_nxv8i16_v8i16: 316; CHECK: # %bb.0: 317; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 318; CHECK-NEXT: vrgather.vi v12, v10, 1 319; CHECK-NEXT: vmseq.vv v14, v8, v12 320; CHECK-NEXT: vrgather.vi v12, v10, 0 321; CHECK-NEXT: vmseq.vv v15, v8, v12 322; CHECK-NEXT: vmor.mm v12, v15, v14 323; CHECK-NEXT: vrgather.vi v14, v10, 2 324; CHECK-NEXT: vmseq.vv v13, v8, v14 325; CHECK-NEXT: vmor.mm v12, v12, v13 326; CHECK-NEXT: vrgather.vi v14, v10, 3 327; CHECK-NEXT: vmseq.vv v13, v8, v14 328; CHECK-NEXT: vmor.mm v12, v12, v13 329; CHECK-NEXT: vrgather.vi v14, v10, 4 330; CHECK-NEXT: vmseq.vv v13, v8, v14 331; CHECK-NEXT: vmor.mm v12, v12, v13 332; CHECK-NEXT: vrgather.vi v14, v10, 5 333; CHECK-NEXT: vmseq.vv v13, v8, v14 334; CHECK-NEXT: vmor.mm v12, v12, v13 335; CHECK-NEXT: vrgather.vi v14, v10, 6 336; CHECK-NEXT: vmseq.vv v13, v8, v14 337; CHECK-NEXT: vrgather.vi v14, v10, 7 338; CHECK-NEXT: vmor.mm v10, v12, v13 339; CHECK-NEXT: vmseq.vv v11, v8, v14 340; CHECK-NEXT: vmor.mm v8, v10, v11 341; CHECK-NEXT: vmand.mm v0, v8, v0 342; CHECK-NEXT: ret 343 %r = tail call <vscale x 8 x i1> @llvm.experimental.vector.match(<vscale x 8 x i16> %op1, <8 x i16> %op2, <vscale x 8 x i1> %mask) 344 ret <vscale x 8 x i1> %r 345} 346 347define <8 x i1> @match_v8i16(<8 x i16> %op1, <8 x i16> %op2, <8 x i1> %mask) { 348; CHECK-LABEL: match_v8i16: 349; CHECK: # %bb.0: 350; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 351; CHECK-NEXT: vrgather.vi v10, v9, 1 352; CHECK-NEXT: vrgather.vi v11, v9, 0 353; CHECK-NEXT: vmseq.vv v10, v8, v10 354; CHECK-NEXT: vmseq.vv v11, v8, v11 355; CHECK-NEXT: vmor.mm v10, v11, v10 356; CHECK-NEXT: vrgather.vi v11, v9, 2 357; CHECK-NEXT: vmseq.vv v11, v8, v11 358; CHECK-NEXT: vmor.mm v10, v10, v11 359; CHECK-NEXT: vrgather.vi v11, v9, 3 360; CHECK-NEXT: vmseq.vv v11, v8, v11 361; CHECK-NEXT: vmor.mm v10, v10, v11 362; CHECK-NEXT: vrgather.vi v11, v9, 4 363; CHECK-NEXT: vmseq.vv v11, v8, v11 364; CHECK-NEXT: vmor.mm v10, v10, v11 365; CHECK-NEXT: vrgather.vi v11, v9, 5 366; CHECK-NEXT: vmseq.vv v11, v8, v11 367; CHECK-NEXT: vmor.mm v10, v10, v11 368; CHECK-NEXT: vrgather.vi v11, v9, 6 369; CHECK-NEXT: vrgather.vi v12, v9, 7 370; CHECK-NEXT: vmseq.vv v9, v8, v11 371; CHECK-NEXT: vmor.mm v9, v10, v9 372; CHECK-NEXT: vmseq.vv v8, v8, v12 373; CHECK-NEXT: vmor.mm v8, v9, v8 374; CHECK-NEXT: vmand.mm v0, v8, v0 375; CHECK-NEXT: ret 376 %r = tail call <8 x i1> @llvm.experimental.vector.match(<8 x i16> %op1, <8 x i16> %op2, <8 x i1> %mask) 377 ret <8 x i1> %r 378} 379 380; Cases where op2 has more elements than op1. 381 382define <8 x i1> @match_v8i8_v16i8(<8 x i8> %op1, <16 x i8> %op2, <8 x i1> %mask) { 383; CHECK-LABEL: match_v8i8_v16i8: 384; CHECK: # %bb.0: 385; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 386; CHECK-NEXT: vrgather.vi v10, v9, 1 387; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 388; CHECK-NEXT: vslidedown.vi v11, v9, 8 389; CHECK-NEXT: vmv.x.s a0, v11 390; CHECK-NEXT: vslidedown.vi v11, v9, 9 391; CHECK-NEXT: vmv.x.s a1, v11 392; CHECK-NEXT: vslidedown.vi v11, v9, 10 393; CHECK-NEXT: vmv.x.s a2, v11 394; CHECK-NEXT: vslidedown.vi v11, v9, 11 395; CHECK-NEXT: vmv.x.s a3, v11 396; CHECK-NEXT: vslidedown.vi v11, v9, 12 397; CHECK-NEXT: vmv.x.s a4, v11 398; CHECK-NEXT: vslidedown.vi v11, v9, 13 399; CHECK-NEXT: vmv.x.s a5, v11 400; CHECK-NEXT: vslidedown.vi v11, v9, 14 401; CHECK-NEXT: vmv.x.s a6, v11 402; CHECK-NEXT: vslidedown.vi v11, v9, 15 403; CHECK-NEXT: vmv.x.s a7, v11 404; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 405; CHECK-NEXT: vrgather.vi v11, v9, 0 406; CHECK-NEXT: vmseq.vv v10, v8, v10 407; CHECK-NEXT: vmseq.vv v11, v8, v11 408; CHECK-NEXT: vmor.mm v10, v11, v10 409; CHECK-NEXT: vrgather.vi v11, v9, 2 410; CHECK-NEXT: vmseq.vv v11, v8, v11 411; CHECK-NEXT: vmor.mm v10, v10, v11 412; CHECK-NEXT: vrgather.vi v11, v9, 3 413; CHECK-NEXT: vmseq.vv v11, v8, v11 414; CHECK-NEXT: vmor.mm v10, v10, v11 415; CHECK-NEXT: vrgather.vi v11, v9, 4 416; CHECK-NEXT: vmseq.vv v11, v8, v11 417; CHECK-NEXT: vmor.mm v10, v10, v11 418; CHECK-NEXT: vrgather.vi v11, v9, 5 419; CHECK-NEXT: vmseq.vv v11, v8, v11 420; CHECK-NEXT: vmor.mm v10, v10, v11 421; CHECK-NEXT: vrgather.vi v11, v9, 6 422; CHECK-NEXT: vmseq.vv v11, v8, v11 423; CHECK-NEXT: vmor.mm v10, v10, v11 424; CHECK-NEXT: vmseq.vx v11, v8, a0 425; CHECK-NEXT: vrgather.vi v12, v9, 7 426; CHECK-NEXT: vmseq.vv v9, v8, v12 427; CHECK-NEXT: vmor.mm v9, v10, v9 428; CHECK-NEXT: vmseq.vx v10, v8, a1 429; CHECK-NEXT: vmor.mm v9, v9, v11 430; CHECK-NEXT: vmseq.vx v11, v8, a2 431; CHECK-NEXT: vmor.mm v9, v9, v10 432; CHECK-NEXT: vmseq.vx v10, v8, a3 433; CHECK-NEXT: vmor.mm v9, v9, v11 434; CHECK-NEXT: vmseq.vx v11, v8, a4 435; CHECK-NEXT: vmor.mm v9, v9, v10 436; CHECK-NEXT: vmseq.vx v10, v8, a5 437; CHECK-NEXT: vmor.mm v9, v9, v11 438; CHECK-NEXT: vmseq.vx v11, v8, a6 439; CHECK-NEXT: vmor.mm v9, v9, v10 440; CHECK-NEXT: vmor.mm v9, v9, v11 441; CHECK-NEXT: vmseq.vx v8, v8, a7 442; CHECK-NEXT: vmor.mm v8, v9, v8 443; CHECK-NEXT: vmand.mm v0, v8, v0 444; CHECK-NEXT: ret 445 %r = tail call <8 x i1> @llvm.experimental.vector.match(<8 x i8> %op1, <16 x i8> %op2, <8 x i1> %mask) 446 ret <8 x i1> %r 447} 448 449define <vscale x 16 x i1> @match_nxv16i8_v32i8(<vscale x 16 x i8> %op1, <32 x i8> %op2, <vscale x 16 x i1> %mask) { 450; RV32-LABEL: match_nxv16i8_v32i8: 451; RV32: # %bb.0: 452; RV32-NEXT: addi sp, sp, -16 453; RV32-NEXT: .cfi_def_cfa_offset 16 454; RV32-NEXT: sw s0, 12(sp) # 4-byte Folded Spill 455; RV32-NEXT: .cfi_offset s0, -4 456; RV32-NEXT: vsetvli a0, zero, e8, m2, ta, ma 457; RV32-NEXT: vrgather.vi v14, v10, 1 458; RV32-NEXT: vrgather.vi v16, v10, 0 459; RV32-NEXT: vrgather.vi v18, v10, 2 460; RV32-NEXT: vrgather.vi v20, v10, 3 461; RV32-NEXT: vrgather.vi v22, v10, 4 462; RV32-NEXT: vrgather.vi v24, v10, 5 463; RV32-NEXT: vrgather.vi v26, v10, 6 464; RV32-NEXT: vrgather.vi v28, v10, 7 465; RV32-NEXT: vmseq.vv v12, v8, v14 466; RV32-NEXT: vmseq.vv v13, v8, v16 467; RV32-NEXT: vrgather.vi v30, v10, 8 468; RV32-NEXT: vmseq.vv v14, v8, v18 469; RV32-NEXT: vmseq.vv v15, v8, v20 470; RV32-NEXT: vrgather.vi v6, v10, 9 471; RV32-NEXT: vmseq.vv v16, v8, v22 472; RV32-NEXT: vmseq.vv v17, v8, v24 473; RV32-NEXT: vrgather.vi v24, v10, 10 474; RV32-NEXT: vmseq.vv v18, v8, v26 475; RV32-NEXT: vmseq.vv v19, v8, v28 476; RV32-NEXT: vrgather.vi v26, v10, 11 477; RV32-NEXT: vmseq.vv v20, v8, v30 478; RV32-NEXT: vmseq.vv v21, v8, v6 479; RV32-NEXT: vrgather.vi v28, v10, 12 480; RV32-NEXT: vmseq.vv v22, v8, v24 481; RV32-NEXT: vmseq.vv v23, v8, v26 482; RV32-NEXT: vrgather.vi v26, v10, 13 483; RV32-NEXT: vmseq.vv v25, v8, v28 484; RV32-NEXT: vmseq.vv v24, v8, v26 485; RV32-NEXT: vslidedown.vi v26, v10, 16 486; RV32-NEXT: vmv.x.s a0, v26 487; RV32-NEXT: vslidedown.vi v26, v10, 17 488; RV32-NEXT: vmv.x.s a1, v26 489; RV32-NEXT: vslidedown.vi v26, v10, 18 490; RV32-NEXT: vmv.x.s a2, v26 491; RV32-NEXT: vslidedown.vi v26, v10, 19 492; RV32-NEXT: vmv.x.s a3, v26 493; RV32-NEXT: vslidedown.vi v26, v10, 20 494; RV32-NEXT: vmv.x.s a4, v26 495; RV32-NEXT: vslidedown.vi v26, v10, 21 496; RV32-NEXT: vmv.x.s a5, v26 497; RV32-NEXT: vslidedown.vi v26, v10, 22 498; RV32-NEXT: vmv.x.s a6, v26 499; RV32-NEXT: vslidedown.vi v26, v10, 23 500; RV32-NEXT: vmv.x.s a7, v26 501; RV32-NEXT: vslidedown.vi v26, v10, 24 502; RV32-NEXT: vmv.x.s t0, v26 503; RV32-NEXT: vslidedown.vi v26, v10, 25 504; RV32-NEXT: vmv.x.s t1, v26 505; RV32-NEXT: vslidedown.vi v26, v10, 26 506; RV32-NEXT: vmv.x.s t2, v26 507; RV32-NEXT: vslidedown.vi v26, v10, 27 508; RV32-NEXT: vmv.x.s t3, v26 509; RV32-NEXT: vslidedown.vi v26, v10, 28 510; RV32-NEXT: vmv.x.s t4, v26 511; RV32-NEXT: vslidedown.vi v26, v10, 29 512; RV32-NEXT: vmv.x.s t5, v26 513; RV32-NEXT: vslidedown.vi v26, v10, 30 514; RV32-NEXT: vmv.x.s t6, v26 515; RV32-NEXT: vslidedown.vi v26, v10, 31 516; RV32-NEXT: vmv.x.s s0, v26 517; RV32-NEXT: vrgather.vi v26, v10, 14 518; RV32-NEXT: vmseq.vv v28, v8, v26 519; RV32-NEXT: vrgather.vi v26, v10, 15 520; RV32-NEXT: vmseq.vv v10, v8, v26 521; RV32-NEXT: vmor.mm v11, v13, v12 522; RV32-NEXT: vmor.mm v11, v11, v14 523; RV32-NEXT: vmor.mm v11, v11, v15 524; RV32-NEXT: vmor.mm v11, v11, v16 525; RV32-NEXT: vmor.mm v11, v11, v17 526; RV32-NEXT: vmor.mm v11, v11, v18 527; RV32-NEXT: vmor.mm v11, v11, v19 528; RV32-NEXT: vmor.mm v11, v11, v20 529; RV32-NEXT: vmor.mm v11, v11, v21 530; RV32-NEXT: vmor.mm v11, v11, v22 531; RV32-NEXT: vmor.mm v11, v11, v23 532; RV32-NEXT: vmor.mm v11, v11, v25 533; RV32-NEXT: vmseq.vx v12, v8, a0 534; RV32-NEXT: vmor.mm v11, v11, v24 535; RV32-NEXT: vmseq.vx v13, v8, a1 536; RV32-NEXT: vmor.mm v11, v11, v28 537; RV32-NEXT: vmseq.vx v14, v8, a2 538; RV32-NEXT: vmor.mm v10, v11, v10 539; RV32-NEXT: vmseq.vx v11, v8, a3 540; RV32-NEXT: vmor.mm v10, v10, v12 541; RV32-NEXT: vmseq.vx v12, v8, a4 542; RV32-NEXT: vmor.mm v10, v10, v13 543; RV32-NEXT: vmseq.vx v13, v8, a5 544; RV32-NEXT: vmor.mm v10, v10, v14 545; RV32-NEXT: vmseq.vx v14, v8, a6 546; RV32-NEXT: vmor.mm v10, v10, v11 547; RV32-NEXT: vmseq.vx v11, v8, a7 548; RV32-NEXT: vmor.mm v10, v10, v12 549; RV32-NEXT: vmseq.vx v12, v8, t0 550; RV32-NEXT: vmor.mm v10, v10, v13 551; RV32-NEXT: vmseq.vx v13, v8, t1 552; RV32-NEXT: vmor.mm v10, v10, v14 553; RV32-NEXT: vmseq.vx v14, v8, t2 554; RV32-NEXT: vmor.mm v10, v10, v11 555; RV32-NEXT: vmseq.vx v11, v8, t3 556; RV32-NEXT: vmor.mm v10, v10, v12 557; RV32-NEXT: vmseq.vx v12, v8, t4 558; RV32-NEXT: vmor.mm v10, v10, v13 559; RV32-NEXT: vmseq.vx v13, v8, t5 560; RV32-NEXT: vmor.mm v10, v10, v14 561; RV32-NEXT: vmseq.vx v14, v8, t6 562; RV32-NEXT: vmor.mm v10, v10, v11 563; RV32-NEXT: vmor.mm v10, v10, v12 564; RV32-NEXT: vmor.mm v10, v10, v13 565; RV32-NEXT: vmor.mm v10, v10, v14 566; RV32-NEXT: vmseq.vx v11, v8, s0 567; RV32-NEXT: vmor.mm v8, v10, v11 568; RV32-NEXT: vmand.mm v0, v8, v0 569; RV32-NEXT: lw s0, 12(sp) # 4-byte Folded Reload 570; RV32-NEXT: .cfi_restore s0 571; RV32-NEXT: addi sp, sp, 16 572; RV32-NEXT: .cfi_def_cfa_offset 0 573; RV32-NEXT: ret 574; 575; RV64-LABEL: match_nxv16i8_v32i8: 576; RV64: # %bb.0: 577; RV64-NEXT: addi sp, sp, -16 578; RV64-NEXT: .cfi_def_cfa_offset 16 579; RV64-NEXT: sd s0, 8(sp) # 8-byte Folded Spill 580; RV64-NEXT: .cfi_offset s0, -8 581; RV64-NEXT: vsetvli a0, zero, e8, m2, ta, ma 582; RV64-NEXT: vrgather.vi v14, v10, 1 583; RV64-NEXT: vrgather.vi v16, v10, 0 584; RV64-NEXT: vrgather.vi v18, v10, 2 585; RV64-NEXT: vrgather.vi v20, v10, 3 586; RV64-NEXT: vrgather.vi v22, v10, 4 587; RV64-NEXT: vrgather.vi v24, v10, 5 588; RV64-NEXT: vrgather.vi v26, v10, 6 589; RV64-NEXT: vrgather.vi v28, v10, 7 590; RV64-NEXT: vmseq.vv v12, v8, v14 591; RV64-NEXT: vmseq.vv v13, v8, v16 592; RV64-NEXT: vrgather.vi v30, v10, 8 593; RV64-NEXT: vmseq.vv v14, v8, v18 594; RV64-NEXT: vmseq.vv v15, v8, v20 595; RV64-NEXT: vrgather.vi v6, v10, 9 596; RV64-NEXT: vmseq.vv v16, v8, v22 597; RV64-NEXT: vmseq.vv v17, v8, v24 598; RV64-NEXT: vrgather.vi v24, v10, 10 599; RV64-NEXT: vmseq.vv v18, v8, v26 600; RV64-NEXT: vmseq.vv v19, v8, v28 601; RV64-NEXT: vrgather.vi v26, v10, 11 602; RV64-NEXT: vmseq.vv v20, v8, v30 603; RV64-NEXT: vmseq.vv v21, v8, v6 604; RV64-NEXT: vrgather.vi v28, v10, 12 605; RV64-NEXT: vmseq.vv v22, v8, v24 606; RV64-NEXT: vmseq.vv v23, v8, v26 607; RV64-NEXT: vrgather.vi v26, v10, 13 608; RV64-NEXT: vmseq.vv v25, v8, v28 609; RV64-NEXT: vmseq.vv v24, v8, v26 610; RV64-NEXT: vslidedown.vi v26, v10, 16 611; RV64-NEXT: vmv.x.s a0, v26 612; RV64-NEXT: vslidedown.vi v26, v10, 17 613; RV64-NEXT: vmv.x.s a1, v26 614; RV64-NEXT: vslidedown.vi v26, v10, 18 615; RV64-NEXT: vmv.x.s a2, v26 616; RV64-NEXT: vslidedown.vi v26, v10, 19 617; RV64-NEXT: vmv.x.s a3, v26 618; RV64-NEXT: vslidedown.vi v26, v10, 20 619; RV64-NEXT: vmv.x.s a4, v26 620; RV64-NEXT: vslidedown.vi v26, v10, 21 621; RV64-NEXT: vmv.x.s a5, v26 622; RV64-NEXT: vslidedown.vi v26, v10, 22 623; RV64-NEXT: vmv.x.s a6, v26 624; RV64-NEXT: vslidedown.vi v26, v10, 23 625; RV64-NEXT: vmv.x.s a7, v26 626; RV64-NEXT: vslidedown.vi v26, v10, 24 627; RV64-NEXT: vmv.x.s t0, v26 628; RV64-NEXT: vslidedown.vi v26, v10, 25 629; RV64-NEXT: vmv.x.s t1, v26 630; RV64-NEXT: vslidedown.vi v26, v10, 26 631; RV64-NEXT: vmv.x.s t2, v26 632; RV64-NEXT: vslidedown.vi v26, v10, 27 633; RV64-NEXT: vmv.x.s t3, v26 634; RV64-NEXT: vslidedown.vi v26, v10, 28 635; RV64-NEXT: vmv.x.s t4, v26 636; RV64-NEXT: vslidedown.vi v26, v10, 29 637; RV64-NEXT: vmv.x.s t5, v26 638; RV64-NEXT: vslidedown.vi v26, v10, 30 639; RV64-NEXT: vmv.x.s t6, v26 640; RV64-NEXT: vslidedown.vi v26, v10, 31 641; RV64-NEXT: vmv.x.s s0, v26 642; RV64-NEXT: vrgather.vi v26, v10, 14 643; RV64-NEXT: vmseq.vv v28, v8, v26 644; RV64-NEXT: vrgather.vi v26, v10, 15 645; RV64-NEXT: vmseq.vv v10, v8, v26 646; RV64-NEXT: vmor.mm v11, v13, v12 647; RV64-NEXT: vmor.mm v11, v11, v14 648; RV64-NEXT: vmor.mm v11, v11, v15 649; RV64-NEXT: vmor.mm v11, v11, v16 650; RV64-NEXT: vmor.mm v11, v11, v17 651; RV64-NEXT: vmor.mm v11, v11, v18 652; RV64-NEXT: vmor.mm v11, v11, v19 653; RV64-NEXT: vmor.mm v11, v11, v20 654; RV64-NEXT: vmor.mm v11, v11, v21 655; RV64-NEXT: vmor.mm v11, v11, v22 656; RV64-NEXT: vmor.mm v11, v11, v23 657; RV64-NEXT: vmor.mm v11, v11, v25 658; RV64-NEXT: vmseq.vx v12, v8, a0 659; RV64-NEXT: vmor.mm v11, v11, v24 660; RV64-NEXT: vmseq.vx v13, v8, a1 661; RV64-NEXT: vmor.mm v11, v11, v28 662; RV64-NEXT: vmseq.vx v14, v8, a2 663; RV64-NEXT: vmor.mm v10, v11, v10 664; RV64-NEXT: vmseq.vx v11, v8, a3 665; RV64-NEXT: vmor.mm v10, v10, v12 666; RV64-NEXT: vmseq.vx v12, v8, a4 667; RV64-NEXT: vmor.mm v10, v10, v13 668; RV64-NEXT: vmseq.vx v13, v8, a5 669; RV64-NEXT: vmor.mm v10, v10, v14 670; RV64-NEXT: vmseq.vx v14, v8, a6 671; RV64-NEXT: vmor.mm v10, v10, v11 672; RV64-NEXT: vmseq.vx v11, v8, a7 673; RV64-NEXT: vmor.mm v10, v10, v12 674; RV64-NEXT: vmseq.vx v12, v8, t0 675; RV64-NEXT: vmor.mm v10, v10, v13 676; RV64-NEXT: vmseq.vx v13, v8, t1 677; RV64-NEXT: vmor.mm v10, v10, v14 678; RV64-NEXT: vmseq.vx v14, v8, t2 679; RV64-NEXT: vmor.mm v10, v10, v11 680; RV64-NEXT: vmseq.vx v11, v8, t3 681; RV64-NEXT: vmor.mm v10, v10, v12 682; RV64-NEXT: vmseq.vx v12, v8, t4 683; RV64-NEXT: vmor.mm v10, v10, v13 684; RV64-NEXT: vmseq.vx v13, v8, t5 685; RV64-NEXT: vmor.mm v10, v10, v14 686; RV64-NEXT: vmseq.vx v14, v8, t6 687; RV64-NEXT: vmor.mm v10, v10, v11 688; RV64-NEXT: vmor.mm v10, v10, v12 689; RV64-NEXT: vmor.mm v10, v10, v13 690; RV64-NEXT: vmor.mm v10, v10, v14 691; RV64-NEXT: vmseq.vx v11, v8, s0 692; RV64-NEXT: vmor.mm v8, v10, v11 693; RV64-NEXT: vmand.mm v0, v8, v0 694; RV64-NEXT: ld s0, 8(sp) # 8-byte Folded Reload 695; RV64-NEXT: .cfi_restore s0 696; RV64-NEXT: addi sp, sp, 16 697; RV64-NEXT: .cfi_def_cfa_offset 0 698; RV64-NEXT: ret 699 %r = tail call <vscale x 16 x i1> @llvm.experimental.vector.match(<vscale x 16 x i8> %op1, <32 x i8> %op2, <vscale x 16 x i1> %mask) 700 ret <vscale x 16 x i1> %r 701} 702 703define <16 x i1> @match_v16i8_v32i8(<16 x i8> %op1, <32 x i8> %op2, <16 x i1> %mask) { 704; RV32-LABEL: match_v16i8_v32i8: 705; RV32: # %bb.0: 706; RV32-NEXT: addi sp, sp, -16 707; RV32-NEXT: .cfi_def_cfa_offset 16 708; RV32-NEXT: sw s0, 12(sp) # 4-byte Folded Spill 709; RV32-NEXT: .cfi_offset s0, -4 710; RV32-NEXT: vsetivli zero, 16, e8, m1, ta, ma 711; RV32-NEXT: vrgather.vi v9, v10, 1 712; RV32-NEXT: vrgather.vi v12, v10, 0 713; RV32-NEXT: vrgather.vi v13, v10, 2 714; RV32-NEXT: vrgather.vi v14, v10, 3 715; RV32-NEXT: vrgather.vi v15, v10, 4 716; RV32-NEXT: vrgather.vi v16, v10, 5 717; RV32-NEXT: vrgather.vi v17, v10, 6 718; RV32-NEXT: vrgather.vi v18, v10, 7 719; RV32-NEXT: vrgather.vi v19, v10, 8 720; RV32-NEXT: vrgather.vi v20, v10, 9 721; RV32-NEXT: vrgather.vi v21, v10, 10 722; RV32-NEXT: vrgather.vi v22, v10, 11 723; RV32-NEXT: vrgather.vi v23, v10, 12 724; RV32-NEXT: vsetivli zero, 1, e8, m2, ta, ma 725; RV32-NEXT: vslidedown.vi v24, v10, 16 726; RV32-NEXT: vmv.x.s a0, v24 727; RV32-NEXT: vslidedown.vi v24, v10, 17 728; RV32-NEXT: vmv.x.s a1, v24 729; RV32-NEXT: vslidedown.vi v24, v10, 18 730; RV32-NEXT: vmv.x.s a2, v24 731; RV32-NEXT: vslidedown.vi v24, v10, 19 732; RV32-NEXT: vmv.x.s a3, v24 733; RV32-NEXT: vslidedown.vi v24, v10, 20 734; RV32-NEXT: vmv.x.s a4, v24 735; RV32-NEXT: vslidedown.vi v24, v10, 21 736; RV32-NEXT: vmv.x.s a5, v24 737; RV32-NEXT: vslidedown.vi v24, v10, 22 738; RV32-NEXT: vmv.x.s a6, v24 739; RV32-NEXT: vslidedown.vi v24, v10, 23 740; RV32-NEXT: vmv.x.s a7, v24 741; RV32-NEXT: vslidedown.vi v24, v10, 24 742; RV32-NEXT: vmv.x.s t0, v24 743; RV32-NEXT: vslidedown.vi v24, v10, 25 744; RV32-NEXT: vmv.x.s t1, v24 745; RV32-NEXT: vslidedown.vi v24, v10, 26 746; RV32-NEXT: vmv.x.s t2, v24 747; RV32-NEXT: vslidedown.vi v24, v10, 27 748; RV32-NEXT: vmv.x.s t3, v24 749; RV32-NEXT: vslidedown.vi v24, v10, 28 750; RV32-NEXT: vmv.x.s t4, v24 751; RV32-NEXT: vslidedown.vi v24, v10, 29 752; RV32-NEXT: vmv.x.s t5, v24 753; RV32-NEXT: vslidedown.vi v24, v10, 30 754; RV32-NEXT: vmv.x.s t6, v24 755; RV32-NEXT: vslidedown.vi v24, v10, 31 756; RV32-NEXT: vmv.x.s s0, v24 757; RV32-NEXT: vsetivli zero, 16, e8, m1, ta, ma 758; RV32-NEXT: vrgather.vi v11, v10, 13 759; RV32-NEXT: vrgather.vi v24, v10, 14 760; RV32-NEXT: vrgather.vi v25, v10, 15 761; RV32-NEXT: vmseq.vv v9, v8, v9 762; RV32-NEXT: vmseq.vv v10, v8, v12 763; RV32-NEXT: vmor.mm v9, v10, v9 764; RV32-NEXT: vmseq.vv v10, v8, v13 765; RV32-NEXT: vmor.mm v9, v9, v10 766; RV32-NEXT: vmseq.vv v10, v8, v14 767; RV32-NEXT: vmor.mm v9, v9, v10 768; RV32-NEXT: vmseq.vv v10, v8, v15 769; RV32-NEXT: vmor.mm v9, v9, v10 770; RV32-NEXT: vmseq.vv v10, v8, v16 771; RV32-NEXT: vmor.mm v9, v9, v10 772; RV32-NEXT: vmseq.vv v10, v8, v17 773; RV32-NEXT: vmor.mm v9, v9, v10 774; RV32-NEXT: vmseq.vv v10, v8, v18 775; RV32-NEXT: vmor.mm v9, v9, v10 776; RV32-NEXT: vmseq.vv v10, v8, v19 777; RV32-NEXT: vmor.mm v9, v9, v10 778; RV32-NEXT: vmseq.vv v10, v8, v20 779; RV32-NEXT: vmor.mm v9, v9, v10 780; RV32-NEXT: vmseq.vv v10, v8, v21 781; RV32-NEXT: vmor.mm v9, v9, v10 782; RV32-NEXT: vmseq.vv v10, v8, v22 783; RV32-NEXT: vmor.mm v9, v9, v10 784; RV32-NEXT: vmseq.vv v10, v8, v23 785; RV32-NEXT: vmor.mm v9, v9, v10 786; RV32-NEXT: vmseq.vx v10, v8, a0 787; RV32-NEXT: vmseq.vv v11, v8, v11 788; RV32-NEXT: vmor.mm v9, v9, v11 789; RV32-NEXT: vmseq.vx v11, v8, a1 790; RV32-NEXT: vmseq.vv v12, v8, v24 791; RV32-NEXT: vmor.mm v9, v9, v12 792; RV32-NEXT: vmseq.vx v12, v8, a2 793; RV32-NEXT: vmseq.vv v13, v8, v25 794; RV32-NEXT: vmor.mm v9, v9, v13 795; RV32-NEXT: vmseq.vx v13, v8, a3 796; RV32-NEXT: vmor.mm v9, v9, v10 797; RV32-NEXT: vmseq.vx v10, v8, a4 798; RV32-NEXT: vmor.mm v9, v9, v11 799; RV32-NEXT: vmseq.vx v11, v8, a5 800; RV32-NEXT: vmor.mm v9, v9, v12 801; RV32-NEXT: vmseq.vx v12, v8, a6 802; RV32-NEXT: vmor.mm v9, v9, v13 803; RV32-NEXT: vmseq.vx v13, v8, a7 804; RV32-NEXT: vmor.mm v9, v9, v10 805; RV32-NEXT: vmseq.vx v10, v8, t0 806; RV32-NEXT: vmor.mm v9, v9, v11 807; RV32-NEXT: vmseq.vx v11, v8, t1 808; RV32-NEXT: vmor.mm v9, v9, v12 809; RV32-NEXT: vmseq.vx v12, v8, t2 810; RV32-NEXT: vmor.mm v9, v9, v13 811; RV32-NEXT: vmseq.vx v13, v8, t3 812; RV32-NEXT: vmor.mm v9, v9, v10 813; RV32-NEXT: vmseq.vx v10, v8, t4 814; RV32-NEXT: vmor.mm v9, v9, v11 815; RV32-NEXT: vmseq.vx v11, v8, t5 816; RV32-NEXT: vmor.mm v9, v9, v12 817; RV32-NEXT: vmseq.vx v12, v8, t6 818; RV32-NEXT: vmor.mm v9, v9, v13 819; RV32-NEXT: vmor.mm v9, v9, v10 820; RV32-NEXT: vmor.mm v9, v9, v11 821; RV32-NEXT: vmor.mm v9, v9, v12 822; RV32-NEXT: vmseq.vx v8, v8, s0 823; RV32-NEXT: vmor.mm v8, v9, v8 824; RV32-NEXT: vmand.mm v0, v8, v0 825; RV32-NEXT: lw s0, 12(sp) # 4-byte Folded Reload 826; RV32-NEXT: .cfi_restore s0 827; RV32-NEXT: addi sp, sp, 16 828; RV32-NEXT: .cfi_def_cfa_offset 0 829; RV32-NEXT: ret 830; 831; RV64-LABEL: match_v16i8_v32i8: 832; RV64: # %bb.0: 833; RV64-NEXT: addi sp, sp, -16 834; RV64-NEXT: .cfi_def_cfa_offset 16 835; RV64-NEXT: sd s0, 8(sp) # 8-byte Folded Spill 836; RV64-NEXT: .cfi_offset s0, -8 837; RV64-NEXT: vsetivli zero, 16, e8, m1, ta, ma 838; RV64-NEXT: vrgather.vi v9, v10, 1 839; RV64-NEXT: vrgather.vi v12, v10, 0 840; RV64-NEXT: vrgather.vi v13, v10, 2 841; RV64-NEXT: vrgather.vi v14, v10, 3 842; RV64-NEXT: vrgather.vi v15, v10, 4 843; RV64-NEXT: vrgather.vi v16, v10, 5 844; RV64-NEXT: vrgather.vi v17, v10, 6 845; RV64-NEXT: vrgather.vi v18, v10, 7 846; RV64-NEXT: vrgather.vi v19, v10, 8 847; RV64-NEXT: vrgather.vi v20, v10, 9 848; RV64-NEXT: vrgather.vi v21, v10, 10 849; RV64-NEXT: vrgather.vi v22, v10, 11 850; RV64-NEXT: vrgather.vi v23, v10, 12 851; RV64-NEXT: vsetivli zero, 1, e8, m2, ta, ma 852; RV64-NEXT: vslidedown.vi v24, v10, 16 853; RV64-NEXT: vmv.x.s a0, v24 854; RV64-NEXT: vslidedown.vi v24, v10, 17 855; RV64-NEXT: vmv.x.s a1, v24 856; RV64-NEXT: vslidedown.vi v24, v10, 18 857; RV64-NEXT: vmv.x.s a2, v24 858; RV64-NEXT: vslidedown.vi v24, v10, 19 859; RV64-NEXT: vmv.x.s a3, v24 860; RV64-NEXT: vslidedown.vi v24, v10, 20 861; RV64-NEXT: vmv.x.s a4, v24 862; RV64-NEXT: vslidedown.vi v24, v10, 21 863; RV64-NEXT: vmv.x.s a5, v24 864; RV64-NEXT: vslidedown.vi v24, v10, 22 865; RV64-NEXT: vmv.x.s a6, v24 866; RV64-NEXT: vslidedown.vi v24, v10, 23 867; RV64-NEXT: vmv.x.s a7, v24 868; RV64-NEXT: vslidedown.vi v24, v10, 24 869; RV64-NEXT: vmv.x.s t0, v24 870; RV64-NEXT: vslidedown.vi v24, v10, 25 871; RV64-NEXT: vmv.x.s t1, v24 872; RV64-NEXT: vslidedown.vi v24, v10, 26 873; RV64-NEXT: vmv.x.s t2, v24 874; RV64-NEXT: vslidedown.vi v24, v10, 27 875; RV64-NEXT: vmv.x.s t3, v24 876; RV64-NEXT: vslidedown.vi v24, v10, 28 877; RV64-NEXT: vmv.x.s t4, v24 878; RV64-NEXT: vslidedown.vi v24, v10, 29 879; RV64-NEXT: vmv.x.s t5, v24 880; RV64-NEXT: vslidedown.vi v24, v10, 30 881; RV64-NEXT: vmv.x.s t6, v24 882; RV64-NEXT: vslidedown.vi v24, v10, 31 883; RV64-NEXT: vmv.x.s s0, v24 884; RV64-NEXT: vsetivli zero, 16, e8, m1, ta, ma 885; RV64-NEXT: vrgather.vi v11, v10, 13 886; RV64-NEXT: vrgather.vi v24, v10, 14 887; RV64-NEXT: vrgather.vi v25, v10, 15 888; RV64-NEXT: vmseq.vv v9, v8, v9 889; RV64-NEXT: vmseq.vv v10, v8, v12 890; RV64-NEXT: vmor.mm v9, v10, v9 891; RV64-NEXT: vmseq.vv v10, v8, v13 892; RV64-NEXT: vmor.mm v9, v9, v10 893; RV64-NEXT: vmseq.vv v10, v8, v14 894; RV64-NEXT: vmor.mm v9, v9, v10 895; RV64-NEXT: vmseq.vv v10, v8, v15 896; RV64-NEXT: vmor.mm v9, v9, v10 897; RV64-NEXT: vmseq.vv v10, v8, v16 898; RV64-NEXT: vmor.mm v9, v9, v10 899; RV64-NEXT: vmseq.vv v10, v8, v17 900; RV64-NEXT: vmor.mm v9, v9, v10 901; RV64-NEXT: vmseq.vv v10, v8, v18 902; RV64-NEXT: vmor.mm v9, v9, v10 903; RV64-NEXT: vmseq.vv v10, v8, v19 904; RV64-NEXT: vmor.mm v9, v9, v10 905; RV64-NEXT: vmseq.vv v10, v8, v20 906; RV64-NEXT: vmor.mm v9, v9, v10 907; RV64-NEXT: vmseq.vv v10, v8, v21 908; RV64-NEXT: vmor.mm v9, v9, v10 909; RV64-NEXT: vmseq.vv v10, v8, v22 910; RV64-NEXT: vmor.mm v9, v9, v10 911; RV64-NEXT: vmseq.vv v10, v8, v23 912; RV64-NEXT: vmor.mm v9, v9, v10 913; RV64-NEXT: vmseq.vx v10, v8, a0 914; RV64-NEXT: vmseq.vv v11, v8, v11 915; RV64-NEXT: vmor.mm v9, v9, v11 916; RV64-NEXT: vmseq.vx v11, v8, a1 917; RV64-NEXT: vmseq.vv v12, v8, v24 918; RV64-NEXT: vmor.mm v9, v9, v12 919; RV64-NEXT: vmseq.vx v12, v8, a2 920; RV64-NEXT: vmseq.vv v13, v8, v25 921; RV64-NEXT: vmor.mm v9, v9, v13 922; RV64-NEXT: vmseq.vx v13, v8, a3 923; RV64-NEXT: vmor.mm v9, v9, v10 924; RV64-NEXT: vmseq.vx v10, v8, a4 925; RV64-NEXT: vmor.mm v9, v9, v11 926; RV64-NEXT: vmseq.vx v11, v8, a5 927; RV64-NEXT: vmor.mm v9, v9, v12 928; RV64-NEXT: vmseq.vx v12, v8, a6 929; RV64-NEXT: vmor.mm v9, v9, v13 930; RV64-NEXT: vmseq.vx v13, v8, a7 931; RV64-NEXT: vmor.mm v9, v9, v10 932; RV64-NEXT: vmseq.vx v10, v8, t0 933; RV64-NEXT: vmor.mm v9, v9, v11 934; RV64-NEXT: vmseq.vx v11, v8, t1 935; RV64-NEXT: vmor.mm v9, v9, v12 936; RV64-NEXT: vmseq.vx v12, v8, t2 937; RV64-NEXT: vmor.mm v9, v9, v13 938; RV64-NEXT: vmseq.vx v13, v8, t3 939; RV64-NEXT: vmor.mm v9, v9, v10 940; RV64-NEXT: vmseq.vx v10, v8, t4 941; RV64-NEXT: vmor.mm v9, v9, v11 942; RV64-NEXT: vmseq.vx v11, v8, t5 943; RV64-NEXT: vmor.mm v9, v9, v12 944; RV64-NEXT: vmseq.vx v12, v8, t6 945; RV64-NEXT: vmor.mm v9, v9, v13 946; RV64-NEXT: vmor.mm v9, v9, v10 947; RV64-NEXT: vmor.mm v9, v9, v11 948; RV64-NEXT: vmor.mm v9, v9, v12 949; RV64-NEXT: vmseq.vx v8, v8, s0 950; RV64-NEXT: vmor.mm v8, v9, v8 951; RV64-NEXT: vmand.mm v0, v8, v0 952; RV64-NEXT: ld s0, 8(sp) # 8-byte Folded Reload 953; RV64-NEXT: .cfi_restore s0 954; RV64-NEXT: addi sp, sp, 16 955; RV64-NEXT: .cfi_def_cfa_offset 0 956; RV64-NEXT: ret 957 %r = tail call <16 x i1> @llvm.experimental.vector.match(<16 x i8> %op1, <32 x i8> %op2, <16 x i1> %mask) 958 ret <16 x i1> %r 959} 960 961define <vscale x 4 x i1> @match_nxv4xi32_v4i32(<vscale x 4 x i32> %op1, <4 x i32> %op2, <vscale x 4 x i1> %mask) { 962; CHECK-LABEL: match_nxv4xi32_v4i32: 963; CHECK: # %bb.0: 964; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 965; CHECK-NEXT: vrgather.vi v12, v10, 1 966; CHECK-NEXT: vmseq.vv v14, v8, v12 967; CHECK-NEXT: vrgather.vi v12, v10, 0 968; CHECK-NEXT: vmseq.vv v15, v8, v12 969; CHECK-NEXT: vmor.mm v12, v15, v14 970; CHECK-NEXT: vrgather.vi v14, v10, 2 971; CHECK-NEXT: vmseq.vv v13, v8, v14 972; CHECK-NEXT: vrgather.vi v14, v10, 3 973; CHECK-NEXT: vmor.mm v10, v12, v13 974; CHECK-NEXT: vmseq.vv v11, v8, v14 975; CHECK-NEXT: vmor.mm v8, v10, v11 976; CHECK-NEXT: vmand.mm v0, v8, v0 977; CHECK-NEXT: ret 978 %r = tail call <vscale x 4 x i1> @llvm.experimental.vector.match(<vscale x 4 x i32> %op1, <4 x i32> %op2, <vscale x 4 x i1> %mask) 979 ret <vscale x 4 x i1> %r 980} 981 982define <vscale x 2 x i1> @match_nxv2xi64_v2i64(<vscale x 2 x i64> %op1, <2 x i64> %op2, <vscale x 2 x i1> %mask) { 983; CHECK-LABEL: match_nxv2xi64_v2i64: 984; CHECK: # %bb.0: 985; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 986; CHECK-NEXT: vrgather.vi v12, v10, 1 987; CHECK-NEXT: vmseq.vv v14, v8, v12 988; CHECK-NEXT: vrgather.vi v12, v10, 0 989; CHECK-NEXT: vmseq.vv v10, v8, v12 990; CHECK-NEXT: vmor.mm v8, v10, v14 991; CHECK-NEXT: vmand.mm v0, v8, v0 992; CHECK-NEXT: ret 993 %r = tail call <vscale x 2 x i1> @llvm.experimental.vector.match(<vscale x 2 x i64> %op1, <2 x i64> %op2, <vscale x 2 x i1> %mask) 994 ret <vscale x 2 x i1> %r 995} 996 997define <4 x i1> @match_v4xi32_v4i32(<4 x i32> %op1, <4 x i32> %op2, <4 x i1> %mask) { 998; CHECK-LABEL: match_v4xi32_v4i32: 999; CHECK: # %bb.0: 1000; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 1001; CHECK-NEXT: vrgather.vi v10, v9, 1 1002; CHECK-NEXT: vrgather.vi v11, v9, 0 1003; CHECK-NEXT: vmseq.vv v10, v8, v10 1004; CHECK-NEXT: vmseq.vv v11, v8, v11 1005; CHECK-NEXT: vmor.mm v10, v11, v10 1006; CHECK-NEXT: vrgather.vi v11, v9, 2 1007; CHECK-NEXT: vrgather.vi v12, v9, 3 1008; CHECK-NEXT: vmseq.vv v9, v8, v11 1009; CHECK-NEXT: vmor.mm v9, v10, v9 1010; CHECK-NEXT: vmseq.vv v8, v8, v12 1011; CHECK-NEXT: vmor.mm v8, v9, v8 1012; CHECK-NEXT: vmand.mm v0, v8, v0 1013; CHECK-NEXT: ret 1014 %r = tail call <4 x i1> @llvm.experimental.vector.match(<4 x i32> %op1, <4 x i32> %op2, <4 x i1> %mask) 1015 ret <4 x i1> %r 1016} 1017 1018define <2 x i1> @match_v2xi64_v2i64(<2 x i64> %op1, <2 x i64> %op2, <2 x i1> %mask) { 1019; CHECK-LABEL: match_v2xi64_v2i64: 1020; CHECK: # %bb.0: 1021; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 1022; CHECK-NEXT: vrgather.vi v10, v9, 1 1023; CHECK-NEXT: vrgather.vi v11, v9, 0 1024; CHECK-NEXT: vmseq.vv v9, v8, v10 1025; CHECK-NEXT: vmseq.vv v8, v8, v11 1026; CHECK-NEXT: vmor.mm v8, v8, v9 1027; CHECK-NEXT: vmand.mm v0, v8, v0 1028; CHECK-NEXT: ret 1029 %r = tail call <2 x i1> @llvm.experimental.vector.match(<2 x i64> %op1, <2 x i64> %op2, <2 x i1> %mask) 1030 ret <2 x i1> %r 1031} 1032