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