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 3; RUN: llc -mtriple=riscv64 -mattr=+experimental-v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 4 5define <vscale x 1 x i8> @ctlz_nxv1i8(<vscale x 1 x i8> %va) { 6; CHECK-LABEL: ctlz_nxv1i8: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, mu 9; CHECK-NEXT: vsrl.vi v9, v8, 1 10; CHECK-NEXT: vor.vv v8, v8, v9 11; CHECK-NEXT: vsrl.vi v9, v8, 2 12; CHECK-NEXT: vor.vv v8, v8, v9 13; CHECK-NEXT: vsrl.vi v9, v8, 4 14; CHECK-NEXT: vor.vv v8, v8, v9 15; CHECK-NEXT: vxor.vi v8, v8, -1 16; CHECK-NEXT: vsrl.vi v9, v8, 1 17; CHECK-NEXT: addi a0, zero, 85 18; CHECK-NEXT: vand.vx v9, v9, a0 19; CHECK-NEXT: vsub.vv v8, v8, v9 20; CHECK-NEXT: addi a0, zero, 51 21; CHECK-NEXT: vand.vx v9, v8, a0 22; CHECK-NEXT: vsrl.vi v8, v8, 2 23; CHECK-NEXT: vand.vx v8, v8, a0 24; CHECK-NEXT: vadd.vv v8, v9, v8 25; CHECK-NEXT: vsrl.vi v9, v8, 4 26; CHECK-NEXT: vadd.vv v8, v8, v9 27; CHECK-NEXT: vand.vi v8, v8, 15 28; CHECK-NEXT: ret 29 %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 false) 30 ret <vscale x 1 x i8> %a 31} 32declare <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8>, i1) 33 34define <vscale x 2 x i8> @ctlz_nxv2i8(<vscale x 2 x i8> %va) { 35; CHECK-LABEL: ctlz_nxv2i8: 36; CHECK: # %bb.0: 37; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 38; CHECK-NEXT: vsrl.vi v9, v8, 1 39; CHECK-NEXT: vor.vv v8, v8, v9 40; CHECK-NEXT: vsrl.vi v9, v8, 2 41; CHECK-NEXT: vor.vv v8, v8, v9 42; CHECK-NEXT: vsrl.vi v9, v8, 4 43; CHECK-NEXT: vor.vv v8, v8, v9 44; CHECK-NEXT: vxor.vi v8, v8, -1 45; CHECK-NEXT: vsrl.vi v9, v8, 1 46; CHECK-NEXT: addi a0, zero, 85 47; CHECK-NEXT: vand.vx v9, v9, a0 48; CHECK-NEXT: vsub.vv v8, v8, v9 49; CHECK-NEXT: addi a0, zero, 51 50; CHECK-NEXT: vand.vx v9, v8, a0 51; CHECK-NEXT: vsrl.vi v8, v8, 2 52; CHECK-NEXT: vand.vx v8, v8, a0 53; CHECK-NEXT: vadd.vv v8, v9, v8 54; CHECK-NEXT: vsrl.vi v9, v8, 4 55; CHECK-NEXT: vadd.vv v8, v8, v9 56; CHECK-NEXT: vand.vi v8, v8, 15 57; CHECK-NEXT: ret 58 %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 false) 59 ret <vscale x 2 x i8> %a 60} 61declare <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8>, i1) 62 63define <vscale x 4 x i8> @ctlz_nxv4i8(<vscale x 4 x i8> %va) { 64; CHECK-LABEL: ctlz_nxv4i8: 65; CHECK: # %bb.0: 66; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 67; CHECK-NEXT: vsrl.vi v9, v8, 1 68; CHECK-NEXT: vor.vv v8, v8, v9 69; CHECK-NEXT: vsrl.vi v9, v8, 2 70; CHECK-NEXT: vor.vv v8, v8, v9 71; CHECK-NEXT: vsrl.vi v9, v8, 4 72; CHECK-NEXT: vor.vv v8, v8, v9 73; CHECK-NEXT: vxor.vi v8, v8, -1 74; CHECK-NEXT: vsrl.vi v9, v8, 1 75; CHECK-NEXT: addi a0, zero, 85 76; CHECK-NEXT: vand.vx v9, v9, a0 77; CHECK-NEXT: vsub.vv v8, v8, v9 78; CHECK-NEXT: addi a0, zero, 51 79; CHECK-NEXT: vand.vx v9, v8, a0 80; CHECK-NEXT: vsrl.vi v8, v8, 2 81; CHECK-NEXT: vand.vx v8, v8, a0 82; CHECK-NEXT: vadd.vv v8, v9, v8 83; CHECK-NEXT: vsrl.vi v9, v8, 4 84; CHECK-NEXT: vadd.vv v8, v8, v9 85; CHECK-NEXT: vand.vi v8, v8, 15 86; CHECK-NEXT: ret 87 %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 false) 88 ret <vscale x 4 x i8> %a 89} 90declare <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8>, i1) 91 92define <vscale x 8 x i8> @ctlz_nxv8i8(<vscale x 8 x i8> %va) { 93; CHECK-LABEL: ctlz_nxv8i8: 94; CHECK: # %bb.0: 95; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, mu 96; CHECK-NEXT: vsrl.vi v9, v8, 1 97; CHECK-NEXT: vor.vv v8, v8, v9 98; CHECK-NEXT: vsrl.vi v9, v8, 2 99; CHECK-NEXT: vor.vv v8, v8, v9 100; CHECK-NEXT: vsrl.vi v9, v8, 4 101; CHECK-NEXT: vor.vv v8, v8, v9 102; CHECK-NEXT: vxor.vi v8, v8, -1 103; CHECK-NEXT: vsrl.vi v9, v8, 1 104; CHECK-NEXT: addi a0, zero, 85 105; CHECK-NEXT: vand.vx v9, v9, a0 106; CHECK-NEXT: vsub.vv v8, v8, v9 107; CHECK-NEXT: addi a0, zero, 51 108; CHECK-NEXT: vand.vx v9, v8, a0 109; CHECK-NEXT: vsrl.vi v8, v8, 2 110; CHECK-NEXT: vand.vx v8, v8, a0 111; CHECK-NEXT: vadd.vv v8, v9, v8 112; CHECK-NEXT: vsrl.vi v9, v8, 4 113; CHECK-NEXT: vadd.vv v8, v8, v9 114; CHECK-NEXT: vand.vi v8, v8, 15 115; CHECK-NEXT: ret 116 %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 false) 117 ret <vscale x 8 x i8> %a 118} 119declare <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8>, i1) 120 121define <vscale x 16 x i8> @ctlz_nxv16i8(<vscale x 16 x i8> %va) { 122; CHECK-LABEL: ctlz_nxv16i8: 123; CHECK: # %bb.0: 124; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, mu 125; CHECK-NEXT: vsrl.vi v10, v8, 1 126; CHECK-NEXT: vor.vv v8, v8, v10 127; CHECK-NEXT: vsrl.vi v10, v8, 2 128; CHECK-NEXT: vor.vv v8, v8, v10 129; CHECK-NEXT: vsrl.vi v10, v8, 4 130; CHECK-NEXT: vor.vv v8, v8, v10 131; CHECK-NEXT: vxor.vi v8, v8, -1 132; CHECK-NEXT: vsrl.vi v10, v8, 1 133; CHECK-NEXT: addi a0, zero, 85 134; CHECK-NEXT: vand.vx v10, v10, a0 135; CHECK-NEXT: vsub.vv v8, v8, v10 136; CHECK-NEXT: addi a0, zero, 51 137; CHECK-NEXT: vand.vx v10, v8, a0 138; CHECK-NEXT: vsrl.vi v8, v8, 2 139; CHECK-NEXT: vand.vx v8, v8, a0 140; CHECK-NEXT: vadd.vv v8, v10, v8 141; CHECK-NEXT: vsrl.vi v10, v8, 4 142; CHECK-NEXT: vadd.vv v8, v8, v10 143; CHECK-NEXT: vand.vi v8, v8, 15 144; CHECK-NEXT: ret 145 %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 false) 146 ret <vscale x 16 x i8> %a 147} 148declare <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8>, i1) 149 150define <vscale x 32 x i8> @ctlz_nxv32i8(<vscale x 32 x i8> %va) { 151; CHECK-LABEL: ctlz_nxv32i8: 152; CHECK: # %bb.0: 153; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, mu 154; CHECK-NEXT: vsrl.vi v12, v8, 1 155; CHECK-NEXT: vor.vv v8, v8, v12 156; CHECK-NEXT: vsrl.vi v12, v8, 2 157; CHECK-NEXT: vor.vv v8, v8, v12 158; CHECK-NEXT: vsrl.vi v12, v8, 4 159; CHECK-NEXT: vor.vv v8, v8, v12 160; CHECK-NEXT: vxor.vi v8, v8, -1 161; CHECK-NEXT: vsrl.vi v12, v8, 1 162; CHECK-NEXT: addi a0, zero, 85 163; CHECK-NEXT: vand.vx v12, v12, a0 164; CHECK-NEXT: vsub.vv v8, v8, v12 165; CHECK-NEXT: addi a0, zero, 51 166; CHECK-NEXT: vand.vx v12, v8, a0 167; CHECK-NEXT: vsrl.vi v8, v8, 2 168; CHECK-NEXT: vand.vx v8, v8, a0 169; CHECK-NEXT: vadd.vv v8, v12, v8 170; CHECK-NEXT: vsrl.vi v12, v8, 4 171; CHECK-NEXT: vadd.vv v8, v8, v12 172; CHECK-NEXT: vand.vi v8, v8, 15 173; CHECK-NEXT: ret 174 %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 false) 175 ret <vscale x 32 x i8> %a 176} 177declare <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8>, i1) 178 179define <vscale x 64 x i8> @ctlz_nxv64i8(<vscale x 64 x i8> %va) { 180; CHECK-LABEL: ctlz_nxv64i8: 181; CHECK: # %bb.0: 182; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, mu 183; CHECK-NEXT: vsrl.vi v16, v8, 1 184; CHECK-NEXT: vor.vv v8, v8, v16 185; CHECK-NEXT: vsrl.vi v16, v8, 2 186; CHECK-NEXT: vor.vv v8, v8, v16 187; CHECK-NEXT: vsrl.vi v16, v8, 4 188; CHECK-NEXT: vor.vv v8, v8, v16 189; CHECK-NEXT: vxor.vi v8, v8, -1 190; CHECK-NEXT: vsrl.vi v16, v8, 1 191; CHECK-NEXT: addi a0, zero, 85 192; CHECK-NEXT: vand.vx v16, v16, a0 193; CHECK-NEXT: vsub.vv v8, v8, v16 194; CHECK-NEXT: addi a0, zero, 51 195; CHECK-NEXT: vand.vx v16, v8, a0 196; CHECK-NEXT: vsrl.vi v8, v8, 2 197; CHECK-NEXT: vand.vx v8, v8, a0 198; CHECK-NEXT: vadd.vv v8, v16, v8 199; CHECK-NEXT: vsrl.vi v16, v8, 4 200; CHECK-NEXT: vadd.vv v8, v8, v16 201; CHECK-NEXT: vand.vi v8, v8, 15 202; CHECK-NEXT: ret 203 %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 false) 204 ret <vscale x 64 x i8> %a 205} 206declare <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8>, i1) 207 208define <vscale x 1 x i16> @ctlz_nxv1i16(<vscale x 1 x i16> %va) { 209; RV32-LABEL: ctlz_nxv1i16: 210; RV32: # %bb.0: 211; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 212; RV32-NEXT: vsrl.vi v9, v8, 1 213; RV32-NEXT: vor.vv v8, v8, v9 214; RV32-NEXT: vsrl.vi v9, v8, 2 215; RV32-NEXT: vor.vv v8, v8, v9 216; RV32-NEXT: vsrl.vi v9, v8, 4 217; RV32-NEXT: vor.vv v8, v8, v9 218; RV32-NEXT: vsrl.vi v9, v8, 8 219; RV32-NEXT: vor.vv v8, v8, v9 220; RV32-NEXT: vxor.vi v8, v8, -1 221; RV32-NEXT: vsrl.vi v9, v8, 1 222; RV32-NEXT: lui a0, 5 223; RV32-NEXT: addi a0, a0, 1365 224; RV32-NEXT: vand.vx v9, v9, a0 225; RV32-NEXT: vsub.vv v8, v8, v9 226; RV32-NEXT: lui a0, 3 227; RV32-NEXT: addi a0, a0, 819 228; RV32-NEXT: vand.vx v9, v8, a0 229; RV32-NEXT: vsrl.vi v8, v8, 2 230; RV32-NEXT: vand.vx v8, v8, a0 231; RV32-NEXT: vadd.vv v8, v9, v8 232; RV32-NEXT: vsrl.vi v9, v8, 4 233; RV32-NEXT: vadd.vv v8, v8, v9 234; RV32-NEXT: lui a0, 1 235; RV32-NEXT: addi a0, a0, -241 236; RV32-NEXT: vand.vx v8, v8, a0 237; RV32-NEXT: addi a0, zero, 257 238; RV32-NEXT: vmul.vx v8, v8, a0 239; RV32-NEXT: vsrl.vi v8, v8, 8 240; RV32-NEXT: ret 241; 242; RV64-LABEL: ctlz_nxv1i16: 243; RV64: # %bb.0: 244; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 245; RV64-NEXT: vsrl.vi v9, v8, 1 246; RV64-NEXT: vor.vv v8, v8, v9 247; RV64-NEXT: vsrl.vi v9, v8, 2 248; RV64-NEXT: vor.vv v8, v8, v9 249; RV64-NEXT: vsrl.vi v9, v8, 4 250; RV64-NEXT: vor.vv v8, v8, v9 251; RV64-NEXT: vsrl.vi v9, v8, 8 252; RV64-NEXT: vor.vv v8, v8, v9 253; RV64-NEXT: vxor.vi v8, v8, -1 254; RV64-NEXT: vsrl.vi v9, v8, 1 255; RV64-NEXT: lui a0, 5 256; RV64-NEXT: addiw a0, a0, 1365 257; RV64-NEXT: vand.vx v9, v9, a0 258; RV64-NEXT: vsub.vv v8, v8, v9 259; RV64-NEXT: lui a0, 3 260; RV64-NEXT: addiw a0, a0, 819 261; RV64-NEXT: vand.vx v9, v8, a0 262; RV64-NEXT: vsrl.vi v8, v8, 2 263; RV64-NEXT: vand.vx v8, v8, a0 264; RV64-NEXT: vadd.vv v8, v9, v8 265; RV64-NEXT: vsrl.vi v9, v8, 4 266; RV64-NEXT: vadd.vv v8, v8, v9 267; RV64-NEXT: lui a0, 1 268; RV64-NEXT: addiw a0, a0, -241 269; RV64-NEXT: vand.vx v8, v8, a0 270; RV64-NEXT: addi a0, zero, 257 271; RV64-NEXT: vmul.vx v8, v8, a0 272; RV64-NEXT: vsrl.vi v8, v8, 8 273; RV64-NEXT: ret 274 %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 false) 275 ret <vscale x 1 x i16> %a 276} 277declare <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16>, i1) 278 279define <vscale x 2 x i16> @ctlz_nxv2i16(<vscale x 2 x i16> %va) { 280; RV32-LABEL: ctlz_nxv2i16: 281; RV32: # %bb.0: 282; RV32-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 283; RV32-NEXT: vsrl.vi v9, v8, 1 284; RV32-NEXT: vor.vv v8, v8, v9 285; RV32-NEXT: vsrl.vi v9, v8, 2 286; RV32-NEXT: vor.vv v8, v8, v9 287; RV32-NEXT: vsrl.vi v9, v8, 4 288; RV32-NEXT: vor.vv v8, v8, v9 289; RV32-NEXT: vsrl.vi v9, v8, 8 290; RV32-NEXT: vor.vv v8, v8, v9 291; RV32-NEXT: vxor.vi v8, v8, -1 292; RV32-NEXT: vsrl.vi v9, v8, 1 293; RV32-NEXT: lui a0, 5 294; RV32-NEXT: addi a0, a0, 1365 295; RV32-NEXT: vand.vx v9, v9, a0 296; RV32-NEXT: vsub.vv v8, v8, v9 297; RV32-NEXT: lui a0, 3 298; RV32-NEXT: addi a0, a0, 819 299; RV32-NEXT: vand.vx v9, v8, a0 300; RV32-NEXT: vsrl.vi v8, v8, 2 301; RV32-NEXT: vand.vx v8, v8, a0 302; RV32-NEXT: vadd.vv v8, v9, v8 303; RV32-NEXT: vsrl.vi v9, v8, 4 304; RV32-NEXT: vadd.vv v8, v8, v9 305; RV32-NEXT: lui a0, 1 306; RV32-NEXT: addi a0, a0, -241 307; RV32-NEXT: vand.vx v8, v8, a0 308; RV32-NEXT: addi a0, zero, 257 309; RV32-NEXT: vmul.vx v8, v8, a0 310; RV32-NEXT: vsrl.vi v8, v8, 8 311; RV32-NEXT: ret 312; 313; RV64-LABEL: ctlz_nxv2i16: 314; RV64: # %bb.0: 315; RV64-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 316; RV64-NEXT: vsrl.vi v9, v8, 1 317; RV64-NEXT: vor.vv v8, v8, v9 318; RV64-NEXT: vsrl.vi v9, v8, 2 319; RV64-NEXT: vor.vv v8, v8, v9 320; RV64-NEXT: vsrl.vi v9, v8, 4 321; RV64-NEXT: vor.vv v8, v8, v9 322; RV64-NEXT: vsrl.vi v9, v8, 8 323; RV64-NEXT: vor.vv v8, v8, v9 324; RV64-NEXT: vxor.vi v8, v8, -1 325; RV64-NEXT: vsrl.vi v9, v8, 1 326; RV64-NEXT: lui a0, 5 327; RV64-NEXT: addiw a0, a0, 1365 328; RV64-NEXT: vand.vx v9, v9, a0 329; RV64-NEXT: vsub.vv v8, v8, v9 330; RV64-NEXT: lui a0, 3 331; RV64-NEXT: addiw a0, a0, 819 332; RV64-NEXT: vand.vx v9, v8, a0 333; RV64-NEXT: vsrl.vi v8, v8, 2 334; RV64-NEXT: vand.vx v8, v8, a0 335; RV64-NEXT: vadd.vv v8, v9, v8 336; RV64-NEXT: vsrl.vi v9, v8, 4 337; RV64-NEXT: vadd.vv v8, v8, v9 338; RV64-NEXT: lui a0, 1 339; RV64-NEXT: addiw a0, a0, -241 340; RV64-NEXT: vand.vx v8, v8, a0 341; RV64-NEXT: addi a0, zero, 257 342; RV64-NEXT: vmul.vx v8, v8, a0 343; RV64-NEXT: vsrl.vi v8, v8, 8 344; RV64-NEXT: ret 345 %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 false) 346 ret <vscale x 2 x i16> %a 347} 348declare <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16>, i1) 349 350define <vscale x 4 x i16> @ctlz_nxv4i16(<vscale x 4 x i16> %va) { 351; RV32-LABEL: ctlz_nxv4i16: 352; RV32: # %bb.0: 353; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, mu 354; RV32-NEXT: vsrl.vi v9, v8, 1 355; RV32-NEXT: vor.vv v8, v8, v9 356; RV32-NEXT: vsrl.vi v9, v8, 2 357; RV32-NEXT: vor.vv v8, v8, v9 358; RV32-NEXT: vsrl.vi v9, v8, 4 359; RV32-NEXT: vor.vv v8, v8, v9 360; RV32-NEXT: vsrl.vi v9, v8, 8 361; RV32-NEXT: vor.vv v8, v8, v9 362; RV32-NEXT: vxor.vi v8, v8, -1 363; RV32-NEXT: vsrl.vi v9, v8, 1 364; RV32-NEXT: lui a0, 5 365; RV32-NEXT: addi a0, a0, 1365 366; RV32-NEXT: vand.vx v9, v9, a0 367; RV32-NEXT: vsub.vv v8, v8, v9 368; RV32-NEXT: lui a0, 3 369; RV32-NEXT: addi a0, a0, 819 370; RV32-NEXT: vand.vx v9, v8, a0 371; RV32-NEXT: vsrl.vi v8, v8, 2 372; RV32-NEXT: vand.vx v8, v8, a0 373; RV32-NEXT: vadd.vv v8, v9, v8 374; RV32-NEXT: vsrl.vi v9, v8, 4 375; RV32-NEXT: vadd.vv v8, v8, v9 376; RV32-NEXT: lui a0, 1 377; RV32-NEXT: addi a0, a0, -241 378; RV32-NEXT: vand.vx v8, v8, a0 379; RV32-NEXT: addi a0, zero, 257 380; RV32-NEXT: vmul.vx v8, v8, a0 381; RV32-NEXT: vsrl.vi v8, v8, 8 382; RV32-NEXT: ret 383; 384; RV64-LABEL: ctlz_nxv4i16: 385; RV64: # %bb.0: 386; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, mu 387; RV64-NEXT: vsrl.vi v9, v8, 1 388; RV64-NEXT: vor.vv v8, v8, v9 389; RV64-NEXT: vsrl.vi v9, v8, 2 390; RV64-NEXT: vor.vv v8, v8, v9 391; RV64-NEXT: vsrl.vi v9, v8, 4 392; RV64-NEXT: vor.vv v8, v8, v9 393; RV64-NEXT: vsrl.vi v9, v8, 8 394; RV64-NEXT: vor.vv v8, v8, v9 395; RV64-NEXT: vxor.vi v8, v8, -1 396; RV64-NEXT: vsrl.vi v9, v8, 1 397; RV64-NEXT: lui a0, 5 398; RV64-NEXT: addiw a0, a0, 1365 399; RV64-NEXT: vand.vx v9, v9, a0 400; RV64-NEXT: vsub.vv v8, v8, v9 401; RV64-NEXT: lui a0, 3 402; RV64-NEXT: addiw a0, a0, 819 403; RV64-NEXT: vand.vx v9, v8, a0 404; RV64-NEXT: vsrl.vi v8, v8, 2 405; RV64-NEXT: vand.vx v8, v8, a0 406; RV64-NEXT: vadd.vv v8, v9, v8 407; RV64-NEXT: vsrl.vi v9, v8, 4 408; RV64-NEXT: vadd.vv v8, v8, v9 409; RV64-NEXT: lui a0, 1 410; RV64-NEXT: addiw a0, a0, -241 411; RV64-NEXT: vand.vx v8, v8, a0 412; RV64-NEXT: addi a0, zero, 257 413; RV64-NEXT: vmul.vx v8, v8, a0 414; RV64-NEXT: vsrl.vi v8, v8, 8 415; RV64-NEXT: ret 416 %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 false) 417 ret <vscale x 4 x i16> %a 418} 419declare <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16>, i1) 420 421define <vscale x 8 x i16> @ctlz_nxv8i16(<vscale x 8 x i16> %va) { 422; RV32-LABEL: ctlz_nxv8i16: 423; RV32: # %bb.0: 424; RV32-NEXT: vsetvli a0, zero, e16, m2, ta, mu 425; RV32-NEXT: vsrl.vi v10, v8, 1 426; RV32-NEXT: vor.vv v8, v8, v10 427; RV32-NEXT: vsrl.vi v10, v8, 2 428; RV32-NEXT: vor.vv v8, v8, v10 429; RV32-NEXT: vsrl.vi v10, v8, 4 430; RV32-NEXT: vor.vv v8, v8, v10 431; RV32-NEXT: vsrl.vi v10, v8, 8 432; RV32-NEXT: vor.vv v8, v8, v10 433; RV32-NEXT: vxor.vi v8, v8, -1 434; RV32-NEXT: vsrl.vi v10, v8, 1 435; RV32-NEXT: lui a0, 5 436; RV32-NEXT: addi a0, a0, 1365 437; RV32-NEXT: vand.vx v10, v10, a0 438; RV32-NEXT: vsub.vv v8, v8, v10 439; RV32-NEXT: lui a0, 3 440; RV32-NEXT: addi a0, a0, 819 441; RV32-NEXT: vand.vx v10, v8, a0 442; RV32-NEXT: vsrl.vi v8, v8, 2 443; RV32-NEXT: vand.vx v8, v8, a0 444; RV32-NEXT: vadd.vv v8, v10, v8 445; RV32-NEXT: vsrl.vi v10, v8, 4 446; RV32-NEXT: vadd.vv v8, v8, v10 447; RV32-NEXT: lui a0, 1 448; RV32-NEXT: addi a0, a0, -241 449; RV32-NEXT: vand.vx v8, v8, a0 450; RV32-NEXT: addi a0, zero, 257 451; RV32-NEXT: vmul.vx v8, v8, a0 452; RV32-NEXT: vsrl.vi v8, v8, 8 453; RV32-NEXT: ret 454; 455; RV64-LABEL: ctlz_nxv8i16: 456; RV64: # %bb.0: 457; RV64-NEXT: vsetvli a0, zero, e16, m2, ta, mu 458; RV64-NEXT: vsrl.vi v10, v8, 1 459; RV64-NEXT: vor.vv v8, v8, v10 460; RV64-NEXT: vsrl.vi v10, v8, 2 461; RV64-NEXT: vor.vv v8, v8, v10 462; RV64-NEXT: vsrl.vi v10, v8, 4 463; RV64-NEXT: vor.vv v8, v8, v10 464; RV64-NEXT: vsrl.vi v10, v8, 8 465; RV64-NEXT: vor.vv v8, v8, v10 466; RV64-NEXT: vxor.vi v8, v8, -1 467; RV64-NEXT: vsrl.vi v10, v8, 1 468; RV64-NEXT: lui a0, 5 469; RV64-NEXT: addiw a0, a0, 1365 470; RV64-NEXT: vand.vx v10, v10, a0 471; RV64-NEXT: vsub.vv v8, v8, v10 472; RV64-NEXT: lui a0, 3 473; RV64-NEXT: addiw a0, a0, 819 474; RV64-NEXT: vand.vx v10, v8, a0 475; RV64-NEXT: vsrl.vi v8, v8, 2 476; RV64-NEXT: vand.vx v8, v8, a0 477; RV64-NEXT: vadd.vv v8, v10, v8 478; RV64-NEXT: vsrl.vi v10, v8, 4 479; RV64-NEXT: vadd.vv v8, v8, v10 480; RV64-NEXT: lui a0, 1 481; RV64-NEXT: addiw a0, a0, -241 482; RV64-NEXT: vand.vx v8, v8, a0 483; RV64-NEXT: addi a0, zero, 257 484; RV64-NEXT: vmul.vx v8, v8, a0 485; RV64-NEXT: vsrl.vi v8, v8, 8 486; RV64-NEXT: ret 487 %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 false) 488 ret <vscale x 8 x i16> %a 489} 490declare <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16>, i1) 491 492define <vscale x 16 x i16> @ctlz_nxv16i16(<vscale x 16 x i16> %va) { 493; RV32-LABEL: ctlz_nxv16i16: 494; RV32: # %bb.0: 495; RV32-NEXT: vsetvli a0, zero, e16, m4, ta, mu 496; RV32-NEXT: vsrl.vi v12, v8, 1 497; RV32-NEXT: vor.vv v8, v8, v12 498; RV32-NEXT: vsrl.vi v12, v8, 2 499; RV32-NEXT: vor.vv v8, v8, v12 500; RV32-NEXT: vsrl.vi v12, v8, 4 501; RV32-NEXT: vor.vv v8, v8, v12 502; RV32-NEXT: vsrl.vi v12, v8, 8 503; RV32-NEXT: vor.vv v8, v8, v12 504; RV32-NEXT: vxor.vi v8, v8, -1 505; RV32-NEXT: vsrl.vi v12, v8, 1 506; RV32-NEXT: lui a0, 5 507; RV32-NEXT: addi a0, a0, 1365 508; RV32-NEXT: vand.vx v12, v12, a0 509; RV32-NEXT: vsub.vv v8, v8, v12 510; RV32-NEXT: lui a0, 3 511; RV32-NEXT: addi a0, a0, 819 512; RV32-NEXT: vand.vx v12, v8, a0 513; RV32-NEXT: vsrl.vi v8, v8, 2 514; RV32-NEXT: vand.vx v8, v8, a0 515; RV32-NEXT: vadd.vv v8, v12, v8 516; RV32-NEXT: vsrl.vi v12, v8, 4 517; RV32-NEXT: vadd.vv v8, v8, v12 518; RV32-NEXT: lui a0, 1 519; RV32-NEXT: addi a0, a0, -241 520; RV32-NEXT: vand.vx v8, v8, a0 521; RV32-NEXT: addi a0, zero, 257 522; RV32-NEXT: vmul.vx v8, v8, a0 523; RV32-NEXT: vsrl.vi v8, v8, 8 524; RV32-NEXT: ret 525; 526; RV64-LABEL: ctlz_nxv16i16: 527; RV64: # %bb.0: 528; RV64-NEXT: vsetvli a0, zero, e16, m4, ta, mu 529; RV64-NEXT: vsrl.vi v12, v8, 1 530; RV64-NEXT: vor.vv v8, v8, v12 531; RV64-NEXT: vsrl.vi v12, v8, 2 532; RV64-NEXT: vor.vv v8, v8, v12 533; RV64-NEXT: vsrl.vi v12, v8, 4 534; RV64-NEXT: vor.vv v8, v8, v12 535; RV64-NEXT: vsrl.vi v12, v8, 8 536; RV64-NEXT: vor.vv v8, v8, v12 537; RV64-NEXT: vxor.vi v8, v8, -1 538; RV64-NEXT: vsrl.vi v12, v8, 1 539; RV64-NEXT: lui a0, 5 540; RV64-NEXT: addiw a0, a0, 1365 541; RV64-NEXT: vand.vx v12, v12, a0 542; RV64-NEXT: vsub.vv v8, v8, v12 543; RV64-NEXT: lui a0, 3 544; RV64-NEXT: addiw a0, a0, 819 545; RV64-NEXT: vand.vx v12, v8, a0 546; RV64-NEXT: vsrl.vi v8, v8, 2 547; RV64-NEXT: vand.vx v8, v8, a0 548; RV64-NEXT: vadd.vv v8, v12, v8 549; RV64-NEXT: vsrl.vi v12, v8, 4 550; RV64-NEXT: vadd.vv v8, v8, v12 551; RV64-NEXT: lui a0, 1 552; RV64-NEXT: addiw a0, a0, -241 553; RV64-NEXT: vand.vx v8, v8, a0 554; RV64-NEXT: addi a0, zero, 257 555; RV64-NEXT: vmul.vx v8, v8, a0 556; RV64-NEXT: vsrl.vi v8, v8, 8 557; RV64-NEXT: ret 558 %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 false) 559 ret <vscale x 16 x i16> %a 560} 561declare <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16>, i1) 562 563define <vscale x 32 x i16> @ctlz_nxv32i16(<vscale x 32 x i16> %va) { 564; RV32-LABEL: ctlz_nxv32i16: 565; RV32: # %bb.0: 566; RV32-NEXT: vsetvli a0, zero, e16, m8, ta, mu 567; RV32-NEXT: vsrl.vi v16, v8, 1 568; RV32-NEXT: vor.vv v8, v8, v16 569; RV32-NEXT: vsrl.vi v16, v8, 2 570; RV32-NEXT: vor.vv v8, v8, v16 571; RV32-NEXT: vsrl.vi v16, v8, 4 572; RV32-NEXT: vor.vv v8, v8, v16 573; RV32-NEXT: vsrl.vi v16, v8, 8 574; RV32-NEXT: vor.vv v8, v8, v16 575; RV32-NEXT: vxor.vi v8, v8, -1 576; RV32-NEXT: vsrl.vi v16, v8, 1 577; RV32-NEXT: lui a0, 5 578; RV32-NEXT: addi a0, a0, 1365 579; RV32-NEXT: vand.vx v16, v16, a0 580; RV32-NEXT: vsub.vv v8, v8, v16 581; RV32-NEXT: lui a0, 3 582; RV32-NEXT: addi a0, a0, 819 583; RV32-NEXT: vand.vx v16, v8, a0 584; RV32-NEXT: vsrl.vi v8, v8, 2 585; RV32-NEXT: vand.vx v8, v8, a0 586; RV32-NEXT: vadd.vv v8, v16, v8 587; RV32-NEXT: vsrl.vi v16, v8, 4 588; RV32-NEXT: vadd.vv v8, v8, v16 589; RV32-NEXT: lui a0, 1 590; RV32-NEXT: addi a0, a0, -241 591; RV32-NEXT: vand.vx v8, v8, a0 592; RV32-NEXT: addi a0, zero, 257 593; RV32-NEXT: vmul.vx v8, v8, a0 594; RV32-NEXT: vsrl.vi v8, v8, 8 595; RV32-NEXT: ret 596; 597; RV64-LABEL: ctlz_nxv32i16: 598; RV64: # %bb.0: 599; RV64-NEXT: vsetvli a0, zero, e16, m8, ta, mu 600; RV64-NEXT: vsrl.vi v16, v8, 1 601; RV64-NEXT: vor.vv v8, v8, v16 602; RV64-NEXT: vsrl.vi v16, v8, 2 603; RV64-NEXT: vor.vv v8, v8, v16 604; RV64-NEXT: vsrl.vi v16, v8, 4 605; RV64-NEXT: vor.vv v8, v8, v16 606; RV64-NEXT: vsrl.vi v16, v8, 8 607; RV64-NEXT: vor.vv v8, v8, v16 608; RV64-NEXT: vxor.vi v8, v8, -1 609; RV64-NEXT: vsrl.vi v16, v8, 1 610; RV64-NEXT: lui a0, 5 611; RV64-NEXT: addiw a0, a0, 1365 612; RV64-NEXT: vand.vx v16, v16, a0 613; RV64-NEXT: vsub.vv v8, v8, v16 614; RV64-NEXT: lui a0, 3 615; RV64-NEXT: addiw a0, a0, 819 616; RV64-NEXT: vand.vx v16, v8, a0 617; RV64-NEXT: vsrl.vi v8, v8, 2 618; RV64-NEXT: vand.vx v8, v8, a0 619; RV64-NEXT: vadd.vv v8, v16, v8 620; RV64-NEXT: vsrl.vi v16, v8, 4 621; RV64-NEXT: vadd.vv v8, v8, v16 622; RV64-NEXT: lui a0, 1 623; RV64-NEXT: addiw a0, a0, -241 624; RV64-NEXT: vand.vx v8, v8, a0 625; RV64-NEXT: addi a0, zero, 257 626; RV64-NEXT: vmul.vx v8, v8, a0 627; RV64-NEXT: vsrl.vi v8, v8, 8 628; RV64-NEXT: ret 629 %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 false) 630 ret <vscale x 32 x i16> %a 631} 632declare <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16>, i1) 633 634define <vscale x 1 x i32> @ctlz_nxv1i32(<vscale x 1 x i32> %va) { 635; RV32-LABEL: ctlz_nxv1i32: 636; RV32: # %bb.0: 637; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 638; RV32-NEXT: vsrl.vi v9, v8, 1 639; RV32-NEXT: vor.vv v8, v8, v9 640; RV32-NEXT: vsrl.vi v9, v8, 2 641; RV32-NEXT: vor.vv v8, v8, v9 642; RV32-NEXT: vsrl.vi v9, v8, 4 643; RV32-NEXT: vor.vv v8, v8, v9 644; RV32-NEXT: vsrl.vi v9, v8, 8 645; RV32-NEXT: vor.vv v8, v8, v9 646; RV32-NEXT: vsrl.vi v9, v8, 16 647; RV32-NEXT: vor.vv v8, v8, v9 648; RV32-NEXT: vxor.vi v8, v8, -1 649; RV32-NEXT: vsrl.vi v9, v8, 1 650; RV32-NEXT: lui a0, 349525 651; RV32-NEXT: addi a0, a0, 1365 652; RV32-NEXT: vand.vx v9, v9, a0 653; RV32-NEXT: vsub.vv v8, v8, v9 654; RV32-NEXT: lui a0, 209715 655; RV32-NEXT: addi a0, a0, 819 656; RV32-NEXT: vand.vx v9, v8, a0 657; RV32-NEXT: vsrl.vi v8, v8, 2 658; RV32-NEXT: vand.vx v8, v8, a0 659; RV32-NEXT: vadd.vv v8, v9, v8 660; RV32-NEXT: vsrl.vi v9, v8, 4 661; RV32-NEXT: vadd.vv v8, v8, v9 662; RV32-NEXT: lui a0, 61681 663; RV32-NEXT: addi a0, a0, -241 664; RV32-NEXT: vand.vx v8, v8, a0 665; RV32-NEXT: lui a0, 4112 666; RV32-NEXT: addi a0, a0, 257 667; RV32-NEXT: vmul.vx v8, v8, a0 668; RV32-NEXT: vsrl.vi v8, v8, 24 669; RV32-NEXT: ret 670; 671; RV64-LABEL: ctlz_nxv1i32: 672; RV64: # %bb.0: 673; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 674; RV64-NEXT: vsrl.vi v9, v8, 1 675; RV64-NEXT: vor.vv v8, v8, v9 676; RV64-NEXT: vsrl.vi v9, v8, 2 677; RV64-NEXT: vor.vv v8, v8, v9 678; RV64-NEXT: vsrl.vi v9, v8, 4 679; RV64-NEXT: vor.vv v8, v8, v9 680; RV64-NEXT: vsrl.vi v9, v8, 8 681; RV64-NEXT: vor.vv v8, v8, v9 682; RV64-NEXT: vsrl.vi v9, v8, 16 683; RV64-NEXT: vor.vv v8, v8, v9 684; RV64-NEXT: vxor.vi v8, v8, -1 685; RV64-NEXT: vsrl.vi v9, v8, 1 686; RV64-NEXT: lui a0, 349525 687; RV64-NEXT: addiw a0, a0, 1365 688; RV64-NEXT: vand.vx v9, v9, a0 689; RV64-NEXT: vsub.vv v8, v8, v9 690; RV64-NEXT: lui a0, 209715 691; RV64-NEXT: addiw a0, a0, 819 692; RV64-NEXT: vand.vx v9, v8, a0 693; RV64-NEXT: vsrl.vi v8, v8, 2 694; RV64-NEXT: vand.vx v8, v8, a0 695; RV64-NEXT: vadd.vv v8, v9, v8 696; RV64-NEXT: vsrl.vi v9, v8, 4 697; RV64-NEXT: vadd.vv v8, v8, v9 698; RV64-NEXT: lui a0, 61681 699; RV64-NEXT: addiw a0, a0, -241 700; RV64-NEXT: vand.vx v8, v8, a0 701; RV64-NEXT: lui a0, 4112 702; RV64-NEXT: addiw a0, a0, 257 703; RV64-NEXT: vmul.vx v8, v8, a0 704; RV64-NEXT: vsrl.vi v8, v8, 24 705; RV64-NEXT: ret 706 %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 false) 707 ret <vscale x 1 x i32> %a 708} 709declare <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32>, i1) 710 711define <vscale x 2 x i32> @ctlz_nxv2i32(<vscale x 2 x i32> %va) { 712; RV32-LABEL: ctlz_nxv2i32: 713; RV32: # %bb.0: 714; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 715; RV32-NEXT: vsrl.vi v9, v8, 1 716; RV32-NEXT: vor.vv v8, v8, v9 717; RV32-NEXT: vsrl.vi v9, v8, 2 718; RV32-NEXT: vor.vv v8, v8, v9 719; RV32-NEXT: vsrl.vi v9, v8, 4 720; RV32-NEXT: vor.vv v8, v8, v9 721; RV32-NEXT: vsrl.vi v9, v8, 8 722; RV32-NEXT: vor.vv v8, v8, v9 723; RV32-NEXT: vsrl.vi v9, v8, 16 724; RV32-NEXT: vor.vv v8, v8, v9 725; RV32-NEXT: vxor.vi v8, v8, -1 726; RV32-NEXT: vsrl.vi v9, v8, 1 727; RV32-NEXT: lui a0, 349525 728; RV32-NEXT: addi a0, a0, 1365 729; RV32-NEXT: vand.vx v9, v9, a0 730; RV32-NEXT: vsub.vv v8, v8, v9 731; RV32-NEXT: lui a0, 209715 732; RV32-NEXT: addi a0, a0, 819 733; RV32-NEXT: vand.vx v9, v8, a0 734; RV32-NEXT: vsrl.vi v8, v8, 2 735; RV32-NEXT: vand.vx v8, v8, a0 736; RV32-NEXT: vadd.vv v8, v9, v8 737; RV32-NEXT: vsrl.vi v9, v8, 4 738; RV32-NEXT: vadd.vv v8, v8, v9 739; RV32-NEXT: lui a0, 61681 740; RV32-NEXT: addi a0, a0, -241 741; RV32-NEXT: vand.vx v8, v8, a0 742; RV32-NEXT: lui a0, 4112 743; RV32-NEXT: addi a0, a0, 257 744; RV32-NEXT: vmul.vx v8, v8, a0 745; RV32-NEXT: vsrl.vi v8, v8, 24 746; RV32-NEXT: ret 747; 748; RV64-LABEL: ctlz_nxv2i32: 749; RV64: # %bb.0: 750; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 751; RV64-NEXT: vsrl.vi v9, v8, 1 752; RV64-NEXT: vor.vv v8, v8, v9 753; RV64-NEXT: vsrl.vi v9, v8, 2 754; RV64-NEXT: vor.vv v8, v8, v9 755; RV64-NEXT: vsrl.vi v9, v8, 4 756; RV64-NEXT: vor.vv v8, v8, v9 757; RV64-NEXT: vsrl.vi v9, v8, 8 758; RV64-NEXT: vor.vv v8, v8, v9 759; RV64-NEXT: vsrl.vi v9, v8, 16 760; RV64-NEXT: vor.vv v8, v8, v9 761; RV64-NEXT: vxor.vi v8, v8, -1 762; RV64-NEXT: vsrl.vi v9, v8, 1 763; RV64-NEXT: lui a0, 349525 764; RV64-NEXT: addiw a0, a0, 1365 765; RV64-NEXT: vand.vx v9, v9, a0 766; RV64-NEXT: vsub.vv v8, v8, v9 767; RV64-NEXT: lui a0, 209715 768; RV64-NEXT: addiw a0, a0, 819 769; RV64-NEXT: vand.vx v9, v8, a0 770; RV64-NEXT: vsrl.vi v8, v8, 2 771; RV64-NEXT: vand.vx v8, v8, a0 772; RV64-NEXT: vadd.vv v8, v9, v8 773; RV64-NEXT: vsrl.vi v9, v8, 4 774; RV64-NEXT: vadd.vv v8, v8, v9 775; RV64-NEXT: lui a0, 61681 776; RV64-NEXT: addiw a0, a0, -241 777; RV64-NEXT: vand.vx v8, v8, a0 778; RV64-NEXT: lui a0, 4112 779; RV64-NEXT: addiw a0, a0, 257 780; RV64-NEXT: vmul.vx v8, v8, a0 781; RV64-NEXT: vsrl.vi v8, v8, 24 782; RV64-NEXT: ret 783 %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 false) 784 ret <vscale x 2 x i32> %a 785} 786declare <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32>, i1) 787 788define <vscale x 4 x i32> @ctlz_nxv4i32(<vscale x 4 x i32> %va) { 789; RV32-LABEL: ctlz_nxv4i32: 790; RV32: # %bb.0: 791; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, mu 792; RV32-NEXT: vsrl.vi v10, v8, 1 793; RV32-NEXT: vor.vv v8, v8, v10 794; RV32-NEXT: vsrl.vi v10, v8, 2 795; RV32-NEXT: vor.vv v8, v8, v10 796; RV32-NEXT: vsrl.vi v10, v8, 4 797; RV32-NEXT: vor.vv v8, v8, v10 798; RV32-NEXT: vsrl.vi v10, v8, 8 799; RV32-NEXT: vor.vv v8, v8, v10 800; RV32-NEXT: vsrl.vi v10, v8, 16 801; RV32-NEXT: vor.vv v8, v8, v10 802; RV32-NEXT: vxor.vi v8, v8, -1 803; RV32-NEXT: vsrl.vi v10, v8, 1 804; RV32-NEXT: lui a0, 349525 805; RV32-NEXT: addi a0, a0, 1365 806; RV32-NEXT: vand.vx v10, v10, a0 807; RV32-NEXT: vsub.vv v8, v8, v10 808; RV32-NEXT: lui a0, 209715 809; RV32-NEXT: addi a0, a0, 819 810; RV32-NEXT: vand.vx v10, v8, a0 811; RV32-NEXT: vsrl.vi v8, v8, 2 812; RV32-NEXT: vand.vx v8, v8, a0 813; RV32-NEXT: vadd.vv v8, v10, v8 814; RV32-NEXT: vsrl.vi v10, v8, 4 815; RV32-NEXT: vadd.vv v8, v8, v10 816; RV32-NEXT: lui a0, 61681 817; RV32-NEXT: addi a0, a0, -241 818; RV32-NEXT: vand.vx v8, v8, a0 819; RV32-NEXT: lui a0, 4112 820; RV32-NEXT: addi a0, a0, 257 821; RV32-NEXT: vmul.vx v8, v8, a0 822; RV32-NEXT: vsrl.vi v8, v8, 24 823; RV32-NEXT: ret 824; 825; RV64-LABEL: ctlz_nxv4i32: 826; RV64: # %bb.0: 827; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, mu 828; RV64-NEXT: vsrl.vi v10, v8, 1 829; RV64-NEXT: vor.vv v8, v8, v10 830; RV64-NEXT: vsrl.vi v10, v8, 2 831; RV64-NEXT: vor.vv v8, v8, v10 832; RV64-NEXT: vsrl.vi v10, v8, 4 833; RV64-NEXT: vor.vv v8, v8, v10 834; RV64-NEXT: vsrl.vi v10, v8, 8 835; RV64-NEXT: vor.vv v8, v8, v10 836; RV64-NEXT: vsrl.vi v10, v8, 16 837; RV64-NEXT: vor.vv v8, v8, v10 838; RV64-NEXT: vxor.vi v8, v8, -1 839; RV64-NEXT: vsrl.vi v10, v8, 1 840; RV64-NEXT: lui a0, 349525 841; RV64-NEXT: addiw a0, a0, 1365 842; RV64-NEXT: vand.vx v10, v10, a0 843; RV64-NEXT: vsub.vv v8, v8, v10 844; RV64-NEXT: lui a0, 209715 845; RV64-NEXT: addiw a0, a0, 819 846; RV64-NEXT: vand.vx v10, v8, a0 847; RV64-NEXT: vsrl.vi v8, v8, 2 848; RV64-NEXT: vand.vx v8, v8, a0 849; RV64-NEXT: vadd.vv v8, v10, v8 850; RV64-NEXT: vsrl.vi v10, v8, 4 851; RV64-NEXT: vadd.vv v8, v8, v10 852; RV64-NEXT: lui a0, 61681 853; RV64-NEXT: addiw a0, a0, -241 854; RV64-NEXT: vand.vx v8, v8, a0 855; RV64-NEXT: lui a0, 4112 856; RV64-NEXT: addiw a0, a0, 257 857; RV64-NEXT: vmul.vx v8, v8, a0 858; RV64-NEXT: vsrl.vi v8, v8, 24 859; RV64-NEXT: ret 860 %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 false) 861 ret <vscale x 4 x i32> %a 862} 863declare <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32>, i1) 864 865define <vscale x 8 x i32> @ctlz_nxv8i32(<vscale x 8 x i32> %va) { 866; RV32-LABEL: ctlz_nxv8i32: 867; RV32: # %bb.0: 868; RV32-NEXT: vsetvli a0, zero, e32, m4, ta, mu 869; RV32-NEXT: vsrl.vi v12, v8, 1 870; RV32-NEXT: vor.vv v8, v8, v12 871; RV32-NEXT: vsrl.vi v12, v8, 2 872; RV32-NEXT: vor.vv v8, v8, v12 873; RV32-NEXT: vsrl.vi v12, v8, 4 874; RV32-NEXT: vor.vv v8, v8, v12 875; RV32-NEXT: vsrl.vi v12, v8, 8 876; RV32-NEXT: vor.vv v8, v8, v12 877; RV32-NEXT: vsrl.vi v12, v8, 16 878; RV32-NEXT: vor.vv v8, v8, v12 879; RV32-NEXT: vxor.vi v8, v8, -1 880; RV32-NEXT: vsrl.vi v12, v8, 1 881; RV32-NEXT: lui a0, 349525 882; RV32-NEXT: addi a0, a0, 1365 883; RV32-NEXT: vand.vx v12, v12, a0 884; RV32-NEXT: vsub.vv v8, v8, v12 885; RV32-NEXT: lui a0, 209715 886; RV32-NEXT: addi a0, a0, 819 887; RV32-NEXT: vand.vx v12, v8, a0 888; RV32-NEXT: vsrl.vi v8, v8, 2 889; RV32-NEXT: vand.vx v8, v8, a0 890; RV32-NEXT: vadd.vv v8, v12, v8 891; RV32-NEXT: vsrl.vi v12, v8, 4 892; RV32-NEXT: vadd.vv v8, v8, v12 893; RV32-NEXT: lui a0, 61681 894; RV32-NEXT: addi a0, a0, -241 895; RV32-NEXT: vand.vx v8, v8, a0 896; RV32-NEXT: lui a0, 4112 897; RV32-NEXT: addi a0, a0, 257 898; RV32-NEXT: vmul.vx v8, v8, a0 899; RV32-NEXT: vsrl.vi v8, v8, 24 900; RV32-NEXT: ret 901; 902; RV64-LABEL: ctlz_nxv8i32: 903; RV64: # %bb.0: 904; RV64-NEXT: vsetvli a0, zero, e32, m4, ta, mu 905; RV64-NEXT: vsrl.vi v12, v8, 1 906; RV64-NEXT: vor.vv v8, v8, v12 907; RV64-NEXT: vsrl.vi v12, v8, 2 908; RV64-NEXT: vor.vv v8, v8, v12 909; RV64-NEXT: vsrl.vi v12, v8, 4 910; RV64-NEXT: vor.vv v8, v8, v12 911; RV64-NEXT: vsrl.vi v12, v8, 8 912; RV64-NEXT: vor.vv v8, v8, v12 913; RV64-NEXT: vsrl.vi v12, v8, 16 914; RV64-NEXT: vor.vv v8, v8, v12 915; RV64-NEXT: vxor.vi v8, v8, -1 916; RV64-NEXT: vsrl.vi v12, v8, 1 917; RV64-NEXT: lui a0, 349525 918; RV64-NEXT: addiw a0, a0, 1365 919; RV64-NEXT: vand.vx v12, v12, a0 920; RV64-NEXT: vsub.vv v8, v8, v12 921; RV64-NEXT: lui a0, 209715 922; RV64-NEXT: addiw a0, a0, 819 923; RV64-NEXT: vand.vx v12, v8, a0 924; RV64-NEXT: vsrl.vi v8, v8, 2 925; RV64-NEXT: vand.vx v8, v8, a0 926; RV64-NEXT: vadd.vv v8, v12, v8 927; RV64-NEXT: vsrl.vi v12, v8, 4 928; RV64-NEXT: vadd.vv v8, v8, v12 929; RV64-NEXT: lui a0, 61681 930; RV64-NEXT: addiw a0, a0, -241 931; RV64-NEXT: vand.vx v8, v8, a0 932; RV64-NEXT: lui a0, 4112 933; RV64-NEXT: addiw a0, a0, 257 934; RV64-NEXT: vmul.vx v8, v8, a0 935; RV64-NEXT: vsrl.vi v8, v8, 24 936; RV64-NEXT: ret 937 %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 false) 938 ret <vscale x 8 x i32> %a 939} 940declare <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32>, i1) 941 942define <vscale x 16 x i32> @ctlz_nxv16i32(<vscale x 16 x i32> %va) { 943; RV32-LABEL: ctlz_nxv16i32: 944; RV32: # %bb.0: 945; RV32-NEXT: vsetvli a0, zero, e32, m8, ta, mu 946; RV32-NEXT: vsrl.vi v16, v8, 1 947; RV32-NEXT: vor.vv v8, v8, v16 948; RV32-NEXT: vsrl.vi v16, v8, 2 949; RV32-NEXT: vor.vv v8, v8, v16 950; RV32-NEXT: vsrl.vi v16, v8, 4 951; RV32-NEXT: vor.vv v8, v8, v16 952; RV32-NEXT: vsrl.vi v16, v8, 8 953; RV32-NEXT: vor.vv v8, v8, v16 954; RV32-NEXT: vsrl.vi v16, v8, 16 955; RV32-NEXT: vor.vv v8, v8, v16 956; RV32-NEXT: vxor.vi v8, v8, -1 957; RV32-NEXT: vsrl.vi v16, v8, 1 958; RV32-NEXT: lui a0, 349525 959; RV32-NEXT: addi a0, a0, 1365 960; RV32-NEXT: vand.vx v16, v16, a0 961; RV32-NEXT: vsub.vv v8, v8, v16 962; RV32-NEXT: lui a0, 209715 963; RV32-NEXT: addi a0, a0, 819 964; RV32-NEXT: vand.vx v16, v8, a0 965; RV32-NEXT: vsrl.vi v8, v8, 2 966; RV32-NEXT: vand.vx v8, v8, a0 967; RV32-NEXT: vadd.vv v8, v16, v8 968; RV32-NEXT: vsrl.vi v16, v8, 4 969; RV32-NEXT: vadd.vv v8, v8, v16 970; RV32-NEXT: lui a0, 61681 971; RV32-NEXT: addi a0, a0, -241 972; RV32-NEXT: vand.vx v8, v8, a0 973; RV32-NEXT: lui a0, 4112 974; RV32-NEXT: addi a0, a0, 257 975; RV32-NEXT: vmul.vx v8, v8, a0 976; RV32-NEXT: vsrl.vi v8, v8, 24 977; RV32-NEXT: ret 978; 979; RV64-LABEL: ctlz_nxv16i32: 980; RV64: # %bb.0: 981; RV64-NEXT: vsetvli a0, zero, e32, m8, ta, mu 982; RV64-NEXT: vsrl.vi v16, v8, 1 983; RV64-NEXT: vor.vv v8, v8, v16 984; RV64-NEXT: vsrl.vi v16, v8, 2 985; RV64-NEXT: vor.vv v8, v8, v16 986; RV64-NEXT: vsrl.vi v16, v8, 4 987; RV64-NEXT: vor.vv v8, v8, v16 988; RV64-NEXT: vsrl.vi v16, v8, 8 989; RV64-NEXT: vor.vv v8, v8, v16 990; RV64-NEXT: vsrl.vi v16, v8, 16 991; RV64-NEXT: vor.vv v8, v8, v16 992; RV64-NEXT: vxor.vi v8, v8, -1 993; RV64-NEXT: vsrl.vi v16, v8, 1 994; RV64-NEXT: lui a0, 349525 995; RV64-NEXT: addiw a0, a0, 1365 996; RV64-NEXT: vand.vx v16, v16, a0 997; RV64-NEXT: vsub.vv v8, v8, v16 998; RV64-NEXT: lui a0, 209715 999; RV64-NEXT: addiw a0, a0, 819 1000; RV64-NEXT: vand.vx v16, v8, a0 1001; RV64-NEXT: vsrl.vi v8, v8, 2 1002; RV64-NEXT: vand.vx v8, v8, a0 1003; RV64-NEXT: vadd.vv v8, v16, v8 1004; RV64-NEXT: vsrl.vi v16, v8, 4 1005; RV64-NEXT: vadd.vv v8, v8, v16 1006; RV64-NEXT: lui a0, 61681 1007; RV64-NEXT: addiw a0, a0, -241 1008; RV64-NEXT: vand.vx v8, v8, a0 1009; RV64-NEXT: lui a0, 4112 1010; RV64-NEXT: addiw a0, a0, 257 1011; RV64-NEXT: vmul.vx v8, v8, a0 1012; RV64-NEXT: vsrl.vi v8, v8, 24 1013; RV64-NEXT: ret 1014 %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 false) 1015 ret <vscale x 16 x i32> %a 1016} 1017declare <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32>, i1) 1018 1019define <vscale x 1 x i64> @ctlz_nxv1i64(<vscale x 1 x i64> %va) { 1020; RV32-LABEL: ctlz_nxv1i64: 1021; RV32: # %bb.0: 1022; RV32-NEXT: addi sp, sp, -16 1023; RV32-NEXT: .cfi_def_cfa_offset 16 1024; RV32-NEXT: lui a0, 349525 1025; RV32-NEXT: addi a0, a0, 1365 1026; RV32-NEXT: sw a0, 12(sp) 1027; RV32-NEXT: sw a0, 8(sp) 1028; RV32-NEXT: lui a0, 209715 1029; RV32-NEXT: addi a0, a0, 819 1030; RV32-NEXT: sw a0, 12(sp) 1031; RV32-NEXT: sw a0, 8(sp) 1032; RV32-NEXT: lui a0, 61681 1033; RV32-NEXT: addi a0, a0, -241 1034; RV32-NEXT: sw a0, 12(sp) 1035; RV32-NEXT: sw a0, 8(sp) 1036; RV32-NEXT: lui a0, 4112 1037; RV32-NEXT: addi a0, a0, 257 1038; RV32-NEXT: sw a0, 12(sp) 1039; RV32-NEXT: sw a0, 8(sp) 1040; RV32-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1041; RV32-NEXT: vsrl.vi v9, v8, 1 1042; RV32-NEXT: vor.vv v8, v8, v9 1043; RV32-NEXT: vsrl.vi v9, v8, 2 1044; RV32-NEXT: vor.vv v8, v8, v9 1045; RV32-NEXT: vsrl.vi v9, v8, 4 1046; RV32-NEXT: vor.vv v8, v8, v9 1047; RV32-NEXT: vsrl.vi v9, v8, 8 1048; RV32-NEXT: vor.vv v8, v8, v9 1049; RV32-NEXT: vsrl.vi v9, v8, 16 1050; RV32-NEXT: vor.vv v8, v8, v9 1051; RV32-NEXT: addi a0, zero, 32 1052; RV32-NEXT: vsrl.vx v9, v8, a0 1053; RV32-NEXT: vor.vv v8, v8, v9 1054; RV32-NEXT: addi a0, sp, 8 1055; RV32-NEXT: vlse64.v v9, (a0), zero 1056; RV32-NEXT: vxor.vi v8, v8, -1 1057; RV32-NEXT: addi a0, sp, 8 1058; RV32-NEXT: vlse64.v v10, (a0), zero 1059; RV32-NEXT: vsrl.vi v11, v8, 1 1060; RV32-NEXT: vand.vv v9, v11, v9 1061; RV32-NEXT: vsub.vv v8, v8, v9 1062; RV32-NEXT: vand.vv v9, v8, v10 1063; RV32-NEXT: vsrl.vi v8, v8, 2 1064; RV32-NEXT: vand.vv v8, v8, v10 1065; RV32-NEXT: vadd.vv v8, v9, v8 1066; RV32-NEXT: addi a0, sp, 8 1067; RV32-NEXT: vlse64.v v9, (a0), zero 1068; RV32-NEXT: addi a0, sp, 8 1069; RV32-NEXT: vlse64.v v10, (a0), zero 1070; RV32-NEXT: vsrl.vi v11, v8, 4 1071; RV32-NEXT: vadd.vv v8, v8, v11 1072; RV32-NEXT: vand.vv v8, v8, v9 1073; RV32-NEXT: vmul.vv v8, v8, v10 1074; RV32-NEXT: addi a0, zero, 56 1075; RV32-NEXT: vsrl.vx v8, v8, a0 1076; RV32-NEXT: addi sp, sp, 16 1077; RV32-NEXT: ret 1078; 1079; RV64-LABEL: ctlz_nxv1i64: 1080; RV64: # %bb.0: 1081; RV64-NEXT: vsetvli a0, zero, e64, m1, ta, mu 1082; RV64-NEXT: vsrl.vi v9, v8, 1 1083; RV64-NEXT: vor.vv v8, v8, v9 1084; RV64-NEXT: vsrl.vi v9, v8, 2 1085; RV64-NEXT: vor.vv v8, v8, v9 1086; RV64-NEXT: vsrl.vi v9, v8, 4 1087; RV64-NEXT: vor.vv v8, v8, v9 1088; RV64-NEXT: vsrl.vi v9, v8, 8 1089; RV64-NEXT: vor.vv v8, v8, v9 1090; RV64-NEXT: vsrl.vi v9, v8, 16 1091; RV64-NEXT: vor.vv v8, v8, v9 1092; RV64-NEXT: addi a0, zero, 32 1093; RV64-NEXT: vsrl.vx v9, v8, a0 1094; RV64-NEXT: vor.vv v8, v8, v9 1095; RV64-NEXT: vxor.vi v8, v8, -1 1096; RV64-NEXT: vsrl.vi v9, v8, 1 1097; RV64-NEXT: lui a0, 21845 1098; RV64-NEXT: addiw a0, a0, 1365 1099; RV64-NEXT: slli a0, a0, 12 1100; RV64-NEXT: addi a0, a0, 1365 1101; RV64-NEXT: slli a0, a0, 12 1102; RV64-NEXT: addi a0, a0, 1365 1103; RV64-NEXT: slli a0, a0, 12 1104; RV64-NEXT: addi a0, a0, 1365 1105; RV64-NEXT: vand.vx v9, v9, a0 1106; RV64-NEXT: vsub.vv v8, v8, v9 1107; RV64-NEXT: lui a0, 13107 1108; RV64-NEXT: addiw a0, a0, 819 1109; RV64-NEXT: slli a0, a0, 12 1110; RV64-NEXT: addi a0, a0, 819 1111; RV64-NEXT: slli a0, a0, 12 1112; RV64-NEXT: addi a0, a0, 819 1113; RV64-NEXT: slli a0, a0, 12 1114; RV64-NEXT: addi a0, a0, 819 1115; RV64-NEXT: vand.vx v9, v8, a0 1116; RV64-NEXT: vsrl.vi v8, v8, 2 1117; RV64-NEXT: vand.vx v8, v8, a0 1118; RV64-NEXT: vadd.vv v8, v9, v8 1119; RV64-NEXT: vsrl.vi v9, v8, 4 1120; RV64-NEXT: vadd.vv v8, v8, v9 1121; RV64-NEXT: lui a0, 3855 1122; RV64-NEXT: addiw a0, a0, 241 1123; RV64-NEXT: slli a0, a0, 12 1124; RV64-NEXT: addi a0, a0, -241 1125; RV64-NEXT: slli a0, a0, 12 1126; RV64-NEXT: addi a0, a0, 241 1127; RV64-NEXT: slli a0, a0, 12 1128; RV64-NEXT: addi a0, a0, -241 1129; RV64-NEXT: vand.vx v8, v8, a0 1130; RV64-NEXT: lui a0, 4112 1131; RV64-NEXT: addiw a0, a0, 257 1132; RV64-NEXT: slli a0, a0, 16 1133; RV64-NEXT: addi a0, a0, 257 1134; RV64-NEXT: slli a0, a0, 16 1135; RV64-NEXT: addi a0, a0, 257 1136; RV64-NEXT: vmul.vx v8, v8, a0 1137; RV64-NEXT: addi a0, zero, 56 1138; RV64-NEXT: vsrl.vx v8, v8, a0 1139; RV64-NEXT: ret 1140 %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 false) 1141 ret <vscale x 1 x i64> %a 1142} 1143declare <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64>, i1) 1144 1145define <vscale x 2 x i64> @ctlz_nxv2i64(<vscale x 2 x i64> %va) { 1146; RV32-LABEL: ctlz_nxv2i64: 1147; RV32: # %bb.0: 1148; RV32-NEXT: addi sp, sp, -16 1149; RV32-NEXT: .cfi_def_cfa_offset 16 1150; RV32-NEXT: lui a0, 349525 1151; RV32-NEXT: addi a0, a0, 1365 1152; RV32-NEXT: sw a0, 12(sp) 1153; RV32-NEXT: sw a0, 8(sp) 1154; RV32-NEXT: lui a0, 209715 1155; RV32-NEXT: addi a0, a0, 819 1156; RV32-NEXT: sw a0, 12(sp) 1157; RV32-NEXT: sw a0, 8(sp) 1158; RV32-NEXT: lui a0, 61681 1159; RV32-NEXT: addi a0, a0, -241 1160; RV32-NEXT: sw a0, 12(sp) 1161; RV32-NEXT: sw a0, 8(sp) 1162; RV32-NEXT: lui a0, 4112 1163; RV32-NEXT: addi a0, a0, 257 1164; RV32-NEXT: sw a0, 12(sp) 1165; RV32-NEXT: sw a0, 8(sp) 1166; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1167; RV32-NEXT: vsrl.vi v10, v8, 1 1168; RV32-NEXT: vor.vv v8, v8, v10 1169; RV32-NEXT: vsrl.vi v10, v8, 2 1170; RV32-NEXT: vor.vv v8, v8, v10 1171; RV32-NEXT: vsrl.vi v10, v8, 4 1172; RV32-NEXT: vor.vv v8, v8, v10 1173; RV32-NEXT: vsrl.vi v10, v8, 8 1174; RV32-NEXT: vor.vv v8, v8, v10 1175; RV32-NEXT: vsrl.vi v10, v8, 16 1176; RV32-NEXT: vor.vv v8, v8, v10 1177; RV32-NEXT: addi a0, zero, 32 1178; RV32-NEXT: vsrl.vx v10, v8, a0 1179; RV32-NEXT: vor.vv v8, v8, v10 1180; RV32-NEXT: addi a0, sp, 8 1181; RV32-NEXT: vlse64.v v10, (a0), zero 1182; RV32-NEXT: vxor.vi v8, v8, -1 1183; RV32-NEXT: addi a0, sp, 8 1184; RV32-NEXT: vlse64.v v12, (a0), zero 1185; RV32-NEXT: vsrl.vi v14, v8, 1 1186; RV32-NEXT: vand.vv v10, v14, v10 1187; RV32-NEXT: vsub.vv v8, v8, v10 1188; RV32-NEXT: vand.vv v10, v8, v12 1189; RV32-NEXT: vsrl.vi v8, v8, 2 1190; RV32-NEXT: vand.vv v8, v8, v12 1191; RV32-NEXT: vadd.vv v8, v10, v8 1192; RV32-NEXT: addi a0, sp, 8 1193; RV32-NEXT: vlse64.v v10, (a0), zero 1194; RV32-NEXT: addi a0, sp, 8 1195; RV32-NEXT: vlse64.v v12, (a0), zero 1196; RV32-NEXT: vsrl.vi v14, v8, 4 1197; RV32-NEXT: vadd.vv v8, v8, v14 1198; RV32-NEXT: vand.vv v8, v8, v10 1199; RV32-NEXT: vmul.vv v8, v8, v12 1200; RV32-NEXT: addi a0, zero, 56 1201; RV32-NEXT: vsrl.vx v8, v8, a0 1202; RV32-NEXT: addi sp, sp, 16 1203; RV32-NEXT: ret 1204; 1205; RV64-LABEL: ctlz_nxv2i64: 1206; RV64: # %bb.0: 1207; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 1208; RV64-NEXT: vsrl.vi v10, v8, 1 1209; RV64-NEXT: vor.vv v8, v8, v10 1210; RV64-NEXT: vsrl.vi v10, v8, 2 1211; RV64-NEXT: vor.vv v8, v8, v10 1212; RV64-NEXT: vsrl.vi v10, v8, 4 1213; RV64-NEXT: vor.vv v8, v8, v10 1214; RV64-NEXT: vsrl.vi v10, v8, 8 1215; RV64-NEXT: vor.vv v8, v8, v10 1216; RV64-NEXT: vsrl.vi v10, v8, 16 1217; RV64-NEXT: vor.vv v8, v8, v10 1218; RV64-NEXT: addi a0, zero, 32 1219; RV64-NEXT: vsrl.vx v10, v8, a0 1220; RV64-NEXT: vor.vv v8, v8, v10 1221; RV64-NEXT: vxor.vi v8, v8, -1 1222; RV64-NEXT: vsrl.vi v10, v8, 1 1223; RV64-NEXT: lui a0, 21845 1224; RV64-NEXT: addiw a0, a0, 1365 1225; RV64-NEXT: slli a0, a0, 12 1226; RV64-NEXT: addi a0, a0, 1365 1227; RV64-NEXT: slli a0, a0, 12 1228; RV64-NEXT: addi a0, a0, 1365 1229; RV64-NEXT: slli a0, a0, 12 1230; RV64-NEXT: addi a0, a0, 1365 1231; RV64-NEXT: vand.vx v10, v10, a0 1232; RV64-NEXT: vsub.vv v8, v8, v10 1233; RV64-NEXT: lui a0, 13107 1234; RV64-NEXT: addiw a0, a0, 819 1235; RV64-NEXT: slli a0, a0, 12 1236; RV64-NEXT: addi a0, a0, 819 1237; RV64-NEXT: slli a0, a0, 12 1238; RV64-NEXT: addi a0, a0, 819 1239; RV64-NEXT: slli a0, a0, 12 1240; RV64-NEXT: addi a0, a0, 819 1241; RV64-NEXT: vand.vx v10, v8, a0 1242; RV64-NEXT: vsrl.vi v8, v8, 2 1243; RV64-NEXT: vand.vx v8, v8, a0 1244; RV64-NEXT: vadd.vv v8, v10, v8 1245; RV64-NEXT: vsrl.vi v10, v8, 4 1246; RV64-NEXT: vadd.vv v8, v8, v10 1247; RV64-NEXT: lui a0, 3855 1248; RV64-NEXT: addiw a0, a0, 241 1249; RV64-NEXT: slli a0, a0, 12 1250; RV64-NEXT: addi a0, a0, -241 1251; RV64-NEXT: slli a0, a0, 12 1252; RV64-NEXT: addi a0, a0, 241 1253; RV64-NEXT: slli a0, a0, 12 1254; RV64-NEXT: addi a0, a0, -241 1255; RV64-NEXT: vand.vx v8, v8, a0 1256; RV64-NEXT: lui a0, 4112 1257; RV64-NEXT: addiw a0, a0, 257 1258; RV64-NEXT: slli a0, a0, 16 1259; RV64-NEXT: addi a0, a0, 257 1260; RV64-NEXT: slli a0, a0, 16 1261; RV64-NEXT: addi a0, a0, 257 1262; RV64-NEXT: vmul.vx v8, v8, a0 1263; RV64-NEXT: addi a0, zero, 56 1264; RV64-NEXT: vsrl.vx v8, v8, a0 1265; RV64-NEXT: ret 1266 %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 false) 1267 ret <vscale x 2 x i64> %a 1268} 1269declare <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64>, i1) 1270 1271define <vscale x 4 x i64> @ctlz_nxv4i64(<vscale x 4 x i64> %va) { 1272; RV32-LABEL: ctlz_nxv4i64: 1273; RV32: # %bb.0: 1274; RV32-NEXT: addi sp, sp, -16 1275; RV32-NEXT: .cfi_def_cfa_offset 16 1276; RV32-NEXT: lui a0, 349525 1277; RV32-NEXT: addi a0, a0, 1365 1278; RV32-NEXT: sw a0, 12(sp) 1279; RV32-NEXT: sw a0, 8(sp) 1280; RV32-NEXT: lui a0, 209715 1281; RV32-NEXT: addi a0, a0, 819 1282; RV32-NEXT: sw a0, 12(sp) 1283; RV32-NEXT: sw a0, 8(sp) 1284; RV32-NEXT: lui a0, 61681 1285; RV32-NEXT: addi a0, a0, -241 1286; RV32-NEXT: sw a0, 12(sp) 1287; RV32-NEXT: sw a0, 8(sp) 1288; RV32-NEXT: lui a0, 4112 1289; RV32-NEXT: addi a0, a0, 257 1290; RV32-NEXT: sw a0, 12(sp) 1291; RV32-NEXT: sw a0, 8(sp) 1292; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1293; RV32-NEXT: vsrl.vi v12, v8, 1 1294; RV32-NEXT: vor.vv v8, v8, v12 1295; RV32-NEXT: vsrl.vi v12, v8, 2 1296; RV32-NEXT: vor.vv v8, v8, v12 1297; RV32-NEXT: vsrl.vi v12, v8, 4 1298; RV32-NEXT: vor.vv v8, v8, v12 1299; RV32-NEXT: vsrl.vi v12, v8, 8 1300; RV32-NEXT: vor.vv v8, v8, v12 1301; RV32-NEXT: vsrl.vi v12, v8, 16 1302; RV32-NEXT: vor.vv v8, v8, v12 1303; RV32-NEXT: addi a0, zero, 32 1304; RV32-NEXT: vsrl.vx v12, v8, a0 1305; RV32-NEXT: vor.vv v8, v8, v12 1306; RV32-NEXT: addi a0, sp, 8 1307; RV32-NEXT: vlse64.v v12, (a0), zero 1308; RV32-NEXT: vxor.vi v8, v8, -1 1309; RV32-NEXT: addi a0, sp, 8 1310; RV32-NEXT: vlse64.v v16, (a0), zero 1311; RV32-NEXT: vsrl.vi v20, v8, 1 1312; RV32-NEXT: vand.vv v12, v20, v12 1313; RV32-NEXT: vsub.vv v8, v8, v12 1314; RV32-NEXT: vand.vv v12, v8, v16 1315; RV32-NEXT: vsrl.vi v8, v8, 2 1316; RV32-NEXT: vand.vv v8, v8, v16 1317; RV32-NEXT: vadd.vv v8, v12, v8 1318; RV32-NEXT: addi a0, sp, 8 1319; RV32-NEXT: vlse64.v v12, (a0), zero 1320; RV32-NEXT: addi a0, sp, 8 1321; RV32-NEXT: vlse64.v v16, (a0), zero 1322; RV32-NEXT: vsrl.vi v20, v8, 4 1323; RV32-NEXT: vadd.vv v8, v8, v20 1324; RV32-NEXT: vand.vv v8, v8, v12 1325; RV32-NEXT: vmul.vv v8, v8, v16 1326; RV32-NEXT: addi a0, zero, 56 1327; RV32-NEXT: vsrl.vx v8, v8, a0 1328; RV32-NEXT: addi sp, sp, 16 1329; RV32-NEXT: ret 1330; 1331; RV64-LABEL: ctlz_nxv4i64: 1332; RV64: # %bb.0: 1333; RV64-NEXT: vsetvli a0, zero, e64, m4, ta, mu 1334; RV64-NEXT: vsrl.vi v12, v8, 1 1335; RV64-NEXT: vor.vv v8, v8, v12 1336; RV64-NEXT: vsrl.vi v12, v8, 2 1337; RV64-NEXT: vor.vv v8, v8, v12 1338; RV64-NEXT: vsrl.vi v12, v8, 4 1339; RV64-NEXT: vor.vv v8, v8, v12 1340; RV64-NEXT: vsrl.vi v12, v8, 8 1341; RV64-NEXT: vor.vv v8, v8, v12 1342; RV64-NEXT: vsrl.vi v12, v8, 16 1343; RV64-NEXT: vor.vv v8, v8, v12 1344; RV64-NEXT: addi a0, zero, 32 1345; RV64-NEXT: vsrl.vx v12, v8, a0 1346; RV64-NEXT: vor.vv v8, v8, v12 1347; RV64-NEXT: vxor.vi v8, v8, -1 1348; RV64-NEXT: vsrl.vi v12, v8, 1 1349; RV64-NEXT: lui a0, 21845 1350; RV64-NEXT: addiw a0, a0, 1365 1351; RV64-NEXT: slli a0, a0, 12 1352; RV64-NEXT: addi a0, a0, 1365 1353; RV64-NEXT: slli a0, a0, 12 1354; RV64-NEXT: addi a0, a0, 1365 1355; RV64-NEXT: slli a0, a0, 12 1356; RV64-NEXT: addi a0, a0, 1365 1357; RV64-NEXT: vand.vx v12, v12, a0 1358; RV64-NEXT: vsub.vv v8, v8, v12 1359; RV64-NEXT: lui a0, 13107 1360; RV64-NEXT: addiw a0, a0, 819 1361; RV64-NEXT: slli a0, a0, 12 1362; RV64-NEXT: addi a0, a0, 819 1363; RV64-NEXT: slli a0, a0, 12 1364; RV64-NEXT: addi a0, a0, 819 1365; RV64-NEXT: slli a0, a0, 12 1366; RV64-NEXT: addi a0, a0, 819 1367; RV64-NEXT: vand.vx v12, v8, a0 1368; RV64-NEXT: vsrl.vi v8, v8, 2 1369; RV64-NEXT: vand.vx v8, v8, a0 1370; RV64-NEXT: vadd.vv v8, v12, v8 1371; RV64-NEXT: vsrl.vi v12, v8, 4 1372; RV64-NEXT: vadd.vv v8, v8, v12 1373; RV64-NEXT: lui a0, 3855 1374; RV64-NEXT: addiw a0, a0, 241 1375; RV64-NEXT: slli a0, a0, 12 1376; RV64-NEXT: addi a0, a0, -241 1377; RV64-NEXT: slli a0, a0, 12 1378; RV64-NEXT: addi a0, a0, 241 1379; RV64-NEXT: slli a0, a0, 12 1380; RV64-NEXT: addi a0, a0, -241 1381; RV64-NEXT: vand.vx v8, v8, a0 1382; RV64-NEXT: lui a0, 4112 1383; RV64-NEXT: addiw a0, a0, 257 1384; RV64-NEXT: slli a0, a0, 16 1385; RV64-NEXT: addi a0, a0, 257 1386; RV64-NEXT: slli a0, a0, 16 1387; RV64-NEXT: addi a0, a0, 257 1388; RV64-NEXT: vmul.vx v8, v8, a0 1389; RV64-NEXT: addi a0, zero, 56 1390; RV64-NEXT: vsrl.vx v8, v8, a0 1391; RV64-NEXT: ret 1392 %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 false) 1393 ret <vscale x 4 x i64> %a 1394} 1395declare <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64>, i1) 1396 1397define <vscale x 8 x i64> @ctlz_nxv8i64(<vscale x 8 x i64> %va) { 1398; RV32-LABEL: ctlz_nxv8i64: 1399; RV32: # %bb.0: 1400; RV32-NEXT: addi sp, sp, -16 1401; RV32-NEXT: .cfi_def_cfa_offset 16 1402; RV32-NEXT: lui a0, 349525 1403; RV32-NEXT: addi a0, a0, 1365 1404; RV32-NEXT: sw a0, 12(sp) 1405; RV32-NEXT: sw a0, 8(sp) 1406; RV32-NEXT: lui a0, 209715 1407; RV32-NEXT: addi a0, a0, 819 1408; RV32-NEXT: sw a0, 12(sp) 1409; RV32-NEXT: sw a0, 8(sp) 1410; RV32-NEXT: lui a0, 61681 1411; RV32-NEXT: addi a0, a0, -241 1412; RV32-NEXT: sw a0, 12(sp) 1413; RV32-NEXT: sw a0, 8(sp) 1414; RV32-NEXT: lui a0, 4112 1415; RV32-NEXT: addi a0, a0, 257 1416; RV32-NEXT: sw a0, 12(sp) 1417; RV32-NEXT: sw a0, 8(sp) 1418; RV32-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1419; RV32-NEXT: vsrl.vi v16, v8, 1 1420; RV32-NEXT: vor.vv v8, v8, v16 1421; RV32-NEXT: vsrl.vi v16, v8, 2 1422; RV32-NEXT: vor.vv v8, v8, v16 1423; RV32-NEXT: vsrl.vi v16, v8, 4 1424; RV32-NEXT: vor.vv v8, v8, v16 1425; RV32-NEXT: vsrl.vi v16, v8, 8 1426; RV32-NEXT: vor.vv v8, v8, v16 1427; RV32-NEXT: vsrl.vi v16, v8, 16 1428; RV32-NEXT: vor.vv v8, v8, v16 1429; RV32-NEXT: addi a0, zero, 32 1430; RV32-NEXT: vsrl.vx v16, v8, a0 1431; RV32-NEXT: vor.vv v8, v8, v16 1432; RV32-NEXT: addi a0, sp, 8 1433; RV32-NEXT: vlse64.v v16, (a0), zero 1434; RV32-NEXT: vxor.vi v8, v8, -1 1435; RV32-NEXT: addi a0, sp, 8 1436; RV32-NEXT: vlse64.v v24, (a0), zero 1437; RV32-NEXT: vsrl.vi v0, v8, 1 1438; RV32-NEXT: vand.vv v16, v0, v16 1439; RV32-NEXT: vsub.vv v8, v8, v16 1440; RV32-NEXT: vand.vv v16, v8, v24 1441; RV32-NEXT: vsrl.vi v8, v8, 2 1442; RV32-NEXT: vand.vv v8, v8, v24 1443; RV32-NEXT: vadd.vv v8, v16, v8 1444; RV32-NEXT: addi a0, sp, 8 1445; RV32-NEXT: vlse64.v v16, (a0), zero 1446; RV32-NEXT: addi a0, sp, 8 1447; RV32-NEXT: vlse64.v v24, (a0), zero 1448; RV32-NEXT: vsrl.vi v0, v8, 4 1449; RV32-NEXT: vadd.vv v8, v8, v0 1450; RV32-NEXT: vand.vv v8, v8, v16 1451; RV32-NEXT: vmul.vv v8, v8, v24 1452; RV32-NEXT: addi a0, zero, 56 1453; RV32-NEXT: vsrl.vx v8, v8, a0 1454; RV32-NEXT: addi sp, sp, 16 1455; RV32-NEXT: ret 1456; 1457; RV64-LABEL: ctlz_nxv8i64: 1458; RV64: # %bb.0: 1459; RV64-NEXT: vsetvli a0, zero, e64, m8, ta, mu 1460; RV64-NEXT: vsrl.vi v16, v8, 1 1461; RV64-NEXT: vor.vv v8, v8, v16 1462; RV64-NEXT: vsrl.vi v16, v8, 2 1463; RV64-NEXT: vor.vv v8, v8, v16 1464; RV64-NEXT: vsrl.vi v16, v8, 4 1465; RV64-NEXT: vor.vv v8, v8, v16 1466; RV64-NEXT: vsrl.vi v16, v8, 8 1467; RV64-NEXT: vor.vv v8, v8, v16 1468; RV64-NEXT: vsrl.vi v16, v8, 16 1469; RV64-NEXT: vor.vv v8, v8, v16 1470; RV64-NEXT: addi a0, zero, 32 1471; RV64-NEXT: vsrl.vx v16, v8, a0 1472; RV64-NEXT: vor.vv v8, v8, v16 1473; RV64-NEXT: vxor.vi v8, v8, -1 1474; RV64-NEXT: vsrl.vi v16, v8, 1 1475; RV64-NEXT: lui a0, 21845 1476; RV64-NEXT: addiw a0, a0, 1365 1477; RV64-NEXT: slli a0, a0, 12 1478; RV64-NEXT: addi a0, a0, 1365 1479; RV64-NEXT: slli a0, a0, 12 1480; RV64-NEXT: addi a0, a0, 1365 1481; RV64-NEXT: slli a0, a0, 12 1482; RV64-NEXT: addi a0, a0, 1365 1483; RV64-NEXT: vand.vx v16, v16, a0 1484; RV64-NEXT: vsub.vv v8, v8, v16 1485; RV64-NEXT: lui a0, 13107 1486; RV64-NEXT: addiw a0, a0, 819 1487; RV64-NEXT: slli a0, a0, 12 1488; RV64-NEXT: addi a0, a0, 819 1489; RV64-NEXT: slli a0, a0, 12 1490; RV64-NEXT: addi a0, a0, 819 1491; RV64-NEXT: slli a0, a0, 12 1492; RV64-NEXT: addi a0, a0, 819 1493; RV64-NEXT: vand.vx v16, v8, a0 1494; RV64-NEXT: vsrl.vi v8, v8, 2 1495; RV64-NEXT: vand.vx v8, v8, a0 1496; RV64-NEXT: vadd.vv v8, v16, v8 1497; RV64-NEXT: vsrl.vi v16, v8, 4 1498; RV64-NEXT: vadd.vv v8, v8, v16 1499; RV64-NEXT: lui a0, 3855 1500; RV64-NEXT: addiw a0, a0, 241 1501; RV64-NEXT: slli a0, a0, 12 1502; RV64-NEXT: addi a0, a0, -241 1503; RV64-NEXT: slli a0, a0, 12 1504; RV64-NEXT: addi a0, a0, 241 1505; RV64-NEXT: slli a0, a0, 12 1506; RV64-NEXT: addi a0, a0, -241 1507; RV64-NEXT: vand.vx v8, v8, a0 1508; RV64-NEXT: lui a0, 4112 1509; RV64-NEXT: addiw a0, a0, 257 1510; RV64-NEXT: slli a0, a0, 16 1511; RV64-NEXT: addi a0, a0, 257 1512; RV64-NEXT: slli a0, a0, 16 1513; RV64-NEXT: addi a0, a0, 257 1514; RV64-NEXT: vmul.vx v8, v8, a0 1515; RV64-NEXT: addi a0, zero, 56 1516; RV64-NEXT: vsrl.vx v8, v8, a0 1517; RV64-NEXT: ret 1518 %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 false) 1519 ret <vscale x 8 x i64> %a 1520} 1521declare <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64>, i1) 1522 1523define <vscale x 1 x i8> @ctlz_zero_undef_nxv1i8(<vscale x 1 x i8> %va) { 1524; CHECK-LABEL: ctlz_zero_undef_nxv1i8: 1525; CHECK: # %bb.0: 1526; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, mu 1527; CHECK-NEXT: vsrl.vi v9, v8, 1 1528; CHECK-NEXT: vor.vv v8, v8, v9 1529; CHECK-NEXT: vsrl.vi v9, v8, 2 1530; CHECK-NEXT: vor.vv v8, v8, v9 1531; CHECK-NEXT: vsrl.vi v9, v8, 4 1532; CHECK-NEXT: vor.vv v8, v8, v9 1533; CHECK-NEXT: vxor.vi v8, v8, -1 1534; CHECK-NEXT: vsrl.vi v9, v8, 1 1535; CHECK-NEXT: addi a0, zero, 85 1536; CHECK-NEXT: vand.vx v9, v9, a0 1537; CHECK-NEXT: vsub.vv v8, v8, v9 1538; CHECK-NEXT: addi a0, zero, 51 1539; CHECK-NEXT: vand.vx v9, v8, a0 1540; CHECK-NEXT: vsrl.vi v8, v8, 2 1541; CHECK-NEXT: vand.vx v8, v8, a0 1542; CHECK-NEXT: vadd.vv v8, v9, v8 1543; CHECK-NEXT: vsrl.vi v9, v8, 4 1544; CHECK-NEXT: vadd.vv v8, v8, v9 1545; CHECK-NEXT: vand.vi v8, v8, 15 1546; CHECK-NEXT: ret 1547 %a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 true) 1548 ret <vscale x 1 x i8> %a 1549} 1550 1551define <vscale x 2 x i8> @ctlz_zero_undef_nxv2i8(<vscale x 2 x i8> %va) { 1552; CHECK-LABEL: ctlz_zero_undef_nxv2i8: 1553; CHECK: # %bb.0: 1554; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, mu 1555; CHECK-NEXT: vsrl.vi v9, v8, 1 1556; CHECK-NEXT: vor.vv v8, v8, v9 1557; CHECK-NEXT: vsrl.vi v9, v8, 2 1558; CHECK-NEXT: vor.vv v8, v8, v9 1559; CHECK-NEXT: vsrl.vi v9, v8, 4 1560; CHECK-NEXT: vor.vv v8, v8, v9 1561; CHECK-NEXT: vxor.vi v8, v8, -1 1562; CHECK-NEXT: vsrl.vi v9, v8, 1 1563; CHECK-NEXT: addi a0, zero, 85 1564; CHECK-NEXT: vand.vx v9, v9, a0 1565; CHECK-NEXT: vsub.vv v8, v8, v9 1566; CHECK-NEXT: addi a0, zero, 51 1567; CHECK-NEXT: vand.vx v9, v8, a0 1568; CHECK-NEXT: vsrl.vi v8, v8, 2 1569; CHECK-NEXT: vand.vx v8, v8, a0 1570; CHECK-NEXT: vadd.vv v8, v9, v8 1571; CHECK-NEXT: vsrl.vi v9, v8, 4 1572; CHECK-NEXT: vadd.vv v8, v8, v9 1573; CHECK-NEXT: vand.vi v8, v8, 15 1574; CHECK-NEXT: ret 1575 %a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 true) 1576 ret <vscale x 2 x i8> %a 1577} 1578 1579define <vscale x 4 x i8> @ctlz_zero_undef_nxv4i8(<vscale x 4 x i8> %va) { 1580; CHECK-LABEL: ctlz_zero_undef_nxv4i8: 1581; CHECK: # %bb.0: 1582; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, mu 1583; CHECK-NEXT: vsrl.vi v9, v8, 1 1584; CHECK-NEXT: vor.vv v8, v8, v9 1585; CHECK-NEXT: vsrl.vi v9, v8, 2 1586; CHECK-NEXT: vor.vv v8, v8, v9 1587; CHECK-NEXT: vsrl.vi v9, v8, 4 1588; CHECK-NEXT: vor.vv v8, v8, v9 1589; CHECK-NEXT: vxor.vi v8, v8, -1 1590; CHECK-NEXT: vsrl.vi v9, v8, 1 1591; CHECK-NEXT: addi a0, zero, 85 1592; CHECK-NEXT: vand.vx v9, v9, a0 1593; CHECK-NEXT: vsub.vv v8, v8, v9 1594; CHECK-NEXT: addi a0, zero, 51 1595; CHECK-NEXT: vand.vx v9, v8, a0 1596; CHECK-NEXT: vsrl.vi v8, v8, 2 1597; CHECK-NEXT: vand.vx v8, v8, a0 1598; CHECK-NEXT: vadd.vv v8, v9, v8 1599; CHECK-NEXT: vsrl.vi v9, v8, 4 1600; CHECK-NEXT: vadd.vv v8, v8, v9 1601; CHECK-NEXT: vand.vi v8, v8, 15 1602; CHECK-NEXT: ret 1603 %a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 true) 1604 ret <vscale x 4 x i8> %a 1605} 1606 1607define <vscale x 8 x i8> @ctlz_zero_undef_nxv8i8(<vscale x 8 x i8> %va) { 1608; CHECK-LABEL: ctlz_zero_undef_nxv8i8: 1609; CHECK: # %bb.0: 1610; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, mu 1611; CHECK-NEXT: vsrl.vi v9, v8, 1 1612; CHECK-NEXT: vor.vv v8, v8, v9 1613; CHECK-NEXT: vsrl.vi v9, v8, 2 1614; CHECK-NEXT: vor.vv v8, v8, v9 1615; CHECK-NEXT: vsrl.vi v9, v8, 4 1616; CHECK-NEXT: vor.vv v8, v8, v9 1617; CHECK-NEXT: vxor.vi v8, v8, -1 1618; CHECK-NEXT: vsrl.vi v9, v8, 1 1619; CHECK-NEXT: addi a0, zero, 85 1620; CHECK-NEXT: vand.vx v9, v9, a0 1621; CHECK-NEXT: vsub.vv v8, v8, v9 1622; CHECK-NEXT: addi a0, zero, 51 1623; CHECK-NEXT: vand.vx v9, v8, a0 1624; CHECK-NEXT: vsrl.vi v8, v8, 2 1625; CHECK-NEXT: vand.vx v8, v8, a0 1626; CHECK-NEXT: vadd.vv v8, v9, v8 1627; CHECK-NEXT: vsrl.vi v9, v8, 4 1628; CHECK-NEXT: vadd.vv v8, v8, v9 1629; CHECK-NEXT: vand.vi v8, v8, 15 1630; CHECK-NEXT: ret 1631 %a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 true) 1632 ret <vscale x 8 x i8> %a 1633} 1634 1635define <vscale x 16 x i8> @ctlz_zero_undef_nxv16i8(<vscale x 16 x i8> %va) { 1636; CHECK-LABEL: ctlz_zero_undef_nxv16i8: 1637; CHECK: # %bb.0: 1638; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, mu 1639; CHECK-NEXT: vsrl.vi v10, v8, 1 1640; CHECK-NEXT: vor.vv v8, v8, v10 1641; CHECK-NEXT: vsrl.vi v10, v8, 2 1642; CHECK-NEXT: vor.vv v8, v8, v10 1643; CHECK-NEXT: vsrl.vi v10, v8, 4 1644; CHECK-NEXT: vor.vv v8, v8, v10 1645; CHECK-NEXT: vxor.vi v8, v8, -1 1646; CHECK-NEXT: vsrl.vi v10, v8, 1 1647; CHECK-NEXT: addi a0, zero, 85 1648; CHECK-NEXT: vand.vx v10, v10, a0 1649; CHECK-NEXT: vsub.vv v8, v8, v10 1650; CHECK-NEXT: addi a0, zero, 51 1651; CHECK-NEXT: vand.vx v10, v8, a0 1652; CHECK-NEXT: vsrl.vi v8, v8, 2 1653; CHECK-NEXT: vand.vx v8, v8, a0 1654; CHECK-NEXT: vadd.vv v8, v10, v8 1655; CHECK-NEXT: vsrl.vi v10, v8, 4 1656; CHECK-NEXT: vadd.vv v8, v8, v10 1657; CHECK-NEXT: vand.vi v8, v8, 15 1658; CHECK-NEXT: ret 1659 %a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 true) 1660 ret <vscale x 16 x i8> %a 1661} 1662 1663define <vscale x 32 x i8> @ctlz_zero_undef_nxv32i8(<vscale x 32 x i8> %va) { 1664; CHECK-LABEL: ctlz_zero_undef_nxv32i8: 1665; CHECK: # %bb.0: 1666; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, mu 1667; CHECK-NEXT: vsrl.vi v12, v8, 1 1668; CHECK-NEXT: vor.vv v8, v8, v12 1669; CHECK-NEXT: vsrl.vi v12, v8, 2 1670; CHECK-NEXT: vor.vv v8, v8, v12 1671; CHECK-NEXT: vsrl.vi v12, v8, 4 1672; CHECK-NEXT: vor.vv v8, v8, v12 1673; CHECK-NEXT: vxor.vi v8, v8, -1 1674; CHECK-NEXT: vsrl.vi v12, v8, 1 1675; CHECK-NEXT: addi a0, zero, 85 1676; CHECK-NEXT: vand.vx v12, v12, a0 1677; CHECK-NEXT: vsub.vv v8, v8, v12 1678; CHECK-NEXT: addi a0, zero, 51 1679; CHECK-NEXT: vand.vx v12, v8, a0 1680; CHECK-NEXT: vsrl.vi v8, v8, 2 1681; CHECK-NEXT: vand.vx v8, v8, a0 1682; CHECK-NEXT: vadd.vv v8, v12, v8 1683; CHECK-NEXT: vsrl.vi v12, v8, 4 1684; CHECK-NEXT: vadd.vv v8, v8, v12 1685; CHECK-NEXT: vand.vi v8, v8, 15 1686; CHECK-NEXT: ret 1687 %a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 true) 1688 ret <vscale x 32 x i8> %a 1689} 1690 1691define <vscale x 64 x i8> @ctlz_zero_undef_nxv64i8(<vscale x 64 x i8> %va) { 1692; CHECK-LABEL: ctlz_zero_undef_nxv64i8: 1693; CHECK: # %bb.0: 1694; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, mu 1695; CHECK-NEXT: vsrl.vi v16, v8, 1 1696; CHECK-NEXT: vor.vv v8, v8, v16 1697; CHECK-NEXT: vsrl.vi v16, v8, 2 1698; CHECK-NEXT: vor.vv v8, v8, v16 1699; CHECK-NEXT: vsrl.vi v16, v8, 4 1700; CHECK-NEXT: vor.vv v8, v8, v16 1701; CHECK-NEXT: vxor.vi v8, v8, -1 1702; CHECK-NEXT: vsrl.vi v16, v8, 1 1703; CHECK-NEXT: addi a0, zero, 85 1704; CHECK-NEXT: vand.vx v16, v16, a0 1705; CHECK-NEXT: vsub.vv v8, v8, v16 1706; CHECK-NEXT: addi a0, zero, 51 1707; CHECK-NEXT: vand.vx v16, v8, a0 1708; CHECK-NEXT: vsrl.vi v8, v8, 2 1709; CHECK-NEXT: vand.vx v8, v8, a0 1710; CHECK-NEXT: vadd.vv v8, v16, v8 1711; CHECK-NEXT: vsrl.vi v16, v8, 4 1712; CHECK-NEXT: vadd.vv v8, v8, v16 1713; CHECK-NEXT: vand.vi v8, v8, 15 1714; CHECK-NEXT: ret 1715 %a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 true) 1716 ret <vscale x 64 x i8> %a 1717} 1718 1719define <vscale x 1 x i16> @ctlz_zero_undef_nxv1i16(<vscale x 1 x i16> %va) { 1720; RV32-LABEL: ctlz_zero_undef_nxv1i16: 1721; RV32: # %bb.0: 1722; RV32-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 1723; RV32-NEXT: vsrl.vi v9, v8, 1 1724; RV32-NEXT: vor.vv v8, v8, v9 1725; RV32-NEXT: vsrl.vi v9, v8, 2 1726; RV32-NEXT: vor.vv v8, v8, v9 1727; RV32-NEXT: vsrl.vi v9, v8, 4 1728; RV32-NEXT: vor.vv v8, v8, v9 1729; RV32-NEXT: vsrl.vi v9, v8, 8 1730; RV32-NEXT: vor.vv v8, v8, v9 1731; RV32-NEXT: vxor.vi v8, v8, -1 1732; RV32-NEXT: vsrl.vi v9, v8, 1 1733; RV32-NEXT: lui a0, 5 1734; RV32-NEXT: addi a0, a0, 1365 1735; RV32-NEXT: vand.vx v9, v9, a0 1736; RV32-NEXT: vsub.vv v8, v8, v9 1737; RV32-NEXT: lui a0, 3 1738; RV32-NEXT: addi a0, a0, 819 1739; RV32-NEXT: vand.vx v9, v8, a0 1740; RV32-NEXT: vsrl.vi v8, v8, 2 1741; RV32-NEXT: vand.vx v8, v8, a0 1742; RV32-NEXT: vadd.vv v8, v9, v8 1743; RV32-NEXT: vsrl.vi v9, v8, 4 1744; RV32-NEXT: vadd.vv v8, v8, v9 1745; RV32-NEXT: lui a0, 1 1746; RV32-NEXT: addi a0, a0, -241 1747; RV32-NEXT: vand.vx v8, v8, a0 1748; RV32-NEXT: addi a0, zero, 257 1749; RV32-NEXT: vmul.vx v8, v8, a0 1750; RV32-NEXT: vsrl.vi v8, v8, 8 1751; RV32-NEXT: ret 1752; 1753; RV64-LABEL: ctlz_zero_undef_nxv1i16: 1754; RV64: # %bb.0: 1755; RV64-NEXT: vsetvli a0, zero, e16, mf4, ta, mu 1756; RV64-NEXT: vsrl.vi v9, v8, 1 1757; RV64-NEXT: vor.vv v8, v8, v9 1758; RV64-NEXT: vsrl.vi v9, v8, 2 1759; RV64-NEXT: vor.vv v8, v8, v9 1760; RV64-NEXT: vsrl.vi v9, v8, 4 1761; RV64-NEXT: vor.vv v8, v8, v9 1762; RV64-NEXT: vsrl.vi v9, v8, 8 1763; RV64-NEXT: vor.vv v8, v8, v9 1764; RV64-NEXT: vxor.vi v8, v8, -1 1765; RV64-NEXT: vsrl.vi v9, v8, 1 1766; RV64-NEXT: lui a0, 5 1767; RV64-NEXT: addiw a0, a0, 1365 1768; RV64-NEXT: vand.vx v9, v9, a0 1769; RV64-NEXT: vsub.vv v8, v8, v9 1770; RV64-NEXT: lui a0, 3 1771; RV64-NEXT: addiw a0, a0, 819 1772; RV64-NEXT: vand.vx v9, v8, a0 1773; RV64-NEXT: vsrl.vi v8, v8, 2 1774; RV64-NEXT: vand.vx v8, v8, a0 1775; RV64-NEXT: vadd.vv v8, v9, v8 1776; RV64-NEXT: vsrl.vi v9, v8, 4 1777; RV64-NEXT: vadd.vv v8, v8, v9 1778; RV64-NEXT: lui a0, 1 1779; RV64-NEXT: addiw a0, a0, -241 1780; RV64-NEXT: vand.vx v8, v8, a0 1781; RV64-NEXT: addi a0, zero, 257 1782; RV64-NEXT: vmul.vx v8, v8, a0 1783; RV64-NEXT: vsrl.vi v8, v8, 8 1784; RV64-NEXT: ret 1785 %a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 true) 1786 ret <vscale x 1 x i16> %a 1787} 1788 1789define <vscale x 2 x i16> @ctlz_zero_undef_nxv2i16(<vscale x 2 x i16> %va) { 1790; RV32-LABEL: ctlz_zero_undef_nxv2i16: 1791; RV32: # %bb.0: 1792; RV32-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 1793; RV32-NEXT: vsrl.vi v9, v8, 1 1794; RV32-NEXT: vor.vv v8, v8, v9 1795; RV32-NEXT: vsrl.vi v9, v8, 2 1796; RV32-NEXT: vor.vv v8, v8, v9 1797; RV32-NEXT: vsrl.vi v9, v8, 4 1798; RV32-NEXT: vor.vv v8, v8, v9 1799; RV32-NEXT: vsrl.vi v9, v8, 8 1800; RV32-NEXT: vor.vv v8, v8, v9 1801; RV32-NEXT: vxor.vi v8, v8, -1 1802; RV32-NEXT: vsrl.vi v9, v8, 1 1803; RV32-NEXT: lui a0, 5 1804; RV32-NEXT: addi a0, a0, 1365 1805; RV32-NEXT: vand.vx v9, v9, a0 1806; RV32-NEXT: vsub.vv v8, v8, v9 1807; RV32-NEXT: lui a0, 3 1808; RV32-NEXT: addi a0, a0, 819 1809; RV32-NEXT: vand.vx v9, v8, a0 1810; RV32-NEXT: vsrl.vi v8, v8, 2 1811; RV32-NEXT: vand.vx v8, v8, a0 1812; RV32-NEXT: vadd.vv v8, v9, v8 1813; RV32-NEXT: vsrl.vi v9, v8, 4 1814; RV32-NEXT: vadd.vv v8, v8, v9 1815; RV32-NEXT: lui a0, 1 1816; RV32-NEXT: addi a0, a0, -241 1817; RV32-NEXT: vand.vx v8, v8, a0 1818; RV32-NEXT: addi a0, zero, 257 1819; RV32-NEXT: vmul.vx v8, v8, a0 1820; RV32-NEXT: vsrl.vi v8, v8, 8 1821; RV32-NEXT: ret 1822; 1823; RV64-LABEL: ctlz_zero_undef_nxv2i16: 1824; RV64: # %bb.0: 1825; RV64-NEXT: vsetvli a0, zero, e16, mf2, ta, mu 1826; RV64-NEXT: vsrl.vi v9, v8, 1 1827; RV64-NEXT: vor.vv v8, v8, v9 1828; RV64-NEXT: vsrl.vi v9, v8, 2 1829; RV64-NEXT: vor.vv v8, v8, v9 1830; RV64-NEXT: vsrl.vi v9, v8, 4 1831; RV64-NEXT: vor.vv v8, v8, v9 1832; RV64-NEXT: vsrl.vi v9, v8, 8 1833; RV64-NEXT: vor.vv v8, v8, v9 1834; RV64-NEXT: vxor.vi v8, v8, -1 1835; RV64-NEXT: vsrl.vi v9, v8, 1 1836; RV64-NEXT: lui a0, 5 1837; RV64-NEXT: addiw a0, a0, 1365 1838; RV64-NEXT: vand.vx v9, v9, a0 1839; RV64-NEXT: vsub.vv v8, v8, v9 1840; RV64-NEXT: lui a0, 3 1841; RV64-NEXT: addiw a0, a0, 819 1842; RV64-NEXT: vand.vx v9, v8, a0 1843; RV64-NEXT: vsrl.vi v8, v8, 2 1844; RV64-NEXT: vand.vx v8, v8, a0 1845; RV64-NEXT: vadd.vv v8, v9, v8 1846; RV64-NEXT: vsrl.vi v9, v8, 4 1847; RV64-NEXT: vadd.vv v8, v8, v9 1848; RV64-NEXT: lui a0, 1 1849; RV64-NEXT: addiw a0, a0, -241 1850; RV64-NEXT: vand.vx v8, v8, a0 1851; RV64-NEXT: addi a0, zero, 257 1852; RV64-NEXT: vmul.vx v8, v8, a0 1853; RV64-NEXT: vsrl.vi v8, v8, 8 1854; RV64-NEXT: ret 1855 %a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 true) 1856 ret <vscale x 2 x i16> %a 1857} 1858 1859define <vscale x 4 x i16> @ctlz_zero_undef_nxv4i16(<vscale x 4 x i16> %va) { 1860; RV32-LABEL: ctlz_zero_undef_nxv4i16: 1861; RV32: # %bb.0: 1862; RV32-NEXT: vsetvli a0, zero, e16, m1, ta, mu 1863; RV32-NEXT: vsrl.vi v9, v8, 1 1864; RV32-NEXT: vor.vv v8, v8, v9 1865; RV32-NEXT: vsrl.vi v9, v8, 2 1866; RV32-NEXT: vor.vv v8, v8, v9 1867; RV32-NEXT: vsrl.vi v9, v8, 4 1868; RV32-NEXT: vor.vv v8, v8, v9 1869; RV32-NEXT: vsrl.vi v9, v8, 8 1870; RV32-NEXT: vor.vv v8, v8, v9 1871; RV32-NEXT: vxor.vi v8, v8, -1 1872; RV32-NEXT: vsrl.vi v9, v8, 1 1873; RV32-NEXT: lui a0, 5 1874; RV32-NEXT: addi a0, a0, 1365 1875; RV32-NEXT: vand.vx v9, v9, a0 1876; RV32-NEXT: vsub.vv v8, v8, v9 1877; RV32-NEXT: lui a0, 3 1878; RV32-NEXT: addi a0, a0, 819 1879; RV32-NEXT: vand.vx v9, v8, a0 1880; RV32-NEXT: vsrl.vi v8, v8, 2 1881; RV32-NEXT: vand.vx v8, v8, a0 1882; RV32-NEXT: vadd.vv v8, v9, v8 1883; RV32-NEXT: vsrl.vi v9, v8, 4 1884; RV32-NEXT: vadd.vv v8, v8, v9 1885; RV32-NEXT: lui a0, 1 1886; RV32-NEXT: addi a0, a0, -241 1887; RV32-NEXT: vand.vx v8, v8, a0 1888; RV32-NEXT: addi a0, zero, 257 1889; RV32-NEXT: vmul.vx v8, v8, a0 1890; RV32-NEXT: vsrl.vi v8, v8, 8 1891; RV32-NEXT: ret 1892; 1893; RV64-LABEL: ctlz_zero_undef_nxv4i16: 1894; RV64: # %bb.0: 1895; RV64-NEXT: vsetvli a0, zero, e16, m1, ta, mu 1896; RV64-NEXT: vsrl.vi v9, v8, 1 1897; RV64-NEXT: vor.vv v8, v8, v9 1898; RV64-NEXT: vsrl.vi v9, v8, 2 1899; RV64-NEXT: vor.vv v8, v8, v9 1900; RV64-NEXT: vsrl.vi v9, v8, 4 1901; RV64-NEXT: vor.vv v8, v8, v9 1902; RV64-NEXT: vsrl.vi v9, v8, 8 1903; RV64-NEXT: vor.vv v8, v8, v9 1904; RV64-NEXT: vxor.vi v8, v8, -1 1905; RV64-NEXT: vsrl.vi v9, v8, 1 1906; RV64-NEXT: lui a0, 5 1907; RV64-NEXT: addiw a0, a0, 1365 1908; RV64-NEXT: vand.vx v9, v9, a0 1909; RV64-NEXT: vsub.vv v8, v8, v9 1910; RV64-NEXT: lui a0, 3 1911; RV64-NEXT: addiw a0, a0, 819 1912; RV64-NEXT: vand.vx v9, v8, a0 1913; RV64-NEXT: vsrl.vi v8, v8, 2 1914; RV64-NEXT: vand.vx v8, v8, a0 1915; RV64-NEXT: vadd.vv v8, v9, v8 1916; RV64-NEXT: vsrl.vi v9, v8, 4 1917; RV64-NEXT: vadd.vv v8, v8, v9 1918; RV64-NEXT: lui a0, 1 1919; RV64-NEXT: addiw a0, a0, -241 1920; RV64-NEXT: vand.vx v8, v8, a0 1921; RV64-NEXT: addi a0, zero, 257 1922; RV64-NEXT: vmul.vx v8, v8, a0 1923; RV64-NEXT: vsrl.vi v8, v8, 8 1924; RV64-NEXT: ret 1925 %a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 true) 1926 ret <vscale x 4 x i16> %a 1927} 1928 1929define <vscale x 8 x i16> @ctlz_zero_undef_nxv8i16(<vscale x 8 x i16> %va) { 1930; RV32-LABEL: ctlz_zero_undef_nxv8i16: 1931; RV32: # %bb.0: 1932; RV32-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1933; RV32-NEXT: vsrl.vi v10, v8, 1 1934; RV32-NEXT: vor.vv v8, v8, v10 1935; RV32-NEXT: vsrl.vi v10, v8, 2 1936; RV32-NEXT: vor.vv v8, v8, v10 1937; RV32-NEXT: vsrl.vi v10, v8, 4 1938; RV32-NEXT: vor.vv v8, v8, v10 1939; RV32-NEXT: vsrl.vi v10, v8, 8 1940; RV32-NEXT: vor.vv v8, v8, v10 1941; RV32-NEXT: vxor.vi v8, v8, -1 1942; RV32-NEXT: vsrl.vi v10, v8, 1 1943; RV32-NEXT: lui a0, 5 1944; RV32-NEXT: addi a0, a0, 1365 1945; RV32-NEXT: vand.vx v10, v10, a0 1946; RV32-NEXT: vsub.vv v8, v8, v10 1947; RV32-NEXT: lui a0, 3 1948; RV32-NEXT: addi a0, a0, 819 1949; RV32-NEXT: vand.vx v10, v8, a0 1950; RV32-NEXT: vsrl.vi v8, v8, 2 1951; RV32-NEXT: vand.vx v8, v8, a0 1952; RV32-NEXT: vadd.vv v8, v10, v8 1953; RV32-NEXT: vsrl.vi v10, v8, 4 1954; RV32-NEXT: vadd.vv v8, v8, v10 1955; RV32-NEXT: lui a0, 1 1956; RV32-NEXT: addi a0, a0, -241 1957; RV32-NEXT: vand.vx v8, v8, a0 1958; RV32-NEXT: addi a0, zero, 257 1959; RV32-NEXT: vmul.vx v8, v8, a0 1960; RV32-NEXT: vsrl.vi v8, v8, 8 1961; RV32-NEXT: ret 1962; 1963; RV64-LABEL: ctlz_zero_undef_nxv8i16: 1964; RV64: # %bb.0: 1965; RV64-NEXT: vsetvli a0, zero, e16, m2, ta, mu 1966; RV64-NEXT: vsrl.vi v10, v8, 1 1967; RV64-NEXT: vor.vv v8, v8, v10 1968; RV64-NEXT: vsrl.vi v10, v8, 2 1969; RV64-NEXT: vor.vv v8, v8, v10 1970; RV64-NEXT: vsrl.vi v10, v8, 4 1971; RV64-NEXT: vor.vv v8, v8, v10 1972; RV64-NEXT: vsrl.vi v10, v8, 8 1973; RV64-NEXT: vor.vv v8, v8, v10 1974; RV64-NEXT: vxor.vi v8, v8, -1 1975; RV64-NEXT: vsrl.vi v10, v8, 1 1976; RV64-NEXT: lui a0, 5 1977; RV64-NEXT: addiw a0, a0, 1365 1978; RV64-NEXT: vand.vx v10, v10, a0 1979; RV64-NEXT: vsub.vv v8, v8, v10 1980; RV64-NEXT: lui a0, 3 1981; RV64-NEXT: addiw a0, a0, 819 1982; RV64-NEXT: vand.vx v10, v8, a0 1983; RV64-NEXT: vsrl.vi v8, v8, 2 1984; RV64-NEXT: vand.vx v8, v8, a0 1985; RV64-NEXT: vadd.vv v8, v10, v8 1986; RV64-NEXT: vsrl.vi v10, v8, 4 1987; RV64-NEXT: vadd.vv v8, v8, v10 1988; RV64-NEXT: lui a0, 1 1989; RV64-NEXT: addiw a0, a0, -241 1990; RV64-NEXT: vand.vx v8, v8, a0 1991; RV64-NEXT: addi a0, zero, 257 1992; RV64-NEXT: vmul.vx v8, v8, a0 1993; RV64-NEXT: vsrl.vi v8, v8, 8 1994; RV64-NEXT: ret 1995 %a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 true) 1996 ret <vscale x 8 x i16> %a 1997} 1998 1999define <vscale x 16 x i16> @ctlz_zero_undef_nxv16i16(<vscale x 16 x i16> %va) { 2000; RV32-LABEL: ctlz_zero_undef_nxv16i16: 2001; RV32: # %bb.0: 2002; RV32-NEXT: vsetvli a0, zero, e16, m4, ta, mu 2003; RV32-NEXT: vsrl.vi v12, v8, 1 2004; RV32-NEXT: vor.vv v8, v8, v12 2005; RV32-NEXT: vsrl.vi v12, v8, 2 2006; RV32-NEXT: vor.vv v8, v8, v12 2007; RV32-NEXT: vsrl.vi v12, v8, 4 2008; RV32-NEXT: vor.vv v8, v8, v12 2009; RV32-NEXT: vsrl.vi v12, v8, 8 2010; RV32-NEXT: vor.vv v8, v8, v12 2011; RV32-NEXT: vxor.vi v8, v8, -1 2012; RV32-NEXT: vsrl.vi v12, v8, 1 2013; RV32-NEXT: lui a0, 5 2014; RV32-NEXT: addi a0, a0, 1365 2015; RV32-NEXT: vand.vx v12, v12, a0 2016; RV32-NEXT: vsub.vv v8, v8, v12 2017; RV32-NEXT: lui a0, 3 2018; RV32-NEXT: addi a0, a0, 819 2019; RV32-NEXT: vand.vx v12, v8, a0 2020; RV32-NEXT: vsrl.vi v8, v8, 2 2021; RV32-NEXT: vand.vx v8, v8, a0 2022; RV32-NEXT: vadd.vv v8, v12, v8 2023; RV32-NEXT: vsrl.vi v12, v8, 4 2024; RV32-NEXT: vadd.vv v8, v8, v12 2025; RV32-NEXT: lui a0, 1 2026; RV32-NEXT: addi a0, a0, -241 2027; RV32-NEXT: vand.vx v8, v8, a0 2028; RV32-NEXT: addi a0, zero, 257 2029; RV32-NEXT: vmul.vx v8, v8, a0 2030; RV32-NEXT: vsrl.vi v8, v8, 8 2031; RV32-NEXT: ret 2032; 2033; RV64-LABEL: ctlz_zero_undef_nxv16i16: 2034; RV64: # %bb.0: 2035; RV64-NEXT: vsetvli a0, zero, e16, m4, ta, mu 2036; RV64-NEXT: vsrl.vi v12, v8, 1 2037; RV64-NEXT: vor.vv v8, v8, v12 2038; RV64-NEXT: vsrl.vi v12, v8, 2 2039; RV64-NEXT: vor.vv v8, v8, v12 2040; RV64-NEXT: vsrl.vi v12, v8, 4 2041; RV64-NEXT: vor.vv v8, v8, v12 2042; RV64-NEXT: vsrl.vi v12, v8, 8 2043; RV64-NEXT: vor.vv v8, v8, v12 2044; RV64-NEXT: vxor.vi v8, v8, -1 2045; RV64-NEXT: vsrl.vi v12, v8, 1 2046; RV64-NEXT: lui a0, 5 2047; RV64-NEXT: addiw a0, a0, 1365 2048; RV64-NEXT: vand.vx v12, v12, a0 2049; RV64-NEXT: vsub.vv v8, v8, v12 2050; RV64-NEXT: lui a0, 3 2051; RV64-NEXT: addiw a0, a0, 819 2052; RV64-NEXT: vand.vx v12, v8, a0 2053; RV64-NEXT: vsrl.vi v8, v8, 2 2054; RV64-NEXT: vand.vx v8, v8, a0 2055; RV64-NEXT: vadd.vv v8, v12, v8 2056; RV64-NEXT: vsrl.vi v12, v8, 4 2057; RV64-NEXT: vadd.vv v8, v8, v12 2058; RV64-NEXT: lui a0, 1 2059; RV64-NEXT: addiw a0, a0, -241 2060; RV64-NEXT: vand.vx v8, v8, a0 2061; RV64-NEXT: addi a0, zero, 257 2062; RV64-NEXT: vmul.vx v8, v8, a0 2063; RV64-NEXT: vsrl.vi v8, v8, 8 2064; RV64-NEXT: ret 2065 %a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 true) 2066 ret <vscale x 16 x i16> %a 2067} 2068 2069define <vscale x 32 x i16> @ctlz_zero_undef_nxv32i16(<vscale x 32 x i16> %va) { 2070; RV32-LABEL: ctlz_zero_undef_nxv32i16: 2071; RV32: # %bb.0: 2072; RV32-NEXT: vsetvli a0, zero, e16, m8, ta, mu 2073; RV32-NEXT: vsrl.vi v16, v8, 1 2074; RV32-NEXT: vor.vv v8, v8, v16 2075; RV32-NEXT: vsrl.vi v16, v8, 2 2076; RV32-NEXT: vor.vv v8, v8, v16 2077; RV32-NEXT: vsrl.vi v16, v8, 4 2078; RV32-NEXT: vor.vv v8, v8, v16 2079; RV32-NEXT: vsrl.vi v16, v8, 8 2080; RV32-NEXT: vor.vv v8, v8, v16 2081; RV32-NEXT: vxor.vi v8, v8, -1 2082; RV32-NEXT: vsrl.vi v16, v8, 1 2083; RV32-NEXT: lui a0, 5 2084; RV32-NEXT: addi a0, a0, 1365 2085; RV32-NEXT: vand.vx v16, v16, a0 2086; RV32-NEXT: vsub.vv v8, v8, v16 2087; RV32-NEXT: lui a0, 3 2088; RV32-NEXT: addi a0, a0, 819 2089; RV32-NEXT: vand.vx v16, v8, a0 2090; RV32-NEXT: vsrl.vi v8, v8, 2 2091; RV32-NEXT: vand.vx v8, v8, a0 2092; RV32-NEXT: vadd.vv v8, v16, v8 2093; RV32-NEXT: vsrl.vi v16, v8, 4 2094; RV32-NEXT: vadd.vv v8, v8, v16 2095; RV32-NEXT: lui a0, 1 2096; RV32-NEXT: addi a0, a0, -241 2097; RV32-NEXT: vand.vx v8, v8, a0 2098; RV32-NEXT: addi a0, zero, 257 2099; RV32-NEXT: vmul.vx v8, v8, a0 2100; RV32-NEXT: vsrl.vi v8, v8, 8 2101; RV32-NEXT: ret 2102; 2103; RV64-LABEL: ctlz_zero_undef_nxv32i16: 2104; RV64: # %bb.0: 2105; RV64-NEXT: vsetvli a0, zero, e16, m8, ta, mu 2106; RV64-NEXT: vsrl.vi v16, v8, 1 2107; RV64-NEXT: vor.vv v8, v8, v16 2108; RV64-NEXT: vsrl.vi v16, v8, 2 2109; RV64-NEXT: vor.vv v8, v8, v16 2110; RV64-NEXT: vsrl.vi v16, v8, 4 2111; RV64-NEXT: vor.vv v8, v8, v16 2112; RV64-NEXT: vsrl.vi v16, v8, 8 2113; RV64-NEXT: vor.vv v8, v8, v16 2114; RV64-NEXT: vxor.vi v8, v8, -1 2115; RV64-NEXT: vsrl.vi v16, v8, 1 2116; RV64-NEXT: lui a0, 5 2117; RV64-NEXT: addiw a0, a0, 1365 2118; RV64-NEXT: vand.vx v16, v16, a0 2119; RV64-NEXT: vsub.vv v8, v8, v16 2120; RV64-NEXT: lui a0, 3 2121; RV64-NEXT: addiw a0, a0, 819 2122; RV64-NEXT: vand.vx v16, v8, a0 2123; RV64-NEXT: vsrl.vi v8, v8, 2 2124; RV64-NEXT: vand.vx v8, v8, a0 2125; RV64-NEXT: vadd.vv v8, v16, v8 2126; RV64-NEXT: vsrl.vi v16, v8, 4 2127; RV64-NEXT: vadd.vv v8, v8, v16 2128; RV64-NEXT: lui a0, 1 2129; RV64-NEXT: addiw a0, a0, -241 2130; RV64-NEXT: vand.vx v8, v8, a0 2131; RV64-NEXT: addi a0, zero, 257 2132; RV64-NEXT: vmul.vx v8, v8, a0 2133; RV64-NEXT: vsrl.vi v8, v8, 8 2134; RV64-NEXT: ret 2135 %a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 true) 2136 ret <vscale x 32 x i16> %a 2137} 2138 2139define <vscale x 1 x i32> @ctlz_zero_undef_nxv1i32(<vscale x 1 x i32> %va) { 2140; RV32-LABEL: ctlz_zero_undef_nxv1i32: 2141; RV32: # %bb.0: 2142; RV32-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 2143; RV32-NEXT: vsrl.vi v9, v8, 1 2144; RV32-NEXT: vor.vv v8, v8, v9 2145; RV32-NEXT: vsrl.vi v9, v8, 2 2146; RV32-NEXT: vor.vv v8, v8, v9 2147; RV32-NEXT: vsrl.vi v9, v8, 4 2148; RV32-NEXT: vor.vv v8, v8, v9 2149; RV32-NEXT: vsrl.vi v9, v8, 8 2150; RV32-NEXT: vor.vv v8, v8, v9 2151; RV32-NEXT: vsrl.vi v9, v8, 16 2152; RV32-NEXT: vor.vv v8, v8, v9 2153; RV32-NEXT: vxor.vi v8, v8, -1 2154; RV32-NEXT: vsrl.vi v9, v8, 1 2155; RV32-NEXT: lui a0, 349525 2156; RV32-NEXT: addi a0, a0, 1365 2157; RV32-NEXT: vand.vx v9, v9, a0 2158; RV32-NEXT: vsub.vv v8, v8, v9 2159; RV32-NEXT: lui a0, 209715 2160; RV32-NEXT: addi a0, a0, 819 2161; RV32-NEXT: vand.vx v9, v8, a0 2162; RV32-NEXT: vsrl.vi v8, v8, 2 2163; RV32-NEXT: vand.vx v8, v8, a0 2164; RV32-NEXT: vadd.vv v8, v9, v8 2165; RV32-NEXT: vsrl.vi v9, v8, 4 2166; RV32-NEXT: vadd.vv v8, v8, v9 2167; RV32-NEXT: lui a0, 61681 2168; RV32-NEXT: addi a0, a0, -241 2169; RV32-NEXT: vand.vx v8, v8, a0 2170; RV32-NEXT: lui a0, 4112 2171; RV32-NEXT: addi a0, a0, 257 2172; RV32-NEXT: vmul.vx v8, v8, a0 2173; RV32-NEXT: vsrl.vi v8, v8, 24 2174; RV32-NEXT: ret 2175; 2176; RV64-LABEL: ctlz_zero_undef_nxv1i32: 2177; RV64: # %bb.0: 2178; RV64-NEXT: vsetvli a0, zero, e32, mf2, ta, mu 2179; RV64-NEXT: vsrl.vi v9, v8, 1 2180; RV64-NEXT: vor.vv v8, v8, v9 2181; RV64-NEXT: vsrl.vi v9, v8, 2 2182; RV64-NEXT: vor.vv v8, v8, v9 2183; RV64-NEXT: vsrl.vi v9, v8, 4 2184; RV64-NEXT: vor.vv v8, v8, v9 2185; RV64-NEXT: vsrl.vi v9, v8, 8 2186; RV64-NEXT: vor.vv v8, v8, v9 2187; RV64-NEXT: vsrl.vi v9, v8, 16 2188; RV64-NEXT: vor.vv v8, v8, v9 2189; RV64-NEXT: vxor.vi v8, v8, -1 2190; RV64-NEXT: vsrl.vi v9, v8, 1 2191; RV64-NEXT: lui a0, 349525 2192; RV64-NEXT: addiw a0, a0, 1365 2193; RV64-NEXT: vand.vx v9, v9, a0 2194; RV64-NEXT: vsub.vv v8, v8, v9 2195; RV64-NEXT: lui a0, 209715 2196; RV64-NEXT: addiw a0, a0, 819 2197; RV64-NEXT: vand.vx v9, v8, a0 2198; RV64-NEXT: vsrl.vi v8, v8, 2 2199; RV64-NEXT: vand.vx v8, v8, a0 2200; RV64-NEXT: vadd.vv v8, v9, v8 2201; RV64-NEXT: vsrl.vi v9, v8, 4 2202; RV64-NEXT: vadd.vv v8, v8, v9 2203; RV64-NEXT: lui a0, 61681 2204; RV64-NEXT: addiw a0, a0, -241 2205; RV64-NEXT: vand.vx v8, v8, a0 2206; RV64-NEXT: lui a0, 4112 2207; RV64-NEXT: addiw a0, a0, 257 2208; RV64-NEXT: vmul.vx v8, v8, a0 2209; RV64-NEXT: vsrl.vi v8, v8, 24 2210; RV64-NEXT: ret 2211 %a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 true) 2212 ret <vscale x 1 x i32> %a 2213} 2214 2215define <vscale x 2 x i32> @ctlz_zero_undef_nxv2i32(<vscale x 2 x i32> %va) { 2216; RV32-LABEL: ctlz_zero_undef_nxv2i32: 2217; RV32: # %bb.0: 2218; RV32-NEXT: vsetvli a0, zero, e32, m1, ta, mu 2219; RV32-NEXT: vsrl.vi v9, v8, 1 2220; RV32-NEXT: vor.vv v8, v8, v9 2221; RV32-NEXT: vsrl.vi v9, v8, 2 2222; RV32-NEXT: vor.vv v8, v8, v9 2223; RV32-NEXT: vsrl.vi v9, v8, 4 2224; RV32-NEXT: vor.vv v8, v8, v9 2225; RV32-NEXT: vsrl.vi v9, v8, 8 2226; RV32-NEXT: vor.vv v8, v8, v9 2227; RV32-NEXT: vsrl.vi v9, v8, 16 2228; RV32-NEXT: vor.vv v8, v8, v9 2229; RV32-NEXT: vxor.vi v8, v8, -1 2230; RV32-NEXT: vsrl.vi v9, v8, 1 2231; RV32-NEXT: lui a0, 349525 2232; RV32-NEXT: addi a0, a0, 1365 2233; RV32-NEXT: vand.vx v9, v9, a0 2234; RV32-NEXT: vsub.vv v8, v8, v9 2235; RV32-NEXT: lui a0, 209715 2236; RV32-NEXT: addi a0, a0, 819 2237; RV32-NEXT: vand.vx v9, v8, a0 2238; RV32-NEXT: vsrl.vi v8, v8, 2 2239; RV32-NEXT: vand.vx v8, v8, a0 2240; RV32-NEXT: vadd.vv v8, v9, v8 2241; RV32-NEXT: vsrl.vi v9, v8, 4 2242; RV32-NEXT: vadd.vv v8, v8, v9 2243; RV32-NEXT: lui a0, 61681 2244; RV32-NEXT: addi a0, a0, -241 2245; RV32-NEXT: vand.vx v8, v8, a0 2246; RV32-NEXT: lui a0, 4112 2247; RV32-NEXT: addi a0, a0, 257 2248; RV32-NEXT: vmul.vx v8, v8, a0 2249; RV32-NEXT: vsrl.vi v8, v8, 24 2250; RV32-NEXT: ret 2251; 2252; RV64-LABEL: ctlz_zero_undef_nxv2i32: 2253; RV64: # %bb.0: 2254; RV64-NEXT: vsetvli a0, zero, e32, m1, ta, mu 2255; RV64-NEXT: vsrl.vi v9, v8, 1 2256; RV64-NEXT: vor.vv v8, v8, v9 2257; RV64-NEXT: vsrl.vi v9, v8, 2 2258; RV64-NEXT: vor.vv v8, v8, v9 2259; RV64-NEXT: vsrl.vi v9, v8, 4 2260; RV64-NEXT: vor.vv v8, v8, v9 2261; RV64-NEXT: vsrl.vi v9, v8, 8 2262; RV64-NEXT: vor.vv v8, v8, v9 2263; RV64-NEXT: vsrl.vi v9, v8, 16 2264; RV64-NEXT: vor.vv v8, v8, v9 2265; RV64-NEXT: vxor.vi v8, v8, -1 2266; RV64-NEXT: vsrl.vi v9, v8, 1 2267; RV64-NEXT: lui a0, 349525 2268; RV64-NEXT: addiw a0, a0, 1365 2269; RV64-NEXT: vand.vx v9, v9, a0 2270; RV64-NEXT: vsub.vv v8, v8, v9 2271; RV64-NEXT: lui a0, 209715 2272; RV64-NEXT: addiw a0, a0, 819 2273; RV64-NEXT: vand.vx v9, v8, a0 2274; RV64-NEXT: vsrl.vi v8, v8, 2 2275; RV64-NEXT: vand.vx v8, v8, a0 2276; RV64-NEXT: vadd.vv v8, v9, v8 2277; RV64-NEXT: vsrl.vi v9, v8, 4 2278; RV64-NEXT: vadd.vv v8, v8, v9 2279; RV64-NEXT: lui a0, 61681 2280; RV64-NEXT: addiw a0, a0, -241 2281; RV64-NEXT: vand.vx v8, v8, a0 2282; RV64-NEXT: lui a0, 4112 2283; RV64-NEXT: addiw a0, a0, 257 2284; RV64-NEXT: vmul.vx v8, v8, a0 2285; RV64-NEXT: vsrl.vi v8, v8, 24 2286; RV64-NEXT: ret 2287 %a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 true) 2288 ret <vscale x 2 x i32> %a 2289} 2290 2291define <vscale x 4 x i32> @ctlz_zero_undef_nxv4i32(<vscale x 4 x i32> %va) { 2292; RV32-LABEL: ctlz_zero_undef_nxv4i32: 2293; RV32: # %bb.0: 2294; RV32-NEXT: vsetvli a0, zero, e32, m2, ta, mu 2295; RV32-NEXT: vsrl.vi v10, v8, 1 2296; RV32-NEXT: vor.vv v8, v8, v10 2297; RV32-NEXT: vsrl.vi v10, v8, 2 2298; RV32-NEXT: vor.vv v8, v8, v10 2299; RV32-NEXT: vsrl.vi v10, v8, 4 2300; RV32-NEXT: vor.vv v8, v8, v10 2301; RV32-NEXT: vsrl.vi v10, v8, 8 2302; RV32-NEXT: vor.vv v8, v8, v10 2303; RV32-NEXT: vsrl.vi v10, v8, 16 2304; RV32-NEXT: vor.vv v8, v8, v10 2305; RV32-NEXT: vxor.vi v8, v8, -1 2306; RV32-NEXT: vsrl.vi v10, v8, 1 2307; RV32-NEXT: lui a0, 349525 2308; RV32-NEXT: addi a0, a0, 1365 2309; RV32-NEXT: vand.vx v10, v10, a0 2310; RV32-NEXT: vsub.vv v8, v8, v10 2311; RV32-NEXT: lui a0, 209715 2312; RV32-NEXT: addi a0, a0, 819 2313; RV32-NEXT: vand.vx v10, v8, a0 2314; RV32-NEXT: vsrl.vi v8, v8, 2 2315; RV32-NEXT: vand.vx v8, v8, a0 2316; RV32-NEXT: vadd.vv v8, v10, v8 2317; RV32-NEXT: vsrl.vi v10, v8, 4 2318; RV32-NEXT: vadd.vv v8, v8, v10 2319; RV32-NEXT: lui a0, 61681 2320; RV32-NEXT: addi a0, a0, -241 2321; RV32-NEXT: vand.vx v8, v8, a0 2322; RV32-NEXT: lui a0, 4112 2323; RV32-NEXT: addi a0, a0, 257 2324; RV32-NEXT: vmul.vx v8, v8, a0 2325; RV32-NEXT: vsrl.vi v8, v8, 24 2326; RV32-NEXT: ret 2327; 2328; RV64-LABEL: ctlz_zero_undef_nxv4i32: 2329; RV64: # %bb.0: 2330; RV64-NEXT: vsetvli a0, zero, e32, m2, ta, mu 2331; RV64-NEXT: vsrl.vi v10, v8, 1 2332; RV64-NEXT: vor.vv v8, v8, v10 2333; RV64-NEXT: vsrl.vi v10, v8, 2 2334; RV64-NEXT: vor.vv v8, v8, v10 2335; RV64-NEXT: vsrl.vi v10, v8, 4 2336; RV64-NEXT: vor.vv v8, v8, v10 2337; RV64-NEXT: vsrl.vi v10, v8, 8 2338; RV64-NEXT: vor.vv v8, v8, v10 2339; RV64-NEXT: vsrl.vi v10, v8, 16 2340; RV64-NEXT: vor.vv v8, v8, v10 2341; RV64-NEXT: vxor.vi v8, v8, -1 2342; RV64-NEXT: vsrl.vi v10, v8, 1 2343; RV64-NEXT: lui a0, 349525 2344; RV64-NEXT: addiw a0, a0, 1365 2345; RV64-NEXT: vand.vx v10, v10, a0 2346; RV64-NEXT: vsub.vv v8, v8, v10 2347; RV64-NEXT: lui a0, 209715 2348; RV64-NEXT: addiw a0, a0, 819 2349; RV64-NEXT: vand.vx v10, v8, a0 2350; RV64-NEXT: vsrl.vi v8, v8, 2 2351; RV64-NEXT: vand.vx v8, v8, a0 2352; RV64-NEXT: vadd.vv v8, v10, v8 2353; RV64-NEXT: vsrl.vi v10, v8, 4 2354; RV64-NEXT: vadd.vv v8, v8, v10 2355; RV64-NEXT: lui a0, 61681 2356; RV64-NEXT: addiw a0, a0, -241 2357; RV64-NEXT: vand.vx v8, v8, a0 2358; RV64-NEXT: lui a0, 4112 2359; RV64-NEXT: addiw a0, a0, 257 2360; RV64-NEXT: vmul.vx v8, v8, a0 2361; RV64-NEXT: vsrl.vi v8, v8, 24 2362; RV64-NEXT: ret 2363 %a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 true) 2364 ret <vscale x 4 x i32> %a 2365} 2366 2367define <vscale x 8 x i32> @ctlz_zero_undef_nxv8i32(<vscale x 8 x i32> %va) { 2368; RV32-LABEL: ctlz_zero_undef_nxv8i32: 2369; RV32: # %bb.0: 2370; RV32-NEXT: vsetvli a0, zero, e32, m4, ta, mu 2371; RV32-NEXT: vsrl.vi v12, v8, 1 2372; RV32-NEXT: vor.vv v8, v8, v12 2373; RV32-NEXT: vsrl.vi v12, v8, 2 2374; RV32-NEXT: vor.vv v8, v8, v12 2375; RV32-NEXT: vsrl.vi v12, v8, 4 2376; RV32-NEXT: vor.vv v8, v8, v12 2377; RV32-NEXT: vsrl.vi v12, v8, 8 2378; RV32-NEXT: vor.vv v8, v8, v12 2379; RV32-NEXT: vsrl.vi v12, v8, 16 2380; RV32-NEXT: vor.vv v8, v8, v12 2381; RV32-NEXT: vxor.vi v8, v8, -1 2382; RV32-NEXT: vsrl.vi v12, v8, 1 2383; RV32-NEXT: lui a0, 349525 2384; RV32-NEXT: addi a0, a0, 1365 2385; RV32-NEXT: vand.vx v12, v12, a0 2386; RV32-NEXT: vsub.vv v8, v8, v12 2387; RV32-NEXT: lui a0, 209715 2388; RV32-NEXT: addi a0, a0, 819 2389; RV32-NEXT: vand.vx v12, v8, a0 2390; RV32-NEXT: vsrl.vi v8, v8, 2 2391; RV32-NEXT: vand.vx v8, v8, a0 2392; RV32-NEXT: vadd.vv v8, v12, v8 2393; RV32-NEXT: vsrl.vi v12, v8, 4 2394; RV32-NEXT: vadd.vv v8, v8, v12 2395; RV32-NEXT: lui a0, 61681 2396; RV32-NEXT: addi a0, a0, -241 2397; RV32-NEXT: vand.vx v8, v8, a0 2398; RV32-NEXT: lui a0, 4112 2399; RV32-NEXT: addi a0, a0, 257 2400; RV32-NEXT: vmul.vx v8, v8, a0 2401; RV32-NEXT: vsrl.vi v8, v8, 24 2402; RV32-NEXT: ret 2403; 2404; RV64-LABEL: ctlz_zero_undef_nxv8i32: 2405; RV64: # %bb.0: 2406; RV64-NEXT: vsetvli a0, zero, e32, m4, ta, mu 2407; RV64-NEXT: vsrl.vi v12, v8, 1 2408; RV64-NEXT: vor.vv v8, v8, v12 2409; RV64-NEXT: vsrl.vi v12, v8, 2 2410; RV64-NEXT: vor.vv v8, v8, v12 2411; RV64-NEXT: vsrl.vi v12, v8, 4 2412; RV64-NEXT: vor.vv v8, v8, v12 2413; RV64-NEXT: vsrl.vi v12, v8, 8 2414; RV64-NEXT: vor.vv v8, v8, v12 2415; RV64-NEXT: vsrl.vi v12, v8, 16 2416; RV64-NEXT: vor.vv v8, v8, v12 2417; RV64-NEXT: vxor.vi v8, v8, -1 2418; RV64-NEXT: vsrl.vi v12, v8, 1 2419; RV64-NEXT: lui a0, 349525 2420; RV64-NEXT: addiw a0, a0, 1365 2421; RV64-NEXT: vand.vx v12, v12, a0 2422; RV64-NEXT: vsub.vv v8, v8, v12 2423; RV64-NEXT: lui a0, 209715 2424; RV64-NEXT: addiw a0, a0, 819 2425; RV64-NEXT: vand.vx v12, v8, a0 2426; RV64-NEXT: vsrl.vi v8, v8, 2 2427; RV64-NEXT: vand.vx v8, v8, a0 2428; RV64-NEXT: vadd.vv v8, v12, v8 2429; RV64-NEXT: vsrl.vi v12, v8, 4 2430; RV64-NEXT: vadd.vv v8, v8, v12 2431; RV64-NEXT: lui a0, 61681 2432; RV64-NEXT: addiw a0, a0, -241 2433; RV64-NEXT: vand.vx v8, v8, a0 2434; RV64-NEXT: lui a0, 4112 2435; RV64-NEXT: addiw a0, a0, 257 2436; RV64-NEXT: vmul.vx v8, v8, a0 2437; RV64-NEXT: vsrl.vi v8, v8, 24 2438; RV64-NEXT: ret 2439 %a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 true) 2440 ret <vscale x 8 x i32> %a 2441} 2442 2443define <vscale x 16 x i32> @ctlz_zero_undef_nxv16i32(<vscale x 16 x i32> %va) { 2444; RV32-LABEL: ctlz_zero_undef_nxv16i32: 2445; RV32: # %bb.0: 2446; RV32-NEXT: vsetvli a0, zero, e32, m8, ta, mu 2447; RV32-NEXT: vsrl.vi v16, v8, 1 2448; RV32-NEXT: vor.vv v8, v8, v16 2449; RV32-NEXT: vsrl.vi v16, v8, 2 2450; RV32-NEXT: vor.vv v8, v8, v16 2451; RV32-NEXT: vsrl.vi v16, v8, 4 2452; RV32-NEXT: vor.vv v8, v8, v16 2453; RV32-NEXT: vsrl.vi v16, v8, 8 2454; RV32-NEXT: vor.vv v8, v8, v16 2455; RV32-NEXT: vsrl.vi v16, v8, 16 2456; RV32-NEXT: vor.vv v8, v8, v16 2457; RV32-NEXT: vxor.vi v8, v8, -1 2458; RV32-NEXT: vsrl.vi v16, v8, 1 2459; RV32-NEXT: lui a0, 349525 2460; RV32-NEXT: addi a0, a0, 1365 2461; RV32-NEXT: vand.vx v16, v16, a0 2462; RV32-NEXT: vsub.vv v8, v8, v16 2463; RV32-NEXT: lui a0, 209715 2464; RV32-NEXT: addi a0, a0, 819 2465; RV32-NEXT: vand.vx v16, v8, a0 2466; RV32-NEXT: vsrl.vi v8, v8, 2 2467; RV32-NEXT: vand.vx v8, v8, a0 2468; RV32-NEXT: vadd.vv v8, v16, v8 2469; RV32-NEXT: vsrl.vi v16, v8, 4 2470; RV32-NEXT: vadd.vv v8, v8, v16 2471; RV32-NEXT: lui a0, 61681 2472; RV32-NEXT: addi a0, a0, -241 2473; RV32-NEXT: vand.vx v8, v8, a0 2474; RV32-NEXT: lui a0, 4112 2475; RV32-NEXT: addi a0, a0, 257 2476; RV32-NEXT: vmul.vx v8, v8, a0 2477; RV32-NEXT: vsrl.vi v8, v8, 24 2478; RV32-NEXT: ret 2479; 2480; RV64-LABEL: ctlz_zero_undef_nxv16i32: 2481; RV64: # %bb.0: 2482; RV64-NEXT: vsetvli a0, zero, e32, m8, ta, mu 2483; RV64-NEXT: vsrl.vi v16, v8, 1 2484; RV64-NEXT: vor.vv v8, v8, v16 2485; RV64-NEXT: vsrl.vi v16, v8, 2 2486; RV64-NEXT: vor.vv v8, v8, v16 2487; RV64-NEXT: vsrl.vi v16, v8, 4 2488; RV64-NEXT: vor.vv v8, v8, v16 2489; RV64-NEXT: vsrl.vi v16, v8, 8 2490; RV64-NEXT: vor.vv v8, v8, v16 2491; RV64-NEXT: vsrl.vi v16, v8, 16 2492; RV64-NEXT: vor.vv v8, v8, v16 2493; RV64-NEXT: vxor.vi v8, v8, -1 2494; RV64-NEXT: vsrl.vi v16, v8, 1 2495; RV64-NEXT: lui a0, 349525 2496; RV64-NEXT: addiw a0, a0, 1365 2497; RV64-NEXT: vand.vx v16, v16, a0 2498; RV64-NEXT: vsub.vv v8, v8, v16 2499; RV64-NEXT: lui a0, 209715 2500; RV64-NEXT: addiw a0, a0, 819 2501; RV64-NEXT: vand.vx v16, v8, a0 2502; RV64-NEXT: vsrl.vi v8, v8, 2 2503; RV64-NEXT: vand.vx v8, v8, a0 2504; RV64-NEXT: vadd.vv v8, v16, v8 2505; RV64-NEXT: vsrl.vi v16, v8, 4 2506; RV64-NEXT: vadd.vv v8, v8, v16 2507; RV64-NEXT: lui a0, 61681 2508; RV64-NEXT: addiw a0, a0, -241 2509; RV64-NEXT: vand.vx v8, v8, a0 2510; RV64-NEXT: lui a0, 4112 2511; RV64-NEXT: addiw a0, a0, 257 2512; RV64-NEXT: vmul.vx v8, v8, a0 2513; RV64-NEXT: vsrl.vi v8, v8, 24 2514; RV64-NEXT: ret 2515 %a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 true) 2516 ret <vscale x 16 x i32> %a 2517} 2518 2519define <vscale x 1 x i64> @ctlz_zero_undef_nxv1i64(<vscale x 1 x i64> %va) { 2520; RV32-LABEL: ctlz_zero_undef_nxv1i64: 2521; RV32: # %bb.0: 2522; RV32-NEXT: addi sp, sp, -16 2523; RV32-NEXT: .cfi_def_cfa_offset 16 2524; RV32-NEXT: lui a0, 349525 2525; RV32-NEXT: addi a0, a0, 1365 2526; RV32-NEXT: sw a0, 12(sp) 2527; RV32-NEXT: sw a0, 8(sp) 2528; RV32-NEXT: lui a0, 209715 2529; RV32-NEXT: addi a0, a0, 819 2530; RV32-NEXT: sw a0, 12(sp) 2531; RV32-NEXT: sw a0, 8(sp) 2532; RV32-NEXT: lui a0, 61681 2533; RV32-NEXT: addi a0, a0, -241 2534; RV32-NEXT: sw a0, 12(sp) 2535; RV32-NEXT: sw a0, 8(sp) 2536; RV32-NEXT: lui a0, 4112 2537; RV32-NEXT: addi a0, a0, 257 2538; RV32-NEXT: sw a0, 12(sp) 2539; RV32-NEXT: sw a0, 8(sp) 2540; RV32-NEXT: vsetvli a0, zero, e64, m1, ta, mu 2541; RV32-NEXT: vsrl.vi v9, v8, 1 2542; RV32-NEXT: vor.vv v8, v8, v9 2543; RV32-NEXT: vsrl.vi v9, v8, 2 2544; RV32-NEXT: vor.vv v8, v8, v9 2545; RV32-NEXT: vsrl.vi v9, v8, 4 2546; RV32-NEXT: vor.vv v8, v8, v9 2547; RV32-NEXT: vsrl.vi v9, v8, 8 2548; RV32-NEXT: vor.vv v8, v8, v9 2549; RV32-NEXT: vsrl.vi v9, v8, 16 2550; RV32-NEXT: vor.vv v8, v8, v9 2551; RV32-NEXT: addi a0, zero, 32 2552; RV32-NEXT: vsrl.vx v9, v8, a0 2553; RV32-NEXT: vor.vv v8, v8, v9 2554; RV32-NEXT: addi a0, sp, 8 2555; RV32-NEXT: vlse64.v v9, (a0), zero 2556; RV32-NEXT: vxor.vi v8, v8, -1 2557; RV32-NEXT: addi a0, sp, 8 2558; RV32-NEXT: vlse64.v v10, (a0), zero 2559; RV32-NEXT: vsrl.vi v11, v8, 1 2560; RV32-NEXT: vand.vv v9, v11, v9 2561; RV32-NEXT: vsub.vv v8, v8, v9 2562; RV32-NEXT: vand.vv v9, v8, v10 2563; RV32-NEXT: vsrl.vi v8, v8, 2 2564; RV32-NEXT: vand.vv v8, v8, v10 2565; RV32-NEXT: vadd.vv v8, v9, v8 2566; RV32-NEXT: addi a0, sp, 8 2567; RV32-NEXT: vlse64.v v9, (a0), zero 2568; RV32-NEXT: addi a0, sp, 8 2569; RV32-NEXT: vlse64.v v10, (a0), zero 2570; RV32-NEXT: vsrl.vi v11, v8, 4 2571; RV32-NEXT: vadd.vv v8, v8, v11 2572; RV32-NEXT: vand.vv v8, v8, v9 2573; RV32-NEXT: vmul.vv v8, v8, v10 2574; RV32-NEXT: addi a0, zero, 56 2575; RV32-NEXT: vsrl.vx v8, v8, a0 2576; RV32-NEXT: addi sp, sp, 16 2577; RV32-NEXT: ret 2578; 2579; RV64-LABEL: ctlz_zero_undef_nxv1i64: 2580; RV64: # %bb.0: 2581; RV64-NEXT: vsetvli a0, zero, e64, m1, ta, mu 2582; RV64-NEXT: vsrl.vi v9, v8, 1 2583; RV64-NEXT: vor.vv v8, v8, v9 2584; RV64-NEXT: vsrl.vi v9, v8, 2 2585; RV64-NEXT: vor.vv v8, v8, v9 2586; RV64-NEXT: vsrl.vi v9, v8, 4 2587; RV64-NEXT: vor.vv v8, v8, v9 2588; RV64-NEXT: vsrl.vi v9, v8, 8 2589; RV64-NEXT: vor.vv v8, v8, v9 2590; RV64-NEXT: vsrl.vi v9, v8, 16 2591; RV64-NEXT: vor.vv v8, v8, v9 2592; RV64-NEXT: addi a0, zero, 32 2593; RV64-NEXT: vsrl.vx v9, v8, a0 2594; RV64-NEXT: vor.vv v8, v8, v9 2595; RV64-NEXT: vxor.vi v8, v8, -1 2596; RV64-NEXT: vsrl.vi v9, v8, 1 2597; RV64-NEXT: lui a0, 21845 2598; RV64-NEXT: addiw a0, a0, 1365 2599; RV64-NEXT: slli a0, a0, 12 2600; RV64-NEXT: addi a0, a0, 1365 2601; RV64-NEXT: slli a0, a0, 12 2602; RV64-NEXT: addi a0, a0, 1365 2603; RV64-NEXT: slli a0, a0, 12 2604; RV64-NEXT: addi a0, a0, 1365 2605; RV64-NEXT: vand.vx v9, v9, a0 2606; RV64-NEXT: vsub.vv v8, v8, v9 2607; RV64-NEXT: lui a0, 13107 2608; RV64-NEXT: addiw a0, a0, 819 2609; RV64-NEXT: slli a0, a0, 12 2610; RV64-NEXT: addi a0, a0, 819 2611; RV64-NEXT: slli a0, a0, 12 2612; RV64-NEXT: addi a0, a0, 819 2613; RV64-NEXT: slli a0, a0, 12 2614; RV64-NEXT: addi a0, a0, 819 2615; RV64-NEXT: vand.vx v9, v8, a0 2616; RV64-NEXT: vsrl.vi v8, v8, 2 2617; RV64-NEXT: vand.vx v8, v8, a0 2618; RV64-NEXT: vadd.vv v8, v9, v8 2619; RV64-NEXT: vsrl.vi v9, v8, 4 2620; RV64-NEXT: vadd.vv v8, v8, v9 2621; RV64-NEXT: lui a0, 3855 2622; RV64-NEXT: addiw a0, a0, 241 2623; RV64-NEXT: slli a0, a0, 12 2624; RV64-NEXT: addi a0, a0, -241 2625; RV64-NEXT: slli a0, a0, 12 2626; RV64-NEXT: addi a0, a0, 241 2627; RV64-NEXT: slli a0, a0, 12 2628; RV64-NEXT: addi a0, a0, -241 2629; RV64-NEXT: vand.vx v8, v8, a0 2630; RV64-NEXT: lui a0, 4112 2631; RV64-NEXT: addiw a0, a0, 257 2632; RV64-NEXT: slli a0, a0, 16 2633; RV64-NEXT: addi a0, a0, 257 2634; RV64-NEXT: slli a0, a0, 16 2635; RV64-NEXT: addi a0, a0, 257 2636; RV64-NEXT: vmul.vx v8, v8, a0 2637; RV64-NEXT: addi a0, zero, 56 2638; RV64-NEXT: vsrl.vx v8, v8, a0 2639; RV64-NEXT: ret 2640 %a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 true) 2641 ret <vscale x 1 x i64> %a 2642} 2643 2644define <vscale x 2 x i64> @ctlz_zero_undef_nxv2i64(<vscale x 2 x i64> %va) { 2645; RV32-LABEL: ctlz_zero_undef_nxv2i64: 2646; RV32: # %bb.0: 2647; RV32-NEXT: addi sp, sp, -16 2648; RV32-NEXT: .cfi_def_cfa_offset 16 2649; RV32-NEXT: lui a0, 349525 2650; RV32-NEXT: addi a0, a0, 1365 2651; RV32-NEXT: sw a0, 12(sp) 2652; RV32-NEXT: sw a0, 8(sp) 2653; RV32-NEXT: lui a0, 209715 2654; RV32-NEXT: addi a0, a0, 819 2655; RV32-NEXT: sw a0, 12(sp) 2656; RV32-NEXT: sw a0, 8(sp) 2657; RV32-NEXT: lui a0, 61681 2658; RV32-NEXT: addi a0, a0, -241 2659; RV32-NEXT: sw a0, 12(sp) 2660; RV32-NEXT: sw a0, 8(sp) 2661; RV32-NEXT: lui a0, 4112 2662; RV32-NEXT: addi a0, a0, 257 2663; RV32-NEXT: sw a0, 12(sp) 2664; RV32-NEXT: sw a0, 8(sp) 2665; RV32-NEXT: vsetvli a0, zero, e64, m2, ta, mu 2666; RV32-NEXT: vsrl.vi v10, v8, 1 2667; RV32-NEXT: vor.vv v8, v8, v10 2668; RV32-NEXT: vsrl.vi v10, v8, 2 2669; RV32-NEXT: vor.vv v8, v8, v10 2670; RV32-NEXT: vsrl.vi v10, v8, 4 2671; RV32-NEXT: vor.vv v8, v8, v10 2672; RV32-NEXT: vsrl.vi v10, v8, 8 2673; RV32-NEXT: vor.vv v8, v8, v10 2674; RV32-NEXT: vsrl.vi v10, v8, 16 2675; RV32-NEXT: vor.vv v8, v8, v10 2676; RV32-NEXT: addi a0, zero, 32 2677; RV32-NEXT: vsrl.vx v10, v8, a0 2678; RV32-NEXT: vor.vv v8, v8, v10 2679; RV32-NEXT: addi a0, sp, 8 2680; RV32-NEXT: vlse64.v v10, (a0), zero 2681; RV32-NEXT: vxor.vi v8, v8, -1 2682; RV32-NEXT: addi a0, sp, 8 2683; RV32-NEXT: vlse64.v v12, (a0), zero 2684; RV32-NEXT: vsrl.vi v14, v8, 1 2685; RV32-NEXT: vand.vv v10, v14, v10 2686; RV32-NEXT: vsub.vv v8, v8, v10 2687; RV32-NEXT: vand.vv v10, v8, v12 2688; RV32-NEXT: vsrl.vi v8, v8, 2 2689; RV32-NEXT: vand.vv v8, v8, v12 2690; RV32-NEXT: vadd.vv v8, v10, v8 2691; RV32-NEXT: addi a0, sp, 8 2692; RV32-NEXT: vlse64.v v10, (a0), zero 2693; RV32-NEXT: addi a0, sp, 8 2694; RV32-NEXT: vlse64.v v12, (a0), zero 2695; RV32-NEXT: vsrl.vi v14, v8, 4 2696; RV32-NEXT: vadd.vv v8, v8, v14 2697; RV32-NEXT: vand.vv v8, v8, v10 2698; RV32-NEXT: vmul.vv v8, v8, v12 2699; RV32-NEXT: addi a0, zero, 56 2700; RV32-NEXT: vsrl.vx v8, v8, a0 2701; RV32-NEXT: addi sp, sp, 16 2702; RV32-NEXT: ret 2703; 2704; RV64-LABEL: ctlz_zero_undef_nxv2i64: 2705; RV64: # %bb.0: 2706; RV64-NEXT: vsetvli a0, zero, e64, m2, ta, mu 2707; RV64-NEXT: vsrl.vi v10, v8, 1 2708; RV64-NEXT: vor.vv v8, v8, v10 2709; RV64-NEXT: vsrl.vi v10, v8, 2 2710; RV64-NEXT: vor.vv v8, v8, v10 2711; RV64-NEXT: vsrl.vi v10, v8, 4 2712; RV64-NEXT: vor.vv v8, v8, v10 2713; RV64-NEXT: vsrl.vi v10, v8, 8 2714; RV64-NEXT: vor.vv v8, v8, v10 2715; RV64-NEXT: vsrl.vi v10, v8, 16 2716; RV64-NEXT: vor.vv v8, v8, v10 2717; RV64-NEXT: addi a0, zero, 32 2718; RV64-NEXT: vsrl.vx v10, v8, a0 2719; RV64-NEXT: vor.vv v8, v8, v10 2720; RV64-NEXT: vxor.vi v8, v8, -1 2721; RV64-NEXT: vsrl.vi v10, v8, 1 2722; RV64-NEXT: lui a0, 21845 2723; RV64-NEXT: addiw a0, a0, 1365 2724; RV64-NEXT: slli a0, a0, 12 2725; RV64-NEXT: addi a0, a0, 1365 2726; RV64-NEXT: slli a0, a0, 12 2727; RV64-NEXT: addi a0, a0, 1365 2728; RV64-NEXT: slli a0, a0, 12 2729; RV64-NEXT: addi a0, a0, 1365 2730; RV64-NEXT: vand.vx v10, v10, a0 2731; RV64-NEXT: vsub.vv v8, v8, v10 2732; RV64-NEXT: lui a0, 13107 2733; RV64-NEXT: addiw a0, a0, 819 2734; RV64-NEXT: slli a0, a0, 12 2735; RV64-NEXT: addi a0, a0, 819 2736; RV64-NEXT: slli a0, a0, 12 2737; RV64-NEXT: addi a0, a0, 819 2738; RV64-NEXT: slli a0, a0, 12 2739; RV64-NEXT: addi a0, a0, 819 2740; RV64-NEXT: vand.vx v10, v8, a0 2741; RV64-NEXT: vsrl.vi v8, v8, 2 2742; RV64-NEXT: vand.vx v8, v8, a0 2743; RV64-NEXT: vadd.vv v8, v10, v8 2744; RV64-NEXT: vsrl.vi v10, v8, 4 2745; RV64-NEXT: vadd.vv v8, v8, v10 2746; RV64-NEXT: lui a0, 3855 2747; RV64-NEXT: addiw a0, a0, 241 2748; RV64-NEXT: slli a0, a0, 12 2749; RV64-NEXT: addi a0, a0, -241 2750; RV64-NEXT: slli a0, a0, 12 2751; RV64-NEXT: addi a0, a0, 241 2752; RV64-NEXT: slli a0, a0, 12 2753; RV64-NEXT: addi a0, a0, -241 2754; RV64-NEXT: vand.vx v8, v8, a0 2755; RV64-NEXT: lui a0, 4112 2756; RV64-NEXT: addiw a0, a0, 257 2757; RV64-NEXT: slli a0, a0, 16 2758; RV64-NEXT: addi a0, a0, 257 2759; RV64-NEXT: slli a0, a0, 16 2760; RV64-NEXT: addi a0, a0, 257 2761; RV64-NEXT: vmul.vx v8, v8, a0 2762; RV64-NEXT: addi a0, zero, 56 2763; RV64-NEXT: vsrl.vx v8, v8, a0 2764; RV64-NEXT: ret 2765 %a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 true) 2766 ret <vscale x 2 x i64> %a 2767} 2768 2769define <vscale x 4 x i64> @ctlz_zero_undef_nxv4i64(<vscale x 4 x i64> %va) { 2770; RV32-LABEL: ctlz_zero_undef_nxv4i64: 2771; RV32: # %bb.0: 2772; RV32-NEXT: addi sp, sp, -16 2773; RV32-NEXT: .cfi_def_cfa_offset 16 2774; RV32-NEXT: lui a0, 349525 2775; RV32-NEXT: addi a0, a0, 1365 2776; RV32-NEXT: sw a0, 12(sp) 2777; RV32-NEXT: sw a0, 8(sp) 2778; RV32-NEXT: lui a0, 209715 2779; RV32-NEXT: addi a0, a0, 819 2780; RV32-NEXT: sw a0, 12(sp) 2781; RV32-NEXT: sw a0, 8(sp) 2782; RV32-NEXT: lui a0, 61681 2783; RV32-NEXT: addi a0, a0, -241 2784; RV32-NEXT: sw a0, 12(sp) 2785; RV32-NEXT: sw a0, 8(sp) 2786; RV32-NEXT: lui a0, 4112 2787; RV32-NEXT: addi a0, a0, 257 2788; RV32-NEXT: sw a0, 12(sp) 2789; RV32-NEXT: sw a0, 8(sp) 2790; RV32-NEXT: vsetvli a0, zero, e64, m4, ta, mu 2791; RV32-NEXT: vsrl.vi v12, v8, 1 2792; RV32-NEXT: vor.vv v8, v8, v12 2793; RV32-NEXT: vsrl.vi v12, v8, 2 2794; RV32-NEXT: vor.vv v8, v8, v12 2795; RV32-NEXT: vsrl.vi v12, v8, 4 2796; RV32-NEXT: vor.vv v8, v8, v12 2797; RV32-NEXT: vsrl.vi v12, v8, 8 2798; RV32-NEXT: vor.vv v8, v8, v12 2799; RV32-NEXT: vsrl.vi v12, v8, 16 2800; RV32-NEXT: vor.vv v8, v8, v12 2801; RV32-NEXT: addi a0, zero, 32 2802; RV32-NEXT: vsrl.vx v12, v8, a0 2803; RV32-NEXT: vor.vv v8, v8, v12 2804; RV32-NEXT: addi a0, sp, 8 2805; RV32-NEXT: vlse64.v v12, (a0), zero 2806; RV32-NEXT: vxor.vi v8, v8, -1 2807; RV32-NEXT: addi a0, sp, 8 2808; RV32-NEXT: vlse64.v v16, (a0), zero 2809; RV32-NEXT: vsrl.vi v20, v8, 1 2810; RV32-NEXT: vand.vv v12, v20, v12 2811; RV32-NEXT: vsub.vv v8, v8, v12 2812; RV32-NEXT: vand.vv v12, v8, v16 2813; RV32-NEXT: vsrl.vi v8, v8, 2 2814; RV32-NEXT: vand.vv v8, v8, v16 2815; RV32-NEXT: vadd.vv v8, v12, v8 2816; RV32-NEXT: addi a0, sp, 8 2817; RV32-NEXT: vlse64.v v12, (a0), zero 2818; RV32-NEXT: addi a0, sp, 8 2819; RV32-NEXT: vlse64.v v16, (a0), zero 2820; RV32-NEXT: vsrl.vi v20, v8, 4 2821; RV32-NEXT: vadd.vv v8, v8, v20 2822; RV32-NEXT: vand.vv v8, v8, v12 2823; RV32-NEXT: vmul.vv v8, v8, v16 2824; RV32-NEXT: addi a0, zero, 56 2825; RV32-NEXT: vsrl.vx v8, v8, a0 2826; RV32-NEXT: addi sp, sp, 16 2827; RV32-NEXT: ret 2828; 2829; RV64-LABEL: ctlz_zero_undef_nxv4i64: 2830; RV64: # %bb.0: 2831; RV64-NEXT: vsetvli a0, zero, e64, m4, ta, mu 2832; RV64-NEXT: vsrl.vi v12, v8, 1 2833; RV64-NEXT: vor.vv v8, v8, v12 2834; RV64-NEXT: vsrl.vi v12, v8, 2 2835; RV64-NEXT: vor.vv v8, v8, v12 2836; RV64-NEXT: vsrl.vi v12, v8, 4 2837; RV64-NEXT: vor.vv v8, v8, v12 2838; RV64-NEXT: vsrl.vi v12, v8, 8 2839; RV64-NEXT: vor.vv v8, v8, v12 2840; RV64-NEXT: vsrl.vi v12, v8, 16 2841; RV64-NEXT: vor.vv v8, v8, v12 2842; RV64-NEXT: addi a0, zero, 32 2843; RV64-NEXT: vsrl.vx v12, v8, a0 2844; RV64-NEXT: vor.vv v8, v8, v12 2845; RV64-NEXT: vxor.vi v8, v8, -1 2846; RV64-NEXT: vsrl.vi v12, v8, 1 2847; RV64-NEXT: lui a0, 21845 2848; RV64-NEXT: addiw a0, a0, 1365 2849; RV64-NEXT: slli a0, a0, 12 2850; RV64-NEXT: addi a0, a0, 1365 2851; RV64-NEXT: slli a0, a0, 12 2852; RV64-NEXT: addi a0, a0, 1365 2853; RV64-NEXT: slli a0, a0, 12 2854; RV64-NEXT: addi a0, a0, 1365 2855; RV64-NEXT: vand.vx v12, v12, a0 2856; RV64-NEXT: vsub.vv v8, v8, v12 2857; RV64-NEXT: lui a0, 13107 2858; RV64-NEXT: addiw a0, a0, 819 2859; RV64-NEXT: slli a0, a0, 12 2860; RV64-NEXT: addi a0, a0, 819 2861; RV64-NEXT: slli a0, a0, 12 2862; RV64-NEXT: addi a0, a0, 819 2863; RV64-NEXT: slli a0, a0, 12 2864; RV64-NEXT: addi a0, a0, 819 2865; RV64-NEXT: vand.vx v12, v8, a0 2866; RV64-NEXT: vsrl.vi v8, v8, 2 2867; RV64-NEXT: vand.vx v8, v8, a0 2868; RV64-NEXT: vadd.vv v8, v12, v8 2869; RV64-NEXT: vsrl.vi v12, v8, 4 2870; RV64-NEXT: vadd.vv v8, v8, v12 2871; RV64-NEXT: lui a0, 3855 2872; RV64-NEXT: addiw a0, a0, 241 2873; RV64-NEXT: slli a0, a0, 12 2874; RV64-NEXT: addi a0, a0, -241 2875; RV64-NEXT: slli a0, a0, 12 2876; RV64-NEXT: addi a0, a0, 241 2877; RV64-NEXT: slli a0, a0, 12 2878; RV64-NEXT: addi a0, a0, -241 2879; RV64-NEXT: vand.vx v8, v8, a0 2880; RV64-NEXT: lui a0, 4112 2881; RV64-NEXT: addiw a0, a0, 257 2882; RV64-NEXT: slli a0, a0, 16 2883; RV64-NEXT: addi a0, a0, 257 2884; RV64-NEXT: slli a0, a0, 16 2885; RV64-NEXT: addi a0, a0, 257 2886; RV64-NEXT: vmul.vx v8, v8, a0 2887; RV64-NEXT: addi a0, zero, 56 2888; RV64-NEXT: vsrl.vx v8, v8, a0 2889; RV64-NEXT: ret 2890 %a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 true) 2891 ret <vscale x 4 x i64> %a 2892} 2893 2894define <vscale x 8 x i64> @ctlz_zero_undef_nxv8i64(<vscale x 8 x i64> %va) { 2895; RV32-LABEL: ctlz_zero_undef_nxv8i64: 2896; RV32: # %bb.0: 2897; RV32-NEXT: addi sp, sp, -16 2898; RV32-NEXT: .cfi_def_cfa_offset 16 2899; RV32-NEXT: lui a0, 349525 2900; RV32-NEXT: addi a0, a0, 1365 2901; RV32-NEXT: sw a0, 12(sp) 2902; RV32-NEXT: sw a0, 8(sp) 2903; RV32-NEXT: lui a0, 209715 2904; RV32-NEXT: addi a0, a0, 819 2905; RV32-NEXT: sw a0, 12(sp) 2906; RV32-NEXT: sw a0, 8(sp) 2907; RV32-NEXT: lui a0, 61681 2908; RV32-NEXT: addi a0, a0, -241 2909; RV32-NEXT: sw a0, 12(sp) 2910; RV32-NEXT: sw a0, 8(sp) 2911; RV32-NEXT: lui a0, 4112 2912; RV32-NEXT: addi a0, a0, 257 2913; RV32-NEXT: sw a0, 12(sp) 2914; RV32-NEXT: sw a0, 8(sp) 2915; RV32-NEXT: vsetvli a0, zero, e64, m8, ta, mu 2916; RV32-NEXT: vsrl.vi v16, v8, 1 2917; RV32-NEXT: vor.vv v8, v8, v16 2918; RV32-NEXT: vsrl.vi v16, v8, 2 2919; RV32-NEXT: vor.vv v8, v8, v16 2920; RV32-NEXT: vsrl.vi v16, v8, 4 2921; RV32-NEXT: vor.vv v8, v8, v16 2922; RV32-NEXT: vsrl.vi v16, v8, 8 2923; RV32-NEXT: vor.vv v8, v8, v16 2924; RV32-NEXT: vsrl.vi v16, v8, 16 2925; RV32-NEXT: vor.vv v8, v8, v16 2926; RV32-NEXT: addi a0, zero, 32 2927; RV32-NEXT: vsrl.vx v16, v8, a0 2928; RV32-NEXT: vor.vv v8, v8, v16 2929; RV32-NEXT: addi a0, sp, 8 2930; RV32-NEXT: vlse64.v v16, (a0), zero 2931; RV32-NEXT: vxor.vi v8, v8, -1 2932; RV32-NEXT: addi a0, sp, 8 2933; RV32-NEXT: vlse64.v v24, (a0), zero 2934; RV32-NEXT: vsrl.vi v0, v8, 1 2935; RV32-NEXT: vand.vv v16, v0, v16 2936; RV32-NEXT: vsub.vv v8, v8, v16 2937; RV32-NEXT: vand.vv v16, v8, v24 2938; RV32-NEXT: vsrl.vi v8, v8, 2 2939; RV32-NEXT: vand.vv v8, v8, v24 2940; RV32-NEXT: vadd.vv v8, v16, v8 2941; RV32-NEXT: addi a0, sp, 8 2942; RV32-NEXT: vlse64.v v16, (a0), zero 2943; RV32-NEXT: addi a0, sp, 8 2944; RV32-NEXT: vlse64.v v24, (a0), zero 2945; RV32-NEXT: vsrl.vi v0, v8, 4 2946; RV32-NEXT: vadd.vv v8, v8, v0 2947; RV32-NEXT: vand.vv v8, v8, v16 2948; RV32-NEXT: vmul.vv v8, v8, v24 2949; RV32-NEXT: addi a0, zero, 56 2950; RV32-NEXT: vsrl.vx v8, v8, a0 2951; RV32-NEXT: addi sp, sp, 16 2952; RV32-NEXT: ret 2953; 2954; RV64-LABEL: ctlz_zero_undef_nxv8i64: 2955; RV64: # %bb.0: 2956; RV64-NEXT: vsetvli a0, zero, e64, m8, ta, mu 2957; RV64-NEXT: vsrl.vi v16, v8, 1 2958; RV64-NEXT: vor.vv v8, v8, v16 2959; RV64-NEXT: vsrl.vi v16, v8, 2 2960; RV64-NEXT: vor.vv v8, v8, v16 2961; RV64-NEXT: vsrl.vi v16, v8, 4 2962; RV64-NEXT: vor.vv v8, v8, v16 2963; RV64-NEXT: vsrl.vi v16, v8, 8 2964; RV64-NEXT: vor.vv v8, v8, v16 2965; RV64-NEXT: vsrl.vi v16, v8, 16 2966; RV64-NEXT: vor.vv v8, v8, v16 2967; RV64-NEXT: addi a0, zero, 32 2968; RV64-NEXT: vsrl.vx v16, v8, a0 2969; RV64-NEXT: vor.vv v8, v8, v16 2970; RV64-NEXT: vxor.vi v8, v8, -1 2971; RV64-NEXT: vsrl.vi v16, v8, 1 2972; RV64-NEXT: lui a0, 21845 2973; RV64-NEXT: addiw a0, a0, 1365 2974; RV64-NEXT: slli a0, a0, 12 2975; RV64-NEXT: addi a0, a0, 1365 2976; RV64-NEXT: slli a0, a0, 12 2977; RV64-NEXT: addi a0, a0, 1365 2978; RV64-NEXT: slli a0, a0, 12 2979; RV64-NEXT: addi a0, a0, 1365 2980; RV64-NEXT: vand.vx v16, v16, a0 2981; RV64-NEXT: vsub.vv v8, v8, v16 2982; RV64-NEXT: lui a0, 13107 2983; RV64-NEXT: addiw a0, a0, 819 2984; RV64-NEXT: slli a0, a0, 12 2985; RV64-NEXT: addi a0, a0, 819 2986; RV64-NEXT: slli a0, a0, 12 2987; RV64-NEXT: addi a0, a0, 819 2988; RV64-NEXT: slli a0, a0, 12 2989; RV64-NEXT: addi a0, a0, 819 2990; RV64-NEXT: vand.vx v16, v8, a0 2991; RV64-NEXT: vsrl.vi v8, v8, 2 2992; RV64-NEXT: vand.vx v8, v8, a0 2993; RV64-NEXT: vadd.vv v8, v16, v8 2994; RV64-NEXT: vsrl.vi v16, v8, 4 2995; RV64-NEXT: vadd.vv v8, v8, v16 2996; RV64-NEXT: lui a0, 3855 2997; RV64-NEXT: addiw a0, a0, 241 2998; RV64-NEXT: slli a0, a0, 12 2999; RV64-NEXT: addi a0, a0, -241 3000; RV64-NEXT: slli a0, a0, 12 3001; RV64-NEXT: addi a0, a0, 241 3002; RV64-NEXT: slli a0, a0, 12 3003; RV64-NEXT: addi a0, a0, -241 3004; RV64-NEXT: vand.vx v8, v8, a0 3005; RV64-NEXT: lui a0, 4112 3006; RV64-NEXT: addiw a0, a0, 257 3007; RV64-NEXT: slli a0, a0, 16 3008; RV64-NEXT: addi a0, a0, 257 3009; RV64-NEXT: slli a0, a0, 16 3010; RV64-NEXT: addi a0, a0, 257 3011; RV64-NEXT: vmul.vx v8, v8, a0 3012; RV64-NEXT: addi a0, zero, 56 3013; RV64-NEXT: vsrl.vx v8, v8, a0 3014; RV64-NEXT: ret 3015 %a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 true) 3016 ret <vscale x 8 x i64> %a 3017} 3018