; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 ; RUN: llc -mtriple=riscv32 -mattr=+v < %s | FileCheck %s -check-prefix=RV32 ; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s -check-prefix=RV64 ; FIXED WIDTH define i16 @ctz_v4i32(<4 x i32> %a) { ; RV32-LABEL: ctz_v4i32: ; RV32: # %bb.0: ; RV32-NEXT: vsetivli zero, 4, e32, m1, ta, ma ; RV32-NEXT: vmsne.vi v8, v8, 0 ; RV32-NEXT: vfirst.m a0, v8 ; RV32-NEXT: bgez a0, .LBB0_2 ; RV32-NEXT: # %bb.1: ; RV32-NEXT: li a0, 4 ; RV32-NEXT: .LBB0_2: ; RV32-NEXT: ret ; ; RV64-LABEL: ctz_v4i32: ; RV64: # %bb.0: ; RV64-NEXT: vsetivli zero, 4, e32, m1, ta, ma ; RV64-NEXT: vmsne.vi v8, v8, 0 ; RV64-NEXT: vfirst.m a0, v8 ; RV64-NEXT: bgez a0, .LBB0_2 ; RV64-NEXT: # %bb.1: ; RV64-NEXT: li a0, 4 ; RV64-NEXT: .LBB0_2: ; RV64-NEXT: ret %res = call i16 @llvm.experimental.cttz.elts.i16.v4i32(<4 x i32> %a, i1 0) ret i16 %res } define i16 @ctz_v2048i1(<2048 x i1> %a) { ; RV32-LABEL: ctz_v2048i1: ; RV32: # %bb.0: ; RV32-NEXT: li a1, 128 ; RV32-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; RV32-NEXT: vfirst.m a0, v0 ; RV32-NEXT: bltz a0, .LBB1_32 ; RV32-NEXT: # %bb.1: ; RV32-NEXT: vfirst.m a2, v8 ; RV32-NEXT: bltz a2, .LBB1_33 ; RV32-NEXT: .LBB1_2: ; RV32-NEXT: beq a0, a1, .LBB1_34 ; RV32-NEXT: .LBB1_3: ; RV32-NEXT: vfirst.m a3, v9 ; RV32-NEXT: bltz a3, .LBB1_35 ; RV32-NEXT: .LBB1_4: ; RV32-NEXT: vfirst.m a2, v10 ; RV32-NEXT: bltz a2, .LBB1_36 ; RV32-NEXT: .LBB1_5: ; RV32-NEXT: beq a3, a1, .LBB1_37 ; RV32-NEXT: .LBB1_6: ; RV32-NEXT: li a2, 256 ; RV32-NEXT: beq a0, a2, .LBB1_38 ; RV32-NEXT: .LBB1_7: ; RV32-NEXT: vfirst.m a4, v11 ; RV32-NEXT: bltz a4, .LBB1_39 ; RV32-NEXT: .LBB1_8: ; RV32-NEXT: vfirst.m a3, v12 ; RV32-NEXT: bltz a3, .LBB1_40 ; RV32-NEXT: .LBB1_9: ; RV32-NEXT: beq a4, a1, .LBB1_41 ; RV32-NEXT: .LBB1_10: ; RV32-NEXT: vfirst.m a3, v13 ; RV32-NEXT: bltz a3, .LBB1_42 ; RV32-NEXT: .LBB1_11: ; RV32-NEXT: vfirst.m a5, v14 ; RV32-NEXT: bltz a5, .LBB1_43 ; RV32-NEXT: .LBB1_12: ; RV32-NEXT: beq a3, a1, .LBB1_44 ; RV32-NEXT: .LBB1_13: ; RV32-NEXT: beq a4, a2, .LBB1_45 ; RV32-NEXT: .LBB1_14: ; RV32-NEXT: li a3, 512 ; RV32-NEXT: beq a0, a3, .LBB1_46 ; RV32-NEXT: .LBB1_15: ; RV32-NEXT: vfirst.m a4, v15 ; RV32-NEXT: bltz a4, .LBB1_47 ; RV32-NEXT: .LBB1_16: ; RV32-NEXT: vfirst.m a5, v16 ; RV32-NEXT: bltz a5, .LBB1_48 ; RV32-NEXT: .LBB1_17: ; RV32-NEXT: beq a4, a1, .LBB1_49 ; RV32-NEXT: .LBB1_18: ; RV32-NEXT: vfirst.m a5, v17 ; RV32-NEXT: bltz a5, .LBB1_50 ; RV32-NEXT: .LBB1_19: ; RV32-NEXT: vfirst.m a6, v18 ; RV32-NEXT: bltz a6, .LBB1_51 ; RV32-NEXT: .LBB1_20: ; RV32-NEXT: beq a5, a1, .LBB1_52 ; RV32-NEXT: .LBB1_21: ; RV32-NEXT: beq a4, a2, .LBB1_53 ; RV32-NEXT: .LBB1_22: ; RV32-NEXT: vfirst.m a5, v19 ; RV32-NEXT: bltz a5, .LBB1_54 ; RV32-NEXT: .LBB1_23: ; RV32-NEXT: vfirst.m a6, v20 ; RV32-NEXT: bltz a6, .LBB1_55 ; RV32-NEXT: .LBB1_24: ; RV32-NEXT: beq a5, a1, .LBB1_56 ; RV32-NEXT: .LBB1_25: ; RV32-NEXT: vfirst.m a6, v21 ; RV32-NEXT: bltz a6, .LBB1_57 ; RV32-NEXT: .LBB1_26: ; RV32-NEXT: vfirst.m a7, v22 ; RV32-NEXT: bltz a7, .LBB1_58 ; RV32-NEXT: .LBB1_27: ; RV32-NEXT: beq a6, a1, .LBB1_59 ; RV32-NEXT: .LBB1_28: ; RV32-NEXT: beq a5, a2, .LBB1_60 ; RV32-NEXT: .LBB1_29: ; RV32-NEXT: beq a4, a3, .LBB1_61 ; RV32-NEXT: .LBB1_30: ; RV32-NEXT: li a1, 1024 ; RV32-NEXT: beq a0, a1, .LBB1_62 ; RV32-NEXT: .LBB1_31: ; RV32-NEXT: ret ; RV32-NEXT: .LBB1_32: ; RV32-NEXT: li a0, 128 ; RV32-NEXT: vfirst.m a2, v8 ; RV32-NEXT: bgez a2, .LBB1_2 ; RV32-NEXT: .LBB1_33: ; RV32-NEXT: li a2, 128 ; RV32-NEXT: bne a0, a1, .LBB1_3 ; RV32-NEXT: .LBB1_34: ; RV32-NEXT: addi a0, a2, 128 ; RV32-NEXT: vfirst.m a3, v9 ; RV32-NEXT: bgez a3, .LBB1_4 ; RV32-NEXT: .LBB1_35: ; RV32-NEXT: li a3, 128 ; RV32-NEXT: vfirst.m a2, v10 ; RV32-NEXT: bgez a2, .LBB1_5 ; RV32-NEXT: .LBB1_36: ; RV32-NEXT: li a2, 128 ; RV32-NEXT: bne a3, a1, .LBB1_6 ; RV32-NEXT: .LBB1_37: ; RV32-NEXT: addi a3, a2, 128 ; RV32-NEXT: li a2, 256 ; RV32-NEXT: bne a0, a2, .LBB1_7 ; RV32-NEXT: .LBB1_38: ; RV32-NEXT: addi a0, a3, 256 ; RV32-NEXT: vfirst.m a4, v11 ; RV32-NEXT: bgez a4, .LBB1_8 ; RV32-NEXT: .LBB1_39: ; RV32-NEXT: li a4, 128 ; RV32-NEXT: vfirst.m a3, v12 ; RV32-NEXT: bgez a3, .LBB1_9 ; RV32-NEXT: .LBB1_40: ; RV32-NEXT: li a3, 128 ; RV32-NEXT: bne a4, a1, .LBB1_10 ; RV32-NEXT: .LBB1_41: ; RV32-NEXT: addi a4, a3, 128 ; RV32-NEXT: vfirst.m a3, v13 ; RV32-NEXT: bgez a3, .LBB1_11 ; RV32-NEXT: .LBB1_42: ; RV32-NEXT: li a3, 128 ; RV32-NEXT: vfirst.m a5, v14 ; RV32-NEXT: bgez a5, .LBB1_12 ; RV32-NEXT: .LBB1_43: ; RV32-NEXT: li a5, 128 ; RV32-NEXT: bne a3, a1, .LBB1_13 ; RV32-NEXT: .LBB1_44: ; RV32-NEXT: addi a3, a5, 128 ; RV32-NEXT: bne a4, a2, .LBB1_14 ; RV32-NEXT: .LBB1_45: ; RV32-NEXT: addi a4, a3, 256 ; RV32-NEXT: li a3, 512 ; RV32-NEXT: bne a0, a3, .LBB1_15 ; RV32-NEXT: .LBB1_46: ; RV32-NEXT: addi a0, a4, 512 ; RV32-NEXT: vfirst.m a4, v15 ; RV32-NEXT: bgez a4, .LBB1_16 ; RV32-NEXT: .LBB1_47: ; RV32-NEXT: li a4, 128 ; RV32-NEXT: vfirst.m a5, v16 ; RV32-NEXT: bgez a5, .LBB1_17 ; RV32-NEXT: .LBB1_48: ; RV32-NEXT: li a5, 128 ; RV32-NEXT: bne a4, a1, .LBB1_18 ; RV32-NEXT: .LBB1_49: ; RV32-NEXT: addi a4, a5, 128 ; RV32-NEXT: vfirst.m a5, v17 ; RV32-NEXT: bgez a5, .LBB1_19 ; RV32-NEXT: .LBB1_50: ; RV32-NEXT: li a5, 128 ; RV32-NEXT: vfirst.m a6, v18 ; RV32-NEXT: bgez a6, .LBB1_20 ; RV32-NEXT: .LBB1_51: ; RV32-NEXT: li a6, 128 ; RV32-NEXT: bne a5, a1, .LBB1_21 ; RV32-NEXT: .LBB1_52: ; RV32-NEXT: addi a5, a6, 128 ; RV32-NEXT: bne a4, a2, .LBB1_22 ; RV32-NEXT: .LBB1_53: ; RV32-NEXT: addi a4, a5, 256 ; RV32-NEXT: vfirst.m a5, v19 ; RV32-NEXT: bgez a5, .LBB1_23 ; RV32-NEXT: .LBB1_54: ; RV32-NEXT: li a5, 128 ; RV32-NEXT: vfirst.m a6, v20 ; RV32-NEXT: bgez a6, .LBB1_24 ; RV32-NEXT: .LBB1_55: ; RV32-NEXT: li a6, 128 ; RV32-NEXT: bne a5, a1, .LBB1_25 ; RV32-NEXT: .LBB1_56: ; RV32-NEXT: addi a5, a6, 128 ; RV32-NEXT: vfirst.m a6, v21 ; RV32-NEXT: bgez a6, .LBB1_26 ; RV32-NEXT: .LBB1_57: ; RV32-NEXT: li a6, 128 ; RV32-NEXT: vfirst.m a7, v22 ; RV32-NEXT: bgez a7, .LBB1_27 ; RV32-NEXT: .LBB1_58: ; RV32-NEXT: li a7, 128 ; RV32-NEXT: bne a6, a1, .LBB1_28 ; RV32-NEXT: .LBB1_59: ; RV32-NEXT: addi a6, a7, 128 ; RV32-NEXT: bne a5, a2, .LBB1_29 ; RV32-NEXT: .LBB1_60: ; RV32-NEXT: addi a5, a6, 256 ; RV32-NEXT: bne a4, a3, .LBB1_30 ; RV32-NEXT: .LBB1_61: ; RV32-NEXT: addi a4, a5, 512 ; RV32-NEXT: li a1, 1024 ; RV32-NEXT: bne a0, a1, .LBB1_31 ; RV32-NEXT: .LBB1_62: ; RV32-NEXT: addi a0, a4, 1024 ; RV32-NEXT: ret ; ; RV64-LABEL: ctz_v2048i1: ; RV64: # %bb.0: ; RV64-NEXT: li a1, 128 ; RV64-NEXT: vsetvli zero, a1, e8, m8, ta, ma ; RV64-NEXT: vfirst.m a0, v0 ; RV64-NEXT: bltz a0, .LBB1_32 ; RV64-NEXT: # %bb.1: ; RV64-NEXT: vfirst.m a2, v8 ; RV64-NEXT: bltz a2, .LBB1_33 ; RV64-NEXT: .LBB1_2: ; RV64-NEXT: beq a0, a1, .LBB1_34 ; RV64-NEXT: .LBB1_3: ; RV64-NEXT: vfirst.m a3, v9 ; RV64-NEXT: bltz a3, .LBB1_35 ; RV64-NEXT: .LBB1_4: ; RV64-NEXT: vfirst.m a2, v10 ; RV64-NEXT: bltz a2, .LBB1_36 ; RV64-NEXT: .LBB1_5: ; RV64-NEXT: beq a3, a1, .LBB1_37 ; RV64-NEXT: .LBB1_6: ; RV64-NEXT: li a2, 256 ; RV64-NEXT: beq a0, a2, .LBB1_38 ; RV64-NEXT: .LBB1_7: ; RV64-NEXT: vfirst.m a4, v11 ; RV64-NEXT: bltz a4, .LBB1_39 ; RV64-NEXT: .LBB1_8: ; RV64-NEXT: vfirst.m a3, v12 ; RV64-NEXT: bltz a3, .LBB1_40 ; RV64-NEXT: .LBB1_9: ; RV64-NEXT: beq a4, a1, .LBB1_41 ; RV64-NEXT: .LBB1_10: ; RV64-NEXT: vfirst.m a3, v13 ; RV64-NEXT: bltz a3, .LBB1_42 ; RV64-NEXT: .LBB1_11: ; RV64-NEXT: vfirst.m a5, v14 ; RV64-NEXT: bltz a5, .LBB1_43 ; RV64-NEXT: .LBB1_12: ; RV64-NEXT: beq a3, a1, .LBB1_44 ; RV64-NEXT: .LBB1_13: ; RV64-NEXT: beq a4, a2, .LBB1_45 ; RV64-NEXT: .LBB1_14: ; RV64-NEXT: li a3, 512 ; RV64-NEXT: beq a0, a3, .LBB1_46 ; RV64-NEXT: .LBB1_15: ; RV64-NEXT: vfirst.m a4, v15 ; RV64-NEXT: bltz a4, .LBB1_47 ; RV64-NEXT: .LBB1_16: ; RV64-NEXT: vfirst.m a5, v16 ; RV64-NEXT: bltz a5, .LBB1_48 ; RV64-NEXT: .LBB1_17: ; RV64-NEXT: beq a4, a1, .LBB1_49 ; RV64-NEXT: .LBB1_18: ; RV64-NEXT: vfirst.m a5, v17 ; RV64-NEXT: bltz a5, .LBB1_50 ; RV64-NEXT: .LBB1_19: ; RV64-NEXT: vfirst.m a6, v18 ; RV64-NEXT: bltz a6, .LBB1_51 ; RV64-NEXT: .LBB1_20: ; RV64-NEXT: beq a5, a1, .LBB1_52 ; RV64-NEXT: .LBB1_21: ; RV64-NEXT: beq a4, a2, .LBB1_53 ; RV64-NEXT: .LBB1_22: ; RV64-NEXT: vfirst.m a5, v19 ; RV64-NEXT: bltz a5, .LBB1_54 ; RV64-NEXT: .LBB1_23: ; RV64-NEXT: vfirst.m a6, v20 ; RV64-NEXT: bltz a6, .LBB1_55 ; RV64-NEXT: .LBB1_24: ; RV64-NEXT: beq a5, a1, .LBB1_56 ; RV64-NEXT: .LBB1_25: ; RV64-NEXT: vfirst.m a6, v21 ; RV64-NEXT: bltz a6, .LBB1_57 ; RV64-NEXT: .LBB1_26: ; RV64-NEXT: vfirst.m a7, v22 ; RV64-NEXT: bltz a7, .LBB1_58 ; RV64-NEXT: .LBB1_27: ; RV64-NEXT: beq a6, a1, .LBB1_59 ; RV64-NEXT: .LBB1_28: ; RV64-NEXT: beq a5, a2, .LBB1_60 ; RV64-NEXT: .LBB1_29: ; RV64-NEXT: beq a4, a3, .LBB1_61 ; RV64-NEXT: .LBB1_30: ; RV64-NEXT: li a1, 1024 ; RV64-NEXT: beq a0, a1, .LBB1_62 ; RV64-NEXT: .LBB1_31: ; RV64-NEXT: ret ; RV64-NEXT: .LBB1_32: ; RV64-NEXT: li a0, 128 ; RV64-NEXT: vfirst.m a2, v8 ; RV64-NEXT: bgez a2, .LBB1_2 ; RV64-NEXT: .LBB1_33: ; RV64-NEXT: li a2, 128 ; RV64-NEXT: bne a0, a1, .LBB1_3 ; RV64-NEXT: .LBB1_34: ; RV64-NEXT: addi a0, a2, 128 ; RV64-NEXT: vfirst.m a3, v9 ; RV64-NEXT: bgez a3, .LBB1_4 ; RV64-NEXT: .LBB1_35: ; RV64-NEXT: li a3, 128 ; RV64-NEXT: vfirst.m a2, v10 ; RV64-NEXT: bgez a2, .LBB1_5 ; RV64-NEXT: .LBB1_36: ; RV64-NEXT: li a2, 128 ; RV64-NEXT: bne a3, a1, .LBB1_6 ; RV64-NEXT: .LBB1_37: ; RV64-NEXT: addi a3, a2, 128 ; RV64-NEXT: li a2, 256 ; RV64-NEXT: bne a0, a2, .LBB1_7 ; RV64-NEXT: .LBB1_38: ; RV64-NEXT: addi a0, a3, 256 ; RV64-NEXT: vfirst.m a4, v11 ; RV64-NEXT: bgez a4, .LBB1_8 ; RV64-NEXT: .LBB1_39: ; RV64-NEXT: li a4, 128 ; RV64-NEXT: vfirst.m a3, v12 ; RV64-NEXT: bgez a3, .LBB1_9 ; RV64-NEXT: .LBB1_40: ; RV64-NEXT: li a3, 128 ; RV64-NEXT: bne a4, a1, .LBB1_10 ; RV64-NEXT: .LBB1_41: ; RV64-NEXT: addi a4, a3, 128 ; RV64-NEXT: vfirst.m a3, v13 ; RV64-NEXT: bgez a3, .LBB1_11 ; RV64-NEXT: .LBB1_42: ; RV64-NEXT: li a3, 128 ; RV64-NEXT: vfirst.m a5, v14 ; RV64-NEXT: bgez a5, .LBB1_12 ; RV64-NEXT: .LBB1_43: ; RV64-NEXT: li a5, 128 ; RV64-NEXT: bne a3, a1, .LBB1_13 ; RV64-NEXT: .LBB1_44: ; RV64-NEXT: addi a3, a5, 128 ; RV64-NEXT: bne a4, a2, .LBB1_14 ; RV64-NEXT: .LBB1_45: ; RV64-NEXT: addi a4, a3, 256 ; RV64-NEXT: li a3, 512 ; RV64-NEXT: bne a0, a3, .LBB1_15 ; RV64-NEXT: .LBB1_46: ; RV64-NEXT: addi a0, a4, 512 ; RV64-NEXT: vfirst.m a4, v15 ; RV64-NEXT: bgez a4, .LBB1_16 ; RV64-NEXT: .LBB1_47: ; RV64-NEXT: li a4, 128 ; RV64-NEXT: vfirst.m a5, v16 ; RV64-NEXT: bgez a5, .LBB1_17 ; RV64-NEXT: .LBB1_48: ; RV64-NEXT: li a5, 128 ; RV64-NEXT: bne a4, a1, .LBB1_18 ; RV64-NEXT: .LBB1_49: ; RV64-NEXT: addi a4, a5, 128 ; RV64-NEXT: vfirst.m a5, v17 ; RV64-NEXT: bgez a5, .LBB1_19 ; RV64-NEXT: .LBB1_50: ; RV64-NEXT: li a5, 128 ; RV64-NEXT: vfirst.m a6, v18 ; RV64-NEXT: bgez a6, .LBB1_20 ; RV64-NEXT: .LBB1_51: ; RV64-NEXT: li a6, 128 ; RV64-NEXT: bne a5, a1, .LBB1_21 ; RV64-NEXT: .LBB1_52: ; RV64-NEXT: addi a5, a6, 128 ; RV64-NEXT: bne a4, a2, .LBB1_22 ; RV64-NEXT: .LBB1_53: ; RV64-NEXT: addi a4, a5, 256 ; RV64-NEXT: vfirst.m a5, v19 ; RV64-NEXT: bgez a5, .LBB1_23 ; RV64-NEXT: .LBB1_54: ; RV64-NEXT: li a5, 128 ; RV64-NEXT: vfirst.m a6, v20 ; RV64-NEXT: bgez a6, .LBB1_24 ; RV64-NEXT: .LBB1_55: ; RV64-NEXT: li a6, 128 ; RV64-NEXT: bne a5, a1, .LBB1_25 ; RV64-NEXT: .LBB1_56: ; RV64-NEXT: addi a5, a6, 128 ; RV64-NEXT: vfirst.m a6, v21 ; RV64-NEXT: bgez a6, .LBB1_26 ; RV64-NEXT: .LBB1_57: ; RV64-NEXT: li a6, 128 ; RV64-NEXT: vfirst.m a7, v22 ; RV64-NEXT: bgez a7, .LBB1_27 ; RV64-NEXT: .LBB1_58: ; RV64-NEXT: li a7, 128 ; RV64-NEXT: bne a6, a1, .LBB1_28 ; RV64-NEXT: .LBB1_59: ; RV64-NEXT: addi a6, a7, 128 ; RV64-NEXT: bne a5, a2, .LBB1_29 ; RV64-NEXT: .LBB1_60: ; RV64-NEXT: addi a5, a6, 256 ; RV64-NEXT: bne a4, a3, .LBB1_30 ; RV64-NEXT: .LBB1_61: ; RV64-NEXT: addi a4, a5, 512 ; RV64-NEXT: li a1, 1024 ; RV64-NEXT: bne a0, a1, .LBB1_31 ; RV64-NEXT: .LBB1_62: ; RV64-NEXT: addi a0, a4, 1024 ; RV64-NEXT: ret %res = call i16 @llvm.experimental.cttz.elts(<2048 x i1> %a, i1 0) ret i16 %res } ; ZERO IS POISON define i32 @ctz_v2i1_poison(<2 x i1> %a) { ; RV32-LABEL: ctz_v2i1_poison: ; RV32: # %bb.0: ; RV32-NEXT: vsetivli zero, 2, e8, mf8, ta, ma ; RV32-NEXT: vfirst.m a0, v0 ; RV32-NEXT: ret ; ; RV64-LABEL: ctz_v2i1_poison: ; RV64: # %bb.0: ; RV64-NEXT: vsetivli zero, 2, e8, mf8, ta, ma ; RV64-NEXT: vfirst.m a0, v0 ; RV64-NEXT: ret %res = call i32 @llvm.experimental.cttz.elts.i32.v2i1(<2 x i1> %a, i1 1) ret i32 %res }