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