1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+zve64x -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32I 3; RUN: llc -mtriple=riscv64 -mattr=+zve64x -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64I 4; RUN: llc -mtriple=riscv32 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32D 5; RUN: llc -mtriple=riscv64 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64D 6 7define <vscale x 1 x i8> @ctlz_nxv1i8(<vscale x 1 x i8> %va) { 8; RV32I-LABEL: ctlz_nxv1i8: 9; RV32I: # %bb.0: 10; RV32I-NEXT: vsetvli a0, zero, e8, mf8, ta, mu 11; RV32I-NEXT: vsrl.vi v9, v8, 1 12; RV32I-NEXT: vor.vv v8, v8, v9 13; RV32I-NEXT: vsrl.vi v9, v8, 2 14; RV32I-NEXT: vor.vv v8, v8, v9 15; RV32I-NEXT: vsrl.vi v9, v8, 4 16; RV32I-NEXT: vor.vv v8, v8, v9 17; RV32I-NEXT: vnot.v v8, v8 18; RV32I-NEXT: vsrl.vi v9, v8, 1 19; RV32I-NEXT: li a0, 85 20; RV32I-NEXT: vand.vx v9, v9, a0 21; RV32I-NEXT: vsub.vv v8, v8, v9 22; RV32I-NEXT: li a0, 51 23; RV32I-NEXT: vand.vx v9, v8, a0 24; RV32I-NEXT: vsrl.vi v8, v8, 2 25; RV32I-NEXT: vand.vx v8, v8, a0 26; RV32I-NEXT: vadd.vv v8, v9, v8 27; RV32I-NEXT: vsrl.vi v9, v8, 4 28; RV32I-NEXT: vadd.vv v8, v8, v9 29; RV32I-NEXT: vand.vi v8, v8, 15 30; RV32I-NEXT: ret 31; 32; RV64I-LABEL: ctlz_nxv1i8: 33; RV64I: # %bb.0: 34; RV64I-NEXT: vsetvli a0, zero, e8, mf8, ta, mu 35; RV64I-NEXT: vsrl.vi v9, v8, 1 36; RV64I-NEXT: vor.vv v8, v8, v9 37; RV64I-NEXT: vsrl.vi v9, v8, 2 38; RV64I-NEXT: vor.vv v8, v8, v9 39; RV64I-NEXT: vsrl.vi v9, v8, 4 40; RV64I-NEXT: vor.vv v8, v8, v9 41; RV64I-NEXT: vnot.v v8, v8 42; RV64I-NEXT: vsrl.vi v9, v8, 1 43; RV64I-NEXT: li a0, 85 44; RV64I-NEXT: vand.vx v9, v9, a0 45; RV64I-NEXT: vsub.vv v8, v8, v9 46; RV64I-NEXT: li a0, 51 47; RV64I-NEXT: vand.vx v9, v8, a0 48; RV64I-NEXT: vsrl.vi v8, v8, 2 49; RV64I-NEXT: vand.vx v8, v8, a0 50; RV64I-NEXT: vadd.vv v8, v9, v8 51; RV64I-NEXT: vsrl.vi v9, v8, 4 52; RV64I-NEXT: vadd.vv v8, v8, v9 53; RV64I-NEXT: vand.vi v8, v8, 15 54; RV64I-NEXT: ret 55; 56; RV32D-LABEL: ctlz_nxv1i8: 57; RV32D: # %bb.0: 58; RV32D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 59; RV32D-NEXT: vzext.vf4 v9, v8 60; RV32D-NEXT: vfcvt.f.xu.v v9, v9 61; RV32D-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 62; RV32D-NEXT: vnsrl.wi v9, v9, 23 63; RV32D-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 64; RV32D-NEXT: vncvt.x.x.w v9, v9 65; RV32D-NEXT: li a0, 134 66; RV32D-NEXT: vmseq.vi v0, v8, 0 67; RV32D-NEXT: vrsub.vx v8, v9, a0 68; RV32D-NEXT: vmerge.vim v8, v8, 8, v0 69; RV32D-NEXT: ret 70; 71; RV64D-LABEL: ctlz_nxv1i8: 72; RV64D: # %bb.0: 73; RV64D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 74; RV64D-NEXT: vzext.vf4 v9, v8 75; RV64D-NEXT: vfcvt.f.xu.v v9, v9 76; RV64D-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 77; RV64D-NEXT: vnsrl.wi v9, v9, 23 78; RV64D-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 79; RV64D-NEXT: vncvt.x.x.w v9, v9 80; RV64D-NEXT: li a0, 134 81; RV64D-NEXT: vmseq.vi v0, v8, 0 82; RV64D-NEXT: vrsub.vx v8, v9, a0 83; RV64D-NEXT: vmerge.vim v8, v8, 8, v0 84; RV64D-NEXT: ret 85 %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 false) 86 ret <vscale x 1 x i8> %a 87} 88declare <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8>, i1) 89 90define <vscale x 2 x i8> @ctlz_nxv2i8(<vscale x 2 x i8> %va) { 91; RV32I-LABEL: ctlz_nxv2i8: 92; RV32I: # %bb.0: 93; RV32I-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 94; RV32I-NEXT: vsrl.vi v9, v8, 1 95; RV32I-NEXT: vor.vv v8, v8, v9 96; RV32I-NEXT: vsrl.vi v9, v8, 2 97; RV32I-NEXT: vor.vv v8, v8, v9 98; RV32I-NEXT: vsrl.vi v9, v8, 4 99; RV32I-NEXT: vor.vv v8, v8, v9 100; RV32I-NEXT: vnot.v v8, v8 101; RV32I-NEXT: vsrl.vi v9, v8, 1 102; RV32I-NEXT: li a0, 85 103; RV32I-NEXT: vand.vx v9, v9, a0 104; RV32I-NEXT: vsub.vv v8, v8, v9 105; RV32I-NEXT: li a0, 51 106; RV32I-NEXT: vand.vx v9, v8, a0 107; RV32I-NEXT: vsrl.vi v8, v8, 2 108; RV32I-NEXT: vand.vx v8, v8, a0 109; RV32I-NEXT: vadd.vv v8, v9, v8 110; RV32I-NEXT: vsrl.vi v9, v8, 4 111; RV32I-NEXT: vadd.vv v8, v8, v9 112; RV32I-NEXT: vand.vi v8, v8, 15 113; RV32I-NEXT: ret 114; 115; RV64I-LABEL: ctlz_nxv2i8: 116; RV64I: # %bb.0: 117; RV64I-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 118; RV64I-NEXT: vsrl.vi v9, v8, 1 119; RV64I-NEXT: vor.vv v8, v8, v9 120; RV64I-NEXT: vsrl.vi v9, v8, 2 121; RV64I-NEXT: vor.vv v8, v8, v9 122; RV64I-NEXT: vsrl.vi v9, v8, 4 123; RV64I-NEXT: vor.vv v8, v8, v9 124; RV64I-NEXT: vnot.v v8, v8 125; RV64I-NEXT: vsrl.vi v9, v8, 1 126; RV64I-NEXT: li a0, 85 127; RV64I-NEXT: vand.vx v9, v9, a0 128; RV64I-NEXT: vsub.vv v8, v8, v9 129; RV64I-NEXT: li a0, 51 130; RV64I-NEXT: vand.vx v9, v8, a0 131; RV64I-NEXT: vsrl.vi v8, v8, 2 132; RV64I-NEXT: vand.vx v8, v8, a0 133; RV64I-NEXT: vadd.vv v8, v9, v8 134; RV64I-NEXT: vsrl.vi v9, v8, 4 135; RV64I-NEXT: vadd.vv v8, v8, v9 136; RV64I-NEXT: vand.vi v8, v8, 15 137; RV64I-NEXT: ret 138; 139; RV32D-LABEL: ctlz_nxv2i8: 140; RV32D: # %bb.0: 141; RV32D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 142; RV32D-NEXT: vzext.vf4 v9, v8 143; RV32D-NEXT: vfcvt.f.xu.v v9, v9 144; RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 145; RV32D-NEXT: vnsrl.wi v9, v9, 23 146; RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 147; RV32D-NEXT: vncvt.x.x.w v9, v9 148; RV32D-NEXT: li a0, 134 149; RV32D-NEXT: vmseq.vi v0, v8, 0 150; RV32D-NEXT: vrsub.vx v8, v9, a0 151; RV32D-NEXT: vmerge.vim v8, v8, 8, v0 152; RV32D-NEXT: ret 153; 154; RV64D-LABEL: ctlz_nxv2i8: 155; RV64D: # %bb.0: 156; RV64D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 157; RV64D-NEXT: vzext.vf4 v9, v8 158; RV64D-NEXT: vfcvt.f.xu.v v9, v9 159; RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 160; RV64D-NEXT: vnsrl.wi v9, v9, 23 161; RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 162; RV64D-NEXT: vncvt.x.x.w v9, v9 163; RV64D-NEXT: li a0, 134 164; RV64D-NEXT: vmseq.vi v0, v8, 0 165; RV64D-NEXT: vrsub.vx v8, v9, a0 166; RV64D-NEXT: vmerge.vim v8, v8, 8, v0 167; RV64D-NEXT: ret 168 %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 false) 169 ret <vscale x 2 x i8> %a 170} 171declare <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8>, i1) 172 173define <vscale x 4 x i8> @ctlz_nxv4i8(<vscale x 4 x i8> %va) { 174; RV32I-LABEL: ctlz_nxv4i8: 175; RV32I: # %bb.0: 176; RV32I-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 177; RV32I-NEXT: vsrl.vi v9, v8, 1 178; RV32I-NEXT: vor.vv v8, v8, v9 179; RV32I-NEXT: vsrl.vi v9, v8, 2 180; RV32I-NEXT: vor.vv v8, v8, v9 181; RV32I-NEXT: vsrl.vi v9, v8, 4 182; RV32I-NEXT: vor.vv v8, v8, v9 183; RV32I-NEXT: vnot.v v8, v8 184; RV32I-NEXT: vsrl.vi v9, v8, 1 185; RV32I-NEXT: li a0, 85 186; RV32I-NEXT: vand.vx v9, v9, a0 187; RV32I-NEXT: vsub.vv v8, v8, v9 188; RV32I-NEXT: li a0, 51 189; RV32I-NEXT: vand.vx v9, v8, a0 190; RV32I-NEXT: vsrl.vi v8, v8, 2 191; RV32I-NEXT: vand.vx v8, v8, a0 192; RV32I-NEXT: vadd.vv v8, v9, v8 193; RV32I-NEXT: vsrl.vi v9, v8, 4 194; RV32I-NEXT: vadd.vv v8, v8, v9 195; RV32I-NEXT: vand.vi v8, v8, 15 196; RV32I-NEXT: ret 197; 198; RV64I-LABEL: ctlz_nxv4i8: 199; RV64I: # %bb.0: 200; RV64I-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 201; RV64I-NEXT: vsrl.vi v9, v8, 1 202; RV64I-NEXT: vor.vv v8, v8, v9 203; RV64I-NEXT: vsrl.vi v9, v8, 2 204; RV64I-NEXT: vor.vv v8, v8, v9 205; RV64I-NEXT: vsrl.vi v9, v8, 4 206; RV64I-NEXT: vor.vv v8, v8, v9 207; RV64I-NEXT: vnot.v v8, v8 208; RV64I-NEXT: vsrl.vi v9, v8, 1 209; RV64I-NEXT: li a0, 85 210; RV64I-NEXT: vand.vx v9, v9, a0 211; RV64I-NEXT: vsub.vv v8, v8, v9 212; RV64I-NEXT: li a0, 51 213; RV64I-NEXT: vand.vx v9, v8, a0 214; RV64I-NEXT: vsrl.vi v8, v8, 2 215; RV64I-NEXT: vand.vx v8, v8, a0 216; RV64I-NEXT: vadd.vv v8, v9, v8 217; RV64I-NEXT: vsrl.vi v9, v8, 4 218; RV64I-NEXT: vadd.vv v8, v8, v9 219; RV64I-NEXT: vand.vi v8, v8, 15 220; RV64I-NEXT: ret 221; 222; RV32D-LABEL: ctlz_nxv4i8: 223; RV32D: # %bb.0: 224; RV32D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 225; RV32D-NEXT: vzext.vf4 v10, v8 226; RV32D-NEXT: vfcvt.f.xu.v v10, v10 227; RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu 228; RV32D-NEXT: vnsrl.wi v9, v10, 23 229; RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 230; RV32D-NEXT: vncvt.x.x.w v9, v9 231; RV32D-NEXT: li a0, 134 232; RV32D-NEXT: vmseq.vi v0, v8, 0 233; RV32D-NEXT: vrsub.vx v8, v9, a0 234; RV32D-NEXT: vmerge.vim v8, v8, 8, v0 235; RV32D-NEXT: ret 236; 237; RV64D-LABEL: ctlz_nxv4i8: 238; RV64D: # %bb.0: 239; RV64D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 240; RV64D-NEXT: vzext.vf4 v10, v8 241; RV64D-NEXT: vfcvt.f.xu.v v10, v10 242; RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu 243; RV64D-NEXT: vnsrl.wi v9, v10, 23 244; RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 245; RV64D-NEXT: vncvt.x.x.w v9, v9 246; RV64D-NEXT: li a0, 134 247; RV64D-NEXT: vmseq.vi v0, v8, 0 248; RV64D-NEXT: vrsub.vx v8, v9, a0 249; RV64D-NEXT: vmerge.vim v8, v8, 8, v0 250; RV64D-NEXT: ret 251 %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 false) 252 ret <vscale x 4 x i8> %a 253} 254declare <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8>, i1) 255 256define <vscale x 8 x i8> @ctlz_nxv8i8(<vscale x 8 x i8> %va) { 257; RV32I-LABEL: ctlz_nxv8i8: 258; RV32I: # %bb.0: 259; RV32I-NEXT: vsetvli a0, zero, e8, m1, ta, mu 260; RV32I-NEXT: vsrl.vi v9, v8, 1 261; RV32I-NEXT: vor.vv v8, v8, v9 262; RV32I-NEXT: vsrl.vi v9, v8, 2 263; RV32I-NEXT: vor.vv v8, v8, v9 264; RV32I-NEXT: vsrl.vi v9, v8, 4 265; RV32I-NEXT: vor.vv v8, v8, v9 266; RV32I-NEXT: vnot.v v8, v8 267; RV32I-NEXT: vsrl.vi v9, v8, 1 268; RV32I-NEXT: li a0, 85 269; RV32I-NEXT: vand.vx v9, v9, a0 270; RV32I-NEXT: vsub.vv v8, v8, v9 271; RV32I-NEXT: li a0, 51 272; RV32I-NEXT: vand.vx v9, v8, a0 273; RV32I-NEXT: vsrl.vi v8, v8, 2 274; RV32I-NEXT: vand.vx v8, v8, a0 275; RV32I-NEXT: vadd.vv v8, v9, v8 276; RV32I-NEXT: vsrl.vi v9, v8, 4 277; RV32I-NEXT: vadd.vv v8, v8, v9 278; RV32I-NEXT: vand.vi v8, v8, 15 279; RV32I-NEXT: ret 280; 281; RV64I-LABEL: ctlz_nxv8i8: 282; RV64I: # %bb.0: 283; RV64I-NEXT: vsetvli a0, zero, e8, m1, ta, mu 284; RV64I-NEXT: vsrl.vi v9, v8, 1 285; RV64I-NEXT: vor.vv v8, v8, v9 286; RV64I-NEXT: vsrl.vi v9, v8, 2 287; RV64I-NEXT: vor.vv v8, v8, v9 288; RV64I-NEXT: vsrl.vi v9, v8, 4 289; RV64I-NEXT: vor.vv v8, v8, v9 290; RV64I-NEXT: vnot.v v8, v8 291; RV64I-NEXT: vsrl.vi v9, v8, 1 292; RV64I-NEXT: li a0, 85 293; RV64I-NEXT: vand.vx v9, v9, a0 294; RV64I-NEXT: vsub.vv v8, v8, v9 295; RV64I-NEXT: li a0, 51 296; RV64I-NEXT: vand.vx v9, v8, a0 297; RV64I-NEXT: vsrl.vi v8, v8, 2 298; RV64I-NEXT: vand.vx v8, v8, a0 299; RV64I-NEXT: vadd.vv v8, v9, v8 300; RV64I-NEXT: vsrl.vi v9, v8, 4 301; RV64I-NEXT: vadd.vv v8, v8, v9 302; RV64I-NEXT: vand.vi v8, v8, 15 303; RV64I-NEXT: ret 304; 305; RV32D-LABEL: ctlz_nxv8i8: 306; RV32D: # %bb.0: 307; RV32D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 308; RV32D-NEXT: vzext.vf4 v12, v8 309; RV32D-NEXT: vfcvt.f.xu.v v12, v12 310; RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu 311; RV32D-NEXT: vnsrl.wi v10, v12, 23 312; RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu 313; RV32D-NEXT: vncvt.x.x.w v9, v10 314; RV32D-NEXT: li a0, 134 315; RV32D-NEXT: vmseq.vi v0, v8, 0 316; RV32D-NEXT: vrsub.vx v8, v9, a0 317; RV32D-NEXT: vmerge.vim v8, v8, 8, v0 318; RV32D-NEXT: ret 319; 320; RV64D-LABEL: ctlz_nxv8i8: 321; RV64D: # %bb.0: 322; RV64D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 323; RV64D-NEXT: vzext.vf4 v12, v8 324; RV64D-NEXT: vfcvt.f.xu.v v12, v12 325; RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu 326; RV64D-NEXT: vnsrl.wi v10, v12, 23 327; RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu 328; RV64D-NEXT: vncvt.x.x.w v9, v10 329; RV64D-NEXT: li a0, 134 330; RV64D-NEXT: vmseq.vi v0, v8, 0 331; RV64D-NEXT: vrsub.vx v8, v9, a0 332; RV64D-NEXT: vmerge.vim v8, v8, 8, v0 333; RV64D-NEXT: ret 334 %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 false) 335 ret <vscale x 8 x i8> %a 336} 337declare <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8>, i1) 338 339define <vscale x 16 x i8> @ctlz_nxv16i8(<vscale x 16 x i8> %va) { 340; RV32I-LABEL: ctlz_nxv16i8: 341; RV32I: # %bb.0: 342; RV32I-NEXT: vsetvli a0, zero, e8, m2, ta, mu 343; RV32I-NEXT: vsrl.vi v10, v8, 1 344; RV32I-NEXT: vor.vv v8, v8, v10 345; RV32I-NEXT: vsrl.vi v10, v8, 2 346; RV32I-NEXT: vor.vv v8, v8, v10 347; RV32I-NEXT: vsrl.vi v10, v8, 4 348; RV32I-NEXT: vor.vv v8, v8, v10 349; RV32I-NEXT: vnot.v v8, v8 350; RV32I-NEXT: vsrl.vi v10, v8, 1 351; RV32I-NEXT: li a0, 85 352; RV32I-NEXT: vand.vx v10, v10, a0 353; RV32I-NEXT: vsub.vv v8, v8, v10 354; RV32I-NEXT: li a0, 51 355; RV32I-NEXT: vand.vx v10, v8, a0 356; RV32I-NEXT: vsrl.vi v8, v8, 2 357; RV32I-NEXT: vand.vx v8, v8, a0 358; RV32I-NEXT: vadd.vv v8, v10, v8 359; RV32I-NEXT: vsrl.vi v10, v8, 4 360; RV32I-NEXT: vadd.vv v8, v8, v10 361; RV32I-NEXT: vand.vi v8, v8, 15 362; RV32I-NEXT: ret 363; 364; RV64I-LABEL: ctlz_nxv16i8: 365; RV64I: # %bb.0: 366; RV64I-NEXT: vsetvli a0, zero, e8, m2, ta, mu 367; RV64I-NEXT: vsrl.vi v10, v8, 1 368; RV64I-NEXT: vor.vv v8, v8, v10 369; RV64I-NEXT: vsrl.vi v10, v8, 2 370; RV64I-NEXT: vor.vv v8, v8, v10 371; RV64I-NEXT: vsrl.vi v10, v8, 4 372; RV64I-NEXT: vor.vv v8, v8, v10 373; RV64I-NEXT: vnot.v v8, v8 374; RV64I-NEXT: vsrl.vi v10, v8, 1 375; RV64I-NEXT: li a0, 85 376; RV64I-NEXT: vand.vx v10, v10, a0 377; RV64I-NEXT: vsub.vv v8, v8, v10 378; RV64I-NEXT: li a0, 51 379; RV64I-NEXT: vand.vx v10, v8, a0 380; RV64I-NEXT: vsrl.vi v8, v8, 2 381; RV64I-NEXT: vand.vx v8, v8, a0 382; RV64I-NEXT: vadd.vv v8, v10, v8 383; RV64I-NEXT: vsrl.vi v10, v8, 4 384; RV64I-NEXT: vadd.vv v8, v8, v10 385; RV64I-NEXT: vand.vi v8, v8, 15 386; RV64I-NEXT: ret 387; 388; RV32D-LABEL: ctlz_nxv16i8: 389; RV32D: # %bb.0: 390; RV32D-NEXT: vsetvli a0, zero, e32, m8, ta, mu 391; RV32D-NEXT: vzext.vf4 v16, v8 392; RV32D-NEXT: vfcvt.f.xu.v v16, v16 393; RV32D-NEXT: vsetvli zero, zero, e16, m4, ta, mu 394; RV32D-NEXT: vnsrl.wi v12, v16, 23 395; RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu 396; RV32D-NEXT: vncvt.x.x.w v10, v12 397; RV32D-NEXT: li a0, 134 398; RV32D-NEXT: vmseq.vi v0, v8, 0 399; RV32D-NEXT: vrsub.vx v8, v10, a0 400; RV32D-NEXT: vmerge.vim v8, v8, 8, v0 401; RV32D-NEXT: ret 402; 403; RV64D-LABEL: ctlz_nxv16i8: 404; RV64D: # %bb.0: 405; RV64D-NEXT: vsetvli a0, zero, e32, m8, ta, mu 406; RV64D-NEXT: vzext.vf4 v16, v8 407; RV64D-NEXT: vfcvt.f.xu.v v16, v16 408; RV64D-NEXT: vsetvli zero, zero, e16, m4, ta, mu 409; RV64D-NEXT: vnsrl.wi v12, v16, 23 410; RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu 411; RV64D-NEXT: vncvt.x.x.w v10, v12 412; RV64D-NEXT: li a0, 134 413; RV64D-NEXT: vmseq.vi v0, v8, 0 414; RV64D-NEXT: vrsub.vx v8, v10, a0 415; RV64D-NEXT: vmerge.vim v8, v8, 8, v0 416; RV64D-NEXT: ret 417 %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 false) 418 ret <vscale x 16 x i8> %a 419} 420declare <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8>, i1) 421 422define <vscale x 32 x i8> @ctlz_nxv32i8(<vscale x 32 x i8> %va) { 423; CHECK-LABEL: ctlz_nxv32i8: 424; CHECK: # %bb.0: 425; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, mu 426; CHECK-NEXT: vsrl.vi v12, v8, 1 427; CHECK-NEXT: vor.vv v8, v8, v12 428; CHECK-NEXT: vsrl.vi v12, v8, 2 429; CHECK-NEXT: vor.vv v8, v8, v12 430; CHECK-NEXT: vsrl.vi v12, v8, 4 431; CHECK-NEXT: vor.vv v8, v8, v12 432; CHECK-NEXT: vnot.v v8, v8 433; CHECK-NEXT: vsrl.vi v12, v8, 1 434; CHECK-NEXT: li a0, 85 435; CHECK-NEXT: vand.vx v12, v12, a0 436; CHECK-NEXT: vsub.vv v8, v8, v12 437; CHECK-NEXT: li a0, 51 438; CHECK-NEXT: vand.vx v12, v8, a0 439; CHECK-NEXT: vsrl.vi v8, v8, 2 440; CHECK-NEXT: vand.vx v8, v8, a0 441; CHECK-NEXT: vadd.vv v8, v12, v8 442; CHECK-NEXT: vsrl.vi v12, v8, 4 443; CHECK-NEXT: vadd.vv v8, v8, v12 444; CHECK-NEXT: vand.vi v8, v8, 15 445; CHECK-NEXT: ret 446 %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 false) 447 ret <vscale x 32 x i8> %a 448} 449declare <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8>, i1) 450 451define <vscale x 64 x i8> @ctlz_nxv64i8(<vscale x 64 x i8> %va) { 452; CHECK-LABEL: ctlz_nxv64i8: 453; CHECK: # %bb.0: 454; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, mu 455; CHECK-NEXT: vsrl.vi v16, v8, 1 456; CHECK-NEXT: vor.vv v8, v8, v16 457; CHECK-NEXT: vsrl.vi v16, v8, 2 458; CHECK-NEXT: vor.vv v8, v8, v16 459; CHECK-NEXT: vsrl.vi v16, v8, 4 460; CHECK-NEXT: vor.vv v8, v8, v16 461; CHECK-NEXT: vnot.v v8, v8 462; CHECK-NEXT: vsrl.vi v16, v8, 1 463; CHECK-NEXT: li a0, 85 464; CHECK-NEXT: vand.vx v16, v16, a0 465; CHECK-NEXT: vsub.vv v8, v8, v16 466; CHECK-NEXT: li a0, 51 467; CHECK-NEXT: vand.vx v16, v8, a0 468; CHECK-NEXT: vsrl.vi v8, v8, 2 469; CHECK-NEXT: vand.vx v8, v8, a0 470; CHECK-NEXT: vadd.vv v8, v16, v8 471; CHECK-NEXT: vsrl.vi v16, v8, 4 472; CHECK-NEXT: vadd.vv v8, v8, v16 473; CHECK-NEXT: vand.vi v8, v8, 15 474; CHECK-NEXT: ret 475 %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 false) 476 ret <vscale x 64 x i8> %a 477} 478declare <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8>, i1) 479 480define <vscale x 1 x i16> @ctlz_nxv1i16(<vscale x 1 x i16> %va) { 481; RV32I-LABEL: ctlz_nxv1i16: 482; RV32I: # %bb.0: 483; RV32I-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 484; RV32I-NEXT: vsrl.vi v9, v8, 1 485; RV32I-NEXT: vor.vv v8, v8, v9 486; RV32I-NEXT: vsrl.vi v9, v8, 2 487; RV32I-NEXT: vor.vv v8, v8, v9 488; RV32I-NEXT: vsrl.vi v9, v8, 4 489; RV32I-NEXT: vor.vv v8, v8, v9 490; RV32I-NEXT: vsrl.vi v9, v8, 8 491; RV32I-NEXT: vor.vv v8, v8, v9 492; RV32I-NEXT: vnot.v v8, v8 493; RV32I-NEXT: vsrl.vi v9, v8, 1 494; RV32I-NEXT: lui a0, 5 495; RV32I-NEXT: addi a0, a0, 1365 496; RV32I-NEXT: vand.vx v9, v9, a0 497; RV32I-NEXT: vsub.vv v8, v8, v9 498; RV32I-NEXT: lui a0, 3 499; RV32I-NEXT: addi a0, a0, 819 500; RV32I-NEXT: vand.vx v9, v8, a0 501; RV32I-NEXT: vsrl.vi v8, v8, 2 502; RV32I-NEXT: vand.vx v8, v8, a0 503; RV32I-NEXT: vadd.vv v8, v9, v8 504; RV32I-NEXT: vsrl.vi v9, v8, 4 505; RV32I-NEXT: vadd.vv v8, v8, v9 506; RV32I-NEXT: lui a0, 1 507; RV32I-NEXT: addi a0, a0, -241 508; RV32I-NEXT: vand.vx v8, v8, a0 509; RV32I-NEXT: li a0, 257 510; RV32I-NEXT: vmul.vx v8, v8, a0 511; RV32I-NEXT: vsrl.vi v8, v8, 8 512; RV32I-NEXT: ret 513; 514; RV64I-LABEL: ctlz_nxv1i16: 515; RV64I: # %bb.0: 516; RV64I-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 517; RV64I-NEXT: vsrl.vi v9, v8, 1 518; RV64I-NEXT: vor.vv v8, v8, v9 519; RV64I-NEXT: vsrl.vi v9, v8, 2 520; RV64I-NEXT: vor.vv v8, v8, v9 521; RV64I-NEXT: vsrl.vi v9, v8, 4 522; RV64I-NEXT: vor.vv v8, v8, v9 523; RV64I-NEXT: vsrl.vi v9, v8, 8 524; RV64I-NEXT: vor.vv v8, v8, v9 525; RV64I-NEXT: vnot.v v8, v8 526; RV64I-NEXT: vsrl.vi v9, v8, 1 527; RV64I-NEXT: lui a0, 5 528; RV64I-NEXT: addiw a0, a0, 1365 529; RV64I-NEXT: vand.vx v9, v9, a0 530; RV64I-NEXT: vsub.vv v8, v8, v9 531; RV64I-NEXT: lui a0, 3 532; RV64I-NEXT: addiw a0, a0, 819 533; RV64I-NEXT: vand.vx v9, v8, a0 534; RV64I-NEXT: vsrl.vi v8, v8, 2 535; RV64I-NEXT: vand.vx v8, v8, a0 536; RV64I-NEXT: vadd.vv v8, v9, v8 537; RV64I-NEXT: vsrl.vi v9, v8, 4 538; RV64I-NEXT: vadd.vv v8, v8, v9 539; RV64I-NEXT: lui a0, 1 540; RV64I-NEXT: addiw a0, a0, -241 541; RV64I-NEXT: vand.vx v8, v8, a0 542; RV64I-NEXT: li a0, 257 543; RV64I-NEXT: vmul.vx v8, v8, a0 544; RV64I-NEXT: vsrl.vi v8, v8, 8 545; RV64I-NEXT: ret 546; 547; RV32D-LABEL: ctlz_nxv1i16: 548; RV32D: # %bb.0: 549; RV32D-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 550; RV32D-NEXT: vfwcvt.f.xu.v v9, v8 551; RV32D-NEXT: vnsrl.wi v9, v9, 23 552; RV32D-NEXT: li a0, 142 553; RV32D-NEXT: vrsub.vx v9, v9, a0 554; RV32D-NEXT: vmseq.vi v0, v8, 0 555; RV32D-NEXT: li a0, 16 556; RV32D-NEXT: vmerge.vxm v8, v9, a0, v0 557; RV32D-NEXT: ret 558; 559; RV64D-LABEL: ctlz_nxv1i16: 560; RV64D: # %bb.0: 561; RV64D-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 562; RV64D-NEXT: vfwcvt.f.xu.v v9, v8 563; RV64D-NEXT: vnsrl.wi v9, v9, 23 564; RV64D-NEXT: li a0, 142 565; RV64D-NEXT: vrsub.vx v9, v9, a0 566; RV64D-NEXT: vmseq.vi v0, v8, 0 567; RV64D-NEXT: li a0, 16 568; RV64D-NEXT: vmerge.vxm v8, v9, a0, v0 569; RV64D-NEXT: ret 570 %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 false) 571 ret <vscale x 1 x i16> %a 572} 573declare <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16>, i1) 574 575define <vscale x 2 x i16> @ctlz_nxv2i16(<vscale x 2 x i16> %va) { 576; RV32I-LABEL: ctlz_nxv2i16: 577; RV32I: # %bb.0: 578; RV32I-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 579; RV32I-NEXT: vsrl.vi v9, v8, 1 580; RV32I-NEXT: vor.vv v8, v8, v9 581; RV32I-NEXT: vsrl.vi v9, v8, 2 582; RV32I-NEXT: vor.vv v8, v8, v9 583; RV32I-NEXT: vsrl.vi v9, v8, 4 584; RV32I-NEXT: vor.vv v8, v8, v9 585; RV32I-NEXT: vsrl.vi v9, v8, 8 586; RV32I-NEXT: vor.vv v8, v8, v9 587; RV32I-NEXT: vnot.v v8, v8 588; RV32I-NEXT: vsrl.vi v9, v8, 1 589; RV32I-NEXT: lui a0, 5 590; RV32I-NEXT: addi a0, a0, 1365 591; RV32I-NEXT: vand.vx v9, v9, a0 592; RV32I-NEXT: vsub.vv v8, v8, v9 593; RV32I-NEXT: lui a0, 3 594; RV32I-NEXT: addi a0, a0, 819 595; RV32I-NEXT: vand.vx v9, v8, a0 596; RV32I-NEXT: vsrl.vi v8, v8, 2 597; RV32I-NEXT: vand.vx v8, v8, a0 598; RV32I-NEXT: vadd.vv v8, v9, v8 599; RV32I-NEXT: vsrl.vi v9, v8, 4 600; RV32I-NEXT: vadd.vv v8, v8, v9 601; RV32I-NEXT: lui a0, 1 602; RV32I-NEXT: addi a0, a0, -241 603; RV32I-NEXT: vand.vx v8, v8, a0 604; RV32I-NEXT: li a0, 257 605; RV32I-NEXT: vmul.vx v8, v8, a0 606; RV32I-NEXT: vsrl.vi v8, v8, 8 607; RV32I-NEXT: ret 608; 609; RV64I-LABEL: ctlz_nxv2i16: 610; RV64I: # %bb.0: 611; RV64I-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 612; RV64I-NEXT: vsrl.vi v9, v8, 1 613; RV64I-NEXT: vor.vv v8, v8, v9 614; RV64I-NEXT: vsrl.vi v9, v8, 2 615; RV64I-NEXT: vor.vv v8, v8, v9 616; RV64I-NEXT: vsrl.vi v9, v8, 4 617; RV64I-NEXT: vor.vv v8, v8, v9 618; RV64I-NEXT: vsrl.vi v9, v8, 8 619; RV64I-NEXT: vor.vv v8, v8, v9 620; RV64I-NEXT: vnot.v v8, v8 621; RV64I-NEXT: vsrl.vi v9, v8, 1 622; RV64I-NEXT: lui a0, 5 623; RV64I-NEXT: addiw a0, a0, 1365 624; RV64I-NEXT: vand.vx v9, v9, a0 625; RV64I-NEXT: vsub.vv v8, v8, v9 626; RV64I-NEXT: lui a0, 3 627; RV64I-NEXT: addiw a0, a0, 819 628; RV64I-NEXT: vand.vx v9, v8, a0 629; RV64I-NEXT: vsrl.vi v8, v8, 2 630; RV64I-NEXT: vand.vx v8, v8, a0 631; RV64I-NEXT: vadd.vv v8, v9, v8 632; RV64I-NEXT: vsrl.vi v9, v8, 4 633; RV64I-NEXT: vadd.vv v8, v8, v9 634; RV64I-NEXT: lui a0, 1 635; RV64I-NEXT: addiw a0, a0, -241 636; RV64I-NEXT: vand.vx v8, v8, a0 637; RV64I-NEXT: li a0, 257 638; RV64I-NEXT: vmul.vx v8, v8, a0 639; RV64I-NEXT: vsrl.vi v8, v8, 8 640; RV64I-NEXT: ret 641; 642; RV32D-LABEL: ctlz_nxv2i16: 643; RV32D: # %bb.0: 644; RV32D-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 645; RV32D-NEXT: vfwcvt.f.xu.v v9, v8 646; RV32D-NEXT: vnsrl.wi v9, v9, 23 647; RV32D-NEXT: li a0, 142 648; RV32D-NEXT: vrsub.vx v9, v9, a0 649; RV32D-NEXT: vmseq.vi v0, v8, 0 650; RV32D-NEXT: li a0, 16 651; RV32D-NEXT: vmerge.vxm v8, v9, a0, v0 652; RV32D-NEXT: ret 653; 654; RV64D-LABEL: ctlz_nxv2i16: 655; RV64D: # %bb.0: 656; RV64D-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 657; RV64D-NEXT: vfwcvt.f.xu.v v9, v8 658; RV64D-NEXT: vnsrl.wi v9, v9, 23 659; RV64D-NEXT: li a0, 142 660; RV64D-NEXT: vrsub.vx v9, v9, a0 661; RV64D-NEXT: vmseq.vi v0, v8, 0 662; RV64D-NEXT: li a0, 16 663; RV64D-NEXT: vmerge.vxm v8, v9, a0, v0 664; RV64D-NEXT: ret 665 %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 false) 666 ret <vscale x 2 x i16> %a 667} 668declare <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16>, i1) 669 670define <vscale x 4 x i16> @ctlz_nxv4i16(<vscale x 4 x i16> %va) { 671; RV32I-LABEL: ctlz_nxv4i16: 672; RV32I: # %bb.0: 673; RV32I-NEXT: vsetvli a0, zero, e16, m1, ta, mu 674; RV32I-NEXT: vsrl.vi v9, v8, 1 675; RV32I-NEXT: vor.vv v8, v8, v9 676; RV32I-NEXT: vsrl.vi v9, v8, 2 677; RV32I-NEXT: vor.vv v8, v8, v9 678; RV32I-NEXT: vsrl.vi v9, v8, 4 679; RV32I-NEXT: vor.vv v8, v8, v9 680; RV32I-NEXT: vsrl.vi v9, v8, 8 681; RV32I-NEXT: vor.vv v8, v8, v9 682; RV32I-NEXT: vnot.v v8, v8 683; RV32I-NEXT: vsrl.vi v9, v8, 1 684; RV32I-NEXT: lui a0, 5 685; RV32I-NEXT: addi a0, a0, 1365 686; RV32I-NEXT: vand.vx v9, v9, a0 687; RV32I-NEXT: vsub.vv v8, v8, v9 688; RV32I-NEXT: lui a0, 3 689; RV32I-NEXT: addi a0, a0, 819 690; RV32I-NEXT: vand.vx v9, v8, a0 691; RV32I-NEXT: vsrl.vi v8, v8, 2 692; RV32I-NEXT: vand.vx v8, v8, a0 693; RV32I-NEXT: vadd.vv v8, v9, v8 694; RV32I-NEXT: vsrl.vi v9, v8, 4 695; RV32I-NEXT: vadd.vv v8, v8, v9 696; RV32I-NEXT: lui a0, 1 697; RV32I-NEXT: addi a0, a0, -241 698; RV32I-NEXT: vand.vx v8, v8, a0 699; RV32I-NEXT: li a0, 257 700; RV32I-NEXT: vmul.vx v8, v8, a0 701; RV32I-NEXT: vsrl.vi v8, v8, 8 702; RV32I-NEXT: ret 703; 704; RV64I-LABEL: ctlz_nxv4i16: 705; RV64I: # %bb.0: 706; RV64I-NEXT: vsetvli a0, zero, e16, m1, ta, mu 707; RV64I-NEXT: vsrl.vi v9, v8, 1 708; RV64I-NEXT: vor.vv v8, v8, v9 709; RV64I-NEXT: vsrl.vi v9, v8, 2 710; RV64I-NEXT: vor.vv v8, v8, v9 711; RV64I-NEXT: vsrl.vi v9, v8, 4 712; RV64I-NEXT: vor.vv v8, v8, v9 713; RV64I-NEXT: vsrl.vi v9, v8, 8 714; RV64I-NEXT: vor.vv v8, v8, v9 715; RV64I-NEXT: vnot.v v8, v8 716; RV64I-NEXT: vsrl.vi v9, v8, 1 717; RV64I-NEXT: lui a0, 5 718; RV64I-NEXT: addiw a0, a0, 1365 719; RV64I-NEXT: vand.vx v9, v9, a0 720; RV64I-NEXT: vsub.vv v8, v8, v9 721; RV64I-NEXT: lui a0, 3 722; RV64I-NEXT: addiw a0, a0, 819 723; RV64I-NEXT: vand.vx v9, v8, a0 724; RV64I-NEXT: vsrl.vi v8, v8, 2 725; RV64I-NEXT: vand.vx v8, v8, a0 726; RV64I-NEXT: vadd.vv v8, v9, v8 727; RV64I-NEXT: vsrl.vi v9, v8, 4 728; RV64I-NEXT: vadd.vv v8, v8, v9 729; RV64I-NEXT: lui a0, 1 730; RV64I-NEXT: addiw a0, a0, -241 731; RV64I-NEXT: vand.vx v8, v8, a0 732; RV64I-NEXT: li a0, 257 733; RV64I-NEXT: vmul.vx v8, v8, a0 734; RV64I-NEXT: vsrl.vi v8, v8, 8 735; RV64I-NEXT: ret 736; 737; RV32D-LABEL: ctlz_nxv4i16: 738; RV32D: # %bb.0: 739; RV32D-NEXT: vsetvli a0, zero, e16, m1, ta, mu 740; RV32D-NEXT: vfwcvt.f.xu.v v10, v8 741; RV32D-NEXT: vnsrl.wi v9, v10, 23 742; RV32D-NEXT: li a0, 142 743; RV32D-NEXT: vrsub.vx v9, v9, a0 744; RV32D-NEXT: vmseq.vi v0, v8, 0 745; RV32D-NEXT: li a0, 16 746; RV32D-NEXT: vmerge.vxm v8, v9, a0, v0 747; RV32D-NEXT: ret 748; 749; RV64D-LABEL: ctlz_nxv4i16: 750; RV64D: # %bb.0: 751; RV64D-NEXT: vsetvli a0, zero, e16, m1, ta, mu 752; RV64D-NEXT: vfwcvt.f.xu.v v10, v8 753; RV64D-NEXT: vnsrl.wi v9, v10, 23 754; RV64D-NEXT: li a0, 142 755; RV64D-NEXT: vrsub.vx v9, v9, a0 756; RV64D-NEXT: vmseq.vi v0, v8, 0 757; RV64D-NEXT: li a0, 16 758; RV64D-NEXT: vmerge.vxm v8, v9, a0, v0 759; RV64D-NEXT: ret 760 %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 false) 761 ret <vscale x 4 x i16> %a 762} 763declare <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16>, i1) 764 765define <vscale x 8 x i16> @ctlz_nxv8i16(<vscale x 8 x i16> %va) { 766; RV32I-LABEL: ctlz_nxv8i16: 767; RV32I: # %bb.0: 768; RV32I-NEXT: vsetvli a0, zero, e16, m2, ta, mu 769; RV32I-NEXT: vsrl.vi v10, v8, 1 770; RV32I-NEXT: vor.vv v8, v8, v10 771; RV32I-NEXT: vsrl.vi v10, v8, 2 772; RV32I-NEXT: vor.vv v8, v8, v10 773; RV32I-NEXT: vsrl.vi v10, v8, 4 774; RV32I-NEXT: vor.vv v8, v8, v10 775; RV32I-NEXT: vsrl.vi v10, v8, 8 776; RV32I-NEXT: vor.vv v8, v8, v10 777; RV32I-NEXT: vnot.v v8, v8 778; RV32I-NEXT: vsrl.vi v10, v8, 1 779; RV32I-NEXT: lui a0, 5 780; RV32I-NEXT: addi a0, a0, 1365 781; RV32I-NEXT: vand.vx v10, v10, a0 782; RV32I-NEXT: vsub.vv v8, v8, v10 783; RV32I-NEXT: lui a0, 3 784; RV32I-NEXT: addi a0, a0, 819 785; RV32I-NEXT: vand.vx v10, v8, a0 786; RV32I-NEXT: vsrl.vi v8, v8, 2 787; RV32I-NEXT: vand.vx v8, v8, a0 788; RV32I-NEXT: vadd.vv v8, v10, v8 789; RV32I-NEXT: vsrl.vi v10, v8, 4 790; RV32I-NEXT: vadd.vv v8, v8, v10 791; RV32I-NEXT: lui a0, 1 792; RV32I-NEXT: addi a0, a0, -241 793; RV32I-NEXT: vand.vx v8, v8, a0 794; RV32I-NEXT: li a0, 257 795; RV32I-NEXT: vmul.vx v8, v8, a0 796; RV32I-NEXT: vsrl.vi v8, v8, 8 797; RV32I-NEXT: ret 798; 799; RV64I-LABEL: ctlz_nxv8i16: 800; RV64I: # %bb.0: 801; RV64I-NEXT: vsetvli a0, zero, e16, m2, ta, mu 802; RV64I-NEXT: vsrl.vi v10, v8, 1 803; RV64I-NEXT: vor.vv v8, v8, v10 804; RV64I-NEXT: vsrl.vi v10, v8, 2 805; RV64I-NEXT: vor.vv v8, v8, v10 806; RV64I-NEXT: vsrl.vi v10, v8, 4 807; RV64I-NEXT: vor.vv v8, v8, v10 808; RV64I-NEXT: vsrl.vi v10, v8, 8 809; RV64I-NEXT: vor.vv v8, v8, v10 810; RV64I-NEXT: vnot.v v8, v8 811; RV64I-NEXT: vsrl.vi v10, v8, 1 812; RV64I-NEXT: lui a0, 5 813; RV64I-NEXT: addiw a0, a0, 1365 814; RV64I-NEXT: vand.vx v10, v10, a0 815; RV64I-NEXT: vsub.vv v8, v8, v10 816; RV64I-NEXT: lui a0, 3 817; RV64I-NEXT: addiw a0, a0, 819 818; RV64I-NEXT: vand.vx v10, v8, a0 819; RV64I-NEXT: vsrl.vi v8, v8, 2 820; RV64I-NEXT: vand.vx v8, v8, a0 821; RV64I-NEXT: vadd.vv v8, v10, v8 822; RV64I-NEXT: vsrl.vi v10, v8, 4 823; RV64I-NEXT: vadd.vv v8, v8, v10 824; RV64I-NEXT: lui a0, 1 825; RV64I-NEXT: addiw a0, a0, -241 826; RV64I-NEXT: vand.vx v8, v8, a0 827; RV64I-NEXT: li a0, 257 828; RV64I-NEXT: vmul.vx v8, v8, a0 829; RV64I-NEXT: vsrl.vi v8, v8, 8 830; RV64I-NEXT: ret 831; 832; RV32D-LABEL: ctlz_nxv8i16: 833; RV32D: # %bb.0: 834; RV32D-NEXT: vsetvli a0, zero, e16, m2, ta, mu 835; RV32D-NEXT: vfwcvt.f.xu.v v12, v8 836; RV32D-NEXT: vnsrl.wi v10, v12, 23 837; RV32D-NEXT: li a0, 142 838; RV32D-NEXT: vrsub.vx v10, v10, a0 839; RV32D-NEXT: vmseq.vi v0, v8, 0 840; RV32D-NEXT: li a0, 16 841; RV32D-NEXT: vmerge.vxm v8, v10, a0, v0 842; RV32D-NEXT: ret 843; 844; RV64D-LABEL: ctlz_nxv8i16: 845; RV64D: # %bb.0: 846; RV64D-NEXT: vsetvli a0, zero, e16, m2, ta, mu 847; RV64D-NEXT: vfwcvt.f.xu.v v12, v8 848; RV64D-NEXT: vnsrl.wi v10, v12, 23 849; RV64D-NEXT: li a0, 142 850; RV64D-NEXT: vrsub.vx v10, v10, a0 851; RV64D-NEXT: vmseq.vi v0, v8, 0 852; RV64D-NEXT: li a0, 16 853; RV64D-NEXT: vmerge.vxm v8, v10, a0, v0 854; RV64D-NEXT: ret 855 %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 false) 856 ret <vscale x 8 x i16> %a 857} 858declare <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16>, i1) 859 860define <vscale x 16 x i16> @ctlz_nxv16i16(<vscale x 16 x i16> %va) { 861; RV32I-LABEL: ctlz_nxv16i16: 862; RV32I: # %bb.0: 863; RV32I-NEXT: vsetvli a0, zero, e16, m4, ta, mu 864; RV32I-NEXT: vsrl.vi v12, v8, 1 865; RV32I-NEXT: vor.vv v8, v8, v12 866; RV32I-NEXT: vsrl.vi v12, v8, 2 867; RV32I-NEXT: vor.vv v8, v8, v12 868; RV32I-NEXT: vsrl.vi v12, v8, 4 869; RV32I-NEXT: vor.vv v8, v8, v12 870; RV32I-NEXT: vsrl.vi v12, v8, 8 871; RV32I-NEXT: vor.vv v8, v8, v12 872; RV32I-NEXT: vnot.v v8, v8 873; RV32I-NEXT: vsrl.vi v12, v8, 1 874; RV32I-NEXT: lui a0, 5 875; RV32I-NEXT: addi a0, a0, 1365 876; RV32I-NEXT: vand.vx v12, v12, a0 877; RV32I-NEXT: vsub.vv v8, v8, v12 878; RV32I-NEXT: lui a0, 3 879; RV32I-NEXT: addi a0, a0, 819 880; RV32I-NEXT: vand.vx v12, v8, a0 881; RV32I-NEXT: vsrl.vi v8, v8, 2 882; RV32I-NEXT: vand.vx v8, v8, a0 883; RV32I-NEXT: vadd.vv v8, v12, v8 884; RV32I-NEXT: vsrl.vi v12, v8, 4 885; RV32I-NEXT: vadd.vv v8, v8, v12 886; RV32I-NEXT: lui a0, 1 887; RV32I-NEXT: addi a0, a0, -241 888; RV32I-NEXT: vand.vx v8, v8, a0 889; RV32I-NEXT: li a0, 257 890; RV32I-NEXT: vmul.vx v8, v8, a0 891; RV32I-NEXT: vsrl.vi v8, v8, 8 892; RV32I-NEXT: ret 893; 894; RV64I-LABEL: ctlz_nxv16i16: 895; RV64I: # %bb.0: 896; RV64I-NEXT: vsetvli a0, zero, e16, m4, ta, mu 897; RV64I-NEXT: vsrl.vi v12, v8, 1 898; RV64I-NEXT: vor.vv v8, v8, v12 899; RV64I-NEXT: vsrl.vi v12, v8, 2 900; RV64I-NEXT: vor.vv v8, v8, v12 901; RV64I-NEXT: vsrl.vi v12, v8, 4 902; RV64I-NEXT: vor.vv v8, v8, v12 903; RV64I-NEXT: vsrl.vi v12, v8, 8 904; RV64I-NEXT: vor.vv v8, v8, v12 905; RV64I-NEXT: vnot.v v8, v8 906; RV64I-NEXT: vsrl.vi v12, v8, 1 907; RV64I-NEXT: lui a0, 5 908; RV64I-NEXT: addiw a0, a0, 1365 909; RV64I-NEXT: vand.vx v12, v12, a0 910; RV64I-NEXT: vsub.vv v8, v8, v12 911; RV64I-NEXT: lui a0, 3 912; RV64I-NEXT: addiw a0, a0, 819 913; RV64I-NEXT: vand.vx v12, v8, a0 914; RV64I-NEXT: vsrl.vi v8, v8, 2 915; RV64I-NEXT: vand.vx v8, v8, a0 916; RV64I-NEXT: vadd.vv v8, v12, v8 917; RV64I-NEXT: vsrl.vi v12, v8, 4 918; RV64I-NEXT: vadd.vv v8, v8, v12 919; RV64I-NEXT: lui a0, 1 920; RV64I-NEXT: addiw a0, a0, -241 921; RV64I-NEXT: vand.vx v8, v8, a0 922; RV64I-NEXT: li a0, 257 923; RV64I-NEXT: vmul.vx v8, v8, a0 924; RV64I-NEXT: vsrl.vi v8, v8, 8 925; RV64I-NEXT: ret 926; 927; RV32D-LABEL: ctlz_nxv16i16: 928; RV32D: # %bb.0: 929; RV32D-NEXT: vsetvli a0, zero, e16, m4, ta, mu 930; RV32D-NEXT: vfwcvt.f.xu.v v16, v8 931; RV32D-NEXT: vnsrl.wi v12, v16, 23 932; RV32D-NEXT: li a0, 142 933; RV32D-NEXT: vrsub.vx v12, v12, a0 934; RV32D-NEXT: vmseq.vi v0, v8, 0 935; RV32D-NEXT: li a0, 16 936; RV32D-NEXT: vmerge.vxm v8, v12, a0, v0 937; RV32D-NEXT: ret 938; 939; RV64D-LABEL: ctlz_nxv16i16: 940; RV64D: # %bb.0: 941; RV64D-NEXT: vsetvli a0, zero, e16, m4, ta, mu 942; RV64D-NEXT: vfwcvt.f.xu.v v16, v8 943; RV64D-NEXT: vnsrl.wi v12, v16, 23 944; RV64D-NEXT: li a0, 142 945; RV64D-NEXT: vrsub.vx v12, v12, a0 946; RV64D-NEXT: vmseq.vi v0, v8, 0 947; RV64D-NEXT: li a0, 16 948; RV64D-NEXT: vmerge.vxm v8, v12, a0, v0 949; RV64D-NEXT: ret 950 %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 false) 951 ret <vscale x 16 x i16> %a 952} 953declare <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16>, i1) 954 955define <vscale x 32 x i16> @ctlz_nxv32i16(<vscale x 32 x i16> %va) { 956; RV32-LABEL: ctlz_nxv32i16: 957; RV32: # %bb.0: 958; RV32-NEXT: vsetvli a0, zero, e16, m8, ta, mu 959; RV32-NEXT: vsrl.vi v16, v8, 1 960; RV32-NEXT: vor.vv v8, v8, v16 961; RV32-NEXT: vsrl.vi v16, v8, 2 962; RV32-NEXT: vor.vv v8, v8, v16 963; RV32-NEXT: vsrl.vi v16, v8, 4 964; RV32-NEXT: vor.vv v8, v8, v16 965; RV32-NEXT: vsrl.vi v16, v8, 8 966; RV32-NEXT: vor.vv v8, v8, v16 967; RV32-NEXT: vnot.v v8, v8 968; RV32-NEXT: vsrl.vi v16, v8, 1 969; RV32-NEXT: lui a0, 5 970; RV32-NEXT: addi a0, a0, 1365 971; RV32-NEXT: vand.vx v16, v16, a0 972; RV32-NEXT: vsub.vv v8, v8, v16 973; RV32-NEXT: lui a0, 3 974; RV32-NEXT: addi a0, a0, 819 975; RV32-NEXT: vand.vx v16, v8, a0 976; RV32-NEXT: vsrl.vi v8, v8, 2 977; RV32-NEXT: vand.vx v8, v8, a0 978; RV32-NEXT: vadd.vv v8, v16, v8 979; RV32-NEXT: vsrl.vi v16, v8, 4 980; RV32-NEXT: vadd.vv v8, v8, v16 981; RV32-NEXT: lui a0, 1 982; RV32-NEXT: addi a0, a0, -241 983; RV32-NEXT: vand.vx v8, v8, a0 984; RV32-NEXT: li a0, 257 985; RV32-NEXT: vmul.vx v8, v8, a0 986; RV32-NEXT: vsrl.vi v8, v8, 8 987; RV32-NEXT: ret 988; 989; RV64-LABEL: ctlz_nxv32i16: 990; RV64: # %bb.0: 991; RV64-NEXT: vsetvli a0, zero, e16, m8, ta, mu 992; RV64-NEXT: vsrl.vi v16, v8, 1 993; RV64-NEXT: vor.vv v8, v8, v16 994; RV64-NEXT: vsrl.vi v16, v8, 2 995; RV64-NEXT: vor.vv v8, v8, v16 996; RV64-NEXT: vsrl.vi v16, v8, 4 997; RV64-NEXT: vor.vv v8, v8, v16 998; RV64-NEXT: vsrl.vi v16, v8, 8 999; RV64-NEXT: vor.vv v8, v8, v16 1000; RV64-NEXT: vnot.v v8, v8 1001; RV64-NEXT: vsrl.vi v16, v8, 1 1002; RV64-NEXT: lui a0, 5 1003; RV64-NEXT: addiw a0, a0, 1365 1004; RV64-NEXT: vand.vx v16, v16, a0 1005; RV64-NEXT: vsub.vv v8, v8, v16 1006; RV64-NEXT: lui a0, 3 1007; RV64-NEXT: addiw a0, a0, 819 1008; RV64-NEXT: vand.vx v16, v8, a0 1009; RV64-NEXT: vsrl.vi v8, v8, 2 1010; RV64-NEXT: vand.vx v8, v8, a0 1011; RV64-NEXT: vadd.vv v8, v16, v8 1012; RV64-NEXT: vsrl.vi v16, v8, 4 1013; RV64-NEXT: vadd.vv v8, v8, v16 1014; RV64-NEXT: lui a0, 1 1015; RV64-NEXT: addiw a0, a0, -241 1016; RV64-NEXT: vand.vx v8, v8, a0 1017; RV64-NEXT: li a0, 257 1018; RV64-NEXT: vmul.vx v8, v8, a0 1019; RV64-NEXT: vsrl.vi v8, v8, 8 1020; RV64-NEXT: ret 1021 %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 false) 1022 ret <vscale x 32 x i16> %a 1023} 1024declare <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16>, i1) 1025 1026define <vscale x 1 x i32> @ctlz_nxv1i32(<vscale x 1 x i32> %va) { 1027; RV32I-LABEL: ctlz_nxv1i32: 1028; RV32I: # %bb.0: 1029; RV32I-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1030; RV32I-NEXT: vsrl.vi v9, v8, 1 1031; RV32I-NEXT: vor.vv v8, v8, v9 1032; RV32I-NEXT: vsrl.vi v9, v8, 2 1033; RV32I-NEXT: vor.vv v8, v8, v9 1034; RV32I-NEXT: vsrl.vi v9, v8, 4 1035; RV32I-NEXT: vor.vv v8, v8, v9 1036; RV32I-NEXT: vsrl.vi v9, v8, 8 1037; RV32I-NEXT: vor.vv v8, v8, v9 1038; RV32I-NEXT: vsrl.vi v9, v8, 16 1039; RV32I-NEXT: vor.vv v8, v8, v9 1040; RV32I-NEXT: vnot.v v8, v8 1041; RV32I-NEXT: vsrl.vi v9, v8, 1 1042; RV32I-NEXT: lui a0, 349525 1043; RV32I-NEXT: addi a0, a0, 1365 1044; RV32I-NEXT: vand.vx v9, v9, a0 1045; RV32I-NEXT: vsub.vv v8, v8, v9 1046; RV32I-NEXT: lui a0, 209715 1047; RV32I-NEXT: addi a0, a0, 819 1048; RV32I-NEXT: vand.vx v9, v8, a0 1049; RV32I-NEXT: vsrl.vi v8, v8, 2 1050; RV32I-NEXT: vand.vx v8, v8, a0 1051; RV32I-NEXT: vadd.vv v8, v9, v8 1052; RV32I-NEXT: vsrl.vi v9, v8, 4 1053; RV32I-NEXT: vadd.vv v8, v8, v9 1054; RV32I-NEXT: lui a0, 61681 1055; RV32I-NEXT: addi a0, a0, -241 1056; RV32I-NEXT: vand.vx v8, v8, a0 1057; RV32I-NEXT: lui a0, 4112 1058; RV32I-NEXT: addi a0, a0, 257 1059; RV32I-NEXT: vmul.vx v8, v8, a0 1060; RV32I-NEXT: vsrl.vi v8, v8, 24 1061; RV32I-NEXT: ret 1062; 1063; RV64I-LABEL: ctlz_nxv1i32: 1064; RV64I: # %bb.0: 1065; RV64I-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1066; RV64I-NEXT: vsrl.vi v9, v8, 1 1067; RV64I-NEXT: vor.vv v8, v8, v9 1068; RV64I-NEXT: vsrl.vi v9, v8, 2 1069; RV64I-NEXT: vor.vv v8, v8, v9 1070; RV64I-NEXT: vsrl.vi v9, v8, 4 1071; RV64I-NEXT: vor.vv v8, v8, v9 1072; RV64I-NEXT: vsrl.vi v9, v8, 8 1073; RV64I-NEXT: vor.vv v8, v8, v9 1074; RV64I-NEXT: vsrl.vi v9, v8, 16 1075; RV64I-NEXT: vor.vv v8, v8, v9 1076; RV64I-NEXT: vnot.v v8, v8 1077; RV64I-NEXT: vsrl.vi v9, v8, 1 1078; RV64I-NEXT: lui a0, 349525 1079; RV64I-NEXT: addiw a0, a0, 1365 1080; RV64I-NEXT: vand.vx v9, v9, a0 1081; RV64I-NEXT: vsub.vv v8, v8, v9 1082; RV64I-NEXT: lui a0, 209715 1083; RV64I-NEXT: addiw a0, a0, 819 1084; RV64I-NEXT: vand.vx v9, v8, a0 1085; RV64I-NEXT: vsrl.vi v8, v8, 2 1086; RV64I-NEXT: vand.vx v8, v8, a0 1087; RV64I-NEXT: vadd.vv v8, v9, v8 1088; RV64I-NEXT: vsrl.vi v9, v8, 4 1089; RV64I-NEXT: vadd.vv v8, v8, v9 1090; RV64I-NEXT: lui a0, 61681 1091; RV64I-NEXT: addiw a0, a0, -241 1092; RV64I-NEXT: vand.vx v8, v8, a0 1093; RV64I-NEXT: lui a0, 4112 1094; RV64I-NEXT: addiw a0, a0, 257 1095; RV64I-NEXT: vmul.vx v8, v8, a0 1096; RV64I-NEXT: vsrl.vi v8, v8, 24 1097; RV64I-NEXT: ret 1098; 1099; RV32D-LABEL: ctlz_nxv1i32: 1100; RV32D: # %bb.0: 1101; RV32D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1102; RV32D-NEXT: vfwcvt.f.xu.v v9, v8 1103; RV32D-NEXT: li a0, 52 1104; RV32D-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1105; RV32D-NEXT: vsrl.vx v9, v9, a0 1106; RV32D-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 1107; RV32D-NEXT: vncvt.x.x.w v9, v9 1108; RV32D-NEXT: li a0, 1054 1109; RV32D-NEXT: vrsub.vx v9, v9, a0 1110; RV32D-NEXT: vmseq.vi v0, v8, 0 1111; RV32D-NEXT: li a0, 32 1112; RV32D-NEXT: vmerge.vxm v8, v9, a0, v0 1113; RV32D-NEXT: ret 1114; 1115; RV64D-LABEL: ctlz_nxv1i32: 1116; RV64D: # %bb.0: 1117; RV64D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 1118; RV64D-NEXT: vfwcvt.f.xu.v v9, v8 1119; RV64D-NEXT: li a0, 52 1120; RV64D-NEXT: vsetvli zero, zero, e64, m1, ta, mu 1121; RV64D-NEXT: vsrl.vx v9, v9, a0 1122; RV64D-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 1123; RV64D-NEXT: vncvt.x.x.w v9, v9 1124; RV64D-NEXT: li a0, 1054 1125; RV64D-NEXT: vrsub.vx v9, v9, a0 1126; RV64D-NEXT: vmseq.vi v0, v8, 0 1127; RV64D-NEXT: li a0, 32 1128; RV64D-NEXT: vmerge.vxm v8, v9, a0, v0 1129; RV64D-NEXT: ret 1130 %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 false) 1131 ret <vscale x 1 x i32> %a 1132} 1133declare <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32>, i1) 1134 1135define <vscale x 2 x i32> @ctlz_nxv2i32(<vscale x 2 x i32> %va) { 1136; RV32I-LABEL: ctlz_nxv2i32: 1137; RV32I: # %bb.0: 1138; RV32I-NEXT: vsetvli a0, zero, e32, m1, ta, mu 1139; RV32I-NEXT: vsrl.vi v9, v8, 1 1140; RV32I-NEXT: vor.vv v8, v8, v9 1141; RV32I-NEXT: vsrl.vi v9, v8, 2 1142; RV32I-NEXT: vor.vv v8, v8, v9 1143; RV32I-NEXT: vsrl.vi v9, v8, 4 1144; RV32I-NEXT: vor.vv v8, v8, v9 1145; RV32I-NEXT: vsrl.vi v9, v8, 8 1146; RV32I-NEXT: vor.vv v8, v8, v9 1147; RV32I-NEXT: vsrl.vi v9, v8, 16 1148; RV32I-NEXT: vor.vv v8, v8, v9 1149; RV32I-NEXT: vnot.v v8, v8 1150; RV32I-NEXT: vsrl.vi v9, v8, 1 1151; RV32I-NEXT: lui a0, 349525 1152; RV32I-NEXT: addi a0, a0, 1365 1153; RV32I-NEXT: vand.vx v9, v9, a0 1154; RV32I-NEXT: vsub.vv v8, v8, v9 1155; RV32I-NEXT: lui a0, 209715 1156; RV32I-NEXT: addi a0, a0, 819 1157; RV32I-NEXT: vand.vx v9, v8, a0 1158; RV32I-NEXT: vsrl.vi v8, v8, 2 1159; RV32I-NEXT: vand.vx v8, v8, a0 1160; RV32I-NEXT: vadd.vv v8, v9, v8 1161; RV32I-NEXT: vsrl.vi v9, v8, 4 1162; RV32I-NEXT: vadd.vv v8, v8, v9 1163; RV32I-NEXT: lui a0, 61681 1164; RV32I-NEXT: addi a0, a0, -241 1165; RV32I-NEXT: vand.vx v8, v8, a0 1166; RV32I-NEXT: lui a0, 4112 1167; RV32I-NEXT: addi a0, a0, 257 1168; RV32I-NEXT: vmul.vx v8, v8, a0 1169; RV32I-NEXT: vsrl.vi v8, v8, 24 1170; RV32I-NEXT: ret 1171; 1172; RV64I-LABEL: ctlz_nxv2i32: 1173; RV64I: # %bb.0: 1174; RV64I-NEXT: vsetvli a0, zero, e32, m1, ta, mu 1175; RV64I-NEXT: vsrl.vi v9, v8, 1 1176; RV64I-NEXT: vor.vv v8, v8, v9 1177; RV64I-NEXT: vsrl.vi v9, v8, 2 1178; RV64I-NEXT: vor.vv v8, v8, v9 1179; RV64I-NEXT: vsrl.vi v9, v8, 4 1180; RV64I-NEXT: vor.vv v8, v8, v9 1181; RV64I-NEXT: vsrl.vi v9, v8, 8 1182; RV64I-NEXT: vor.vv v8, v8, v9 1183; RV64I-NEXT: vsrl.vi v9, v8, 16 1184; RV64I-NEXT: vor.vv v8, v8, v9 1185; RV64I-NEXT: vnot.v v8, v8 1186; RV64I-NEXT: vsrl.vi v9, v8, 1 1187; RV64I-NEXT: lui a0, 349525 1188; RV64I-NEXT: addiw a0, a0, 1365 1189; RV64I-NEXT: vand.vx v9, v9, a0 1190; RV64I-NEXT: vsub.vv v8, v8, v9 1191; RV64I-NEXT: lui a0, 209715 1192; RV64I-NEXT: addiw a0, a0, 819 1193; RV64I-NEXT: vand.vx v9, v8, a0 1194; RV64I-NEXT: vsrl.vi v8, v8, 2 1195; RV64I-NEXT: vand.vx v8, v8, a0 1196; RV64I-NEXT: vadd.vv v8, v9, v8 1197; RV64I-NEXT: vsrl.vi v9, v8, 4 1198; RV64I-NEXT: vadd.vv v8, v8, v9 1199; RV64I-NEXT: lui a0, 61681 1200; RV64I-NEXT: addiw a0, a0, -241 1201; RV64I-NEXT: vand.vx v8, v8, a0 1202; RV64I-NEXT: lui a0, 4112 1203; RV64I-NEXT: addiw a0, a0, 257 1204; RV64I-NEXT: vmul.vx v8, v8, a0 1205; RV64I-NEXT: vsrl.vi v8, v8, 24 1206; RV64I-NEXT: ret 1207; 1208; RV32D-LABEL: ctlz_nxv2i32: 1209; RV32D: # %bb.0: 1210; RV32D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 1211; RV32D-NEXT: vfwcvt.f.xu.v v10, v8 1212; RV32D-NEXT: li a0, 52 1213; RV32D-NEXT: vsetvli zero, zero, e64, m2, ta, mu 1214; RV32D-NEXT: vsrl.vx v10, v10, a0 1215; RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu 1216; RV32D-NEXT: vncvt.x.x.w v9, v10 1217; RV32D-NEXT: li a0, 1054 1218; RV32D-NEXT: vrsub.vx v9, v9, a0 1219; RV32D-NEXT: vmseq.vi v0, v8, 0 1220; RV32D-NEXT: li a0, 32 1221; RV32D-NEXT: vmerge.vxm v8, v9, a0, v0 1222; RV32D-NEXT: ret 1223; 1224; RV64D-LABEL: ctlz_nxv2i32: 1225; RV64D: # %bb.0: 1226; RV64D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 1227; RV64D-NEXT: vfwcvt.f.xu.v v10, v8 1228; RV64D-NEXT: li a0, 52 1229; RV64D-NEXT: vsetvli zero, zero, e64, m2, ta, mu 1230; RV64D-NEXT: vsrl.vx v10, v10, a0 1231; RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu 1232; RV64D-NEXT: vncvt.x.x.w v9, v10 1233; RV64D-NEXT: li a0, 1054 1234; RV64D-NEXT: vrsub.vx v9, v9, a0 1235; RV64D-NEXT: vmseq.vi v0, v8, 0 1236; RV64D-NEXT: li a0, 32 1237; RV64D-NEXT: vmerge.vxm v8, v9, a0, v0 1238; RV64D-NEXT: ret 1239 %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 false) 1240 ret <vscale x 2 x i32> %a 1241} 1242declare <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32>, i1) 1243 1244define <vscale x 4 x i32> @ctlz_nxv4i32(<vscale x 4 x i32> %va) { 1245; RV32I-LABEL: ctlz_nxv4i32: 1246; RV32I: # %bb.0: 1247; RV32I-NEXT: vsetvli a0, zero, e32, m2, ta, mu 1248; RV32I-NEXT: vsrl.vi v10, v8, 1 1249; RV32I-NEXT: vor.vv v8, v8, v10 1250; RV32I-NEXT: vsrl.vi v10, v8, 2 1251; RV32I-NEXT: vor.vv v8, v8, v10 1252; RV32I-NEXT: vsrl.vi v10, v8, 4 1253; RV32I-NEXT: vor.vv v8, v8, v10 1254; RV32I-NEXT: vsrl.vi v10, v8, 8 1255; RV32I-NEXT: vor.vv v8, v8, v10 1256; RV32I-NEXT: vsrl.vi v10, v8, 16 1257; RV32I-NEXT: vor.vv v8, v8, v10 1258; RV32I-NEXT: vnot.v v8, v8 1259; RV32I-NEXT: vsrl.vi v10, v8, 1 1260; RV32I-NEXT: lui a0, 349525 1261; RV32I-NEXT: addi a0, a0, 1365 1262; RV32I-NEXT: vand.vx v10, v10, a0 1263; RV32I-NEXT: vsub.vv v8, v8, v10 1264; RV32I-NEXT: lui a0, 209715 1265; RV32I-NEXT: addi a0, a0, 819 1266; RV32I-NEXT: vand.vx v10, v8, a0 1267; RV32I-NEXT: vsrl.vi v8, v8, 2 1268; RV32I-NEXT: vand.vx v8, v8, a0 1269; RV32I-NEXT: vadd.vv v8, v10, v8 1270; RV32I-NEXT: vsrl.vi v10, v8, 4 1271; RV32I-NEXT: vadd.vv v8, v8, v10 1272; RV32I-NEXT: lui a0, 61681 1273; RV32I-NEXT: addi a0, a0, -241 1274; RV32I-NEXT: vand.vx v8, v8, a0 1275; RV32I-NEXT: lui a0, 4112 1276; RV32I-NEXT: addi a0, a0, 257 1277; RV32I-NEXT: vmul.vx v8, v8, a0 1278; RV32I-NEXT: vsrl.vi v8, v8, 24 1279; RV32I-NEXT: ret 1280; 1281; RV64I-LABEL: ctlz_nxv4i32: 1282; RV64I: # %bb.0: 1283; RV64I-NEXT: vsetvli a0, zero, e32, m2, ta, mu 1284; RV64I-NEXT: vsrl.vi v10, v8, 1 1285; RV64I-NEXT: vor.vv v8, v8, v10 1286; RV64I-NEXT: vsrl.vi v10, v8, 2 1287; RV64I-NEXT: vor.vv v8, v8, v10 1288; RV64I-NEXT: vsrl.vi v10, v8, 4 1289; RV64I-NEXT: vor.vv v8, v8, v10 1290; RV64I-NEXT: vsrl.vi v10, v8, 8 1291; RV64I-NEXT: vor.vv v8, v8, v10 1292; RV64I-NEXT: vsrl.vi v10, v8, 16 1293; RV64I-NEXT: vor.vv v8, v8, v10 1294; RV64I-NEXT: vnot.v v8, v8 1295; RV64I-NEXT: vsrl.vi v10, v8, 1 1296; RV64I-NEXT: lui a0, 349525 1297; RV64I-NEXT: addiw a0, a0, 1365 1298; RV64I-NEXT: vand.vx v10, v10, a0 1299; RV64I-NEXT: vsub.vv v8, v8, v10 1300; RV64I-NEXT: lui a0, 209715 1301; RV64I-NEXT: addiw a0, a0, 819 1302; RV64I-NEXT: vand.vx v10, v8, a0 1303; RV64I-NEXT: vsrl.vi v8, v8, 2 1304; RV64I-NEXT: vand.vx v8, v8, a0 1305; RV64I-NEXT: vadd.vv v8, v10, v8 1306; RV64I-NEXT: vsrl.vi v10, v8, 4 1307; RV64I-NEXT: vadd.vv v8, v8, v10 1308; RV64I-NEXT: lui a0, 61681 1309; RV64I-NEXT: addiw a0, a0, -241 1310; RV64I-NEXT: vand.vx v8, v8, a0 1311; RV64I-NEXT: lui a0, 4112 1312; RV64I-NEXT: addiw a0, a0, 257 1313; RV64I-NEXT: vmul.vx v8, v8, a0 1314; RV64I-NEXT: vsrl.vi v8, v8, 24 1315; RV64I-NEXT: ret 1316; 1317; RV32D-LABEL: ctlz_nxv4i32: 1318; RV32D: # %bb.0: 1319; RV32D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 1320; RV32D-NEXT: vfwcvt.f.xu.v v12, v8 1321; RV32D-NEXT: li a0, 52 1322; RV32D-NEXT: vsetvli zero, zero, e64, m4, ta, mu 1323; RV32D-NEXT: vsrl.vx v12, v12, a0 1324; RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu 1325; RV32D-NEXT: vncvt.x.x.w v10, v12 1326; RV32D-NEXT: li a0, 1054 1327; RV32D-NEXT: vrsub.vx v10, v10, a0 1328; RV32D-NEXT: vmseq.vi v0, v8, 0 1329; RV32D-NEXT: li a0, 32 1330; RV32D-NEXT: vmerge.vxm v8, v10, a0, v0 1331; RV32D-NEXT: ret 1332; 1333; RV64D-LABEL: ctlz_nxv4i32: 1334; RV64D: # %bb.0: 1335; RV64D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 1336; RV64D-NEXT: vfwcvt.f.xu.v v12, v8 1337; RV64D-NEXT: li a0, 52 1338; RV64D-NEXT: vsetvli zero, zero, e64, m4, ta, mu 1339; RV64D-NEXT: vsrl.vx v12, v12, a0 1340; RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu 1341; RV64D-NEXT: vncvt.x.x.w v10, v12 1342; RV64D-NEXT: li a0, 1054 1343; RV64D-NEXT: vrsub.vx v10, v10, a0 1344; RV64D-NEXT: vmseq.vi v0, v8, 0 1345; RV64D-NEXT: li a0, 32 1346; RV64D-NEXT: vmerge.vxm v8, v10, a0, v0 1347; RV64D-NEXT: ret 1348 %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 false) 1349 ret <vscale x 4 x i32> %a 1350} 1351declare <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32>, i1) 1352 1353define <vscale x 8 x i32> @ctlz_nxv8i32(<vscale x 8 x i32> %va) { 1354; RV32I-LABEL: ctlz_nxv8i32: 1355; RV32I: # %bb.0: 1356; RV32I-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1357; RV32I-NEXT: vsrl.vi v12, v8, 1 1358; RV32I-NEXT: vor.vv v8, v8, v12 1359; RV32I-NEXT: vsrl.vi v12, v8, 2 1360; RV32I-NEXT: vor.vv v8, v8, v12 1361; RV32I-NEXT: vsrl.vi v12, v8, 4 1362; RV32I-NEXT: vor.vv v8, v8, v12 1363; RV32I-NEXT: vsrl.vi v12, v8, 8 1364; RV32I-NEXT: vor.vv v8, v8, v12 1365; RV32I-NEXT: vsrl.vi v12, v8, 16 1366; RV32I-NEXT: vor.vv v8, v8, v12 1367; RV32I-NEXT: vnot.v v8, v8 1368; RV32I-NEXT: vsrl.vi v12, v8, 1 1369; RV32I-NEXT: lui a0, 349525 1370; RV32I-NEXT: addi a0, a0, 1365 1371; RV32I-NEXT: vand.vx v12, v12, a0 1372; RV32I-NEXT: vsub.vv v8, v8, v12 1373; RV32I-NEXT: lui a0, 209715 1374; RV32I-NEXT: addi a0, a0, 819 1375; RV32I-NEXT: vand.vx v12, v8, a0 1376; RV32I-NEXT: vsrl.vi v8, v8, 2 1377; RV32I-NEXT: vand.vx v8, v8, a0 1378; RV32I-NEXT: vadd.vv v8, v12, v8 1379; RV32I-NEXT: vsrl.vi v12, v8, 4 1380; RV32I-NEXT: vadd.vv v8, v8, v12 1381; RV32I-NEXT: lui a0, 61681 1382; RV32I-NEXT: addi a0, a0, -241 1383; RV32I-NEXT: vand.vx v8, v8, a0 1384; RV32I-NEXT: lui a0, 4112 1385; RV32I-NEXT: addi a0, a0, 257 1386; RV32I-NEXT: vmul.vx v8, v8, a0 1387; RV32I-NEXT: vsrl.vi v8, v8, 24 1388; RV32I-NEXT: ret 1389; 1390; RV64I-LABEL: ctlz_nxv8i32: 1391; RV64I: # %bb.0: 1392; RV64I-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1393; RV64I-NEXT: vsrl.vi v12, v8, 1 1394; RV64I-NEXT: vor.vv v8, v8, v12 1395; RV64I-NEXT: vsrl.vi v12, v8, 2 1396; RV64I-NEXT: vor.vv v8, v8, v12 1397; RV64I-NEXT: vsrl.vi v12, v8, 4 1398; RV64I-NEXT: vor.vv v8, v8, v12 1399; RV64I-NEXT: vsrl.vi v12, v8, 8 1400; RV64I-NEXT: vor.vv v8, v8, v12 1401; RV64I-NEXT: vsrl.vi v12, v8, 16 1402; RV64I-NEXT: vor.vv v8, v8, v12 1403; RV64I-NEXT: vnot.v v8, v8 1404; RV64I-NEXT: vsrl.vi v12, v8, 1 1405; RV64I-NEXT: lui a0, 349525 1406; RV64I-NEXT: addiw a0, a0, 1365 1407; RV64I-NEXT: vand.vx v12, v12, a0 1408; RV64I-NEXT: vsub.vv v8, v8, v12 1409; RV64I-NEXT: lui a0, 209715 1410; RV64I-NEXT: addiw a0, a0, 819 1411; RV64I-NEXT: vand.vx v12, v8, a0 1412; RV64I-NEXT: vsrl.vi v8, v8, 2 1413; RV64I-NEXT: vand.vx v8, v8, a0 1414; RV64I-NEXT: vadd.vv v8, v12, v8 1415; RV64I-NEXT: vsrl.vi v12, v8, 4 1416; RV64I-NEXT: vadd.vv v8, v8, v12 1417; RV64I-NEXT: lui a0, 61681 1418; RV64I-NEXT: addiw a0, a0, -241 1419; RV64I-NEXT: vand.vx v8, v8, a0 1420; RV64I-NEXT: lui a0, 4112 1421; RV64I-NEXT: addiw a0, a0, 257 1422; RV64I-NEXT: vmul.vx v8, v8, a0 1423; RV64I-NEXT: vsrl.vi v8, v8, 24 1424; RV64I-NEXT: ret 1425; 1426; RV32D-LABEL: ctlz_nxv8i32: 1427; RV32D: # %bb.0: 1428; RV32D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1429; RV32D-NEXT: vfwcvt.f.xu.v v16, v8 1430; RV32D-NEXT: li a0, 52 1431; RV32D-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1432; RV32D-NEXT: vsrl.vx v16, v16, a0 1433; RV32D-NEXT: vsetvli zero, zero, e32, m4, ta, mu 1434; RV32D-NEXT: vncvt.x.x.w v12, v16 1435; RV32D-NEXT: li a0, 1054 1436; RV32D-NEXT: vrsub.vx v12, v12, a0 1437; RV32D-NEXT: vmseq.vi v0, v8, 0 1438; RV32D-NEXT: li a0, 32 1439; RV32D-NEXT: vmerge.vxm v8, v12, a0, v0 1440; RV32D-NEXT: ret 1441; 1442; RV64D-LABEL: ctlz_nxv8i32: 1443; RV64D: # %bb.0: 1444; RV64D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 1445; RV64D-NEXT: vfwcvt.f.xu.v v16, v8 1446; RV64D-NEXT: li a0, 52 1447; RV64D-NEXT: vsetvli zero, zero, e64, m8, ta, mu 1448; RV64D-NEXT: vsrl.vx v16, v16, a0 1449; RV64D-NEXT: vsetvli zero, zero, e32, m4, ta, mu 1450; RV64D-NEXT: vncvt.x.x.w v12, v16 1451; RV64D-NEXT: li a0, 1054 1452; RV64D-NEXT: vrsub.vx v12, v12, a0 1453; RV64D-NEXT: vmseq.vi v0, v8, 0 1454; RV64D-NEXT: li a0, 32 1455; RV64D-NEXT: vmerge.vxm v8, v12, a0, v0 1456; RV64D-NEXT: ret 1457 %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 false) 1458 ret <vscale x 8 x i32> %a 1459} 1460declare <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32>, i1) 1461 1462define <vscale x 16 x i32> @ctlz_nxv16i32(<vscale x 16 x i32> %va) { 1463; RV32-LABEL: ctlz_nxv16i32: 1464; RV32: # %bb.0: 1465; RV32-NEXT: vsetvli a0, zero, e32, m8, ta, mu 1466; RV32-NEXT: vsrl.vi v16, v8, 1 1467; RV32-NEXT: vor.vv v8, v8, v16 1468; RV32-NEXT: vsrl.vi v16, v8, 2 1469; RV32-NEXT: vor.vv v8, v8, v16 1470; RV32-NEXT: vsrl.vi v16, v8, 4 1471; RV32-NEXT: vor.vv v8, v8, v16 1472; RV32-NEXT: vsrl.vi v16, v8, 8 1473; RV32-NEXT: vor.vv v8, v8, v16 1474; RV32-NEXT: vsrl.vi v16, v8, 16 1475; RV32-NEXT: vor.vv v8, v8, v16 1476; RV32-NEXT: vnot.v v8, v8 1477; RV32-NEXT: vsrl.vi v16, v8, 1 1478; RV32-NEXT: lui a0, 349525 1479; RV32-NEXT: addi a0, a0, 1365 1480; RV32-NEXT: vand.vx v16, v16, a0 1481; RV32-NEXT: vsub.vv v8, v8, v16 1482; RV32-NEXT: lui a0, 209715 1483; RV32-NEXT: addi a0, a0, 819 1484; RV32-NEXT: vand.vx v16, v8, a0 1485; RV32-NEXT: vsrl.vi v8, v8, 2 1486; RV32-NEXT: vand.vx v8, v8, a0 1487; RV32-NEXT: vadd.vv v8, v16, v8 1488; RV32-NEXT: vsrl.vi v16, v8, 4 1489; RV32-NEXT: vadd.vv v8, v8, v16 1490; RV32-NEXT: lui a0, 61681 1491; RV32-NEXT: addi a0, a0, -241 1492; RV32-NEXT: vand.vx v8, v8, a0 1493; RV32-NEXT: lui a0, 4112 1494; RV32-NEXT: addi a0, a0, 257 1495; RV32-NEXT: vmul.vx v8, v8, a0 1496; RV32-NEXT: vsrl.vi v8, v8, 24 1497; RV32-NEXT: ret 1498; 1499; RV64-LABEL: ctlz_nxv16i32: 1500; RV64: # %bb.0: 1501; RV64-NEXT: vsetvli a0, zero, e32, m8, ta, mu 1502; RV64-NEXT: vsrl.vi v16, v8, 1 1503; RV64-NEXT: vor.vv v8, v8, v16 1504; RV64-NEXT: vsrl.vi v16, v8, 2 1505; RV64-NEXT: vor.vv v8, v8, v16 1506; RV64-NEXT: vsrl.vi v16, v8, 4 1507; RV64-NEXT: vor.vv v8, v8, v16 1508; RV64-NEXT: vsrl.vi v16, v8, 8 1509; RV64-NEXT: vor.vv v8, v8, v16 1510; RV64-NEXT: vsrl.vi v16, v8, 16 1511; RV64-NEXT: vor.vv v8, v8, v16 1512; RV64-NEXT: vnot.v v8, v8 1513; RV64-NEXT: vsrl.vi v16, v8, 1 1514; RV64-NEXT: lui a0, 349525 1515; RV64-NEXT: addiw a0, a0, 1365 1516; RV64-NEXT: vand.vx v16, v16, a0 1517; RV64-NEXT: vsub.vv v8, v8, v16 1518; RV64-NEXT: lui a0, 209715 1519; RV64-NEXT: addiw a0, a0, 819 1520; RV64-NEXT: vand.vx v16, v8, a0 1521; RV64-NEXT: vsrl.vi v8, v8, 2 1522; RV64-NEXT: vand.vx v8, v8, a0 1523; RV64-NEXT: vadd.vv v8, v16, v8 1524; RV64-NEXT: vsrl.vi v16, v8, 4 1525; RV64-NEXT: vadd.vv v8, v8, v16 1526; RV64-NEXT: lui a0, 61681 1527; RV64-NEXT: addiw a0, a0, -241 1528; RV64-NEXT: vand.vx v8, v8, a0 1529; RV64-NEXT: lui a0, 4112 1530; RV64-NEXT: addiw a0, a0, 257 1531; RV64-NEXT: vmul.vx v8, v8, a0 1532; RV64-NEXT: vsrl.vi v8, v8, 24 1533; RV64-NEXT: ret 1534 %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 false) 1535 ret <vscale x 16 x i32> %a 1536} 1537declare <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32>, i1) 1538 1539define <vscale x 1 x i64> @ctlz_nxv1i64(<vscale x 1 x i64> %va) { 1540; RV32-LABEL: ctlz_nxv1i64: 1541; RV32: # %bb.0: 1542; RV32-NEXT: addi sp, sp, -16 1543; RV32-NEXT: .cfi_def_cfa_offset 16 1544; RV32-NEXT: lui a0, 349525 1545; RV32-NEXT: addi a0, a0, 1365 1546; RV32-NEXT: sw a0, 12(sp) 1547; RV32-NEXT: sw a0, 8(sp) 1548; RV32-NEXT: lui a0, 209715 1549; RV32-NEXT: addi a0, a0, 819 1550; RV32-NEXT: sw a0, 12(sp) 1551; RV32-NEXT: sw a0, 8(sp) 1552; RV32-NEXT: lui a0, 61681 1553; RV32-NEXT: addi a0, a0, -241 1554; RV32-NEXT: sw a0, 12(sp) 1555; RV32-NEXT: sw a0, 8(sp) 1556; RV32-NEXT: lui a0, 4112 1557; RV32-NEXT: addi a0, a0, 257 1558; RV32-NEXT: sw a0, 12(sp) 1559; RV32-NEXT: sw a0, 8(sp) 1560; RV32-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1561; RV32-NEXT: vsrl.vi v9, v8, 1 1562; RV32-NEXT: vor.vv v8, v8, v9 1563; RV32-NEXT: vsrl.vi v9, v8, 2 1564; RV32-NEXT: vor.vv v8, v8, v9 1565; RV32-NEXT: vsrl.vi v9, v8, 4 1566; RV32-NEXT: vor.vv v8, v8, v9 1567; RV32-NEXT: vsrl.vi v9, v8, 8 1568; RV32-NEXT: vor.vv v8, v8, v9 1569; RV32-NEXT: vsrl.vi v9, v8, 16 1570; RV32-NEXT: vor.vv v8, v8, v9 1571; RV32-NEXT: li a0, 32 1572; RV32-NEXT: vsrl.vx v9, v8, a0 1573; RV32-NEXT: vor.vv v8, v8, v9 1574; RV32-NEXT: addi a0, sp, 8 1575; RV32-NEXT: vlse64.v v9, (a0), zero 1576; RV32-NEXT: vnot.v v8, v8 1577; RV32-NEXT: addi a0, sp, 8 1578; RV32-NEXT: vlse64.v v10, (a0), zero 1579; RV32-NEXT: vsrl.vi v11, v8, 1 1580; RV32-NEXT: vand.vv v9, v11, v9 1581; RV32-NEXT: vsub.vv v8, v8, v9 1582; RV32-NEXT: vand.vv v9, v8, v10 1583; RV32-NEXT: vsrl.vi v8, v8, 2 1584; RV32-NEXT: vand.vv v8, v8, v10 1585; RV32-NEXT: vadd.vv v8, v9, v8 1586; RV32-NEXT: addi a0, sp, 8 1587; RV32-NEXT: vlse64.v v9, (a0), zero 1588; RV32-NEXT: addi a0, sp, 8 1589; RV32-NEXT: vlse64.v v10, (a0), zero 1590; RV32-NEXT: vsrl.vi v11, v8, 4 1591; RV32-NEXT: vadd.vv v8, v8, v11 1592; RV32-NEXT: vand.vv v8, v8, v9 1593; RV32-NEXT: vmul.vv v8, v8, v10 1594; RV32-NEXT: li a0, 56 1595; RV32-NEXT: vsrl.vx v8, v8, a0 1596; RV32-NEXT: addi sp, sp, 16 1597; RV32-NEXT: ret 1598; 1599; RV64-LABEL: ctlz_nxv1i64: 1600; RV64: # %bb.0: 1601; RV64-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1602; RV64-NEXT: vsrl.vi v9, v8, 1 1603; RV64-NEXT: vor.vv v8, v8, v9 1604; RV64-NEXT: vsrl.vi v9, v8, 2 1605; RV64-NEXT: vor.vv v8, v8, v9 1606; RV64-NEXT: vsrl.vi v9, v8, 4 1607; RV64-NEXT: vor.vv v8, v8, v9 1608; RV64-NEXT: vsrl.vi v9, v8, 8 1609; RV64-NEXT: vor.vv v8, v8, v9 1610; RV64-NEXT: vsrl.vi v9, v8, 16 1611; RV64-NEXT: vor.vv v8, v8, v9 1612; RV64-NEXT: li a0, 32 1613; RV64-NEXT: vsrl.vx v9, v8, a0 1614; RV64-NEXT: vor.vv v8, v8, v9 1615; RV64-NEXT: vnot.v v8, v8 1616; RV64-NEXT: lui a0, %hi(.LCPI18_0) 1617; RV64-NEXT: ld a0, %lo(.LCPI18_0)(a0) 1618; RV64-NEXT: lui a1, %hi(.LCPI18_1) 1619; RV64-NEXT: ld a1, %lo(.LCPI18_1)(a1) 1620; RV64-NEXT: vsrl.vi v9, v8, 1 1621; RV64-NEXT: vand.vx v9, v9, a0 1622; RV64-NEXT: vsub.vv v8, v8, v9 1623; RV64-NEXT: vand.vx v9, v8, a1 1624; RV64-NEXT: vsrl.vi v8, v8, 2 1625; RV64-NEXT: vand.vx v8, v8, a1 1626; RV64-NEXT: vadd.vv v8, v9, v8 1627; RV64-NEXT: lui a0, %hi(.LCPI18_2) 1628; RV64-NEXT: ld a0, %lo(.LCPI18_2)(a0) 1629; RV64-NEXT: lui a1, %hi(.LCPI18_3) 1630; RV64-NEXT: ld a1, %lo(.LCPI18_3)(a1) 1631; RV64-NEXT: vsrl.vi v9, v8, 4 1632; RV64-NEXT: vadd.vv v8, v8, v9 1633; RV64-NEXT: vand.vx v8, v8, a0 1634; RV64-NEXT: vmul.vx v8, v8, a1 1635; RV64-NEXT: li a0, 56 1636; RV64-NEXT: vsrl.vx v8, v8, a0 1637; RV64-NEXT: ret 1638 %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 false) 1639 ret <vscale x 1 x i64> %a 1640} 1641declare <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64>, i1) 1642 1643define <vscale x 2 x i64> @ctlz_nxv2i64(<vscale x 2 x i64> %va) { 1644; RV32-LABEL: ctlz_nxv2i64: 1645; RV32: # %bb.0: 1646; RV32-NEXT: addi sp, sp, -16 1647; RV32-NEXT: .cfi_def_cfa_offset 16 1648; RV32-NEXT: lui a0, 349525 1649; RV32-NEXT: addi a0, a0, 1365 1650; RV32-NEXT: sw a0, 12(sp) 1651; RV32-NEXT: sw a0, 8(sp) 1652; RV32-NEXT: lui a0, 209715 1653; RV32-NEXT: addi a0, a0, 819 1654; RV32-NEXT: sw a0, 12(sp) 1655; RV32-NEXT: sw a0, 8(sp) 1656; RV32-NEXT: lui a0, 61681 1657; RV32-NEXT: addi a0, a0, -241 1658; RV32-NEXT: sw a0, 12(sp) 1659; RV32-NEXT: sw a0, 8(sp) 1660; RV32-NEXT: lui a0, 4112 1661; RV32-NEXT: addi a0, a0, 257 1662; RV32-NEXT: sw a0, 12(sp) 1663; RV32-NEXT: sw a0, 8(sp) 1664; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1665; RV32-NEXT: vsrl.vi v10, v8, 1 1666; RV32-NEXT: vor.vv v8, v8, v10 1667; RV32-NEXT: vsrl.vi v10, v8, 2 1668; RV32-NEXT: vor.vv v8, v8, v10 1669; RV32-NEXT: vsrl.vi v10, v8, 4 1670; RV32-NEXT: vor.vv v8, v8, v10 1671; RV32-NEXT: vsrl.vi v10, v8, 8 1672; RV32-NEXT: vor.vv v8, v8, v10 1673; RV32-NEXT: vsrl.vi v10, v8, 16 1674; RV32-NEXT: vor.vv v8, v8, v10 1675; RV32-NEXT: li a0, 32 1676; RV32-NEXT: vsrl.vx v10, v8, a0 1677; RV32-NEXT: vor.vv v8, v8, v10 1678; RV32-NEXT: addi a0, sp, 8 1679; RV32-NEXT: vlse64.v v10, (a0), zero 1680; RV32-NEXT: vnot.v v8, v8 1681; RV32-NEXT: addi a0, sp, 8 1682; RV32-NEXT: vlse64.v v12, (a0), zero 1683; RV32-NEXT: vsrl.vi v14, v8, 1 1684; RV32-NEXT: vand.vv v10, v14, v10 1685; RV32-NEXT: vsub.vv v8, v8, v10 1686; RV32-NEXT: vand.vv v10, v8, v12 1687; RV32-NEXT: vsrl.vi v8, v8, 2 1688; RV32-NEXT: vand.vv v8, v8, v12 1689; RV32-NEXT: vadd.vv v8, v10, v8 1690; RV32-NEXT: addi a0, sp, 8 1691; RV32-NEXT: vlse64.v v10, (a0), zero 1692; RV32-NEXT: addi a0, sp, 8 1693; RV32-NEXT: vlse64.v v12, (a0), zero 1694; RV32-NEXT: vsrl.vi v14, v8, 4 1695; RV32-NEXT: vadd.vv v8, v8, v14 1696; RV32-NEXT: vand.vv v8, v8, v10 1697; RV32-NEXT: vmul.vv v8, v8, v12 1698; RV32-NEXT: li a0, 56 1699; RV32-NEXT: vsrl.vx v8, v8, a0 1700; RV32-NEXT: addi sp, sp, 16 1701; RV32-NEXT: ret 1702; 1703; RV64-LABEL: ctlz_nxv2i64: 1704; RV64: # %bb.0: 1705; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1706; RV64-NEXT: vsrl.vi v10, v8, 1 1707; RV64-NEXT: vor.vv v8, v8, v10 1708; RV64-NEXT: vsrl.vi v10, v8, 2 1709; RV64-NEXT: vor.vv v8, v8, v10 1710; RV64-NEXT: vsrl.vi v10, v8, 4 1711; RV64-NEXT: vor.vv v8, v8, v10 1712; RV64-NEXT: vsrl.vi v10, v8, 8 1713; RV64-NEXT: vor.vv v8, v8, v10 1714; RV64-NEXT: vsrl.vi v10, v8, 16 1715; RV64-NEXT: vor.vv v8, v8, v10 1716; RV64-NEXT: li a0, 32 1717; RV64-NEXT: vsrl.vx v10, v8, a0 1718; RV64-NEXT: vor.vv v8, v8, v10 1719; RV64-NEXT: vnot.v v8, v8 1720; RV64-NEXT: lui a0, %hi(.LCPI19_0) 1721; RV64-NEXT: ld a0, %lo(.LCPI19_0)(a0) 1722; RV64-NEXT: lui a1, %hi(.LCPI19_1) 1723; RV64-NEXT: ld a1, %lo(.LCPI19_1)(a1) 1724; RV64-NEXT: vsrl.vi v10, v8, 1 1725; RV64-NEXT: vand.vx v10, v10, a0 1726; RV64-NEXT: vsub.vv v8, v8, v10 1727; RV64-NEXT: vand.vx v10, v8, a1 1728; RV64-NEXT: vsrl.vi v8, v8, 2 1729; RV64-NEXT: vand.vx v8, v8, a1 1730; RV64-NEXT: vadd.vv v8, v10, v8 1731; RV64-NEXT: lui a0, %hi(.LCPI19_2) 1732; RV64-NEXT: ld a0, %lo(.LCPI19_2)(a0) 1733; RV64-NEXT: lui a1, %hi(.LCPI19_3) 1734; RV64-NEXT: ld a1, %lo(.LCPI19_3)(a1) 1735; RV64-NEXT: vsrl.vi v10, v8, 4 1736; RV64-NEXT: vadd.vv v8, v8, v10 1737; RV64-NEXT: vand.vx v8, v8, a0 1738; RV64-NEXT: vmul.vx v8, v8, a1 1739; RV64-NEXT: li a0, 56 1740; RV64-NEXT: vsrl.vx v8, v8, a0 1741; RV64-NEXT: ret 1742 %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 false) 1743 ret <vscale x 2 x i64> %a 1744} 1745declare <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64>, i1) 1746 1747define <vscale x 4 x i64> @ctlz_nxv4i64(<vscale x 4 x i64> %va) { 1748; RV32-LABEL: ctlz_nxv4i64: 1749; RV32: # %bb.0: 1750; RV32-NEXT: addi sp, sp, -16 1751; RV32-NEXT: .cfi_def_cfa_offset 16 1752; RV32-NEXT: lui a0, 349525 1753; RV32-NEXT: addi a0, a0, 1365 1754; RV32-NEXT: sw a0, 12(sp) 1755; RV32-NEXT: sw a0, 8(sp) 1756; RV32-NEXT: lui a0, 209715 1757; RV32-NEXT: addi a0, a0, 819 1758; RV32-NEXT: sw a0, 12(sp) 1759; RV32-NEXT: sw a0, 8(sp) 1760; RV32-NEXT: lui a0, 61681 1761; RV32-NEXT: addi a0, a0, -241 1762; RV32-NEXT: sw a0, 12(sp) 1763; RV32-NEXT: sw a0, 8(sp) 1764; RV32-NEXT: lui a0, 4112 1765; RV32-NEXT: addi a0, a0, 257 1766; RV32-NEXT: sw a0, 12(sp) 1767; RV32-NEXT: sw a0, 8(sp) 1768; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1769; RV32-NEXT: vsrl.vi v12, v8, 1 1770; RV32-NEXT: vor.vv v8, v8, v12 1771; RV32-NEXT: vsrl.vi v12, v8, 2 1772; RV32-NEXT: vor.vv v8, v8, v12 1773; RV32-NEXT: vsrl.vi v12, v8, 4 1774; RV32-NEXT: vor.vv v8, v8, v12 1775; RV32-NEXT: vsrl.vi v12, v8, 8 1776; RV32-NEXT: vor.vv v8, v8, v12 1777; RV32-NEXT: vsrl.vi v12, v8, 16 1778; RV32-NEXT: vor.vv v8, v8, v12 1779; RV32-NEXT: li a0, 32 1780; RV32-NEXT: vsrl.vx v12, v8, a0 1781; RV32-NEXT: vor.vv v8, v8, v12 1782; RV32-NEXT: addi a0, sp, 8 1783; RV32-NEXT: vlse64.v v12, (a0), zero 1784; RV32-NEXT: vnot.v v8, v8 1785; RV32-NEXT: addi a0, sp, 8 1786; RV32-NEXT: vlse64.v v16, (a0), zero 1787; RV32-NEXT: vsrl.vi v20, v8, 1 1788; RV32-NEXT: vand.vv v12, v20, v12 1789; RV32-NEXT: vsub.vv v8, v8, v12 1790; RV32-NEXT: vand.vv v12, v8, v16 1791; RV32-NEXT: vsrl.vi v8, v8, 2 1792; RV32-NEXT: vand.vv v8, v8, v16 1793; RV32-NEXT: vadd.vv v8, v12, v8 1794; RV32-NEXT: addi a0, sp, 8 1795; RV32-NEXT: vlse64.v v12, (a0), zero 1796; RV32-NEXT: addi a0, sp, 8 1797; RV32-NEXT: vlse64.v v16, (a0), zero 1798; RV32-NEXT: vsrl.vi v20, v8, 4 1799; RV32-NEXT: vadd.vv v8, v8, v20 1800; RV32-NEXT: vand.vv v8, v8, v12 1801; RV32-NEXT: vmul.vv v8, v8, v16 1802; RV32-NEXT: li a0, 56 1803; RV32-NEXT: vsrl.vx v8, v8, a0 1804; RV32-NEXT: addi sp, sp, 16 1805; RV32-NEXT: ret 1806; 1807; RV64-LABEL: ctlz_nxv4i64: 1808; RV64: # %bb.0: 1809; RV64-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1810; RV64-NEXT: vsrl.vi v12, v8, 1 1811; RV64-NEXT: vor.vv v8, v8, v12 1812; RV64-NEXT: vsrl.vi v12, v8, 2 1813; RV64-NEXT: vor.vv v8, v8, v12 1814; RV64-NEXT: vsrl.vi v12, v8, 4 1815; RV64-NEXT: vor.vv v8, v8, v12 1816; RV64-NEXT: vsrl.vi v12, v8, 8 1817; RV64-NEXT: vor.vv v8, v8, v12 1818; RV64-NEXT: vsrl.vi v12, v8, 16 1819; RV64-NEXT: vor.vv v8, v8, v12 1820; RV64-NEXT: li a0, 32 1821; RV64-NEXT: vsrl.vx v12, v8, a0 1822; RV64-NEXT: vor.vv v8, v8, v12 1823; RV64-NEXT: vnot.v v8, v8 1824; RV64-NEXT: lui a0, %hi(.LCPI20_0) 1825; RV64-NEXT: ld a0, %lo(.LCPI20_0)(a0) 1826; RV64-NEXT: lui a1, %hi(.LCPI20_1) 1827; RV64-NEXT: ld a1, %lo(.LCPI20_1)(a1) 1828; RV64-NEXT: vsrl.vi v12, v8, 1 1829; RV64-NEXT: vand.vx v12, v12, a0 1830; RV64-NEXT: vsub.vv v8, v8, v12 1831; RV64-NEXT: vand.vx v12, v8, a1 1832; RV64-NEXT: vsrl.vi v8, v8, 2 1833; RV64-NEXT: vand.vx v8, v8, a1 1834; RV64-NEXT: vadd.vv v8, v12, v8 1835; RV64-NEXT: lui a0, %hi(.LCPI20_2) 1836; RV64-NEXT: ld a0, %lo(.LCPI20_2)(a0) 1837; RV64-NEXT: lui a1, %hi(.LCPI20_3) 1838; RV64-NEXT: ld a1, %lo(.LCPI20_3)(a1) 1839; RV64-NEXT: vsrl.vi v12, v8, 4 1840; RV64-NEXT: vadd.vv v8, v8, v12 1841; RV64-NEXT: vand.vx v8, v8, a0 1842; RV64-NEXT: vmul.vx v8, v8, a1 1843; RV64-NEXT: li a0, 56 1844; RV64-NEXT: vsrl.vx v8, v8, a0 1845; RV64-NEXT: ret 1846 %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 false) 1847 ret <vscale x 4 x i64> %a 1848} 1849declare <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64>, i1) 1850 1851define <vscale x 8 x i64> @ctlz_nxv8i64(<vscale x 8 x i64> %va) { 1852; RV32-LABEL: ctlz_nxv8i64: 1853; RV32: # %bb.0: 1854; RV32-NEXT: addi sp, sp, -16 1855; RV32-NEXT: .cfi_def_cfa_offset 16 1856; RV32-NEXT: lui a0, 349525 1857; RV32-NEXT: addi a0, a0, 1365 1858; RV32-NEXT: sw a0, 12(sp) 1859; RV32-NEXT: sw a0, 8(sp) 1860; RV32-NEXT: lui a0, 209715 1861; RV32-NEXT: addi a0, a0, 819 1862; RV32-NEXT: sw a0, 12(sp) 1863; RV32-NEXT: sw a0, 8(sp) 1864; RV32-NEXT: lui a0, 61681 1865; RV32-NEXT: addi a0, a0, -241 1866; RV32-NEXT: sw a0, 12(sp) 1867; RV32-NEXT: sw a0, 8(sp) 1868; RV32-NEXT: lui a0, 4112 1869; RV32-NEXT: addi a0, a0, 257 1870; RV32-NEXT: sw a0, 12(sp) 1871; RV32-NEXT: sw a0, 8(sp) 1872; RV32-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1873; RV32-NEXT: vsrl.vi v16, v8, 1 1874; RV32-NEXT: vor.vv v8, v8, v16 1875; RV32-NEXT: vsrl.vi v16, v8, 2 1876; RV32-NEXT: vor.vv v8, v8, v16 1877; RV32-NEXT: vsrl.vi v16, v8, 4 1878; RV32-NEXT: vor.vv v8, v8, v16 1879; RV32-NEXT: vsrl.vi v16, v8, 8 1880; RV32-NEXT: vor.vv v8, v8, v16 1881; RV32-NEXT: vsrl.vi v16, v8, 16 1882; RV32-NEXT: vor.vv v8, v8, v16 1883; RV32-NEXT: li a0, 32 1884; RV32-NEXT: vsrl.vx v16, v8, a0 1885; RV32-NEXT: vor.vv v8, v8, v16 1886; RV32-NEXT: addi a0, sp, 8 1887; RV32-NEXT: vlse64.v v16, (a0), zero 1888; RV32-NEXT: vnot.v v8, v8 1889; RV32-NEXT: addi a0, sp, 8 1890; RV32-NEXT: vlse64.v v24, (a0), zero 1891; RV32-NEXT: vsrl.vi v0, v8, 1 1892; RV32-NEXT: vand.vv v16, v0, v16 1893; RV32-NEXT: vsub.vv v8, v8, v16 1894; RV32-NEXT: vand.vv v16, v8, v24 1895; RV32-NEXT: vsrl.vi v8, v8, 2 1896; RV32-NEXT: vand.vv v8, v8, v24 1897; RV32-NEXT: vadd.vv v8, v16, v8 1898; RV32-NEXT: addi a0, sp, 8 1899; RV32-NEXT: vlse64.v v16, (a0), zero 1900; RV32-NEXT: addi a0, sp, 8 1901; RV32-NEXT: vlse64.v v24, (a0), zero 1902; RV32-NEXT: vsrl.vi v0, v8, 4 1903; RV32-NEXT: vadd.vv v8, v8, v0 1904; RV32-NEXT: vand.vv v8, v8, v16 1905; RV32-NEXT: vmul.vv v8, v8, v24 1906; RV32-NEXT: li a0, 56 1907; RV32-NEXT: vsrl.vx v8, v8, a0 1908; RV32-NEXT: addi sp, sp, 16 1909; RV32-NEXT: ret 1910; 1911; RV64-LABEL: ctlz_nxv8i64: 1912; RV64: # %bb.0: 1913; RV64-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1914; RV64-NEXT: vsrl.vi v16, v8, 1 1915; RV64-NEXT: vor.vv v8, v8, v16 1916; RV64-NEXT: vsrl.vi v16, v8, 2 1917; RV64-NEXT: vor.vv v8, v8, v16 1918; RV64-NEXT: vsrl.vi v16, v8, 4 1919; RV64-NEXT: vor.vv v8, v8, v16 1920; RV64-NEXT: vsrl.vi v16, v8, 8 1921; RV64-NEXT: vor.vv v8, v8, v16 1922; RV64-NEXT: vsrl.vi v16, v8, 16 1923; RV64-NEXT: vor.vv v8, v8, v16 1924; RV64-NEXT: li a0, 32 1925; RV64-NEXT: vsrl.vx v16, v8, a0 1926; RV64-NEXT: vor.vv v8, v8, v16 1927; RV64-NEXT: vnot.v v8, v8 1928; RV64-NEXT: lui a0, %hi(.LCPI21_0) 1929; RV64-NEXT: ld a0, %lo(.LCPI21_0)(a0) 1930; RV64-NEXT: lui a1, %hi(.LCPI21_1) 1931; RV64-NEXT: ld a1, %lo(.LCPI21_1)(a1) 1932; RV64-NEXT: vsrl.vi v16, v8, 1 1933; RV64-NEXT: vand.vx v16, v16, a0 1934; RV64-NEXT: vsub.vv v8, v8, v16 1935; RV64-NEXT: vand.vx v16, v8, a1 1936; RV64-NEXT: vsrl.vi v8, v8, 2 1937; RV64-NEXT: vand.vx v8, v8, a1 1938; RV64-NEXT: vadd.vv v8, v16, v8 1939; RV64-NEXT: lui a0, %hi(.LCPI21_2) 1940; RV64-NEXT: ld a0, %lo(.LCPI21_2)(a0) 1941; RV64-NEXT: lui a1, %hi(.LCPI21_3) 1942; RV64-NEXT: ld a1, %lo(.LCPI21_3)(a1) 1943; RV64-NEXT: vsrl.vi v16, v8, 4 1944; RV64-NEXT: vadd.vv v8, v8, v16 1945; RV64-NEXT: vand.vx v8, v8, a0 1946; RV64-NEXT: vmul.vx v8, v8, a1 1947; RV64-NEXT: li a0, 56 1948; RV64-NEXT: vsrl.vx v8, v8, a0 1949; RV64-NEXT: ret 1950 %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 false) 1951 ret <vscale x 8 x i64> %a 1952} 1953declare <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64>, i1) 1954 1955define <vscale x 1 x i8> @ctlz_zero_undef_nxv1i8(<vscale x 1 x i8> %va) { 1956; RV32I-LABEL: ctlz_zero_undef_nxv1i8: 1957; RV32I: # %bb.0: 1958; RV32I-NEXT: vsetvli a0, zero, e8, mf8, ta, mu 1959; RV32I-NEXT: vsrl.vi v9, v8, 1 1960; RV32I-NEXT: vor.vv v8, v8, v9 1961; RV32I-NEXT: vsrl.vi v9, v8, 2 1962; RV32I-NEXT: vor.vv v8, v8, v9 1963; RV32I-NEXT: vsrl.vi v9, v8, 4 1964; RV32I-NEXT: vor.vv v8, v8, v9 1965; RV32I-NEXT: vnot.v v8, v8 1966; RV32I-NEXT: vsrl.vi v9, v8, 1 1967; RV32I-NEXT: li a0, 85 1968; RV32I-NEXT: vand.vx v9, v9, a0 1969; RV32I-NEXT: vsub.vv v8, v8, v9 1970; RV32I-NEXT: li a0, 51 1971; RV32I-NEXT: vand.vx v9, v8, a0 1972; RV32I-NEXT: vsrl.vi v8, v8, 2 1973; RV32I-NEXT: vand.vx v8, v8, a0 1974; RV32I-NEXT: vadd.vv v8, v9, v8 1975; RV32I-NEXT: vsrl.vi v9, v8, 4 1976; RV32I-NEXT: vadd.vv v8, v8, v9 1977; RV32I-NEXT: vand.vi v8, v8, 15 1978; RV32I-NEXT: ret 1979; 1980; RV64I-LABEL: ctlz_zero_undef_nxv1i8: 1981; RV64I: # %bb.0: 1982; RV64I-NEXT: vsetvli a0, zero, e8, mf8, ta, mu 1983; RV64I-NEXT: vsrl.vi v9, v8, 1 1984; RV64I-NEXT: vor.vv v8, v8, v9 1985; RV64I-NEXT: vsrl.vi v9, v8, 2 1986; RV64I-NEXT: vor.vv v8, v8, v9 1987; RV64I-NEXT: vsrl.vi v9, v8, 4 1988; RV64I-NEXT: vor.vv v8, v8, v9 1989; RV64I-NEXT: vnot.v v8, v8 1990; RV64I-NEXT: vsrl.vi v9, v8, 1 1991; RV64I-NEXT: li a0, 85 1992; RV64I-NEXT: vand.vx v9, v9, a0 1993; RV64I-NEXT: vsub.vv v8, v8, v9 1994; RV64I-NEXT: li a0, 51 1995; RV64I-NEXT: vand.vx v9, v8, a0 1996; RV64I-NEXT: vsrl.vi v8, v8, 2 1997; RV64I-NEXT: vand.vx v8, v8, a0 1998; RV64I-NEXT: vadd.vv v8, v9, v8 1999; RV64I-NEXT: vsrl.vi v9, v8, 4 2000; RV64I-NEXT: vadd.vv v8, v8, v9 2001; RV64I-NEXT: vand.vi v8, v8, 15 2002; RV64I-NEXT: ret 2003; 2004; RV32D-LABEL: ctlz_zero_undef_nxv1i8: 2005; RV32D: # %bb.0: 2006; RV32D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 2007; RV32D-NEXT: vzext.vf4 v9, v8 2008; RV32D-NEXT: vfcvt.f.xu.v v8, v9 2009; RV32D-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 2010; RV32D-NEXT: vnsrl.wi v8, v8, 23 2011; RV32D-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 2012; RV32D-NEXT: vncvt.x.x.w v8, v8 2013; RV32D-NEXT: li a0, 134 2014; RV32D-NEXT: vrsub.vx v8, v8, a0 2015; RV32D-NEXT: ret 2016; 2017; RV64D-LABEL: ctlz_zero_undef_nxv1i8: 2018; RV64D: # %bb.0: 2019; RV64D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 2020; RV64D-NEXT: vzext.vf4 v9, v8 2021; RV64D-NEXT: vfcvt.f.xu.v v8, v9 2022; RV64D-NEXT: vsetvli zero, zero, e16, mf4, ta, mu 2023; RV64D-NEXT: vnsrl.wi v8, v8, 23 2024; RV64D-NEXT: vsetvli zero, zero, e8, mf8, ta, mu 2025; RV64D-NEXT: vncvt.x.x.w v8, v8 2026; RV64D-NEXT: li a0, 134 2027; RV64D-NEXT: vrsub.vx v8, v8, a0 2028; RV64D-NEXT: ret 2029 %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 true) 2030 ret <vscale x 1 x i8> %a 2031} 2032 2033define <vscale x 2 x i8> @ctlz_zero_undef_nxv2i8(<vscale x 2 x i8> %va) { 2034; RV32I-LABEL: ctlz_zero_undef_nxv2i8: 2035; RV32I: # %bb.0: 2036; RV32I-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 2037; RV32I-NEXT: vsrl.vi v9, v8, 1 2038; RV32I-NEXT: vor.vv v8, v8, v9 2039; RV32I-NEXT: vsrl.vi v9, v8, 2 2040; RV32I-NEXT: vor.vv v8, v8, v9 2041; RV32I-NEXT: vsrl.vi v9, v8, 4 2042; RV32I-NEXT: vor.vv v8, v8, v9 2043; RV32I-NEXT: vnot.v v8, v8 2044; RV32I-NEXT: vsrl.vi v9, v8, 1 2045; RV32I-NEXT: li a0, 85 2046; RV32I-NEXT: vand.vx v9, v9, a0 2047; RV32I-NEXT: vsub.vv v8, v8, v9 2048; RV32I-NEXT: li a0, 51 2049; RV32I-NEXT: vand.vx v9, v8, a0 2050; RV32I-NEXT: vsrl.vi v8, v8, 2 2051; RV32I-NEXT: vand.vx v8, v8, a0 2052; RV32I-NEXT: vadd.vv v8, v9, v8 2053; RV32I-NEXT: vsrl.vi v9, v8, 4 2054; RV32I-NEXT: vadd.vv v8, v8, v9 2055; RV32I-NEXT: vand.vi v8, v8, 15 2056; RV32I-NEXT: ret 2057; 2058; RV64I-LABEL: ctlz_zero_undef_nxv2i8: 2059; RV64I: # %bb.0: 2060; RV64I-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 2061; RV64I-NEXT: vsrl.vi v9, v8, 1 2062; RV64I-NEXT: vor.vv v8, v8, v9 2063; RV64I-NEXT: vsrl.vi v9, v8, 2 2064; RV64I-NEXT: vor.vv v8, v8, v9 2065; RV64I-NEXT: vsrl.vi v9, v8, 4 2066; RV64I-NEXT: vor.vv v8, v8, v9 2067; RV64I-NEXT: vnot.v v8, v8 2068; RV64I-NEXT: vsrl.vi v9, v8, 1 2069; RV64I-NEXT: li a0, 85 2070; RV64I-NEXT: vand.vx v9, v9, a0 2071; RV64I-NEXT: vsub.vv v8, v8, v9 2072; RV64I-NEXT: li a0, 51 2073; RV64I-NEXT: vand.vx v9, v8, a0 2074; RV64I-NEXT: vsrl.vi v8, v8, 2 2075; RV64I-NEXT: vand.vx v8, v8, a0 2076; RV64I-NEXT: vadd.vv v8, v9, v8 2077; RV64I-NEXT: vsrl.vi v9, v8, 4 2078; RV64I-NEXT: vadd.vv v8, v8, v9 2079; RV64I-NEXT: vand.vi v8, v8, 15 2080; RV64I-NEXT: ret 2081; 2082; RV32D-LABEL: ctlz_zero_undef_nxv2i8: 2083; RV32D: # %bb.0: 2084; RV32D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 2085; RV32D-NEXT: vzext.vf4 v9, v8 2086; RV32D-NEXT: vfcvt.f.xu.v v8, v9 2087; RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 2088; RV32D-NEXT: vnsrl.wi v8, v8, 23 2089; RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 2090; RV32D-NEXT: vncvt.x.x.w v8, v8 2091; RV32D-NEXT: li a0, 134 2092; RV32D-NEXT: vrsub.vx v8, v8, a0 2093; RV32D-NEXT: ret 2094; 2095; RV64D-LABEL: ctlz_zero_undef_nxv2i8: 2096; RV64D: # %bb.0: 2097; RV64D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 2098; RV64D-NEXT: vzext.vf4 v9, v8 2099; RV64D-NEXT: vfcvt.f.xu.v v8, v9 2100; RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu 2101; RV64D-NEXT: vnsrl.wi v8, v8, 23 2102; RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu 2103; RV64D-NEXT: vncvt.x.x.w v8, v8 2104; RV64D-NEXT: li a0, 134 2105; RV64D-NEXT: vrsub.vx v8, v8, a0 2106; RV64D-NEXT: ret 2107 %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 true) 2108 ret <vscale x 2 x i8> %a 2109} 2110 2111define <vscale x 4 x i8> @ctlz_zero_undef_nxv4i8(<vscale x 4 x i8> %va) { 2112; RV32I-LABEL: ctlz_zero_undef_nxv4i8: 2113; RV32I: # %bb.0: 2114; RV32I-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 2115; RV32I-NEXT: vsrl.vi v9, v8, 1 2116; RV32I-NEXT: vor.vv v8, v8, v9 2117; RV32I-NEXT: vsrl.vi v9, v8, 2 2118; RV32I-NEXT: vor.vv v8, v8, v9 2119; RV32I-NEXT: vsrl.vi v9, v8, 4 2120; RV32I-NEXT: vor.vv v8, v8, v9 2121; RV32I-NEXT: vnot.v v8, v8 2122; RV32I-NEXT: vsrl.vi v9, v8, 1 2123; RV32I-NEXT: li a0, 85 2124; RV32I-NEXT: vand.vx v9, v9, a0 2125; RV32I-NEXT: vsub.vv v8, v8, v9 2126; RV32I-NEXT: li a0, 51 2127; RV32I-NEXT: vand.vx v9, v8, a0 2128; RV32I-NEXT: vsrl.vi v8, v8, 2 2129; RV32I-NEXT: vand.vx v8, v8, a0 2130; RV32I-NEXT: vadd.vv v8, v9, v8 2131; RV32I-NEXT: vsrl.vi v9, v8, 4 2132; RV32I-NEXT: vadd.vv v8, v8, v9 2133; RV32I-NEXT: vand.vi v8, v8, 15 2134; RV32I-NEXT: ret 2135; 2136; RV64I-LABEL: ctlz_zero_undef_nxv4i8: 2137; RV64I: # %bb.0: 2138; RV64I-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 2139; RV64I-NEXT: vsrl.vi v9, v8, 1 2140; RV64I-NEXT: vor.vv v8, v8, v9 2141; RV64I-NEXT: vsrl.vi v9, v8, 2 2142; RV64I-NEXT: vor.vv v8, v8, v9 2143; RV64I-NEXT: vsrl.vi v9, v8, 4 2144; RV64I-NEXT: vor.vv v8, v8, v9 2145; RV64I-NEXT: vnot.v v8, v8 2146; RV64I-NEXT: vsrl.vi v9, v8, 1 2147; RV64I-NEXT: li a0, 85 2148; RV64I-NEXT: vand.vx v9, v9, a0 2149; RV64I-NEXT: vsub.vv v8, v8, v9 2150; RV64I-NEXT: li a0, 51 2151; RV64I-NEXT: vand.vx v9, v8, a0 2152; RV64I-NEXT: vsrl.vi v8, v8, 2 2153; RV64I-NEXT: vand.vx v8, v8, a0 2154; RV64I-NEXT: vadd.vv v8, v9, v8 2155; RV64I-NEXT: vsrl.vi v9, v8, 4 2156; RV64I-NEXT: vadd.vv v8, v8, v9 2157; RV64I-NEXT: vand.vi v8, v8, 15 2158; RV64I-NEXT: ret 2159; 2160; RV32D-LABEL: ctlz_zero_undef_nxv4i8: 2161; RV32D: # %bb.0: 2162; RV32D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 2163; RV32D-NEXT: vzext.vf4 v10, v8 2164; RV32D-NEXT: vfcvt.f.xu.v v8, v10 2165; RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu 2166; RV32D-NEXT: vnsrl.wi v10, v8, 23 2167; RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 2168; RV32D-NEXT: vncvt.x.x.w v8, v10 2169; RV32D-NEXT: li a0, 134 2170; RV32D-NEXT: vrsub.vx v8, v8, a0 2171; RV32D-NEXT: ret 2172; 2173; RV64D-LABEL: ctlz_zero_undef_nxv4i8: 2174; RV64D: # %bb.0: 2175; RV64D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 2176; RV64D-NEXT: vzext.vf4 v10, v8 2177; RV64D-NEXT: vfcvt.f.xu.v v8, v10 2178; RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu 2179; RV64D-NEXT: vnsrl.wi v10, v8, 23 2180; RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu 2181; RV64D-NEXT: vncvt.x.x.w v8, v10 2182; RV64D-NEXT: li a0, 134 2183; RV64D-NEXT: vrsub.vx v8, v8, a0 2184; RV64D-NEXT: ret 2185 %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 true) 2186 ret <vscale x 4 x i8> %a 2187} 2188 2189define <vscale x 8 x i8> @ctlz_zero_undef_nxv8i8(<vscale x 8 x i8> %va) { 2190; RV32I-LABEL: ctlz_zero_undef_nxv8i8: 2191; RV32I: # %bb.0: 2192; RV32I-NEXT: vsetvli a0, zero, e8, m1, ta, mu 2193; RV32I-NEXT: vsrl.vi v9, v8, 1 2194; RV32I-NEXT: vor.vv v8, v8, v9 2195; RV32I-NEXT: vsrl.vi v9, v8, 2 2196; RV32I-NEXT: vor.vv v8, v8, v9 2197; RV32I-NEXT: vsrl.vi v9, v8, 4 2198; RV32I-NEXT: vor.vv v8, v8, v9 2199; RV32I-NEXT: vnot.v v8, v8 2200; RV32I-NEXT: vsrl.vi v9, v8, 1 2201; RV32I-NEXT: li a0, 85 2202; RV32I-NEXT: vand.vx v9, v9, a0 2203; RV32I-NEXT: vsub.vv v8, v8, v9 2204; RV32I-NEXT: li a0, 51 2205; RV32I-NEXT: vand.vx v9, v8, a0 2206; RV32I-NEXT: vsrl.vi v8, v8, 2 2207; RV32I-NEXT: vand.vx v8, v8, a0 2208; RV32I-NEXT: vadd.vv v8, v9, v8 2209; RV32I-NEXT: vsrl.vi v9, v8, 4 2210; RV32I-NEXT: vadd.vv v8, v8, v9 2211; RV32I-NEXT: vand.vi v8, v8, 15 2212; RV32I-NEXT: ret 2213; 2214; RV64I-LABEL: ctlz_zero_undef_nxv8i8: 2215; RV64I: # %bb.0: 2216; RV64I-NEXT: vsetvli a0, zero, e8, m1, ta, mu 2217; RV64I-NEXT: vsrl.vi v9, v8, 1 2218; RV64I-NEXT: vor.vv v8, v8, v9 2219; RV64I-NEXT: vsrl.vi v9, v8, 2 2220; RV64I-NEXT: vor.vv v8, v8, v9 2221; RV64I-NEXT: vsrl.vi v9, v8, 4 2222; RV64I-NEXT: vor.vv v8, v8, v9 2223; RV64I-NEXT: vnot.v v8, v8 2224; RV64I-NEXT: vsrl.vi v9, v8, 1 2225; RV64I-NEXT: li a0, 85 2226; RV64I-NEXT: vand.vx v9, v9, a0 2227; RV64I-NEXT: vsub.vv v8, v8, v9 2228; RV64I-NEXT: li a0, 51 2229; RV64I-NEXT: vand.vx v9, v8, a0 2230; RV64I-NEXT: vsrl.vi v8, v8, 2 2231; RV64I-NEXT: vand.vx v8, v8, a0 2232; RV64I-NEXT: vadd.vv v8, v9, v8 2233; RV64I-NEXT: vsrl.vi v9, v8, 4 2234; RV64I-NEXT: vadd.vv v8, v8, v9 2235; RV64I-NEXT: vand.vi v8, v8, 15 2236; RV64I-NEXT: ret 2237; 2238; RV32D-LABEL: ctlz_zero_undef_nxv8i8: 2239; RV32D: # %bb.0: 2240; RV32D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 2241; RV32D-NEXT: vzext.vf4 v12, v8 2242; RV32D-NEXT: vfcvt.f.xu.v v8, v12 2243; RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu 2244; RV32D-NEXT: vnsrl.wi v12, v8, 23 2245; RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu 2246; RV32D-NEXT: vncvt.x.x.w v8, v12 2247; RV32D-NEXT: li a0, 134 2248; RV32D-NEXT: vrsub.vx v8, v8, a0 2249; RV32D-NEXT: ret 2250; 2251; RV64D-LABEL: ctlz_zero_undef_nxv8i8: 2252; RV64D: # %bb.0: 2253; RV64D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 2254; RV64D-NEXT: vzext.vf4 v12, v8 2255; RV64D-NEXT: vfcvt.f.xu.v v8, v12 2256; RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu 2257; RV64D-NEXT: vnsrl.wi v12, v8, 23 2258; RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu 2259; RV64D-NEXT: vncvt.x.x.w v8, v12 2260; RV64D-NEXT: li a0, 134 2261; RV64D-NEXT: vrsub.vx v8, v8, a0 2262; RV64D-NEXT: ret 2263 %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 true) 2264 ret <vscale x 8 x i8> %a 2265} 2266 2267define <vscale x 16 x i8> @ctlz_zero_undef_nxv16i8(<vscale x 16 x i8> %va) { 2268; RV32I-LABEL: ctlz_zero_undef_nxv16i8: 2269; RV32I: # %bb.0: 2270; RV32I-NEXT: vsetvli a0, zero, e8, m2, ta, mu 2271; RV32I-NEXT: vsrl.vi v10, v8, 1 2272; RV32I-NEXT: vor.vv v8, v8, v10 2273; RV32I-NEXT: vsrl.vi v10, v8, 2 2274; RV32I-NEXT: vor.vv v8, v8, v10 2275; RV32I-NEXT: vsrl.vi v10, v8, 4 2276; RV32I-NEXT: vor.vv v8, v8, v10 2277; RV32I-NEXT: vnot.v v8, v8 2278; RV32I-NEXT: vsrl.vi v10, v8, 1 2279; RV32I-NEXT: li a0, 85 2280; RV32I-NEXT: vand.vx v10, v10, a0 2281; RV32I-NEXT: vsub.vv v8, v8, v10 2282; RV32I-NEXT: li a0, 51 2283; RV32I-NEXT: vand.vx v10, v8, a0 2284; RV32I-NEXT: vsrl.vi v8, v8, 2 2285; RV32I-NEXT: vand.vx v8, v8, a0 2286; RV32I-NEXT: vadd.vv v8, v10, v8 2287; RV32I-NEXT: vsrl.vi v10, v8, 4 2288; RV32I-NEXT: vadd.vv v8, v8, v10 2289; RV32I-NEXT: vand.vi v8, v8, 15 2290; RV32I-NEXT: ret 2291; 2292; RV64I-LABEL: ctlz_zero_undef_nxv16i8: 2293; RV64I: # %bb.0: 2294; RV64I-NEXT: vsetvli a0, zero, e8, m2, ta, mu 2295; RV64I-NEXT: vsrl.vi v10, v8, 1 2296; RV64I-NEXT: vor.vv v8, v8, v10 2297; RV64I-NEXT: vsrl.vi v10, v8, 2 2298; RV64I-NEXT: vor.vv v8, v8, v10 2299; RV64I-NEXT: vsrl.vi v10, v8, 4 2300; RV64I-NEXT: vor.vv v8, v8, v10 2301; RV64I-NEXT: vnot.v v8, v8 2302; RV64I-NEXT: vsrl.vi v10, v8, 1 2303; RV64I-NEXT: li a0, 85 2304; RV64I-NEXT: vand.vx v10, v10, a0 2305; RV64I-NEXT: vsub.vv v8, v8, v10 2306; RV64I-NEXT: li a0, 51 2307; RV64I-NEXT: vand.vx v10, v8, a0 2308; RV64I-NEXT: vsrl.vi v8, v8, 2 2309; RV64I-NEXT: vand.vx v8, v8, a0 2310; RV64I-NEXT: vadd.vv v8, v10, v8 2311; RV64I-NEXT: vsrl.vi v10, v8, 4 2312; RV64I-NEXT: vadd.vv v8, v8, v10 2313; RV64I-NEXT: vand.vi v8, v8, 15 2314; RV64I-NEXT: ret 2315; 2316; RV32D-LABEL: ctlz_zero_undef_nxv16i8: 2317; RV32D: # %bb.0: 2318; RV32D-NEXT: vsetvli a0, zero, e32, m8, ta, mu 2319; RV32D-NEXT: vzext.vf4 v16, v8 2320; RV32D-NEXT: vfcvt.f.xu.v v8, v16 2321; RV32D-NEXT: vsetvli zero, zero, e16, m4, ta, mu 2322; RV32D-NEXT: vnsrl.wi v16, v8, 23 2323; RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu 2324; RV32D-NEXT: vncvt.x.x.w v8, v16 2325; RV32D-NEXT: li a0, 134 2326; RV32D-NEXT: vrsub.vx v8, v8, a0 2327; RV32D-NEXT: ret 2328; 2329; RV64D-LABEL: ctlz_zero_undef_nxv16i8: 2330; RV64D: # %bb.0: 2331; RV64D-NEXT: vsetvli a0, zero, e32, m8, ta, mu 2332; RV64D-NEXT: vzext.vf4 v16, v8 2333; RV64D-NEXT: vfcvt.f.xu.v v8, v16 2334; RV64D-NEXT: vsetvli zero, zero, e16, m4, ta, mu 2335; RV64D-NEXT: vnsrl.wi v16, v8, 23 2336; RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu 2337; RV64D-NEXT: vncvt.x.x.w v8, v16 2338; RV64D-NEXT: li a0, 134 2339; RV64D-NEXT: vrsub.vx v8, v8, a0 2340; RV64D-NEXT: ret 2341 %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 true) 2342 ret <vscale x 16 x i8> %a 2343} 2344 2345define <vscale x 32 x i8> @ctlz_zero_undef_nxv32i8(<vscale x 32 x i8> %va) { 2346; CHECK-LABEL: ctlz_zero_undef_nxv32i8: 2347; CHECK: # %bb.0: 2348; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, mu 2349; CHECK-NEXT: vsrl.vi v12, v8, 1 2350; CHECK-NEXT: vor.vv v8, v8, v12 2351; CHECK-NEXT: vsrl.vi v12, v8, 2 2352; CHECK-NEXT: vor.vv v8, v8, v12 2353; CHECK-NEXT: vsrl.vi v12, v8, 4 2354; CHECK-NEXT: vor.vv v8, v8, v12 2355; CHECK-NEXT: vnot.v v8, v8 2356; CHECK-NEXT: vsrl.vi v12, v8, 1 2357; CHECK-NEXT: li a0, 85 2358; CHECK-NEXT: vand.vx v12, v12, a0 2359; CHECK-NEXT: vsub.vv v8, v8, v12 2360; CHECK-NEXT: li a0, 51 2361; CHECK-NEXT: vand.vx v12, v8, a0 2362; CHECK-NEXT: vsrl.vi v8, v8, 2 2363; CHECK-NEXT: vand.vx v8, v8, a0 2364; CHECK-NEXT: vadd.vv v8, v12, v8 2365; CHECK-NEXT: vsrl.vi v12, v8, 4 2366; CHECK-NEXT: vadd.vv v8, v8, v12 2367; CHECK-NEXT: vand.vi v8, v8, 15 2368; CHECK-NEXT: ret 2369 %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 true) 2370 ret <vscale x 32 x i8> %a 2371} 2372 2373define <vscale x 64 x i8> @ctlz_zero_undef_nxv64i8(<vscale x 64 x i8> %va) { 2374; CHECK-LABEL: ctlz_zero_undef_nxv64i8: 2375; CHECK: # %bb.0: 2376; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, mu 2377; CHECK-NEXT: vsrl.vi v16, v8, 1 2378; CHECK-NEXT: vor.vv v8, v8, v16 2379; CHECK-NEXT: vsrl.vi v16, v8, 2 2380; CHECK-NEXT: vor.vv v8, v8, v16 2381; CHECK-NEXT: vsrl.vi v16, v8, 4 2382; CHECK-NEXT: vor.vv v8, v8, v16 2383; CHECK-NEXT: vnot.v v8, v8 2384; CHECK-NEXT: vsrl.vi v16, v8, 1 2385; CHECK-NEXT: li a0, 85 2386; CHECK-NEXT: vand.vx v16, v16, a0 2387; CHECK-NEXT: vsub.vv v8, v8, v16 2388; CHECK-NEXT: li a0, 51 2389; CHECK-NEXT: vand.vx v16, v8, a0 2390; CHECK-NEXT: vsrl.vi v8, v8, 2 2391; CHECK-NEXT: vand.vx v8, v8, a0 2392; CHECK-NEXT: vadd.vv v8, v16, v8 2393; CHECK-NEXT: vsrl.vi v16, v8, 4 2394; CHECK-NEXT: vadd.vv v8, v8, v16 2395; CHECK-NEXT: vand.vi v8, v8, 15 2396; CHECK-NEXT: ret 2397 %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 true) 2398 ret <vscale x 64 x i8> %a 2399} 2400 2401define <vscale x 1 x i16> @ctlz_zero_undef_nxv1i16(<vscale x 1 x i16> %va) { 2402; RV32I-LABEL: ctlz_zero_undef_nxv1i16: 2403; RV32I: # %bb.0: 2404; RV32I-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 2405; RV32I-NEXT: vsrl.vi v9, v8, 1 2406; RV32I-NEXT: vor.vv v8, v8, v9 2407; RV32I-NEXT: vsrl.vi v9, v8, 2 2408; RV32I-NEXT: vor.vv v8, v8, v9 2409; RV32I-NEXT: vsrl.vi v9, v8, 4 2410; RV32I-NEXT: vor.vv v8, v8, v9 2411; RV32I-NEXT: vsrl.vi v9, v8, 8 2412; RV32I-NEXT: vor.vv v8, v8, v9 2413; RV32I-NEXT: vnot.v v8, v8 2414; RV32I-NEXT: vsrl.vi v9, v8, 1 2415; RV32I-NEXT: lui a0, 5 2416; RV32I-NEXT: addi a0, a0, 1365 2417; RV32I-NEXT: vand.vx v9, v9, a0 2418; RV32I-NEXT: vsub.vv v8, v8, v9 2419; RV32I-NEXT: lui a0, 3 2420; RV32I-NEXT: addi a0, a0, 819 2421; RV32I-NEXT: vand.vx v9, v8, a0 2422; RV32I-NEXT: vsrl.vi v8, v8, 2 2423; RV32I-NEXT: vand.vx v8, v8, a0 2424; RV32I-NEXT: vadd.vv v8, v9, v8 2425; RV32I-NEXT: vsrl.vi v9, v8, 4 2426; RV32I-NEXT: vadd.vv v8, v8, v9 2427; RV32I-NEXT: lui a0, 1 2428; RV32I-NEXT: addi a0, a0, -241 2429; RV32I-NEXT: vand.vx v8, v8, a0 2430; RV32I-NEXT: li a0, 257 2431; RV32I-NEXT: vmul.vx v8, v8, a0 2432; RV32I-NEXT: vsrl.vi v8, v8, 8 2433; RV32I-NEXT: ret 2434; 2435; RV64I-LABEL: ctlz_zero_undef_nxv1i16: 2436; RV64I: # %bb.0: 2437; RV64I-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 2438; RV64I-NEXT: vsrl.vi v9, v8, 1 2439; RV64I-NEXT: vor.vv v8, v8, v9 2440; RV64I-NEXT: vsrl.vi v9, v8, 2 2441; RV64I-NEXT: vor.vv v8, v8, v9 2442; RV64I-NEXT: vsrl.vi v9, v8, 4 2443; RV64I-NEXT: vor.vv v8, v8, v9 2444; RV64I-NEXT: vsrl.vi v9, v8, 8 2445; RV64I-NEXT: vor.vv v8, v8, v9 2446; RV64I-NEXT: vnot.v v8, v8 2447; RV64I-NEXT: vsrl.vi v9, v8, 1 2448; RV64I-NEXT: lui a0, 5 2449; RV64I-NEXT: addiw a0, a0, 1365 2450; RV64I-NEXT: vand.vx v9, v9, a0 2451; RV64I-NEXT: vsub.vv v8, v8, v9 2452; RV64I-NEXT: lui a0, 3 2453; RV64I-NEXT: addiw a0, a0, 819 2454; RV64I-NEXT: vand.vx v9, v8, a0 2455; RV64I-NEXT: vsrl.vi v8, v8, 2 2456; RV64I-NEXT: vand.vx v8, v8, a0 2457; RV64I-NEXT: vadd.vv v8, v9, v8 2458; RV64I-NEXT: vsrl.vi v9, v8, 4 2459; RV64I-NEXT: vadd.vv v8, v8, v9 2460; RV64I-NEXT: lui a0, 1 2461; RV64I-NEXT: addiw a0, a0, -241 2462; RV64I-NEXT: vand.vx v8, v8, a0 2463; RV64I-NEXT: li a0, 257 2464; RV64I-NEXT: vmul.vx v8, v8, a0 2465; RV64I-NEXT: vsrl.vi v8, v8, 8 2466; RV64I-NEXT: ret 2467; 2468; RV32D-LABEL: ctlz_zero_undef_nxv1i16: 2469; RV32D: # %bb.0: 2470; RV32D-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 2471; RV32D-NEXT: vfwcvt.f.xu.v v9, v8 2472; RV32D-NEXT: vnsrl.wi v8, v9, 23 2473; RV32D-NEXT: li a0, 142 2474; RV32D-NEXT: vrsub.vx v8, v8, a0 2475; RV32D-NEXT: ret 2476; 2477; RV64D-LABEL: ctlz_zero_undef_nxv1i16: 2478; RV64D: # %bb.0: 2479; RV64D-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 2480; RV64D-NEXT: vfwcvt.f.xu.v v9, v8 2481; RV64D-NEXT: vnsrl.wi v8, v9, 23 2482; RV64D-NEXT: li a0, 142 2483; RV64D-NEXT: vrsub.vx v8, v8, a0 2484; RV64D-NEXT: ret 2485 %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 true) 2486 ret <vscale x 1 x i16> %a 2487} 2488 2489define <vscale x 2 x i16> @ctlz_zero_undef_nxv2i16(<vscale x 2 x i16> %va) { 2490; RV32I-LABEL: ctlz_zero_undef_nxv2i16: 2491; RV32I: # %bb.0: 2492; RV32I-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 2493; RV32I-NEXT: vsrl.vi v9, v8, 1 2494; RV32I-NEXT: vor.vv v8, v8, v9 2495; RV32I-NEXT: vsrl.vi v9, v8, 2 2496; RV32I-NEXT: vor.vv v8, v8, v9 2497; RV32I-NEXT: vsrl.vi v9, v8, 4 2498; RV32I-NEXT: vor.vv v8, v8, v9 2499; RV32I-NEXT: vsrl.vi v9, v8, 8 2500; RV32I-NEXT: vor.vv v8, v8, v9 2501; RV32I-NEXT: vnot.v v8, v8 2502; RV32I-NEXT: vsrl.vi v9, v8, 1 2503; RV32I-NEXT: lui a0, 5 2504; RV32I-NEXT: addi a0, a0, 1365 2505; RV32I-NEXT: vand.vx v9, v9, a0 2506; RV32I-NEXT: vsub.vv v8, v8, v9 2507; RV32I-NEXT: lui a0, 3 2508; RV32I-NEXT: addi a0, a0, 819 2509; RV32I-NEXT: vand.vx v9, v8, a0 2510; RV32I-NEXT: vsrl.vi v8, v8, 2 2511; RV32I-NEXT: vand.vx v8, v8, a0 2512; RV32I-NEXT: vadd.vv v8, v9, v8 2513; RV32I-NEXT: vsrl.vi v9, v8, 4 2514; RV32I-NEXT: vadd.vv v8, v8, v9 2515; RV32I-NEXT: lui a0, 1 2516; RV32I-NEXT: addi a0, a0, -241 2517; RV32I-NEXT: vand.vx v8, v8, a0 2518; RV32I-NEXT: li a0, 257 2519; RV32I-NEXT: vmul.vx v8, v8, a0 2520; RV32I-NEXT: vsrl.vi v8, v8, 8 2521; RV32I-NEXT: ret 2522; 2523; RV64I-LABEL: ctlz_zero_undef_nxv2i16: 2524; RV64I: # %bb.0: 2525; RV64I-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 2526; RV64I-NEXT: vsrl.vi v9, v8, 1 2527; RV64I-NEXT: vor.vv v8, v8, v9 2528; RV64I-NEXT: vsrl.vi v9, v8, 2 2529; RV64I-NEXT: vor.vv v8, v8, v9 2530; RV64I-NEXT: vsrl.vi v9, v8, 4 2531; RV64I-NEXT: vor.vv v8, v8, v9 2532; RV64I-NEXT: vsrl.vi v9, v8, 8 2533; RV64I-NEXT: vor.vv v8, v8, v9 2534; RV64I-NEXT: vnot.v v8, v8 2535; RV64I-NEXT: vsrl.vi v9, v8, 1 2536; RV64I-NEXT: lui a0, 5 2537; RV64I-NEXT: addiw a0, a0, 1365 2538; RV64I-NEXT: vand.vx v9, v9, a0 2539; RV64I-NEXT: vsub.vv v8, v8, v9 2540; RV64I-NEXT: lui a0, 3 2541; RV64I-NEXT: addiw a0, a0, 819 2542; RV64I-NEXT: vand.vx v9, v8, a0 2543; RV64I-NEXT: vsrl.vi v8, v8, 2 2544; RV64I-NEXT: vand.vx v8, v8, a0 2545; RV64I-NEXT: vadd.vv v8, v9, v8 2546; RV64I-NEXT: vsrl.vi v9, v8, 4 2547; RV64I-NEXT: vadd.vv v8, v8, v9 2548; RV64I-NEXT: lui a0, 1 2549; RV64I-NEXT: addiw a0, a0, -241 2550; RV64I-NEXT: vand.vx v8, v8, a0 2551; RV64I-NEXT: li a0, 257 2552; RV64I-NEXT: vmul.vx v8, v8, a0 2553; RV64I-NEXT: vsrl.vi v8, v8, 8 2554; RV64I-NEXT: ret 2555; 2556; RV32D-LABEL: ctlz_zero_undef_nxv2i16: 2557; RV32D: # %bb.0: 2558; RV32D-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 2559; RV32D-NEXT: vfwcvt.f.xu.v v9, v8 2560; RV32D-NEXT: vnsrl.wi v8, v9, 23 2561; RV32D-NEXT: li a0, 142 2562; RV32D-NEXT: vrsub.vx v8, v8, a0 2563; RV32D-NEXT: ret 2564; 2565; RV64D-LABEL: ctlz_zero_undef_nxv2i16: 2566; RV64D: # %bb.0: 2567; RV64D-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 2568; RV64D-NEXT: vfwcvt.f.xu.v v9, v8 2569; RV64D-NEXT: vnsrl.wi v8, v9, 23 2570; RV64D-NEXT: li a0, 142 2571; RV64D-NEXT: vrsub.vx v8, v8, a0 2572; RV64D-NEXT: ret 2573 %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 true) 2574 ret <vscale x 2 x i16> %a 2575} 2576 2577define <vscale x 4 x i16> @ctlz_zero_undef_nxv4i16(<vscale x 4 x i16> %va) { 2578; RV32I-LABEL: ctlz_zero_undef_nxv4i16: 2579; RV32I: # %bb.0: 2580; RV32I-NEXT: vsetvli a0, zero, e16, m1, ta, mu 2581; RV32I-NEXT: vsrl.vi v9, v8, 1 2582; RV32I-NEXT: vor.vv v8, v8, v9 2583; RV32I-NEXT: vsrl.vi v9, v8, 2 2584; RV32I-NEXT: vor.vv v8, v8, v9 2585; RV32I-NEXT: vsrl.vi v9, v8, 4 2586; RV32I-NEXT: vor.vv v8, v8, v9 2587; RV32I-NEXT: vsrl.vi v9, v8, 8 2588; RV32I-NEXT: vor.vv v8, v8, v9 2589; RV32I-NEXT: vnot.v v8, v8 2590; RV32I-NEXT: vsrl.vi v9, v8, 1 2591; RV32I-NEXT: lui a0, 5 2592; RV32I-NEXT: addi a0, a0, 1365 2593; RV32I-NEXT: vand.vx v9, v9, a0 2594; RV32I-NEXT: vsub.vv v8, v8, v9 2595; RV32I-NEXT: lui a0, 3 2596; RV32I-NEXT: addi a0, a0, 819 2597; RV32I-NEXT: vand.vx v9, v8, a0 2598; RV32I-NEXT: vsrl.vi v8, v8, 2 2599; RV32I-NEXT: vand.vx v8, v8, a0 2600; RV32I-NEXT: vadd.vv v8, v9, v8 2601; RV32I-NEXT: vsrl.vi v9, v8, 4 2602; RV32I-NEXT: vadd.vv v8, v8, v9 2603; RV32I-NEXT: lui a0, 1 2604; RV32I-NEXT: addi a0, a0, -241 2605; RV32I-NEXT: vand.vx v8, v8, a0 2606; RV32I-NEXT: li a0, 257 2607; RV32I-NEXT: vmul.vx v8, v8, a0 2608; RV32I-NEXT: vsrl.vi v8, v8, 8 2609; RV32I-NEXT: ret 2610; 2611; RV64I-LABEL: ctlz_zero_undef_nxv4i16: 2612; RV64I: # %bb.0: 2613; RV64I-NEXT: vsetvli a0, zero, e16, m1, ta, mu 2614; RV64I-NEXT: vsrl.vi v9, v8, 1 2615; RV64I-NEXT: vor.vv v8, v8, v9 2616; RV64I-NEXT: vsrl.vi v9, v8, 2 2617; RV64I-NEXT: vor.vv v8, v8, v9 2618; RV64I-NEXT: vsrl.vi v9, v8, 4 2619; RV64I-NEXT: vor.vv v8, v8, v9 2620; RV64I-NEXT: vsrl.vi v9, v8, 8 2621; RV64I-NEXT: vor.vv v8, v8, v9 2622; RV64I-NEXT: vnot.v v8, v8 2623; RV64I-NEXT: vsrl.vi v9, v8, 1 2624; RV64I-NEXT: lui a0, 5 2625; RV64I-NEXT: addiw a0, a0, 1365 2626; RV64I-NEXT: vand.vx v9, v9, a0 2627; RV64I-NEXT: vsub.vv v8, v8, v9 2628; RV64I-NEXT: lui a0, 3 2629; RV64I-NEXT: addiw a0, a0, 819 2630; RV64I-NEXT: vand.vx v9, v8, a0 2631; RV64I-NEXT: vsrl.vi v8, v8, 2 2632; RV64I-NEXT: vand.vx v8, v8, a0 2633; RV64I-NEXT: vadd.vv v8, v9, v8 2634; RV64I-NEXT: vsrl.vi v9, v8, 4 2635; RV64I-NEXT: vadd.vv v8, v8, v9 2636; RV64I-NEXT: lui a0, 1 2637; RV64I-NEXT: addiw a0, a0, -241 2638; RV64I-NEXT: vand.vx v8, v8, a0 2639; RV64I-NEXT: li a0, 257 2640; RV64I-NEXT: vmul.vx v8, v8, a0 2641; RV64I-NEXT: vsrl.vi v8, v8, 8 2642; RV64I-NEXT: ret 2643; 2644; RV32D-LABEL: ctlz_zero_undef_nxv4i16: 2645; RV32D: # %bb.0: 2646; RV32D-NEXT: vsetvli a0, zero, e16, m1, ta, mu 2647; RV32D-NEXT: vfwcvt.f.xu.v v10, v8 2648; RV32D-NEXT: vnsrl.wi v8, v10, 23 2649; RV32D-NEXT: li a0, 142 2650; RV32D-NEXT: vrsub.vx v8, v8, a0 2651; RV32D-NEXT: ret 2652; 2653; RV64D-LABEL: ctlz_zero_undef_nxv4i16: 2654; RV64D: # %bb.0: 2655; RV64D-NEXT: vsetvli a0, zero, e16, m1, ta, mu 2656; RV64D-NEXT: vfwcvt.f.xu.v v10, v8 2657; RV64D-NEXT: vnsrl.wi v8, v10, 23 2658; RV64D-NEXT: li a0, 142 2659; RV64D-NEXT: vrsub.vx v8, v8, a0 2660; RV64D-NEXT: ret 2661 %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 true) 2662 ret <vscale x 4 x i16> %a 2663} 2664 2665define <vscale x 8 x i16> @ctlz_zero_undef_nxv8i16(<vscale x 8 x i16> %va) { 2666; RV32I-LABEL: ctlz_zero_undef_nxv8i16: 2667; RV32I: # %bb.0: 2668; RV32I-NEXT: vsetvli a0, zero, e16, m2, ta, mu 2669; RV32I-NEXT: vsrl.vi v10, v8, 1 2670; RV32I-NEXT: vor.vv v8, v8, v10 2671; RV32I-NEXT: vsrl.vi v10, v8, 2 2672; RV32I-NEXT: vor.vv v8, v8, v10 2673; RV32I-NEXT: vsrl.vi v10, v8, 4 2674; RV32I-NEXT: vor.vv v8, v8, v10 2675; RV32I-NEXT: vsrl.vi v10, v8, 8 2676; RV32I-NEXT: vor.vv v8, v8, v10 2677; RV32I-NEXT: vnot.v v8, v8 2678; RV32I-NEXT: vsrl.vi v10, v8, 1 2679; RV32I-NEXT: lui a0, 5 2680; RV32I-NEXT: addi a0, a0, 1365 2681; RV32I-NEXT: vand.vx v10, v10, a0 2682; RV32I-NEXT: vsub.vv v8, v8, v10 2683; RV32I-NEXT: lui a0, 3 2684; RV32I-NEXT: addi a0, a0, 819 2685; RV32I-NEXT: vand.vx v10, v8, a0 2686; RV32I-NEXT: vsrl.vi v8, v8, 2 2687; RV32I-NEXT: vand.vx v8, v8, a0 2688; RV32I-NEXT: vadd.vv v8, v10, v8 2689; RV32I-NEXT: vsrl.vi v10, v8, 4 2690; RV32I-NEXT: vadd.vv v8, v8, v10 2691; RV32I-NEXT: lui a0, 1 2692; RV32I-NEXT: addi a0, a0, -241 2693; RV32I-NEXT: vand.vx v8, v8, a0 2694; RV32I-NEXT: li a0, 257 2695; RV32I-NEXT: vmul.vx v8, v8, a0 2696; RV32I-NEXT: vsrl.vi v8, v8, 8 2697; RV32I-NEXT: ret 2698; 2699; RV64I-LABEL: ctlz_zero_undef_nxv8i16: 2700; RV64I: # %bb.0: 2701; RV64I-NEXT: vsetvli a0, zero, e16, m2, ta, mu 2702; RV64I-NEXT: vsrl.vi v10, v8, 1 2703; RV64I-NEXT: vor.vv v8, v8, v10 2704; RV64I-NEXT: vsrl.vi v10, v8, 2 2705; RV64I-NEXT: vor.vv v8, v8, v10 2706; RV64I-NEXT: vsrl.vi v10, v8, 4 2707; RV64I-NEXT: vor.vv v8, v8, v10 2708; RV64I-NEXT: vsrl.vi v10, v8, 8 2709; RV64I-NEXT: vor.vv v8, v8, v10 2710; RV64I-NEXT: vnot.v v8, v8 2711; RV64I-NEXT: vsrl.vi v10, v8, 1 2712; RV64I-NEXT: lui a0, 5 2713; RV64I-NEXT: addiw a0, a0, 1365 2714; RV64I-NEXT: vand.vx v10, v10, a0 2715; RV64I-NEXT: vsub.vv v8, v8, v10 2716; RV64I-NEXT: lui a0, 3 2717; RV64I-NEXT: addiw a0, a0, 819 2718; RV64I-NEXT: vand.vx v10, v8, a0 2719; RV64I-NEXT: vsrl.vi v8, v8, 2 2720; RV64I-NEXT: vand.vx v8, v8, a0 2721; RV64I-NEXT: vadd.vv v8, v10, v8 2722; RV64I-NEXT: vsrl.vi v10, v8, 4 2723; RV64I-NEXT: vadd.vv v8, v8, v10 2724; RV64I-NEXT: lui a0, 1 2725; RV64I-NEXT: addiw a0, a0, -241 2726; RV64I-NEXT: vand.vx v8, v8, a0 2727; RV64I-NEXT: li a0, 257 2728; RV64I-NEXT: vmul.vx v8, v8, a0 2729; RV64I-NEXT: vsrl.vi v8, v8, 8 2730; RV64I-NEXT: ret 2731; 2732; RV32D-LABEL: ctlz_zero_undef_nxv8i16: 2733; RV32D: # %bb.0: 2734; RV32D-NEXT: vsetvli a0, zero, e16, m2, ta, mu 2735; RV32D-NEXT: vfwcvt.f.xu.v v12, v8 2736; RV32D-NEXT: vnsrl.wi v8, v12, 23 2737; RV32D-NEXT: li a0, 142 2738; RV32D-NEXT: vrsub.vx v8, v8, a0 2739; RV32D-NEXT: ret 2740; 2741; RV64D-LABEL: ctlz_zero_undef_nxv8i16: 2742; RV64D: # %bb.0: 2743; RV64D-NEXT: vsetvli a0, zero, e16, m2, ta, mu 2744; RV64D-NEXT: vfwcvt.f.xu.v v12, v8 2745; RV64D-NEXT: vnsrl.wi v8, v12, 23 2746; RV64D-NEXT: li a0, 142 2747; RV64D-NEXT: vrsub.vx v8, v8, a0 2748; RV64D-NEXT: ret 2749 %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 true) 2750 ret <vscale x 8 x i16> %a 2751} 2752 2753define <vscale x 16 x i16> @ctlz_zero_undef_nxv16i16(<vscale x 16 x i16> %va) { 2754; RV32I-LABEL: ctlz_zero_undef_nxv16i16: 2755; RV32I: # %bb.0: 2756; RV32I-NEXT: vsetvli a0, zero, e16, m4, ta, mu 2757; RV32I-NEXT: vsrl.vi v12, v8, 1 2758; RV32I-NEXT: vor.vv v8, v8, v12 2759; RV32I-NEXT: vsrl.vi v12, v8, 2 2760; RV32I-NEXT: vor.vv v8, v8, v12 2761; RV32I-NEXT: vsrl.vi v12, v8, 4 2762; RV32I-NEXT: vor.vv v8, v8, v12 2763; RV32I-NEXT: vsrl.vi v12, v8, 8 2764; RV32I-NEXT: vor.vv v8, v8, v12 2765; RV32I-NEXT: vnot.v v8, v8 2766; RV32I-NEXT: vsrl.vi v12, v8, 1 2767; RV32I-NEXT: lui a0, 5 2768; RV32I-NEXT: addi a0, a0, 1365 2769; RV32I-NEXT: vand.vx v12, v12, a0 2770; RV32I-NEXT: vsub.vv v8, v8, v12 2771; RV32I-NEXT: lui a0, 3 2772; RV32I-NEXT: addi a0, a0, 819 2773; RV32I-NEXT: vand.vx v12, v8, a0 2774; RV32I-NEXT: vsrl.vi v8, v8, 2 2775; RV32I-NEXT: vand.vx v8, v8, a0 2776; RV32I-NEXT: vadd.vv v8, v12, v8 2777; RV32I-NEXT: vsrl.vi v12, v8, 4 2778; RV32I-NEXT: vadd.vv v8, v8, v12 2779; RV32I-NEXT: lui a0, 1 2780; RV32I-NEXT: addi a0, a0, -241 2781; RV32I-NEXT: vand.vx v8, v8, a0 2782; RV32I-NEXT: li a0, 257 2783; RV32I-NEXT: vmul.vx v8, v8, a0 2784; RV32I-NEXT: vsrl.vi v8, v8, 8 2785; RV32I-NEXT: ret 2786; 2787; RV64I-LABEL: ctlz_zero_undef_nxv16i16: 2788; RV64I: # %bb.0: 2789; RV64I-NEXT: vsetvli a0, zero, e16, m4, ta, mu 2790; RV64I-NEXT: vsrl.vi v12, v8, 1 2791; RV64I-NEXT: vor.vv v8, v8, v12 2792; RV64I-NEXT: vsrl.vi v12, v8, 2 2793; RV64I-NEXT: vor.vv v8, v8, v12 2794; RV64I-NEXT: vsrl.vi v12, v8, 4 2795; RV64I-NEXT: vor.vv v8, v8, v12 2796; RV64I-NEXT: vsrl.vi v12, v8, 8 2797; RV64I-NEXT: vor.vv v8, v8, v12 2798; RV64I-NEXT: vnot.v v8, v8 2799; RV64I-NEXT: vsrl.vi v12, v8, 1 2800; RV64I-NEXT: lui a0, 5 2801; RV64I-NEXT: addiw a0, a0, 1365 2802; RV64I-NEXT: vand.vx v12, v12, a0 2803; RV64I-NEXT: vsub.vv v8, v8, v12 2804; RV64I-NEXT: lui a0, 3 2805; RV64I-NEXT: addiw a0, a0, 819 2806; RV64I-NEXT: vand.vx v12, v8, a0 2807; RV64I-NEXT: vsrl.vi v8, v8, 2 2808; RV64I-NEXT: vand.vx v8, v8, a0 2809; RV64I-NEXT: vadd.vv v8, v12, v8 2810; RV64I-NEXT: vsrl.vi v12, v8, 4 2811; RV64I-NEXT: vadd.vv v8, v8, v12 2812; RV64I-NEXT: lui a0, 1 2813; RV64I-NEXT: addiw a0, a0, -241 2814; RV64I-NEXT: vand.vx v8, v8, a0 2815; RV64I-NEXT: li a0, 257 2816; RV64I-NEXT: vmul.vx v8, v8, a0 2817; RV64I-NEXT: vsrl.vi v8, v8, 8 2818; RV64I-NEXT: ret 2819; 2820; RV32D-LABEL: ctlz_zero_undef_nxv16i16: 2821; RV32D: # %bb.0: 2822; RV32D-NEXT: vsetvli a0, zero, e16, m4, ta, mu 2823; RV32D-NEXT: vfwcvt.f.xu.v v16, v8 2824; RV32D-NEXT: vnsrl.wi v8, v16, 23 2825; RV32D-NEXT: li a0, 142 2826; RV32D-NEXT: vrsub.vx v8, v8, a0 2827; RV32D-NEXT: ret 2828; 2829; RV64D-LABEL: ctlz_zero_undef_nxv16i16: 2830; RV64D: # %bb.0: 2831; RV64D-NEXT: vsetvli a0, zero, e16, m4, ta, mu 2832; RV64D-NEXT: vfwcvt.f.xu.v v16, v8 2833; RV64D-NEXT: vnsrl.wi v8, v16, 23 2834; RV64D-NEXT: li a0, 142 2835; RV64D-NEXT: vrsub.vx v8, v8, a0 2836; RV64D-NEXT: ret 2837 %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 true) 2838 ret <vscale x 16 x i16> %a 2839} 2840 2841define <vscale x 32 x i16> @ctlz_zero_undef_nxv32i16(<vscale x 32 x i16> %va) { 2842; RV32-LABEL: ctlz_zero_undef_nxv32i16: 2843; RV32: # %bb.0: 2844; RV32-NEXT: vsetvli a0, zero, e16, m8, ta, mu 2845; RV32-NEXT: vsrl.vi v16, v8, 1 2846; RV32-NEXT: vor.vv v8, v8, v16 2847; RV32-NEXT: vsrl.vi v16, v8, 2 2848; RV32-NEXT: vor.vv v8, v8, v16 2849; RV32-NEXT: vsrl.vi v16, v8, 4 2850; RV32-NEXT: vor.vv v8, v8, v16 2851; RV32-NEXT: vsrl.vi v16, v8, 8 2852; RV32-NEXT: vor.vv v8, v8, v16 2853; RV32-NEXT: vnot.v v8, v8 2854; RV32-NEXT: vsrl.vi v16, v8, 1 2855; RV32-NEXT: lui a0, 5 2856; RV32-NEXT: addi a0, a0, 1365 2857; RV32-NEXT: vand.vx v16, v16, a0 2858; RV32-NEXT: vsub.vv v8, v8, v16 2859; RV32-NEXT: lui a0, 3 2860; RV32-NEXT: addi a0, a0, 819 2861; RV32-NEXT: vand.vx v16, v8, a0 2862; RV32-NEXT: vsrl.vi v8, v8, 2 2863; RV32-NEXT: vand.vx v8, v8, a0 2864; RV32-NEXT: vadd.vv v8, v16, v8 2865; RV32-NEXT: vsrl.vi v16, v8, 4 2866; RV32-NEXT: vadd.vv v8, v8, v16 2867; RV32-NEXT: lui a0, 1 2868; RV32-NEXT: addi a0, a0, -241 2869; RV32-NEXT: vand.vx v8, v8, a0 2870; RV32-NEXT: li a0, 257 2871; RV32-NEXT: vmul.vx v8, v8, a0 2872; RV32-NEXT: vsrl.vi v8, v8, 8 2873; RV32-NEXT: ret 2874; 2875; RV64-LABEL: ctlz_zero_undef_nxv32i16: 2876; RV64: # %bb.0: 2877; RV64-NEXT: vsetvli a0, zero, e16, m8, ta, mu 2878; RV64-NEXT: vsrl.vi v16, v8, 1 2879; RV64-NEXT: vor.vv v8, v8, v16 2880; RV64-NEXT: vsrl.vi v16, v8, 2 2881; RV64-NEXT: vor.vv v8, v8, v16 2882; RV64-NEXT: vsrl.vi v16, v8, 4 2883; RV64-NEXT: vor.vv v8, v8, v16 2884; RV64-NEXT: vsrl.vi v16, v8, 8 2885; RV64-NEXT: vor.vv v8, v8, v16 2886; RV64-NEXT: vnot.v v8, v8 2887; RV64-NEXT: vsrl.vi v16, v8, 1 2888; RV64-NEXT: lui a0, 5 2889; RV64-NEXT: addiw a0, a0, 1365 2890; RV64-NEXT: vand.vx v16, v16, a0 2891; RV64-NEXT: vsub.vv v8, v8, v16 2892; RV64-NEXT: lui a0, 3 2893; RV64-NEXT: addiw a0, a0, 819 2894; RV64-NEXT: vand.vx v16, v8, a0 2895; RV64-NEXT: vsrl.vi v8, v8, 2 2896; RV64-NEXT: vand.vx v8, v8, a0 2897; RV64-NEXT: vadd.vv v8, v16, v8 2898; RV64-NEXT: vsrl.vi v16, v8, 4 2899; RV64-NEXT: vadd.vv v8, v8, v16 2900; RV64-NEXT: lui a0, 1 2901; RV64-NEXT: addiw a0, a0, -241 2902; RV64-NEXT: vand.vx v8, v8, a0 2903; RV64-NEXT: li a0, 257 2904; RV64-NEXT: vmul.vx v8, v8, a0 2905; RV64-NEXT: vsrl.vi v8, v8, 8 2906; RV64-NEXT: ret 2907 %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 true) 2908 ret <vscale x 32 x i16> %a 2909} 2910 2911define <vscale x 1 x i32> @ctlz_zero_undef_nxv1i32(<vscale x 1 x i32> %va) { 2912; RV32I-LABEL: ctlz_zero_undef_nxv1i32: 2913; RV32I: # %bb.0: 2914; RV32I-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 2915; RV32I-NEXT: vsrl.vi v9, v8, 1 2916; RV32I-NEXT: vor.vv v8, v8, v9 2917; RV32I-NEXT: vsrl.vi v9, v8, 2 2918; RV32I-NEXT: vor.vv v8, v8, v9 2919; RV32I-NEXT: vsrl.vi v9, v8, 4 2920; RV32I-NEXT: vor.vv v8, v8, v9 2921; RV32I-NEXT: vsrl.vi v9, v8, 8 2922; RV32I-NEXT: vor.vv v8, v8, v9 2923; RV32I-NEXT: vsrl.vi v9, v8, 16 2924; RV32I-NEXT: vor.vv v8, v8, v9 2925; RV32I-NEXT: vnot.v v8, v8 2926; RV32I-NEXT: vsrl.vi v9, v8, 1 2927; RV32I-NEXT: lui a0, 349525 2928; RV32I-NEXT: addi a0, a0, 1365 2929; RV32I-NEXT: vand.vx v9, v9, a0 2930; RV32I-NEXT: vsub.vv v8, v8, v9 2931; RV32I-NEXT: lui a0, 209715 2932; RV32I-NEXT: addi a0, a0, 819 2933; RV32I-NEXT: vand.vx v9, v8, a0 2934; RV32I-NEXT: vsrl.vi v8, v8, 2 2935; RV32I-NEXT: vand.vx v8, v8, a0 2936; RV32I-NEXT: vadd.vv v8, v9, v8 2937; RV32I-NEXT: vsrl.vi v9, v8, 4 2938; RV32I-NEXT: vadd.vv v8, v8, v9 2939; RV32I-NEXT: lui a0, 61681 2940; RV32I-NEXT: addi a0, a0, -241 2941; RV32I-NEXT: vand.vx v8, v8, a0 2942; RV32I-NEXT: lui a0, 4112 2943; RV32I-NEXT: addi a0, a0, 257 2944; RV32I-NEXT: vmul.vx v8, v8, a0 2945; RV32I-NEXT: vsrl.vi v8, v8, 24 2946; RV32I-NEXT: ret 2947; 2948; RV64I-LABEL: ctlz_zero_undef_nxv1i32: 2949; RV64I: # %bb.0: 2950; RV64I-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 2951; RV64I-NEXT: vsrl.vi v9, v8, 1 2952; RV64I-NEXT: vor.vv v8, v8, v9 2953; RV64I-NEXT: vsrl.vi v9, v8, 2 2954; RV64I-NEXT: vor.vv v8, v8, v9 2955; RV64I-NEXT: vsrl.vi v9, v8, 4 2956; RV64I-NEXT: vor.vv v8, v8, v9 2957; RV64I-NEXT: vsrl.vi v9, v8, 8 2958; RV64I-NEXT: vor.vv v8, v8, v9 2959; RV64I-NEXT: vsrl.vi v9, v8, 16 2960; RV64I-NEXT: vor.vv v8, v8, v9 2961; RV64I-NEXT: vnot.v v8, v8 2962; RV64I-NEXT: vsrl.vi v9, v8, 1 2963; RV64I-NEXT: lui a0, 349525 2964; RV64I-NEXT: addiw a0, a0, 1365 2965; RV64I-NEXT: vand.vx v9, v9, a0 2966; RV64I-NEXT: vsub.vv v8, v8, v9 2967; RV64I-NEXT: lui a0, 209715 2968; RV64I-NEXT: addiw a0, a0, 819 2969; RV64I-NEXT: vand.vx v9, v8, a0 2970; RV64I-NEXT: vsrl.vi v8, v8, 2 2971; RV64I-NEXT: vand.vx v8, v8, a0 2972; RV64I-NEXT: vadd.vv v8, v9, v8 2973; RV64I-NEXT: vsrl.vi v9, v8, 4 2974; RV64I-NEXT: vadd.vv v8, v8, v9 2975; RV64I-NEXT: lui a0, 61681 2976; RV64I-NEXT: addiw a0, a0, -241 2977; RV64I-NEXT: vand.vx v8, v8, a0 2978; RV64I-NEXT: lui a0, 4112 2979; RV64I-NEXT: addiw a0, a0, 257 2980; RV64I-NEXT: vmul.vx v8, v8, a0 2981; RV64I-NEXT: vsrl.vi v8, v8, 24 2982; RV64I-NEXT: ret 2983; 2984; RV32D-LABEL: ctlz_zero_undef_nxv1i32: 2985; RV32D: # %bb.0: 2986; RV32D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 2987; RV32D-NEXT: vfwcvt.f.xu.v v9, v8 2988; RV32D-NEXT: li a0, 52 2989; RV32D-NEXT: vsetvli zero, zero, e64, m1, ta, mu 2990; RV32D-NEXT: vsrl.vx v8, v9, a0 2991; RV32D-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 2992; RV32D-NEXT: vncvt.x.x.w v8, v8 2993; RV32D-NEXT: li a0, 1054 2994; RV32D-NEXT: vrsub.vx v8, v8, a0 2995; RV32D-NEXT: ret 2996; 2997; RV64D-LABEL: ctlz_zero_undef_nxv1i32: 2998; RV64D: # %bb.0: 2999; RV64D-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 3000; RV64D-NEXT: vfwcvt.f.xu.v v9, v8 3001; RV64D-NEXT: li a0, 52 3002; RV64D-NEXT: vsetvli zero, zero, e64, m1, ta, mu 3003; RV64D-NEXT: vsrl.vx v8, v9, a0 3004; RV64D-NEXT: vsetvli zero, zero, e32, mf2, ta, mu 3005; RV64D-NEXT: vncvt.x.x.w v8, v8 3006; RV64D-NEXT: li a0, 1054 3007; RV64D-NEXT: vrsub.vx v8, v8, a0 3008; RV64D-NEXT: ret 3009 %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 true) 3010 ret <vscale x 1 x i32> %a 3011} 3012 3013define <vscale x 2 x i32> @ctlz_zero_undef_nxv2i32(<vscale x 2 x i32> %va) { 3014; RV32I-LABEL: ctlz_zero_undef_nxv2i32: 3015; RV32I: # %bb.0: 3016; RV32I-NEXT: vsetvli a0, zero, e32, m1, ta, mu 3017; RV32I-NEXT: vsrl.vi v9, v8, 1 3018; RV32I-NEXT: vor.vv v8, v8, v9 3019; RV32I-NEXT: vsrl.vi v9, v8, 2 3020; RV32I-NEXT: vor.vv v8, v8, v9 3021; RV32I-NEXT: vsrl.vi v9, v8, 4 3022; RV32I-NEXT: vor.vv v8, v8, v9 3023; RV32I-NEXT: vsrl.vi v9, v8, 8 3024; RV32I-NEXT: vor.vv v8, v8, v9 3025; RV32I-NEXT: vsrl.vi v9, v8, 16 3026; RV32I-NEXT: vor.vv v8, v8, v9 3027; RV32I-NEXT: vnot.v v8, v8 3028; RV32I-NEXT: vsrl.vi v9, v8, 1 3029; RV32I-NEXT: lui a0, 349525 3030; RV32I-NEXT: addi a0, a0, 1365 3031; RV32I-NEXT: vand.vx v9, v9, a0 3032; RV32I-NEXT: vsub.vv v8, v8, v9 3033; RV32I-NEXT: lui a0, 209715 3034; RV32I-NEXT: addi a0, a0, 819 3035; RV32I-NEXT: vand.vx v9, v8, a0 3036; RV32I-NEXT: vsrl.vi v8, v8, 2 3037; RV32I-NEXT: vand.vx v8, v8, a0 3038; RV32I-NEXT: vadd.vv v8, v9, v8 3039; RV32I-NEXT: vsrl.vi v9, v8, 4 3040; RV32I-NEXT: vadd.vv v8, v8, v9 3041; RV32I-NEXT: lui a0, 61681 3042; RV32I-NEXT: addi a0, a0, -241 3043; RV32I-NEXT: vand.vx v8, v8, a0 3044; RV32I-NEXT: lui a0, 4112 3045; RV32I-NEXT: addi a0, a0, 257 3046; RV32I-NEXT: vmul.vx v8, v8, a0 3047; RV32I-NEXT: vsrl.vi v8, v8, 24 3048; RV32I-NEXT: ret 3049; 3050; RV64I-LABEL: ctlz_zero_undef_nxv2i32: 3051; RV64I: # %bb.0: 3052; RV64I-NEXT: vsetvli a0, zero, e32, m1, ta, mu 3053; RV64I-NEXT: vsrl.vi v9, v8, 1 3054; RV64I-NEXT: vor.vv v8, v8, v9 3055; RV64I-NEXT: vsrl.vi v9, v8, 2 3056; RV64I-NEXT: vor.vv v8, v8, v9 3057; RV64I-NEXT: vsrl.vi v9, v8, 4 3058; RV64I-NEXT: vor.vv v8, v8, v9 3059; RV64I-NEXT: vsrl.vi v9, v8, 8 3060; RV64I-NEXT: vor.vv v8, v8, v9 3061; RV64I-NEXT: vsrl.vi v9, v8, 16 3062; RV64I-NEXT: vor.vv v8, v8, v9 3063; RV64I-NEXT: vnot.v v8, v8 3064; RV64I-NEXT: vsrl.vi v9, v8, 1 3065; RV64I-NEXT: lui a0, 349525 3066; RV64I-NEXT: addiw a0, a0, 1365 3067; RV64I-NEXT: vand.vx v9, v9, a0 3068; RV64I-NEXT: vsub.vv v8, v8, v9 3069; RV64I-NEXT: lui a0, 209715 3070; RV64I-NEXT: addiw a0, a0, 819 3071; RV64I-NEXT: vand.vx v9, v8, a0 3072; RV64I-NEXT: vsrl.vi v8, v8, 2 3073; RV64I-NEXT: vand.vx v8, v8, a0 3074; RV64I-NEXT: vadd.vv v8, v9, v8 3075; RV64I-NEXT: vsrl.vi v9, v8, 4 3076; RV64I-NEXT: vadd.vv v8, v8, v9 3077; RV64I-NEXT: lui a0, 61681 3078; RV64I-NEXT: addiw a0, a0, -241 3079; RV64I-NEXT: vand.vx v8, v8, a0 3080; RV64I-NEXT: lui a0, 4112 3081; RV64I-NEXT: addiw a0, a0, 257 3082; RV64I-NEXT: vmul.vx v8, v8, a0 3083; RV64I-NEXT: vsrl.vi v8, v8, 24 3084; RV64I-NEXT: ret 3085; 3086; RV32D-LABEL: ctlz_zero_undef_nxv2i32: 3087; RV32D: # %bb.0: 3088; RV32D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 3089; RV32D-NEXT: vfwcvt.f.xu.v v10, v8 3090; RV32D-NEXT: li a0, 52 3091; RV32D-NEXT: vsetvli zero, zero, e64, m2, ta, mu 3092; RV32D-NEXT: vsrl.vx v8, v10, a0 3093; RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu 3094; RV32D-NEXT: vncvt.x.x.w v10, v8 3095; RV32D-NEXT: li a0, 1054 3096; RV32D-NEXT: vrsub.vx v8, v10, a0 3097; RV32D-NEXT: ret 3098; 3099; RV64D-LABEL: ctlz_zero_undef_nxv2i32: 3100; RV64D: # %bb.0: 3101; RV64D-NEXT: vsetvli a0, zero, e32, m1, ta, mu 3102; RV64D-NEXT: vfwcvt.f.xu.v v10, v8 3103; RV64D-NEXT: li a0, 52 3104; RV64D-NEXT: vsetvli zero, zero, e64, m2, ta, mu 3105; RV64D-NEXT: vsrl.vx v8, v10, a0 3106; RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu 3107; RV64D-NEXT: vncvt.x.x.w v10, v8 3108; RV64D-NEXT: li a0, 1054 3109; RV64D-NEXT: vrsub.vx v8, v10, a0 3110; RV64D-NEXT: ret 3111 %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 true) 3112 ret <vscale x 2 x i32> %a 3113} 3114 3115define <vscale x 4 x i32> @ctlz_zero_undef_nxv4i32(<vscale x 4 x i32> %va) { 3116; RV32I-LABEL: ctlz_zero_undef_nxv4i32: 3117; RV32I: # %bb.0: 3118; RV32I-NEXT: vsetvli a0, zero, e32, m2, ta, mu 3119; RV32I-NEXT: vsrl.vi v10, v8, 1 3120; RV32I-NEXT: vor.vv v8, v8, v10 3121; RV32I-NEXT: vsrl.vi v10, v8, 2 3122; RV32I-NEXT: vor.vv v8, v8, v10 3123; RV32I-NEXT: vsrl.vi v10, v8, 4 3124; RV32I-NEXT: vor.vv v8, v8, v10 3125; RV32I-NEXT: vsrl.vi v10, v8, 8 3126; RV32I-NEXT: vor.vv v8, v8, v10 3127; RV32I-NEXT: vsrl.vi v10, v8, 16 3128; RV32I-NEXT: vor.vv v8, v8, v10 3129; RV32I-NEXT: vnot.v v8, v8 3130; RV32I-NEXT: vsrl.vi v10, v8, 1 3131; RV32I-NEXT: lui a0, 349525 3132; RV32I-NEXT: addi a0, a0, 1365 3133; RV32I-NEXT: vand.vx v10, v10, a0 3134; RV32I-NEXT: vsub.vv v8, v8, v10 3135; RV32I-NEXT: lui a0, 209715 3136; RV32I-NEXT: addi a0, a0, 819 3137; RV32I-NEXT: vand.vx v10, v8, a0 3138; RV32I-NEXT: vsrl.vi v8, v8, 2 3139; RV32I-NEXT: vand.vx v8, v8, a0 3140; RV32I-NEXT: vadd.vv v8, v10, v8 3141; RV32I-NEXT: vsrl.vi v10, v8, 4 3142; RV32I-NEXT: vadd.vv v8, v8, v10 3143; RV32I-NEXT: lui a0, 61681 3144; RV32I-NEXT: addi a0, a0, -241 3145; RV32I-NEXT: vand.vx v8, v8, a0 3146; RV32I-NEXT: lui a0, 4112 3147; RV32I-NEXT: addi a0, a0, 257 3148; RV32I-NEXT: vmul.vx v8, v8, a0 3149; RV32I-NEXT: vsrl.vi v8, v8, 24 3150; RV32I-NEXT: ret 3151; 3152; RV64I-LABEL: ctlz_zero_undef_nxv4i32: 3153; RV64I: # %bb.0: 3154; RV64I-NEXT: vsetvli a0, zero, e32, m2, ta, mu 3155; RV64I-NEXT: vsrl.vi v10, v8, 1 3156; RV64I-NEXT: vor.vv v8, v8, v10 3157; RV64I-NEXT: vsrl.vi v10, v8, 2 3158; RV64I-NEXT: vor.vv v8, v8, v10 3159; RV64I-NEXT: vsrl.vi v10, v8, 4 3160; RV64I-NEXT: vor.vv v8, v8, v10 3161; RV64I-NEXT: vsrl.vi v10, v8, 8 3162; RV64I-NEXT: vor.vv v8, v8, v10 3163; RV64I-NEXT: vsrl.vi v10, v8, 16 3164; RV64I-NEXT: vor.vv v8, v8, v10 3165; RV64I-NEXT: vnot.v v8, v8 3166; RV64I-NEXT: vsrl.vi v10, v8, 1 3167; RV64I-NEXT: lui a0, 349525 3168; RV64I-NEXT: addiw a0, a0, 1365 3169; RV64I-NEXT: vand.vx v10, v10, a0 3170; RV64I-NEXT: vsub.vv v8, v8, v10 3171; RV64I-NEXT: lui a0, 209715 3172; RV64I-NEXT: addiw a0, a0, 819 3173; RV64I-NEXT: vand.vx v10, v8, a0 3174; RV64I-NEXT: vsrl.vi v8, v8, 2 3175; RV64I-NEXT: vand.vx v8, v8, a0 3176; RV64I-NEXT: vadd.vv v8, v10, v8 3177; RV64I-NEXT: vsrl.vi v10, v8, 4 3178; RV64I-NEXT: vadd.vv v8, v8, v10 3179; RV64I-NEXT: lui a0, 61681 3180; RV64I-NEXT: addiw a0, a0, -241 3181; RV64I-NEXT: vand.vx v8, v8, a0 3182; RV64I-NEXT: lui a0, 4112 3183; RV64I-NEXT: addiw a0, a0, 257 3184; RV64I-NEXT: vmul.vx v8, v8, a0 3185; RV64I-NEXT: vsrl.vi v8, v8, 24 3186; RV64I-NEXT: ret 3187; 3188; RV32D-LABEL: ctlz_zero_undef_nxv4i32: 3189; RV32D: # %bb.0: 3190; RV32D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 3191; RV32D-NEXT: vfwcvt.f.xu.v v12, v8 3192; RV32D-NEXT: li a0, 52 3193; RV32D-NEXT: vsetvli zero, zero, e64, m4, ta, mu 3194; RV32D-NEXT: vsrl.vx v8, v12, a0 3195; RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu 3196; RV32D-NEXT: vncvt.x.x.w v12, v8 3197; RV32D-NEXT: li a0, 1054 3198; RV32D-NEXT: vrsub.vx v8, v12, a0 3199; RV32D-NEXT: ret 3200; 3201; RV64D-LABEL: ctlz_zero_undef_nxv4i32: 3202; RV64D: # %bb.0: 3203; RV64D-NEXT: vsetvli a0, zero, e32, m2, ta, mu 3204; RV64D-NEXT: vfwcvt.f.xu.v v12, v8 3205; RV64D-NEXT: li a0, 52 3206; RV64D-NEXT: vsetvli zero, zero, e64, m4, ta, mu 3207; RV64D-NEXT: vsrl.vx v8, v12, a0 3208; RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu 3209; RV64D-NEXT: vncvt.x.x.w v12, v8 3210; RV64D-NEXT: li a0, 1054 3211; RV64D-NEXT: vrsub.vx v8, v12, a0 3212; RV64D-NEXT: ret 3213 %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 true) 3214 ret <vscale x 4 x i32> %a 3215} 3216 3217define <vscale x 8 x i32> @ctlz_zero_undef_nxv8i32(<vscale x 8 x i32> %va) { 3218; RV32I-LABEL: ctlz_zero_undef_nxv8i32: 3219; RV32I: # %bb.0: 3220; RV32I-NEXT: vsetvli a0, zero, e32, m4, ta, mu 3221; RV32I-NEXT: vsrl.vi v12, v8, 1 3222; RV32I-NEXT: vor.vv v8, v8, v12 3223; RV32I-NEXT: vsrl.vi v12, v8, 2 3224; RV32I-NEXT: vor.vv v8, v8, v12 3225; RV32I-NEXT: vsrl.vi v12, v8, 4 3226; RV32I-NEXT: vor.vv v8, v8, v12 3227; RV32I-NEXT: vsrl.vi v12, v8, 8 3228; RV32I-NEXT: vor.vv v8, v8, v12 3229; RV32I-NEXT: vsrl.vi v12, v8, 16 3230; RV32I-NEXT: vor.vv v8, v8, v12 3231; RV32I-NEXT: vnot.v v8, v8 3232; RV32I-NEXT: vsrl.vi v12, v8, 1 3233; RV32I-NEXT: lui a0, 349525 3234; RV32I-NEXT: addi a0, a0, 1365 3235; RV32I-NEXT: vand.vx v12, v12, a0 3236; RV32I-NEXT: vsub.vv v8, v8, v12 3237; RV32I-NEXT: lui a0, 209715 3238; RV32I-NEXT: addi a0, a0, 819 3239; RV32I-NEXT: vand.vx v12, v8, a0 3240; RV32I-NEXT: vsrl.vi v8, v8, 2 3241; RV32I-NEXT: vand.vx v8, v8, a0 3242; RV32I-NEXT: vadd.vv v8, v12, v8 3243; RV32I-NEXT: vsrl.vi v12, v8, 4 3244; RV32I-NEXT: vadd.vv v8, v8, v12 3245; RV32I-NEXT: lui a0, 61681 3246; RV32I-NEXT: addi a0, a0, -241 3247; RV32I-NEXT: vand.vx v8, v8, a0 3248; RV32I-NEXT: lui a0, 4112 3249; RV32I-NEXT: addi a0, a0, 257 3250; RV32I-NEXT: vmul.vx v8, v8, a0 3251; RV32I-NEXT: vsrl.vi v8, v8, 24 3252; RV32I-NEXT: ret 3253; 3254; RV64I-LABEL: ctlz_zero_undef_nxv8i32: 3255; RV64I: # %bb.0: 3256; RV64I-NEXT: vsetvli a0, zero, e32, m4, ta, mu 3257; RV64I-NEXT: vsrl.vi v12, v8, 1 3258; RV64I-NEXT: vor.vv v8, v8, v12 3259; RV64I-NEXT: vsrl.vi v12, v8, 2 3260; RV64I-NEXT: vor.vv v8, v8, v12 3261; RV64I-NEXT: vsrl.vi v12, v8, 4 3262; RV64I-NEXT: vor.vv v8, v8, v12 3263; RV64I-NEXT: vsrl.vi v12, v8, 8 3264; RV64I-NEXT: vor.vv v8, v8, v12 3265; RV64I-NEXT: vsrl.vi v12, v8, 16 3266; RV64I-NEXT: vor.vv v8, v8, v12 3267; RV64I-NEXT: vnot.v v8, v8 3268; RV64I-NEXT: vsrl.vi v12, v8, 1 3269; RV64I-NEXT: lui a0, 349525 3270; RV64I-NEXT: addiw a0, a0, 1365 3271; RV64I-NEXT: vand.vx v12, v12, a0 3272; RV64I-NEXT: vsub.vv v8, v8, v12 3273; RV64I-NEXT: lui a0, 209715 3274; RV64I-NEXT: addiw a0, a0, 819 3275; RV64I-NEXT: vand.vx v12, v8, a0 3276; RV64I-NEXT: vsrl.vi v8, v8, 2 3277; RV64I-NEXT: vand.vx v8, v8, a0 3278; RV64I-NEXT: vadd.vv v8, v12, v8 3279; RV64I-NEXT: vsrl.vi v12, v8, 4 3280; RV64I-NEXT: vadd.vv v8, v8, v12 3281; RV64I-NEXT: lui a0, 61681 3282; RV64I-NEXT: addiw a0, a0, -241 3283; RV64I-NEXT: vand.vx v8, v8, a0 3284; RV64I-NEXT: lui a0, 4112 3285; RV64I-NEXT: addiw a0, a0, 257 3286; RV64I-NEXT: vmul.vx v8, v8, a0 3287; RV64I-NEXT: vsrl.vi v8, v8, 24 3288; RV64I-NEXT: ret 3289; 3290; RV32D-LABEL: ctlz_zero_undef_nxv8i32: 3291; RV32D: # %bb.0: 3292; RV32D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 3293; RV32D-NEXT: vfwcvt.f.xu.v v16, v8 3294; RV32D-NEXT: li a0, 52 3295; RV32D-NEXT: vsetvli zero, zero, e64, m8, ta, mu 3296; RV32D-NEXT: vsrl.vx v8, v16, a0 3297; RV32D-NEXT: vsetvli zero, zero, e32, m4, ta, mu 3298; RV32D-NEXT: vncvt.x.x.w v16, v8 3299; RV32D-NEXT: li a0, 1054 3300; RV32D-NEXT: vrsub.vx v8, v16, a0 3301; RV32D-NEXT: ret 3302; 3303; RV64D-LABEL: ctlz_zero_undef_nxv8i32: 3304; RV64D: # %bb.0: 3305; RV64D-NEXT: vsetvli a0, zero, e32, m4, ta, mu 3306; RV64D-NEXT: vfwcvt.f.xu.v v16, v8 3307; RV64D-NEXT: li a0, 52 3308; RV64D-NEXT: vsetvli zero, zero, e64, m8, ta, mu 3309; RV64D-NEXT: vsrl.vx v8, v16, a0 3310; RV64D-NEXT: vsetvli zero, zero, e32, m4, ta, mu 3311; RV64D-NEXT: vncvt.x.x.w v16, v8 3312; RV64D-NEXT: li a0, 1054 3313; RV64D-NEXT: vrsub.vx v8, v16, a0 3314; RV64D-NEXT: ret 3315 %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 true) 3316 ret <vscale x 8 x i32> %a 3317} 3318 3319define <vscale x 16 x i32> @ctlz_zero_undef_nxv16i32(<vscale x 16 x i32> %va) { 3320; RV32-LABEL: ctlz_zero_undef_nxv16i32: 3321; RV32: # %bb.0: 3322; RV32-NEXT: vsetvli a0, zero, e32, m8, ta, mu 3323; RV32-NEXT: vsrl.vi v16, v8, 1 3324; RV32-NEXT: vor.vv v8, v8, v16 3325; RV32-NEXT: vsrl.vi v16, v8, 2 3326; RV32-NEXT: vor.vv v8, v8, v16 3327; RV32-NEXT: vsrl.vi v16, v8, 4 3328; RV32-NEXT: vor.vv v8, v8, v16 3329; RV32-NEXT: vsrl.vi v16, v8, 8 3330; RV32-NEXT: vor.vv v8, v8, v16 3331; RV32-NEXT: vsrl.vi v16, v8, 16 3332; RV32-NEXT: vor.vv v8, v8, v16 3333; RV32-NEXT: vnot.v v8, v8 3334; RV32-NEXT: vsrl.vi v16, v8, 1 3335; RV32-NEXT: lui a0, 349525 3336; RV32-NEXT: addi a0, a0, 1365 3337; RV32-NEXT: vand.vx v16, v16, a0 3338; RV32-NEXT: vsub.vv v8, v8, v16 3339; RV32-NEXT: lui a0, 209715 3340; RV32-NEXT: addi a0, a0, 819 3341; RV32-NEXT: vand.vx v16, v8, a0 3342; RV32-NEXT: vsrl.vi v8, v8, 2 3343; RV32-NEXT: vand.vx v8, v8, a0 3344; RV32-NEXT: vadd.vv v8, v16, v8 3345; RV32-NEXT: vsrl.vi v16, v8, 4 3346; RV32-NEXT: vadd.vv v8, v8, v16 3347; RV32-NEXT: lui a0, 61681 3348; RV32-NEXT: addi a0, a0, -241 3349; RV32-NEXT: vand.vx v8, v8, a0 3350; RV32-NEXT: lui a0, 4112 3351; RV32-NEXT: addi a0, a0, 257 3352; RV32-NEXT: vmul.vx v8, v8, a0 3353; RV32-NEXT: vsrl.vi v8, v8, 24 3354; RV32-NEXT: ret 3355; 3356; RV64-LABEL: ctlz_zero_undef_nxv16i32: 3357; RV64: # %bb.0: 3358; RV64-NEXT: vsetvli a0, zero, e32, m8, ta, mu 3359; RV64-NEXT: vsrl.vi v16, v8, 1 3360; RV64-NEXT: vor.vv v8, v8, v16 3361; RV64-NEXT: vsrl.vi v16, v8, 2 3362; RV64-NEXT: vor.vv v8, v8, v16 3363; RV64-NEXT: vsrl.vi v16, v8, 4 3364; RV64-NEXT: vor.vv v8, v8, v16 3365; RV64-NEXT: vsrl.vi v16, v8, 8 3366; RV64-NEXT: vor.vv v8, v8, v16 3367; RV64-NEXT: vsrl.vi v16, v8, 16 3368; RV64-NEXT: vor.vv v8, v8, v16 3369; RV64-NEXT: vnot.v v8, v8 3370; RV64-NEXT: vsrl.vi v16, v8, 1 3371; RV64-NEXT: lui a0, 349525 3372; RV64-NEXT: addiw a0, a0, 1365 3373; RV64-NEXT: vand.vx v16, v16, a0 3374; RV64-NEXT: vsub.vv v8, v8, v16 3375; RV64-NEXT: lui a0, 209715 3376; RV64-NEXT: addiw a0, a0, 819 3377; RV64-NEXT: vand.vx v16, v8, a0 3378; RV64-NEXT: vsrl.vi v8, v8, 2 3379; RV64-NEXT: vand.vx v8, v8, a0 3380; RV64-NEXT: vadd.vv v8, v16, v8 3381; RV64-NEXT: vsrl.vi v16, v8, 4 3382; RV64-NEXT: vadd.vv v8, v8, v16 3383; RV64-NEXT: lui a0, 61681 3384; RV64-NEXT: addiw a0, a0, -241 3385; RV64-NEXT: vand.vx v8, v8, a0 3386; RV64-NEXT: lui a0, 4112 3387; RV64-NEXT: addiw a0, a0, 257 3388; RV64-NEXT: vmul.vx v8, v8, a0 3389; RV64-NEXT: vsrl.vi v8, v8, 24 3390; RV64-NEXT: ret 3391 %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 true) 3392 ret <vscale x 16 x i32> %a 3393} 3394 3395define <vscale x 1 x i64> @ctlz_zero_undef_nxv1i64(<vscale x 1 x i64> %va) { 3396; RV32-LABEL: ctlz_zero_undef_nxv1i64: 3397; RV32: # %bb.0: 3398; RV32-NEXT: addi sp, sp, -16 3399; RV32-NEXT: .cfi_def_cfa_offset 16 3400; RV32-NEXT: lui a0, 349525 3401; RV32-NEXT: addi a0, a0, 1365 3402; RV32-NEXT: sw a0, 12(sp) 3403; RV32-NEXT: sw a0, 8(sp) 3404; RV32-NEXT: lui a0, 209715 3405; RV32-NEXT: addi a0, a0, 819 3406; RV32-NEXT: sw a0, 12(sp) 3407; RV32-NEXT: sw a0, 8(sp) 3408; RV32-NEXT: lui a0, 61681 3409; RV32-NEXT: addi a0, a0, -241 3410; RV32-NEXT: sw a0, 12(sp) 3411; RV32-NEXT: sw a0, 8(sp) 3412; RV32-NEXT: lui a0, 4112 3413; RV32-NEXT: addi a0, a0, 257 3414; RV32-NEXT: sw a0, 12(sp) 3415; RV32-NEXT: sw a0, 8(sp) 3416; RV32-NEXT: vsetvli a0, zero, e64, m1, ta, mu 3417; RV32-NEXT: vsrl.vi v9, v8, 1 3418; RV32-NEXT: vor.vv v8, v8, v9 3419; RV32-NEXT: vsrl.vi v9, v8, 2 3420; RV32-NEXT: vor.vv v8, v8, v9 3421; RV32-NEXT: vsrl.vi v9, v8, 4 3422; RV32-NEXT: vor.vv v8, v8, v9 3423; RV32-NEXT: vsrl.vi v9, v8, 8 3424; RV32-NEXT: vor.vv v8, v8, v9 3425; RV32-NEXT: vsrl.vi v9, v8, 16 3426; RV32-NEXT: vor.vv v8, v8, v9 3427; RV32-NEXT: li a0, 32 3428; RV32-NEXT: vsrl.vx v9, v8, a0 3429; RV32-NEXT: vor.vv v8, v8, v9 3430; RV32-NEXT: addi a0, sp, 8 3431; RV32-NEXT: vlse64.v v9, (a0), zero 3432; RV32-NEXT: vnot.v v8, v8 3433; RV32-NEXT: addi a0, sp, 8 3434; RV32-NEXT: vlse64.v v10, (a0), zero 3435; RV32-NEXT: vsrl.vi v11, v8, 1 3436; RV32-NEXT: vand.vv v9, v11, v9 3437; RV32-NEXT: vsub.vv v8, v8, v9 3438; RV32-NEXT: vand.vv v9, v8, v10 3439; RV32-NEXT: vsrl.vi v8, v8, 2 3440; RV32-NEXT: vand.vv v8, v8, v10 3441; RV32-NEXT: vadd.vv v8, v9, v8 3442; RV32-NEXT: addi a0, sp, 8 3443; RV32-NEXT: vlse64.v v9, (a0), zero 3444; RV32-NEXT: addi a0, sp, 8 3445; RV32-NEXT: vlse64.v v10, (a0), zero 3446; RV32-NEXT: vsrl.vi v11, v8, 4 3447; RV32-NEXT: vadd.vv v8, v8, v11 3448; RV32-NEXT: vand.vv v8, v8, v9 3449; RV32-NEXT: vmul.vv v8, v8, v10 3450; RV32-NEXT: li a0, 56 3451; RV32-NEXT: vsrl.vx v8, v8, a0 3452; RV32-NEXT: addi sp, sp, 16 3453; RV32-NEXT: ret 3454; 3455; RV64-LABEL: ctlz_zero_undef_nxv1i64: 3456; RV64: # %bb.0: 3457; RV64-NEXT: vsetvli a0, zero, e64, m1, ta, mu 3458; RV64-NEXT: vsrl.vi v9, v8, 1 3459; RV64-NEXT: vor.vv v8, v8, v9 3460; RV64-NEXT: vsrl.vi v9, v8, 2 3461; RV64-NEXT: vor.vv v8, v8, v9 3462; RV64-NEXT: vsrl.vi v9, v8, 4 3463; RV64-NEXT: vor.vv v8, v8, v9 3464; RV64-NEXT: vsrl.vi v9, v8, 8 3465; RV64-NEXT: vor.vv v8, v8, v9 3466; RV64-NEXT: vsrl.vi v9, v8, 16 3467; RV64-NEXT: vor.vv v8, v8, v9 3468; RV64-NEXT: li a0, 32 3469; RV64-NEXT: vsrl.vx v9, v8, a0 3470; RV64-NEXT: vor.vv v8, v8, v9 3471; RV64-NEXT: vnot.v v8, v8 3472; RV64-NEXT: lui a0, %hi(.LCPI40_0) 3473; RV64-NEXT: ld a0, %lo(.LCPI40_0)(a0) 3474; RV64-NEXT: lui a1, %hi(.LCPI40_1) 3475; RV64-NEXT: ld a1, %lo(.LCPI40_1)(a1) 3476; RV64-NEXT: vsrl.vi v9, v8, 1 3477; RV64-NEXT: vand.vx v9, v9, a0 3478; RV64-NEXT: vsub.vv v8, v8, v9 3479; RV64-NEXT: vand.vx v9, v8, a1 3480; RV64-NEXT: vsrl.vi v8, v8, 2 3481; RV64-NEXT: vand.vx v8, v8, a1 3482; RV64-NEXT: vadd.vv v8, v9, v8 3483; RV64-NEXT: lui a0, %hi(.LCPI40_2) 3484; RV64-NEXT: ld a0, %lo(.LCPI40_2)(a0) 3485; RV64-NEXT: lui a1, %hi(.LCPI40_3) 3486; RV64-NEXT: ld a1, %lo(.LCPI40_3)(a1) 3487; RV64-NEXT: vsrl.vi v9, v8, 4 3488; RV64-NEXT: vadd.vv v8, v8, v9 3489; RV64-NEXT: vand.vx v8, v8, a0 3490; RV64-NEXT: vmul.vx v8, v8, a1 3491; RV64-NEXT: li a0, 56 3492; RV64-NEXT: vsrl.vx v8, v8, a0 3493; RV64-NEXT: ret 3494 %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 true) 3495 ret <vscale x 1 x i64> %a 3496} 3497 3498define <vscale x 2 x i64> @ctlz_zero_undef_nxv2i64(<vscale x 2 x i64> %va) { 3499; RV32-LABEL: ctlz_zero_undef_nxv2i64: 3500; RV32: # %bb.0: 3501; RV32-NEXT: addi sp, sp, -16 3502; RV32-NEXT: .cfi_def_cfa_offset 16 3503; RV32-NEXT: lui a0, 349525 3504; RV32-NEXT: addi a0, a0, 1365 3505; RV32-NEXT: sw a0, 12(sp) 3506; RV32-NEXT: sw a0, 8(sp) 3507; RV32-NEXT: lui a0, 209715 3508; RV32-NEXT: addi a0, a0, 819 3509; RV32-NEXT: sw a0, 12(sp) 3510; RV32-NEXT: sw a0, 8(sp) 3511; RV32-NEXT: lui a0, 61681 3512; RV32-NEXT: addi a0, a0, -241 3513; RV32-NEXT: sw a0, 12(sp) 3514; RV32-NEXT: sw a0, 8(sp) 3515; RV32-NEXT: lui a0, 4112 3516; RV32-NEXT: addi a0, a0, 257 3517; RV32-NEXT: sw a0, 12(sp) 3518; RV32-NEXT: sw a0, 8(sp) 3519; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 3520; RV32-NEXT: vsrl.vi v10, v8, 1 3521; RV32-NEXT: vor.vv v8, v8, v10 3522; RV32-NEXT: vsrl.vi v10, v8, 2 3523; RV32-NEXT: vor.vv v8, v8, v10 3524; RV32-NEXT: vsrl.vi v10, v8, 4 3525; RV32-NEXT: vor.vv v8, v8, v10 3526; RV32-NEXT: vsrl.vi v10, v8, 8 3527; RV32-NEXT: vor.vv v8, v8, v10 3528; RV32-NEXT: vsrl.vi v10, v8, 16 3529; RV32-NEXT: vor.vv v8, v8, v10 3530; RV32-NEXT: li a0, 32 3531; RV32-NEXT: vsrl.vx v10, v8, a0 3532; RV32-NEXT: vor.vv v8, v8, v10 3533; RV32-NEXT: addi a0, sp, 8 3534; RV32-NEXT: vlse64.v v10, (a0), zero 3535; RV32-NEXT: vnot.v v8, v8 3536; RV32-NEXT: addi a0, sp, 8 3537; RV32-NEXT: vlse64.v v12, (a0), zero 3538; RV32-NEXT: vsrl.vi v14, v8, 1 3539; RV32-NEXT: vand.vv v10, v14, v10 3540; RV32-NEXT: vsub.vv v8, v8, v10 3541; RV32-NEXT: vand.vv v10, v8, v12 3542; RV32-NEXT: vsrl.vi v8, v8, 2 3543; RV32-NEXT: vand.vv v8, v8, v12 3544; RV32-NEXT: vadd.vv v8, v10, v8 3545; RV32-NEXT: addi a0, sp, 8 3546; RV32-NEXT: vlse64.v v10, (a0), zero 3547; RV32-NEXT: addi a0, sp, 8 3548; RV32-NEXT: vlse64.v v12, (a0), zero 3549; RV32-NEXT: vsrl.vi v14, v8, 4 3550; RV32-NEXT: vadd.vv v8, v8, v14 3551; RV32-NEXT: vand.vv v8, v8, v10 3552; RV32-NEXT: vmul.vv v8, v8, v12 3553; RV32-NEXT: li a0, 56 3554; RV32-NEXT: vsrl.vx v8, v8, a0 3555; RV32-NEXT: addi sp, sp, 16 3556; RV32-NEXT: ret 3557; 3558; RV64-LABEL: ctlz_zero_undef_nxv2i64: 3559; RV64: # %bb.0: 3560; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 3561; RV64-NEXT: vsrl.vi v10, v8, 1 3562; RV64-NEXT: vor.vv v8, v8, v10 3563; RV64-NEXT: vsrl.vi v10, v8, 2 3564; RV64-NEXT: vor.vv v8, v8, v10 3565; RV64-NEXT: vsrl.vi v10, v8, 4 3566; RV64-NEXT: vor.vv v8, v8, v10 3567; RV64-NEXT: vsrl.vi v10, v8, 8 3568; RV64-NEXT: vor.vv v8, v8, v10 3569; RV64-NEXT: vsrl.vi v10, v8, 16 3570; RV64-NEXT: vor.vv v8, v8, v10 3571; RV64-NEXT: li a0, 32 3572; RV64-NEXT: vsrl.vx v10, v8, a0 3573; RV64-NEXT: vor.vv v8, v8, v10 3574; RV64-NEXT: vnot.v v8, v8 3575; RV64-NEXT: lui a0, %hi(.LCPI41_0) 3576; RV64-NEXT: ld a0, %lo(.LCPI41_0)(a0) 3577; RV64-NEXT: lui a1, %hi(.LCPI41_1) 3578; RV64-NEXT: ld a1, %lo(.LCPI41_1)(a1) 3579; RV64-NEXT: vsrl.vi v10, v8, 1 3580; RV64-NEXT: vand.vx v10, v10, a0 3581; RV64-NEXT: vsub.vv v8, v8, v10 3582; RV64-NEXT: vand.vx v10, v8, a1 3583; RV64-NEXT: vsrl.vi v8, v8, 2 3584; RV64-NEXT: vand.vx v8, v8, a1 3585; RV64-NEXT: vadd.vv v8, v10, v8 3586; RV64-NEXT: lui a0, %hi(.LCPI41_2) 3587; RV64-NEXT: ld a0, %lo(.LCPI41_2)(a0) 3588; RV64-NEXT: lui a1, %hi(.LCPI41_3) 3589; RV64-NEXT: ld a1, %lo(.LCPI41_3)(a1) 3590; RV64-NEXT: vsrl.vi v10, v8, 4 3591; RV64-NEXT: vadd.vv v8, v8, v10 3592; RV64-NEXT: vand.vx v8, v8, a0 3593; RV64-NEXT: vmul.vx v8, v8, a1 3594; RV64-NEXT: li a0, 56 3595; RV64-NEXT: vsrl.vx v8, v8, a0 3596; RV64-NEXT: ret 3597 %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 true) 3598 ret <vscale x 2 x i64> %a 3599} 3600 3601define <vscale x 4 x i64> @ctlz_zero_undef_nxv4i64(<vscale x 4 x i64> %va) { 3602; RV32-LABEL: ctlz_zero_undef_nxv4i64: 3603; RV32: # %bb.0: 3604; RV32-NEXT: addi sp, sp, -16 3605; RV32-NEXT: .cfi_def_cfa_offset 16 3606; RV32-NEXT: lui a0, 349525 3607; RV32-NEXT: addi a0, a0, 1365 3608; RV32-NEXT: sw a0, 12(sp) 3609; RV32-NEXT: sw a0, 8(sp) 3610; RV32-NEXT: lui a0, 209715 3611; RV32-NEXT: addi a0, a0, 819 3612; RV32-NEXT: sw a0, 12(sp) 3613; RV32-NEXT: sw a0, 8(sp) 3614; RV32-NEXT: lui a0, 61681 3615; RV32-NEXT: addi a0, a0, -241 3616; RV32-NEXT: sw a0, 12(sp) 3617; RV32-NEXT: sw a0, 8(sp) 3618; RV32-NEXT: lui a0, 4112 3619; RV32-NEXT: addi a0, a0, 257 3620; RV32-NEXT: sw a0, 12(sp) 3621; RV32-NEXT: sw a0, 8(sp) 3622; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, mu 3623; RV32-NEXT: vsrl.vi v12, v8, 1 3624; RV32-NEXT: vor.vv v8, v8, v12 3625; RV32-NEXT: vsrl.vi v12, v8, 2 3626; RV32-NEXT: vor.vv v8, v8, v12 3627; RV32-NEXT: vsrl.vi v12, v8, 4 3628; RV32-NEXT: vor.vv v8, v8, v12 3629; RV32-NEXT: vsrl.vi v12, v8, 8 3630; RV32-NEXT: vor.vv v8, v8, v12 3631; RV32-NEXT: vsrl.vi v12, v8, 16 3632; RV32-NEXT: vor.vv v8, v8, v12 3633; RV32-NEXT: li a0, 32 3634; RV32-NEXT: vsrl.vx v12, v8, a0 3635; RV32-NEXT: vor.vv v8, v8, v12 3636; RV32-NEXT: addi a0, sp, 8 3637; RV32-NEXT: vlse64.v v12, (a0), zero 3638; RV32-NEXT: vnot.v v8, v8 3639; RV32-NEXT: addi a0, sp, 8 3640; RV32-NEXT: vlse64.v v16, (a0), zero 3641; RV32-NEXT: vsrl.vi v20, v8, 1 3642; RV32-NEXT: vand.vv v12, v20, v12 3643; RV32-NEXT: vsub.vv v8, v8, v12 3644; RV32-NEXT: vand.vv v12, v8, v16 3645; RV32-NEXT: vsrl.vi v8, v8, 2 3646; RV32-NEXT: vand.vv v8, v8, v16 3647; RV32-NEXT: vadd.vv v8, v12, v8 3648; RV32-NEXT: addi a0, sp, 8 3649; RV32-NEXT: vlse64.v v12, (a0), zero 3650; RV32-NEXT: addi a0, sp, 8 3651; RV32-NEXT: vlse64.v v16, (a0), zero 3652; RV32-NEXT: vsrl.vi v20, v8, 4 3653; RV32-NEXT: vadd.vv v8, v8, v20 3654; RV32-NEXT: vand.vv v8, v8, v12 3655; RV32-NEXT: vmul.vv v8, v8, v16 3656; RV32-NEXT: li a0, 56 3657; RV32-NEXT: vsrl.vx v8, v8, a0 3658; RV32-NEXT: addi sp, sp, 16 3659; RV32-NEXT: ret 3660; 3661; RV64-LABEL: ctlz_zero_undef_nxv4i64: 3662; RV64: # %bb.0: 3663; RV64-NEXT: vsetvli a0, zero, e64, m4, ta, mu 3664; RV64-NEXT: vsrl.vi v12, v8, 1 3665; RV64-NEXT: vor.vv v8, v8, v12 3666; RV64-NEXT: vsrl.vi v12, v8, 2 3667; RV64-NEXT: vor.vv v8, v8, v12 3668; RV64-NEXT: vsrl.vi v12, v8, 4 3669; RV64-NEXT: vor.vv v8, v8, v12 3670; RV64-NEXT: vsrl.vi v12, v8, 8 3671; RV64-NEXT: vor.vv v8, v8, v12 3672; RV64-NEXT: vsrl.vi v12, v8, 16 3673; RV64-NEXT: vor.vv v8, v8, v12 3674; RV64-NEXT: li a0, 32 3675; RV64-NEXT: vsrl.vx v12, v8, a0 3676; RV64-NEXT: vor.vv v8, v8, v12 3677; RV64-NEXT: vnot.v v8, v8 3678; RV64-NEXT: lui a0, %hi(.LCPI42_0) 3679; RV64-NEXT: ld a0, %lo(.LCPI42_0)(a0) 3680; RV64-NEXT: lui a1, %hi(.LCPI42_1) 3681; RV64-NEXT: ld a1, %lo(.LCPI42_1)(a1) 3682; RV64-NEXT: vsrl.vi v12, v8, 1 3683; RV64-NEXT: vand.vx v12, v12, a0 3684; RV64-NEXT: vsub.vv v8, v8, v12 3685; RV64-NEXT: vand.vx v12, v8, a1 3686; RV64-NEXT: vsrl.vi v8, v8, 2 3687; RV64-NEXT: vand.vx v8, v8, a1 3688; RV64-NEXT: vadd.vv v8, v12, v8 3689; RV64-NEXT: lui a0, %hi(.LCPI42_2) 3690; RV64-NEXT: ld a0, %lo(.LCPI42_2)(a0) 3691; RV64-NEXT: lui a1, %hi(.LCPI42_3) 3692; RV64-NEXT: ld a1, %lo(.LCPI42_3)(a1) 3693; RV64-NEXT: vsrl.vi v12, v8, 4 3694; RV64-NEXT: vadd.vv v8, v8, v12 3695; RV64-NEXT: vand.vx v8, v8, a0 3696; RV64-NEXT: vmul.vx v8, v8, a1 3697; RV64-NEXT: li a0, 56 3698; RV64-NEXT: vsrl.vx v8, v8, a0 3699; RV64-NEXT: ret 3700 %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 true) 3701 ret <vscale x 4 x i64> %a 3702} 3703 3704define <vscale x 8 x i64> @ctlz_zero_undef_nxv8i64(<vscale x 8 x i64> %va) { 3705; RV32-LABEL: ctlz_zero_undef_nxv8i64: 3706; RV32: # %bb.0: 3707; RV32-NEXT: addi sp, sp, -16 3708; RV32-NEXT: .cfi_def_cfa_offset 16 3709; RV32-NEXT: lui a0, 349525 3710; RV32-NEXT: addi a0, a0, 1365 3711; RV32-NEXT: sw a0, 12(sp) 3712; RV32-NEXT: sw a0, 8(sp) 3713; RV32-NEXT: lui a0, 209715 3714; RV32-NEXT: addi a0, a0, 819 3715; RV32-NEXT: sw a0, 12(sp) 3716; RV32-NEXT: sw a0, 8(sp) 3717; RV32-NEXT: lui a0, 61681 3718; RV32-NEXT: addi a0, a0, -241 3719; RV32-NEXT: sw a0, 12(sp) 3720; RV32-NEXT: sw a0, 8(sp) 3721; RV32-NEXT: lui a0, 4112 3722; RV32-NEXT: addi a0, a0, 257 3723; RV32-NEXT: sw a0, 12(sp) 3724; RV32-NEXT: sw a0, 8(sp) 3725; RV32-NEXT: vsetvli a0, zero, e64, m8, ta, mu 3726; RV32-NEXT: vsrl.vi v16, v8, 1 3727; RV32-NEXT: vor.vv v8, v8, v16 3728; RV32-NEXT: vsrl.vi v16, v8, 2 3729; RV32-NEXT: vor.vv v8, v8, v16 3730; RV32-NEXT: vsrl.vi v16, v8, 4 3731; RV32-NEXT: vor.vv v8, v8, v16 3732; RV32-NEXT: vsrl.vi v16, v8, 8 3733; RV32-NEXT: vor.vv v8, v8, v16 3734; RV32-NEXT: vsrl.vi v16, v8, 16 3735; RV32-NEXT: vor.vv v8, v8, v16 3736; RV32-NEXT: li a0, 32 3737; RV32-NEXT: vsrl.vx v16, v8, a0 3738; RV32-NEXT: vor.vv v8, v8, v16 3739; RV32-NEXT: addi a0, sp, 8 3740; RV32-NEXT: vlse64.v v16, (a0), zero 3741; RV32-NEXT: vnot.v v8, v8 3742; RV32-NEXT: addi a0, sp, 8 3743; RV32-NEXT: vlse64.v v24, (a0), zero 3744; RV32-NEXT: vsrl.vi v0, v8, 1 3745; RV32-NEXT: vand.vv v16, v0, v16 3746; RV32-NEXT: vsub.vv v8, v8, v16 3747; RV32-NEXT: vand.vv v16, v8, v24 3748; RV32-NEXT: vsrl.vi v8, v8, 2 3749; RV32-NEXT: vand.vv v8, v8, v24 3750; RV32-NEXT: vadd.vv v8, v16, v8 3751; RV32-NEXT: addi a0, sp, 8 3752; RV32-NEXT: vlse64.v v16, (a0), zero 3753; RV32-NEXT: addi a0, sp, 8 3754; RV32-NEXT: vlse64.v v24, (a0), zero 3755; RV32-NEXT: vsrl.vi v0, v8, 4 3756; RV32-NEXT: vadd.vv v8, v8, v0 3757; RV32-NEXT: vand.vv v8, v8, v16 3758; RV32-NEXT: vmul.vv v8, v8, v24 3759; RV32-NEXT: li a0, 56 3760; RV32-NEXT: vsrl.vx v8, v8, a0 3761; RV32-NEXT: addi sp, sp, 16 3762; RV32-NEXT: ret 3763; 3764; RV64-LABEL: ctlz_zero_undef_nxv8i64: 3765; RV64: # %bb.0: 3766; RV64-NEXT: vsetvli a0, zero, e64, m8, ta, mu 3767; RV64-NEXT: vsrl.vi v16, v8, 1 3768; RV64-NEXT: vor.vv v8, v8, v16 3769; RV64-NEXT: vsrl.vi v16, v8, 2 3770; RV64-NEXT: vor.vv v8, v8, v16 3771; RV64-NEXT: vsrl.vi v16, v8, 4 3772; RV64-NEXT: vor.vv v8, v8, v16 3773; RV64-NEXT: vsrl.vi v16, v8, 8 3774; RV64-NEXT: vor.vv v8, v8, v16 3775; RV64-NEXT: vsrl.vi v16, v8, 16 3776; RV64-NEXT: vor.vv v8, v8, v16 3777; RV64-NEXT: li a0, 32 3778; RV64-NEXT: vsrl.vx v16, v8, a0 3779; RV64-NEXT: vor.vv v8, v8, v16 3780; RV64-NEXT: vnot.v v8, v8 3781; RV64-NEXT: lui a0, %hi(.LCPI43_0) 3782; RV64-NEXT: ld a0, %lo(.LCPI43_0)(a0) 3783; RV64-NEXT: lui a1, %hi(.LCPI43_1) 3784; RV64-NEXT: ld a1, %lo(.LCPI43_1)(a1) 3785; RV64-NEXT: vsrl.vi v16, v8, 1 3786; RV64-NEXT: vand.vx v16, v16, a0 3787; RV64-NEXT: vsub.vv v8, v8, v16 3788; RV64-NEXT: vand.vx v16, v8, a1 3789; RV64-NEXT: vsrl.vi v8, v8, 2 3790; RV64-NEXT: vand.vx v8, v8, a1 3791; RV64-NEXT: vadd.vv v8, v16, v8 3792; RV64-NEXT: lui a0, %hi(.LCPI43_2) 3793; RV64-NEXT: ld a0, %lo(.LCPI43_2)(a0) 3794; RV64-NEXT: lui a1, %hi(.LCPI43_3) 3795; RV64-NEXT: ld a1, %lo(.LCPI43_3)(a1) 3796; RV64-NEXT: vsrl.vi v16, v8, 4 3797; RV64-NEXT: vadd.vv v8, v8, v16 3798; RV64-NEXT: vand.vx v8, v8, a0 3799; RV64-NEXT: vmul.vx v8, v8, a1 3800; RV64-NEXT: li a0, 56 3801; RV64-NEXT: vsrl.vx v8, v8, a0 3802; RV64-NEXT: ret 3803 %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 true) 3804 ret <vscale x 8 x i64> %a 3805} 3806