diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -7062,8 +7062,8 @@ SDValue CTLZ = DAG.getNode(ISD::CTLZ_ZERO_UNDEF, dl, VT, Op); SDValue Zero = DAG.getConstant(0, dl, VT); SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ); - Result = DAG.getNode(ISD::SELECT, dl, VT, SrcIsZero, - DAG.getConstant(NumBitsPerElt, dl, VT), CTLZ); + Result = DAG.getSelect(dl, VT, SrcIsZero, + DAG.getConstant(NumBitsPerElt, dl, VT), CTLZ); return true; } @@ -7114,8 +7114,8 @@ SDValue CTTZ = DAG.getNode(ISD::CTTZ_ZERO_UNDEF, dl, VT, Op); SDValue Zero = DAG.getConstant(0, dl, VT); SDValue SrcIsZero = DAG.getSetCC(dl, SetCCVT, Op, Zero, ISD::SETEQ); - Result = DAG.getNode(ISD::SELECT, dl, VT, SrcIsZero, - DAG.getConstant(NumBitsPerElt, dl, VT), CTTZ); + Result = DAG.getSelect(dl, VT, SrcIsZero, + DAG.getConstant(NumBitsPerElt, dl, VT), CTTZ); return true; } diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -819,6 +819,16 @@ setOperationAction(ISD::VECREDUCE_UMAX, VT, Custom); setOperationAction(ISD::VECREDUCE_UMIN, VT, Custom); + // Lower CTLZ_UNDEF if we have a floating point type that can represent + // the value exactly. + if (((VT.getVectorElementType() == MVT::i8 || + VT.getVectorElementType() == MVT::i16) && + Subtarget.hasStdExtF()) || + (VT.getVectorElementType() == MVT::i32 && Subtarget.hasStdExtD())) { + setOperationAction(ISD::CTLZ_ZERO_UNDEF, VT, Custom); + setOperationAction(ISD::CTTZ_ZERO_UNDEF, VT, Custom); + } + for (unsigned VPOpc : IntegerVPOps) setOperationAction(VPOpc, VT, Custom); } @@ -2278,6 +2288,66 @@ return DAG.getNode(RVVOpc, DL, ContainerVT, Op, Mask, VL); } +// Lower CTLZ_ZERO_UNDEF or CTTZ_ZERO_UNDEF by converting to FP and extracting +// the exponent. +static SDValue lowerCTLZ_CTTZ_ZERO_UNDEF(SDValue Op, SelectionDAG &DAG) { + MVT VT = Op.getSimpleValueType(); + unsigned EltSize = VT.getScalarSizeInBits(); + SDValue Src = Op.getOperand(0); + SDLoc DL(Op); + + // We need a FP type that can represent the value. + MVT FloatEltVT = EltSize == 32 ? MVT::f64 : MVT::f32; + EVT FloatVT = EVT::getVectorVT(*DAG.getContext(), FloatEltVT, + VT.getVectorElementCount()); + + // Make sure the float type is legal. If not, split the operation in half. + // FIXME: Not all of the operations in the final sequence need to be split. + // We need something like X86's SplitOpsAndApply. + const TargetLowering &TLI = DAG.getTargetLoweringInfo(); + if (!TLI.isTypeLegal(FloatVT)) { + SDValue Lo, Hi; + std::tie(Lo, Hi) = DAG.SplitVector(Src, DL); + + EVT LoVT, HiVT; + std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(VT); + return DAG.getNode(ISD::CONCAT_VECTORS, DL, VT, + DAG.getNode(Op.getOpcode(), DL, LoVT, Lo), + DAG.getNode(Op.getOpcode(), DL, HiVT, Hi)); + } + + // For CTTZ_ZERO_UNDEF, we need to extract the lowest set bit using X & -X. + // The trailing zero count is equal to log2 of this single bit value. + if (Op.getOpcode() == ISD::CTTZ_ZERO_UNDEF) { + SDValue Neg = + DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT), Src); + Src = DAG.getNode(ISD::AND, DL, VT, Src, Neg); + } + + // We have a legal FP type, convert to it. + SDValue FloatVal = DAG.getNode(ISD::UINT_TO_FP, DL, FloatVT, Src); + // Bitcast to integer and shift the exponent to the LSB. + EVT IntVT = FloatVT.changeVectorElementTypeToInteger(); + SDValue Bitcast = DAG.getBitcast(IntVT, FloatVal); + unsigned ShiftAmt = FloatEltVT == MVT::f64 ? 52 : 23; + SDValue Shift = DAG.getNode(ISD::SRL, DL, IntVT, Bitcast, + DAG.getConstant(ShiftAmt, DL, IntVT)); + // Truncate back to original type to allow vnsrl. + SDValue Trunc = DAG.getNode(ISD::TRUNCATE, DL, VT, Shift); + // The exponent contains log2 of the value in biased form. + unsigned ExponentBias = FloatEltVT == MVT::f64 ? 1023 : 127; + + // For trailing zeros, we just need to subtract the bias. + if (Op.getOpcode() == ISD::CTTZ_ZERO_UNDEF) + return DAG.getNode(ISD::SUB, DL, VT, Trunc, + DAG.getConstant(ExponentBias, DL, VT)); + + // For leading zeros, we need to remove the bias and convert from log2 to + // leading zeros. We can do this by subtracting from (Bias + (EltSize - 1)). + unsigned Adjust = ExponentBias + (EltSize - 1); + return DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(Adjust, DL, VT), Trunc); +} + // While RVV has alignment restrictions, we should always be able to load as a // legal equivalently-sized byte-typed vector instead. This method is // responsible for re-expressing a ISD::LOAD via a correctly-aligned type. If @@ -2892,6 +2962,9 @@ return lowerToScalableOp(Op, DAG, RISCVISD::FMAXNUM_VL); case ISD::ABS: return lowerABS(Op, DAG); + case ISD::CTLZ_ZERO_UNDEF: + case ISD::CTTZ_ZERO_UNDEF: + return lowerCTLZ_CTTZ_ZERO_UNDEF(Op, DAG); case ISD::VSELECT: return lowerFixedLengthVectorSelectToRVV(Op, DAG); case ISD::FCOPYSIGN: diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-ctlz.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-ctlz.ll --- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-ctlz.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-ctlz.ll @@ -3,12 +3,17 @@ ; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV64 ; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV32 ; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV64 +; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV32D +; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV64D +; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV32D +; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV64D +; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=8 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX8-RV32D +; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=8 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX8-RV64D -define void @ctlz_v16i8(<16 x i8>* %x, <16 x i8>* %y) { +define void @ctlz_v16i8(<16 x i8>* %x, <16 x i8>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v16i8: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle8.v v25, (a0) ; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 @@ -477,7 +482,6 @@ ; LMULMAX2-RV64-LABEL: ctlz_v16i8: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -32 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX2-RV64-NEXT: vle8.v v25, (a0) ; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 @@ -1000,7 +1004,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v16i8: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle8.v v25, (a0) ; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 @@ -1469,7 +1472,6 @@ ; LMULMAX1-RV64-LABEL: ctlz_v16i8: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -32 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV64-NEXT: vle8.v v25, (a0) ; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 @@ -1988,6 +1990,244 @@ ; LMULMAX1-RV64-NEXT: vse8.v v25, (a0) ; LMULMAX1-RV64-NEXT: addi sp, sp, 32 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v16i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v26, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX2-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v26 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v27, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV32D-NEXT: vmerge.vim v25, v27, 8, v0 +; LMULMAX2-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v16i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v26, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX2-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v26 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v27, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV64D-NEXT: vmerge.vim v25, v27, 8, v0 +; LMULMAX2-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v16i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v26, v25 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v28, v25, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v28, v28, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v28, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v28, v28, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v28, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v27, 8 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vim v25, v26, 8, v0 +; LMULMAX1-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v16i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v26, v25 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v28, v25, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v28, v28, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v28, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v28, v28, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v28, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v27, 8 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vim v25, v26, 8, v0 +; LMULMAX1-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v16i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV32D-NEXT: vrsub.vx v25, v28, a1 +; LMULMAX8-RV32D-NEXT: vmerge.vim v25, v25, 8, v0 +; LMULMAX8-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v16i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV64D-NEXT: vrsub.vx v25, v28, a1 +; LMULMAX8-RV64D-NEXT: vmerge.vim v25, v25, 8, v0 +; LMULMAX8-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <16 x i8>, <16 x i8>* %x %b = load <16 x i8>, <16 x i8>* %y %c = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 false) @@ -1996,11 +2236,10 @@ } declare <16 x i8> @llvm.ctlz.v16i8(<16 x i8>, i1) -define void @ctlz_v8i16(<8 x i16>* %x, <8 x i16>* %y) { +define void @ctlz_v8i16(<8 x i16>* %x, <8 x i16>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v8i16: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle16.v v25, (a0) ; LMULMAX2-RV32-NEXT: vmv.x.s a2, v25 @@ -2247,7 +2486,6 @@ ; LMULMAX2-RV64-LABEL: ctlz_v8i16: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -32 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX2-RV64-NEXT: vle16.v v25, (a0) ; LMULMAX2-RV64-NEXT: vmv.x.s a2, v25 @@ -2532,7 +2770,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v8i16: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle16.v v25, (a0) ; LMULMAX1-RV32-NEXT: vmv.x.s a2, v25 @@ -2779,7 +3016,6 @@ ; LMULMAX1-RV64-LABEL: ctlz_v8i16: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -32 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV64-NEXT: vle16.v v25, (a0) ; LMULMAX1-RV64-NEXT: vmv.x.s a2, v25 @@ -3060,6 +3296,118 @@ ; LMULMAX1-RV64-NEXT: vse16.v v25, (a0) ; LMULMAX1-RV64-NEXT: addi sp, sp, 32 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v8i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV32D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v8i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV64D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v8i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v27, a1, v0 +; LMULMAX1-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v8i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v27, a1, v0 +; LMULMAX1-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v8i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV32D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v8i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV64D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <8 x i16>, <8 x i16>* %x %b = load <8 x i16>, <8 x i16>* %y %c = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 false) @@ -3068,11 +3416,10 @@ } declare <8 x i16> @llvm.ctlz.v8i16(<8 x i16>, i1) -define void @ctlz_v4i32(<4 x i32>* %x, <4 x i32>* %y) { +define void @ctlz_v4i32(<4 x i32>* %x, <4 x i32>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v4i32: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle32.v v25, (a0) ; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 @@ -3197,7 +3544,6 @@ ; LMULMAX2-RV64-LABEL: ctlz_v4i32: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -32 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX2-RV64-NEXT: vle32.v v25, (a0) ; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 @@ -3364,7 +3710,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v4i32: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle32.v v25, (a0) ; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 @@ -3489,7 +3834,6 @@ ; LMULMAX1-RV64-LABEL: ctlz_v4i32: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -32 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV64-NEXT: vle32.v v25, (a0) ; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 @@ -3652,6 +3996,124 @@ ; LMULMAX1-RV64-NEXT: vse32.v v25, (a0) ; LMULMAX1-RV64-NEXT: addi sp, sp, 32 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v4i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v28, v26, a1 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 1054 +; LMULMAX2-RV32D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v4i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v28, v26, a1 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 1054 +; LMULMAX2-RV64D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v4i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 1054 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 2 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v27, a1, v0 +; LMULMAX1-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v4i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 1054 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 2 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v27, a1, v0 +; LMULMAX1-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v4i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v28, v26, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV32D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v4i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v28, v26, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV64D-NEXT: vrsub.vx v26, v28, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <4 x i32>, <4 x i32>* %x %b = load <4 x i32>, <4 x i32>* %y %c = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 false) @@ -3660,11 +4122,10 @@ } declare <4 x i32> @llvm.ctlz.v4i32(<4 x i32>, i1) -define void @ctlz_v2i64(<2 x i64>* %x, <2 x i64>* %y) { +define void @ctlz_v2i64(<2 x i64>* %x, <2 x i64>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v2i64: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle64.v v25, (a0) ; LMULMAX2-RV32-NEXT: sw zero, 28(sp) @@ -3898,7 +4359,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v2i64: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) ; LMULMAX1-RV32-NEXT: sw zero, 28(sp) @@ -4128,6 +4588,705 @@ ; LMULMAX1-RV64-NEXT: vmv.s.x v26, a1 ; LMULMAX1-RV64-NEXT: vse64.v v26, (a0) ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v2i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a1, 4112 +; LMULMAX2-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB3_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB3_3 +; LMULMAX2-RV32D-NEXT: .LBB3_2: +; LMULMAX2-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32D-NEXT: or a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB3_3: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB3_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB3_6 +; LMULMAX2-RV32D-NEXT: .LBB3_5: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB3_6: +; LMULMAX2-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v2i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: lui a3, 21845 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX2-RV64D-NEXT: and a2, a2, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a4, 3855 +; LMULMAX2-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a5, 4112 +; LMULMAX2-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX2-RV64D-NEXT: and a3, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a3, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v2i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV32D-NEXT: lui a1, 349525 +; LMULMAX1-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX1-RV32D-NEXT: lui a1, 209715 +; LMULMAX1-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX1-RV32D-NEXT: lui a1, 61681 +; LMULMAX1-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX1-RV32D-NEXT: lui a1, 4112 +; LMULMAX1-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX1-RV32D-NEXT: bnez a5, .LBB3_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB3_3 +; LMULMAX1-RV32D-NEXT: .LBB3_2: +; LMULMAX1-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX1-RV32D-NEXT: or a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB3_3: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB3_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB3_6 +; LMULMAX1-RV32D-NEXT: .LBB3_5: +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB3_6: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v2i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: lui a3, 21845 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX1-RV64D-NEXT: and a2, a2, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: lui a2, 13107 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: and a4, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a4, a1 +; LMULMAX1-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64D-NEXT: and a3, a3, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX1-RV64D-NEXT: and a3, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a3, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v2i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a1, 4112 +; LMULMAX8-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB3_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB3_3 +; LMULMAX8-RV32D-NEXT: .LBB3_2: +; LMULMAX8-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX8-RV32D-NEXT: or a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB3_3: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB3_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB3_6 +; LMULMAX8-RV32D-NEXT: .LBB3_5: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB3_6: +; LMULMAX8-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v2i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: lui a3, 21845 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX8-RV64D-NEXT: and a2, a2, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a4, 3855 +; LMULMAX8-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a5, 4112 +; LMULMAX8-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX8-RV64D-NEXT: and a3, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a3, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX8-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <2 x i64>, <2 x i64>* %x %b = load <2 x i64>, <2 x i64>* %y %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 false) @@ -4136,17 +5295,13 @@ } declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1) -define void @ctlz_v32i8(<32 x i8>* %x, <32 x i8>* %y) { +define void @ctlz_v32i8(<32 x i8>* %x, <32 x i8>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v32i8: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: addi a6, zero, 32 ; LMULMAX2-RV32-NEXT: vsetvli zero, a6, e8, m2, ta, mu @@ -5068,13 +6223,9 @@ ; LMULMAX2-RV64-LABEL: ctlz_v32i8: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: addi a6, zero, 32 ; LMULMAX2-RV64-NEXT: vsetvli zero, a6, e8, m2, ta, mu @@ -6082,7 +7233,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v32i8: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV32-NEXT: addi a6, a0, 16 ; LMULMAX1-RV32-NEXT: vle8.v v26, (a6) @@ -7003,7 +8153,6 @@ ; LMULMAX1-RV64-LABEL: ctlz_v32i8: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -48 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV64-NEXT: addi a6, a0, 16 ; LMULMAX1-RV64-NEXT: vle8.v v26, (a6) @@ -8006,6 +9155,428 @@ ; LMULMAX1-RV64-NEXT: vse8.v v26, (a6) ; LMULMAX1-RV64-NEXT: addi sp, sp, 48 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v32i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v8, v26, 16 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v8 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 134 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vmv1r.v v28, v30 +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v26 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v28, 16 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV32D-NEXT: vmerge.vim v26, v8, 8, v0 +; LMULMAX2-RV32D-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v32i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v8, v26, 16 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v8 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 134 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv1r.v v28, v30 +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v26 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v28, 16 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV64D-NEXT: vmerge.vim v26, v8, 8, v0 +; LMULMAX2-RV64D-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v32i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle8.v v28, (a1) +; LMULMAX1-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v26, v28 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 134 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v28, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v27 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v28, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v31, v31 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v31, v31, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v31, v31, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v31, v31, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v8, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v8, v31, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v8, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v8, 8 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v28, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vim v28, v30, 8, v0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v25 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v25, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v30, v30, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 8 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vim v25, v27, 8, v0 +; LMULMAX1-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v32i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle8.v v28, (a1) +; LMULMAX1-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v26, v28 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 134 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v28, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v27 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v28, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v31, v31 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v31, v31, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v31, v31, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v31, v31, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v8, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v8, v31, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v8, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v8, 8 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v28, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vim v28, v30, 8, v0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v25 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v25, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v30, v30, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 8 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vim v25, v27, 8, v0 +; LMULMAX1-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v32i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v8, v26 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v8, v28, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV32D-NEXT: vrsub.vx v26, v8, a1 +; LMULMAX8-RV32D-NEXT: vmerge.vim v26, v26, 8, v0 +; LMULMAX8-RV32D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v32i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v8, v26 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v8, v28, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV64D-NEXT: vrsub.vx v26, v8, a1 +; LMULMAX8-RV64D-NEXT: vmerge.vim v26, v26, 8, v0 +; LMULMAX8-RV64D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <32 x i8>, <32 x i8>* %x %b = load <32 x i8>, <32 x i8>* %y %c = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %a, i1 false) @@ -8014,17 +9585,13 @@ } declare <32 x i8> @llvm.ctlz.v32i8(<32 x i8>, i1) -define void @ctlz_v16i16(<16 x i16>* %x, <16 x i16>* %y) { +define void @ctlz_v16i16(<16 x i16>* %x, <16 x i16>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v16i16: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, mu ; LMULMAX2-RV32-NEXT: vle16.v v26, (a0) @@ -8499,13 +10066,9 @@ ; LMULMAX2-RV64-LABEL: ctlz_v16i16: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, mu ; LMULMAX2-RV64-NEXT: vle16.v v26, (a0) @@ -9034,7 +10597,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v16i16: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV32-NEXT: addi a6, a0, 16 ; LMULMAX1-RV32-NEXT: vle16.v v26, (a6) @@ -9509,7 +11071,6 @@ ; LMULMAX1-RV64-LABEL: ctlz_v16i16: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -48 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV64-NEXT: addi a6, a0, 16 ; LMULMAX1-RV64-NEXT: vle16.v v26, (a6) @@ -10034,6 +11595,186 @@ ; LMULMAX1-RV64-NEXT: vse16.v v26, (a6) ; LMULMAX1-RV64-NEXT: addi sp, sp, 48 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v16i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV32D-NEXT: vrsub.vx v28, v25, a1 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV32D-NEXT: vrsub.vx v30, v25, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v28, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v16i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV64D-NEXT: vrsub.vx v28, v25, a1 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV64D-NEXT: vrsub.vx v30, v25, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v28, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v16i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 142 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v30, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v30, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a3, zero, 16 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v29, a3, v0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v29, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v29, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v26, v28, a3, v0 +; LMULMAX1-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vse16.v v25, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v16i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 142 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v30, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v30, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a3, zero, 16 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v29, a3, v0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v29, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v29, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v26, v28, a3, v0 +; LMULMAX1-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vse16.v v25, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v16i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v8, v28, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV32D-NEXT: vrsub.vx v28, v8, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v16i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v8, v28, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV64D-NEXT: vrsub.vx v28, v8, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <16 x i16>, <16 x i16>* %x %b = load <16 x i16>, <16 x i16>* %y %c = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %a, i1 false) @@ -10042,17 +11783,13 @@ } declare <16 x i16> @llvm.ctlz.v16i16(<16 x i16>, i1) -define void @ctlz_v8i32(<8 x i32>* %x, <8 x i32>* %y) { +define void @ctlz_v8i32(<8 x i32>* %x, <8 x i32>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v8i32: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu ; LMULMAX2-RV32-NEXT: vle32.v v26, (a0) @@ -10285,13 +12022,9 @@ ; LMULMAX2-RV64-LABEL: ctlz_v8i32: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, mu ; LMULMAX2-RV64-NEXT: vle32.v v26, (a0) @@ -10586,7 +12319,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v8i32: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV32-NEXT: addi a6, a0, 16 ; LMULMAX1-RV32-NEXT: vle32.v v26, (a6) @@ -10819,7 +12551,6 @@ ; LMULMAX1-RV64-LABEL: ctlz_v8i32: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -48 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV64-NEXT: addi a6, a0, 16 ; LMULMAX1-RV64-NEXT: vle32.v v26, (a6) @@ -11110,6 +12841,192 @@ ; LMULMAX1-RV64-NEXT: vse32.v v26, (a6) ; LMULMAX1-RV64-NEXT: addi sp, sp, 48 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v8i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 1054 +; LMULMAX2-RV32D-NEXT: vrsub.vx v28, v25, a2 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV32D-NEXT: vrsub.vx v30, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v28, 4 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v8i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 1054 +; LMULMAX2-RV64D-NEXT: vrsub.vx v28, v25, a2 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV64D-NEXT: vrsub.vx v30, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v28, 4 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v8i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: addi a3, zero, 1054 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v30, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v30, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 2 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a4, zero, 32 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v29, a4, v0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v29, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v29, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v27, 2 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v26, v28, a4, v0 +; LMULMAX1-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vse32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v8i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: addi a3, zero, 1054 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v30, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v30, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 2 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a4, zero, 32 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v29, a4, v0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v29, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v29, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v27, 2 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v26, v28, a4, v0 +; LMULMAX1-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vse32.v v25, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v8i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v8, v28, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV32D-NEXT: vrsub.vx v28, v8, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v8i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v8, v28, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV64D-NEXT: vrsub.vx v28, v8, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <8 x i32>, <8 x i32>* %x %b = load <8 x i32>, <8 x i32>* %y %c = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %a, i1 false) @@ -11118,17 +13035,13 @@ } declare <8 x i32> @llvm.ctlz.v8i32(<8 x i32>, i1) -define void @ctlz_v4i64(<4 x i64>* %x, <4 x i64>* %y) { +define void @ctlz_v4i64(<4 x i64>* %x, <4 x i64>* %y) nounwind { ; LMULMAX2-RV32-LABEL: ctlz_v4i64: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu ; LMULMAX2-RV32-NEXT: vle64.v v26, (a0) @@ -11387,13 +13300,9 @@ ; LMULMAX2-RV64-LABEL: ctlz_v4i64: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, mu ; LMULMAX2-RV64-NEXT: vle64.v v26, (a0) @@ -11552,7 +13461,6 @@ ; LMULMAX1-RV32-LABEL: ctlz_v4i64: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) ; LMULMAX1-RV32-NEXT: addi a6, a0, 16 @@ -11963,6 +13871,1264 @@ ; LMULMAX1-RV64-NEXT: vse64.v v27, (a0) ; LMULMAX1-RV64-NEXT: vse64.v v26, (a6) ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_v4i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a1, 4112 +; LMULMAX2-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB7_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_3 +; LMULMAX2-RV32D-NEXT: .LBB7_2: +; LMULMAX2-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32D-NEXT: or a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_3: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX2-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB7_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_6 +; LMULMAX2-RV32D-NEXT: .LBB7_5: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_6: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX2-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB7_8 +; LMULMAX2-RV32D-NEXT: # %bb.7: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_9 +; LMULMAX2-RV32D-NEXT: .LBB7_8: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_9: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB7_11 +; LMULMAX2-RV32D-NEXT: # %bb.10: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_12 +; LMULMAX2-RV32D-NEXT: .LBB7_11: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_12: +; LMULMAX2-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_v4i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: not a2, a1 +; LMULMAX2-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64D-NEXT: lui a1, 21845 +; LMULMAX2-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a3, a2 +; LMULMAX2-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64D-NEXT: and a3, a3, a2 +; LMULMAX2-RV64D-NEXT: add a3, a4, a3 +; LMULMAX2-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64D-NEXT: add a4, a3, a4 +; LMULMAX2-RV64D-NEXT: lui a3, 3855 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: and a5, a4, a3 +; LMULMAX2-RV64D-NEXT: lui a4, 4112 +; LMULMAX2-RV64D-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64D-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64D-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64D-NEXT: sd a5, 32(sp) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64D-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV64D-NEXT: srli a1, a5, 1 +; LMULMAX2-RV64D-NEXT: or a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: and a5, a5, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a5, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 56(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: and a5, a5, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a5, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: and a5, a5, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a5, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_v4i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32D-NEXT: vle64.v v26, (a6) +; LMULMAX1-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX1-RV32D-NEXT: addi a7, zero, 32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v27, v26, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32D-NEXT: lui a2, 349525 +; LMULMAX1-RV32D-NEXT: addi a5, a2, 1365 +; LMULMAX1-RV32D-NEXT: lui a2, 209715 +; LMULMAX1-RV32D-NEXT: addi a4, a2, 819 +; LMULMAX1-RV32D-NEXT: lui a2, 61681 +; LMULMAX1-RV32D-NEXT: addi t0, a2, -241 +; LMULMAX1-RV32D-NEXT: lui a2, 4112 +; LMULMAX1-RV32D-NEXT: addi a3, a2, 257 +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB7_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_3 +; LMULMAX1-RV32D-NEXT: .LBB7_2: +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_3: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32D-NEXT: vsrl.vx v27, v26, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32D-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32D-NEXT: bnez a2, .LBB7_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_6 +; LMULMAX1-RV32D-NEXT: .LBB7_5: +; LMULMAX1-RV32D-NEXT: srli a1, a2, 1 +; LMULMAX1-RV32D-NEXT: or a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_6: +; LMULMAX1-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB7_8 +; LMULMAX1-RV32D-NEXT: # %bb.7: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_9 +; LMULMAX1-RV32D-NEXT: .LBB7_8: +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_9: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32D-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32D-NEXT: bnez a2, .LBB7_11 +; LMULMAX1-RV32D-NEXT: # %bb.10: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_12 +; LMULMAX1-RV32D-NEXT: .LBB7_11: +; LMULMAX1-RV32D-NEXT: srli a1, a2, 1 +; LMULMAX1-RV32D-NEXT: or a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_12: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vse64.v v26, (a6) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_v4i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64D-NEXT: vle64.v v27, (a6) +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v27, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: not a3, a2 +; LMULMAX1-RV64D-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64D-NEXT: lui a2, 21845 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64D-NEXT: and a4, a4, a7 +; LMULMAX1-RV64D-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64D-NEXT: lui a3, 13107 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: and a5, a4, a3 +; LMULMAX1-RV64D-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64D-NEXT: and a4, a4, a3 +; LMULMAX1-RV64D-NEXT: add a4, a5, a4 +; LMULMAX1-RV64D-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64D-NEXT: add a5, a4, a5 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a5, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v27, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v27, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v27, (a0) +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a6) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_v4i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a1, 4112 +; LMULMAX8-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB7_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_3 +; LMULMAX8-RV32D-NEXT: .LBB7_2: +; LMULMAX8-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX8-RV32D-NEXT: or a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_3: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX8-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB7_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_6 +; LMULMAX8-RV32D-NEXT: .LBB7_5: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_6: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX8-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB7_8 +; LMULMAX8-RV32D-NEXT: # %bb.7: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_9 +; LMULMAX8-RV32D-NEXT: .LBB7_8: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_9: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB7_11 +; LMULMAX8-RV32D-NEXT: # %bb.10: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_12 +; LMULMAX8-RV32D-NEXT: .LBB7_11: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_12: +; LMULMAX8-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_v4i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: not a2, a1 +; LMULMAX8-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX8-RV64D-NEXT: lui a1, 21845 +; LMULMAX8-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a3, a2 +; LMULMAX8-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX8-RV64D-NEXT: and a3, a3, a2 +; LMULMAX8-RV64D-NEXT: add a3, a4, a3 +; LMULMAX8-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX8-RV64D-NEXT: add a4, a3, a4 +; LMULMAX8-RV64D-NEXT: lui a3, 3855 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: and a5, a4, a3 +; LMULMAX8-RV64D-NEXT: lui a4, 4112 +; LMULMAX8-RV64D-NEXT: addiw a4, a4, 257 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX8-RV64D-NEXT: mul a5, a5, a4 +; LMULMAX8-RV64D-NEXT: srli a5, a5, 56 +; LMULMAX8-RV64D-NEXT: sd a5, 32(sp) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV64D-NEXT: vmv.x.s a5, v28 +; LMULMAX8-RV64D-NEXT: srli a1, a5, 1 +; LMULMAX8-RV64D-NEXT: or a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: and a5, a5, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a5, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 56(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: and a5, a5, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a5, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: and a5, a5, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a5, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV64D-NEXT: ret %a = load <4 x i64>, <4 x i64>* %x %b = load <4 x i64>, <4 x i64>* %y %c = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %a, i1 false) @@ -11970,3 +15136,14988 @@ ret void } declare <4 x i64> @llvm.ctlz.v4i64(<4 x i64>, i1) + +define void @ctlz_zero_undef_v16i8(<16 x i8>* %x, <16 x i8>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a2, a1 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: lui a4, 4112 +; LMULMAX2-RV32-NEXT: addi a4, a4, 257 +; LMULMAX2-RV32-NEXT: mul a5, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a5, 24 +; LMULMAX2-RV32-NEXT: addi a5, a5, -24 +; LMULMAX2-RV32-NEXT: sb a5, 16(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32-NEXT: andi a5, a5, 255 +; LMULMAX2-RV32-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32-NEXT: or a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 31(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 30(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 29(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 28(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 27(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 26(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 25(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 24(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 23(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 22(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 21(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 20(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 19(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 18(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 17(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle8.v v25, (a1) +; LMULMAX2-RV32-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a2, a1 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: addiw a5, a5, -56 +; LMULMAX2-RV64-NEXT: sb a5, 16(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV64-NEXT: andi a5, a5, 255 +; LMULMAX2-RV64-NEXT: srli a1, a5, 1 +; LMULMAX2-RV64-NEXT: or a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 31(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 30(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 29(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 28(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 27(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 26(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 25(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 24(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 23(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 22(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 21(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 20(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 19(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 18(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 17(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 16 +; LMULMAX2-RV64-NEXT: vle8.v v25, (a1) +; LMULMAX2-RV64-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV64-NEXT: addi sp, sp, 32 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a2, a1 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV32-NEXT: and a3, a3, a6 +; LMULMAX1-RV32-NEXT: sub a3, a2, a3 +; LMULMAX1-RV32-NEXT: lui a2, 209715 +; LMULMAX1-RV32-NEXT: addi a2, a2, 819 +; LMULMAX1-RV32-NEXT: and a4, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a3, 2 +; LMULMAX1-RV32-NEXT: and a3, a3, a2 +; LMULMAX1-RV32-NEXT: add a3, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 4 +; LMULMAX1-RV32-NEXT: add a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 61681 +; LMULMAX1-RV32-NEXT: addi a3, a3, -241 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: lui a4, 4112 +; LMULMAX1-RV32-NEXT: addi a4, a4, 257 +; LMULMAX1-RV32-NEXT: mul a5, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a5, 24 +; LMULMAX1-RV32-NEXT: addi a5, a5, -24 +; LMULMAX1-RV32-NEXT: sb a5, 16(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV32-NEXT: andi a5, a5, 255 +; LMULMAX1-RV32-NEXT: srli a1, a5, 1 +; LMULMAX1-RV32-NEXT: or a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 31(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 29(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 27(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 25(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 23(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 21(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 19(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 18(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 17(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV32-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -32 +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a2, a1 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: lui a1, 21845 +; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV64-NEXT: and a3, a3, a6 +; LMULMAX1-RV64-NEXT: sub a3, a2, a3 +; LMULMAX1-RV64-NEXT: lui a2, 13107 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: and a4, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a3, 2 +; LMULMAX1-RV64-NEXT: and a3, a3, a2 +; LMULMAX1-RV64-NEXT: add a3, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 4 +; LMULMAX1-RV64-NEXT: add a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 3855 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: lui a4, 4112 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: mul a5, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a5, 56 +; LMULMAX1-RV64-NEXT: addiw a5, a5, -56 +; LMULMAX1-RV64-NEXT: sb a5, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV64-NEXT: andi a5, a5, 255 +; LMULMAX1-RV64-NEXT: srli a1, a5, 1 +; LMULMAX1-RV64-NEXT: or a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 31(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 29(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 27(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 25(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 23(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 21(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 19(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 18(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 17(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV64-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64-NEXT: addi sp, sp, 32 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v26, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX2-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v27, v25, 8 +; LMULMAX2-RV32D-NEXT: vse8.v v27, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v26, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX2-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v27, v25, 8 +; LMULMAX2-RV64D-NEXT: vse8.v v27, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v26, v25 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v28, v28, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v25, v28 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v27, 8 +; LMULMAX1-RV32D-NEXT: vse8.v v26, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v26, v25 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v25, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v28, v28, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v25, v28 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v27, 8 +; LMULMAX1-RV64D-NEXT: vse8.v v26, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v25, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX8-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v16i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v25, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX8-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <16 x i8>, <16 x i8>* %x + %b = load <16 x i8>, <16 x i8>* %y + %c = call <16 x i8> @llvm.ctlz.v16i8(<16 x i8> %a, i1 true) + store <16 x i8> %c, <16 x i8>* %x + ret void +} + +define void @ctlz_zero_undef_v8i16(<8 x i16>* %x, <8 x i16>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a2, v25 +; LMULMAX2-RV32-NEXT: lui a1, 16 +; LMULMAX2-RV32-NEXT: addi a6, a1, -1 +; LMULMAX2-RV32-NEXT: and a2, a2, a6 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 2 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 4 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 8 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 16 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: not a3, a2 +; LMULMAX2-RV32-NEXT: srli a4, a3, 1 +; LMULMAX2-RV32-NEXT: lui a2, 349525 +; LMULMAX2-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV32-NEXT: and a4, a4, a7 +; LMULMAX2-RV32-NEXT: sub a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a3, 819 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a4, 2 +; LMULMAX2-RV32-NEXT: and a4, a4, a3 +; LMULMAX2-RV32-NEXT: add a4, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a4, 4 +; LMULMAX2-RV32-NEXT: add a5, a4, a5 +; LMULMAX2-RV32-NEXT: lui a4, 61681 +; LMULMAX2-RV32-NEXT: addi a4, a4, -241 +; LMULMAX2-RV32-NEXT: and a1, a5, a4 +; LMULMAX2-RV32-NEXT: lui a5, 4112 +; LMULMAX2-RV32-NEXT: addi a5, a5, 257 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 16(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 30(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 28(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 26(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 24(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 22(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 20(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 18(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle16.v v25, (a1) +; LMULMAX2-RV32-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV64-NEXT: vmv.x.s a2, v25 +; LMULMAX2-RV64-NEXT: lui a1, 16 +; LMULMAX2-RV64-NEXT: addiw a6, a1, -1 +; LMULMAX2-RV64-NEXT: and a2, a2, a6 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 2 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 4 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 8 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 16 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 32 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: not a3, a2 +; LMULMAX2-RV64-NEXT: srli a4, a3, 1 +; LMULMAX2-RV64-NEXT: lui a2, 21845 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV64-NEXT: and a4, a4, a7 +; LMULMAX2-RV64-NEXT: sub a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 13107 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a4, 2 +; LMULMAX2-RV64-NEXT: and a4, a4, a3 +; LMULMAX2-RV64-NEXT: add a4, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a4, 4 +; LMULMAX2-RV64-NEXT: add a5, a4, a5 +; LMULMAX2-RV64-NEXT: lui a4, 3855 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: and a1, a5, a4 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 16(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 30(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 28(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 26(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 24(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 22(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 20(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 18(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 16 +; LMULMAX2-RV64-NEXT: vle16.v v25, (a1) +; LMULMAX2-RV64-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV64-NEXT: addi sp, sp, 32 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV32-NEXT: lui a1, 16 +; LMULMAX1-RV32-NEXT: addi a6, a1, -1 +; LMULMAX1-RV32-NEXT: and a2, a2, a6 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a3, a2 +; LMULMAX1-RV32-NEXT: srli a4, a3, 1 +; LMULMAX1-RV32-NEXT: lui a2, 349525 +; LMULMAX1-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV32-NEXT: and a4, a4, a7 +; LMULMAX1-RV32-NEXT: sub a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a3, 819 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a4, 2 +; LMULMAX1-RV32-NEXT: and a4, a4, a3 +; LMULMAX1-RV32-NEXT: add a4, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a4, 4 +; LMULMAX1-RV32-NEXT: add a5, a4, a5 +; LMULMAX1-RV32-NEXT: lui a4, 61681 +; LMULMAX1-RV32-NEXT: addi a4, a4, -241 +; LMULMAX1-RV32-NEXT: and a1, a5, a4 +; LMULMAX1-RV32-NEXT: lui a5, 4112 +; LMULMAX1-RV32-NEXT: addi a5, a5, 257 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 16(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: and a1, a1, a6 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: and a1, a1, a6 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: and a1, a1, a6 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: and a1, a1, a6 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: and a1, a1, a6 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: and a1, a1, a6 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: and a1, a1, a6 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 18(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -32 +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV64-NEXT: lui a1, 16 +; LMULMAX1-RV64-NEXT: addiw a6, a1, -1 +; LMULMAX1-RV64-NEXT: and a2, a2, a6 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a3, a2 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: and a1, a1, a6 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: and a1, a1, a6 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: and a1, a1, a6 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: and a1, a1, a6 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: and a1, a1, a6 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: and a1, a1, a6 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: and a1, a1, a6 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 18(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV64-NEXT: addi sp, sp, 32 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX2-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX2-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v25, 4 +; LMULMAX1-RV32D-NEXT: vse16.v v27, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v25, 4 +; LMULMAX1-RV64D-NEXT: vse16.v v27, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX8-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v8i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX8-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <8 x i16>, <8 x i16>* %x + %b = load <8 x i16>, <8 x i16>* %y + %c = call <8 x i16> @llvm.ctlz.v8i16(<8 x i16> %a, i1 true) + store <8 x i16> %c, <8 x i16>* %x + ret void +} + +define void @ctlz_zero_undef_v4i32(<4 x i32>* %x, <4 x i32>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a2, a1 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: lui a4, 4112 +; LMULMAX2-RV32-NEXT: addi a4, a4, 257 +; LMULMAX2-RV32-NEXT: mul a5, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a5, 24 +; LMULMAX2-RV32-NEXT: sw a5, 16(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32-NEXT: or a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 28(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 20(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a2, a1 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: addiw a5, a5, -32 +; LMULMAX2-RV64-NEXT: sw a5, 16(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV64-NEXT: srliw a1, a5, 1 +; LMULMAX2-RV64-NEXT: slli a5, a5, 32 +; LMULMAX2-RV64-NEXT: srli a5, a5, 32 +; LMULMAX2-RV64-NEXT: or a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 28(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 24(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 20(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 16 +; LMULMAX2-RV64-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV64-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV64-NEXT: addi sp, sp, 32 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a2, a1 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV32-NEXT: and a3, a3, a6 +; LMULMAX1-RV32-NEXT: sub a3, a2, a3 +; LMULMAX1-RV32-NEXT: lui a2, 209715 +; LMULMAX1-RV32-NEXT: addi a2, a2, 819 +; LMULMAX1-RV32-NEXT: and a4, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a3, 2 +; LMULMAX1-RV32-NEXT: and a3, a3, a2 +; LMULMAX1-RV32-NEXT: add a3, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 4 +; LMULMAX1-RV32-NEXT: add a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 61681 +; LMULMAX1-RV32-NEXT: addi a3, a3, -241 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: lui a4, 4112 +; LMULMAX1-RV32-NEXT: addi a4, a4, 257 +; LMULMAX1-RV32-NEXT: mul a5, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a5, 24 +; LMULMAX1-RV32-NEXT: sw a5, 16(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV32-NEXT: srli a1, a5, 1 +; LMULMAX1-RV32-NEXT: or a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 20(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -32 +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a2, a1 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: lui a1, 21845 +; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV64-NEXT: and a3, a3, a6 +; LMULMAX1-RV64-NEXT: sub a3, a2, a3 +; LMULMAX1-RV64-NEXT: lui a2, 13107 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: and a4, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a3, 2 +; LMULMAX1-RV64-NEXT: and a3, a3, a2 +; LMULMAX1-RV64-NEXT: add a3, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 4 +; LMULMAX1-RV64-NEXT: add a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 3855 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: lui a4, 4112 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: mul a5, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a5, 56 +; LMULMAX1-RV64-NEXT: addiw a5, a5, -32 +; LMULMAX1-RV64-NEXT: sw a5, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV64-NEXT: srliw a1, a5, 1 +; LMULMAX1-RV64-NEXT: slli a5, a5, 32 +; LMULMAX1-RV64-NEXT: srli a5, a5, 32 +; LMULMAX1-RV64-NEXT: or a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a5 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 20(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV64-NEXT: addi sp, sp, 32 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 1054 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX2-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 1054 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX2-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 1054 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v25, 2 +; LMULMAX1-RV32D-NEXT: vse32.v v27, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 1054 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v25, 2 +; LMULMAX1-RV64D-NEXT: vse32.v v27, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV32D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX8-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v4i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV64D-NEXT: vrsub.vx v25, v25, a1 +; LMULMAX8-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <4 x i32>, <4 x i32>* %x + %b = load <4 x i32>, <4 x i32>* %y + %c = call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %a, i1 true) + store <4 x i32> %c, <4 x i32>* %x + ret void +} + +define void @ctlz_zero_undef_v2i64(<2 x i64>* %x, <2 x i64>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV32-NEXT: sw zero, 28(sp) +; LMULMAX2-RV32-NEXT: sw zero, 20(sp) +; LMULMAX2-RV32-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32-NEXT: lui a1, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32-NEXT: lui a1, 61681 +; LMULMAX2-RV32-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32-NEXT: lui a1, 4112 +; LMULMAX2-RV32-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32-NEXT: bnez a5, .LBB11_2 +; LMULMAX2-RV32-NEXT: # %bb.1: +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB11_3 +; LMULMAX2-RV32-NEXT: .LBB11_2: +; LMULMAX2-RV32-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32-NEXT: or a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB11_3: +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: sw a5, 16(sp) +; LMULMAX2-RV32-NEXT: bnez a1, .LBB11_5 +; LMULMAX2-RV32-NEXT: # %bb.4: +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB11_6 +; LMULMAX2-RV32-NEXT: .LBB11_5: +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB11_6: +; LMULMAX2-RV32-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32-NEXT: vse64.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: lui a3, 21845 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 1365 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a6, a3, 1365 +; LMULMAX2-RV64-NEXT: and a2, a2, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a4 +; LMULMAX2-RV64-NEXT: lui a4, 3855 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64-NEXT: vmv.v.x v26, a1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a3 +; LMULMAX2-RV64-NEXT: srli a3, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a3 +; LMULMAX2-RV64-NEXT: srli a3, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a3 +; LMULMAX2-RV64-NEXT: srli a3, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a3 +; LMULMAX2-RV64-NEXT: srli a3, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a3 +; LMULMAX2-RV64-NEXT: srli a3, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a3 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a3 +; LMULMAX2-RV64-NEXT: and a3, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a3, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX2-RV64-NEXT: vmv.s.x v26, a1 +; LMULMAX2-RV64-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a4, a1, 1365 +; LMULMAX1-RV32-NEXT: lui a1, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a1, 819 +; LMULMAX1-RV32-NEXT: lui a1, 61681 +; LMULMAX1-RV32-NEXT: addi a7, a1, -241 +; LMULMAX1-RV32-NEXT: lui a1, 4112 +; LMULMAX1-RV32-NEXT: addi a2, a1, 257 +; LMULMAX1-RV32-NEXT: bnez a5, .LBB11_2 +; LMULMAX1-RV32-NEXT: # %bb.1: +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a5, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB11_3 +; LMULMAX1-RV32-NEXT: .LBB11_2: +; LMULMAX1-RV32-NEXT: srli a1, a5, 1 +; LMULMAX1-RV32-NEXT: or a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a5, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB11_3: +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: sw a5, 16(sp) +; LMULMAX1-RV32-NEXT: bnez a1, .LBB11_5 +; LMULMAX1-RV32-NEXT: # %bb.4: +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a4, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a4, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a3 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB11_6 +; LMULMAX1-RV32-NEXT: .LBB11_5: +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a5 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a4, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a4, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a3 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB11_6: +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: lui a3, 21845 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a6, a3, 1365 +; LMULMAX1-RV64-NEXT: and a2, a2, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: lui a2, 13107 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: and a4, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a4, a1 +; LMULMAX1-RV64-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a4 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a3 +; LMULMAX1-RV64-NEXT: and a3, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a3, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a1, 4112 +; LMULMAX2-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB11_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB11_3 +; LMULMAX2-RV32D-NEXT: .LBB11_2: +; LMULMAX2-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32D-NEXT: or a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB11_3: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB11_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB11_6 +; LMULMAX2-RV32D-NEXT: .LBB11_5: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB11_6: +; LMULMAX2-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: lui a3, 21845 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX2-RV64D-NEXT: and a2, a2, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a4, 3855 +; LMULMAX2-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a5, 4112 +; LMULMAX2-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a3 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX2-RV64D-NEXT: and a3, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a3, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV32D-NEXT: lui a1, 349525 +; LMULMAX1-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX1-RV32D-NEXT: lui a1, 209715 +; LMULMAX1-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX1-RV32D-NEXT: lui a1, 61681 +; LMULMAX1-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX1-RV32D-NEXT: lui a1, 4112 +; LMULMAX1-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX1-RV32D-NEXT: bnez a5, .LBB11_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB11_3 +; LMULMAX1-RV32D-NEXT: .LBB11_2: +; LMULMAX1-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX1-RV32D-NEXT: or a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB11_3: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB11_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB11_6 +; LMULMAX1-RV32D-NEXT: .LBB11_5: +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a5 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB11_6: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: lui a3, 21845 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX1-RV64D-NEXT: and a2, a2, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: lui a2, 13107 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: and a4, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a4, a1 +; LMULMAX1-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a3 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64D-NEXT: and a3, a3, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX1-RV64D-NEXT: and a3, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a3, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a1, 4112 +; LMULMAX8-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB11_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB11_3 +; LMULMAX8-RV32D-NEXT: .LBB11_2: +; LMULMAX8-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX8-RV32D-NEXT: or a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB11_3: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB11_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB11_6 +; LMULMAX8-RV32D-NEXT: .LBB11_5: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB11_6: +; LMULMAX8-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v2i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: lui a3, 21845 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX8-RV64D-NEXT: and a2, a2, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a4, 3855 +; LMULMAX8-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a5, 4112 +; LMULMAX8-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a3 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX8-RV64D-NEXT: and a3, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a3, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX8-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <2 x i64>, <2 x i64>* %x + %b = load <2 x i64>, <2 x i64>* %y + %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 true) + store <2 x i64> %c, <2 x i64>* %x + ret void +} + +define void @ctlz_zero_undef_v32i8(<32 x i8>* %x, <32 x i8>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX2-RV32-NEXT: andi a2, a2, 255 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 2 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 4 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 8 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 16 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: not a3, a2 +; LMULMAX2-RV32-NEXT: srli a4, a3, 1 +; LMULMAX2-RV32-NEXT: lui a2, 349525 +; LMULMAX2-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV32-NEXT: and a4, a4, a7 +; LMULMAX2-RV32-NEXT: sub a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a3, 819 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a4, 2 +; LMULMAX2-RV32-NEXT: and a4, a4, a3 +; LMULMAX2-RV32-NEXT: add a4, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a4, 4 +; LMULMAX2-RV32-NEXT: add a5, a4, a5 +; LMULMAX2-RV32-NEXT: lui a4, 61681 +; LMULMAX2-RV32-NEXT: addi a4, a4, -241 +; LMULMAX2-RV32-NEXT: and a1, a5, a4 +; LMULMAX2-RV32-NEXT: lui a5, 4112 +; LMULMAX2-RV32-NEXT: addi a5, a5, 257 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 32(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e8, m2, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 31 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 63(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 30 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 62(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 29 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 61(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 28 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 60(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 27 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 59(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 26 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 58(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 25 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 57(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 24 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 56(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 23 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 55(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 22 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 54(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 21 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 53(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 20 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 52(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 19 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 51(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 18 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 50(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 17 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 49(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 16 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 48(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 47(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 46(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 45(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 44(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 43(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 42(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 41(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 40(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 39(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 38(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 37(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 36(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 35(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 34(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: andi a1, a1, 255 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -24 +; LMULMAX2-RV32-NEXT: sb a1, 33(sp) +; LMULMAX2-RV32-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle8.v v26, (a1) +; LMULMAX2-RV32-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: addi a6, zero, 32 +; LMULMAX2-RV64-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX2-RV64-NEXT: andi a2, a2, 255 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 2 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 4 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 8 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 16 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 32 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: not a3, a2 +; LMULMAX2-RV64-NEXT: srli a4, a3, 1 +; LMULMAX2-RV64-NEXT: lui a2, 21845 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV64-NEXT: and a4, a4, a7 +; LMULMAX2-RV64-NEXT: sub a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 13107 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a4, 2 +; LMULMAX2-RV64-NEXT: and a4, a4, a3 +; LMULMAX2-RV64-NEXT: add a4, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a4, 4 +; LMULMAX2-RV64-NEXT: add a5, a4, a5 +; LMULMAX2-RV64-NEXT: lui a4, 3855 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: and a1, a5, a4 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 32(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e8, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 31 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 63(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 30 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 62(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 29 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 61(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 28 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 60(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 27 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 59(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 26 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 58(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 25 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 57(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 24 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 23 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 55(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 22 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 54(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 21 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 53(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 20 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 52(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 19 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 51(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 18 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 50(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 17 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 49(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 16 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 47(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 46(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 45(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 44(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 43(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 42(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 41(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 40(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 39(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 38(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 37(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 36(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 35(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 34(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: andi a1, a1, 255 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX2-RV64-NEXT: sb a1, 33(sp) +; LMULMAX2-RV64-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle8.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32-NEXT: vle8.v v26, (a6) +; LMULMAX1-RV32-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: andi a2, a2, 255 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a3, a2 +; LMULMAX1-RV32-NEXT: srli a4, a3, 1 +; LMULMAX1-RV32-NEXT: lui a2, 349525 +; LMULMAX1-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV32-NEXT: and a4, a4, a7 +; LMULMAX1-RV32-NEXT: sub a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a3, 819 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a4, 2 +; LMULMAX1-RV32-NEXT: and a4, a4, a3 +; LMULMAX1-RV32-NEXT: add a4, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a4, 4 +; LMULMAX1-RV32-NEXT: add a5, a4, a5 +; LMULMAX1-RV32-NEXT: lui a4, 61681 +; LMULMAX1-RV32-NEXT: addi a4, a4, -241 +; LMULMAX1-RV32-NEXT: and a1, a5, a4 +; LMULMAX1-RV32-NEXT: lui a5, 4112 +; LMULMAX1-RV32-NEXT: addi a5, a5, 257 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 32(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 15 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 47(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 14 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 46(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 13 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 45(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 12 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 44(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 11 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 43(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 10 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 42(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 9 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 41(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 8 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 40(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 39(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 38(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 37(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 36(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 35(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 34(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 33(sp) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 16(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 31(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 29(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 27(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 25(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 23(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 21(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 19(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 18(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: andi a1, a1, 255 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -24 +; LMULMAX1-RV32-NEXT: sb a1, 17(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle8.v v26, (a1) +; LMULMAX1-RV32-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse8.v v26, (a6) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -48 +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle8.v v26, (a6) +; LMULMAX1-RV64-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: andi a2, a2, 255 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a3, a2 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 32(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 15 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 47(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 14 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 46(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 13 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 45(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 12 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 44(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 11 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 43(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 10 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 42(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 9 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 41(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 8 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 40(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 39(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 38(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 37(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 36(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 35(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 34(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 33(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 16(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 31(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 29(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 27(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 25(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 23(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 21(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 19(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 18(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: andi a1, a1, 255 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -56 +; LMULMAX1-RV64-NEXT: sb a1, 17(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV64-NEXT: addi a1, sp, 32 +; LMULMAX1-RV64-NEXT: vle8.v v26, (a1) +; LMULMAX1-RV64-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64-NEXT: vse8.v v26, (a6) +; LMULMAX1-RV64-NEXT: addi sp, sp, 48 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v30, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v8, v30, 16 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v26, v8 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 134 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vmv1r.v v26, v28 +; LMULMAX2-RV32D-NEXT: vslideup.vi v26, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v26, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v30 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v30, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v30, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v26, 16 +; LMULMAX2-RV32D-NEXT: vse8.v v30, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v30, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v8, v30, 16 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v26, v8 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 134 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv1r.v v26, v28 +; LMULMAX2-RV64D-NEXT: vslideup.vi v26, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v26, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v30 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v30, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v30, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v26, 16 +; LMULMAX2-RV64D-NEXT: vse8.v v30, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle8.v v29, (a1) +; LMULMAX1-RV32D-NEXT: vle8.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v25, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v25, v25 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 134 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v25 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v28, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v28 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v29, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v30, v30, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v31, v25 +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v31, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v25 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v25, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v25, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v25, 8 +; LMULMAX1-RV32D-NEXT: vse8.v v27, (a0) +; LMULMAX1-RV32D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle8.v v29, (a1) +; LMULMAX1-RV64D-NEXT: vle8.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v25, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v25, v25 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 134 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v25 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v28, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v28 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v29, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v30, v30, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v31, v25 +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v31, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v25 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v26, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v25, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: vrsub.vx v26, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v25, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v25, 8 +; LMULMAX1-RV64D-NEXT: vse8.v v27, (a0) +; LMULMAX1-RV64D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v8, v26 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v32i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v8, v26 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 134 +; LMULMAX8-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <32 x i8>, <32 x i8>* %x + %b = load <32 x i8>, <32 x i8>* %y + %c = call <32 x i8> @llvm.ctlz.v32i8(<32 x i8> %a, i1 true) + store <32 x i8> %c, <32 x i8>* %x + ret void +} + +define void @ctlz_zero_undef_v16i16(<16 x i16>* %x, <16 x i16>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX2-RV32-NEXT: lui a1, 16 +; LMULMAX2-RV32-NEXT: addi a6, a1, -1 +; LMULMAX2-RV32-NEXT: and a2, a2, a6 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 2 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 4 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 8 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: srli a3, a2, 16 +; LMULMAX2-RV32-NEXT: or a2, a2, a3 +; LMULMAX2-RV32-NEXT: not a3, a2 +; LMULMAX2-RV32-NEXT: srli a4, a3, 1 +; LMULMAX2-RV32-NEXT: lui a2, 349525 +; LMULMAX2-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV32-NEXT: and a4, a4, a7 +; LMULMAX2-RV32-NEXT: sub a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a3, 819 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a4, 2 +; LMULMAX2-RV32-NEXT: and a4, a4, a3 +; LMULMAX2-RV32-NEXT: add a4, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a4, 4 +; LMULMAX2-RV32-NEXT: add a5, a4, a5 +; LMULMAX2-RV32-NEXT: lui a4, 61681 +; LMULMAX2-RV32-NEXT: addi a4, a4, -241 +; LMULMAX2-RV32-NEXT: and a1, a5, a4 +; LMULMAX2-RV32-NEXT: lui a5, 4112 +; LMULMAX2-RV32-NEXT: addi a5, a5, 257 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 32(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e16, m2, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 62(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 60(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 58(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 56(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 54(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 52(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 50(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 48(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 46(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 44(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 42(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 40(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 38(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 36(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: and a1, a1, a6 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, -16 +; LMULMAX2-RV32-NEXT: sh a1, 34(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle16.v v26, (a1) +; LMULMAX2-RV32-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX2-RV64-NEXT: lui a1, 16 +; LMULMAX2-RV64-NEXT: addiw a6, a1, -1 +; LMULMAX2-RV64-NEXT: and a2, a2, a6 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 2 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 4 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 8 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 16 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: srli a3, a2, 32 +; LMULMAX2-RV64-NEXT: or a2, a2, a3 +; LMULMAX2-RV64-NEXT: not a3, a2 +; LMULMAX2-RV64-NEXT: srli a4, a3, 1 +; LMULMAX2-RV64-NEXT: lui a2, 21845 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV64-NEXT: and a4, a4, a7 +; LMULMAX2-RV64-NEXT: sub a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 13107 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a4, 2 +; LMULMAX2-RV64-NEXT: and a4, a4, a3 +; LMULMAX2-RV64-NEXT: add a4, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a4, 4 +; LMULMAX2-RV64-NEXT: add a5, a4, a5 +; LMULMAX2-RV64-NEXT: lui a4, 3855 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: and a1, a5, a4 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 32(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e16, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 62(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 60(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 58(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 54(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 52(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 50(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 46(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 44(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 42(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 40(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 38(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 36(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: and a1, a1, a6 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX2-RV64-NEXT: sh a1, 34(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle16.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32-NEXT: vle16.v v26, (a6) +; LMULMAX1-RV32-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: lui a2, 16 +; LMULMAX1-RV32-NEXT: addi a7, a2, -1 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: srli a3, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a3, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a3, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a3, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a3 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a4, a1, 1 +; LMULMAX1-RV32-NEXT: lui a3, 349525 +; LMULMAX1-RV32-NEXT: addi t0, a3, 1365 +; LMULMAX1-RV32-NEXT: and a4, a4, t0 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: lui a4, 209715 +; LMULMAX1-RV32-NEXT: addi a4, a4, 819 +; LMULMAX1-RV32-NEXT: and a5, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: lui a5, 61681 +; LMULMAX1-RV32-NEXT: addi a5, a5, -241 +; LMULMAX1-RV32-NEXT: and a2, a1, a5 +; LMULMAX1-RV32-NEXT: lui a1, 4112 +; LMULMAX1-RV32-NEXT: addi a1, a1, 257 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 32(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 46(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 44(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 42(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 40(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 38(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 36(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 34(sp) +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 16(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a2, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a2, 24 +; LMULMAX1-RV32-NEXT: addi a2, a2, -16 +; LMULMAX1-RV32-NEXT: sh a2, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: and a3, a3, t0 +; LMULMAX1-RV32-NEXT: sub a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a3, a2, a4 +; LMULMAX1-RV32-NEXT: srli a2, a2, 2 +; LMULMAX1-RV32-NEXT: and a2, a2, a4 +; LMULMAX1-RV32-NEXT: add a2, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: add a2, a2, a3 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: mul a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, -16 +; LMULMAX1-RV32-NEXT: sh a1, 18(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle16.v v26, (a1) +; LMULMAX1-RV32-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse16.v v26, (a6) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -48 +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle16.v v26, (a6) +; LMULMAX1-RV64-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: lui a2, 16 +; LMULMAX1-RV64-NEXT: addiw a7, a2, -1 +; LMULMAX1-RV64-NEXT: and a1, a1, a7 +; LMULMAX1-RV64-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a3 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a4, a1, 1 +; LMULMAX1-RV64-NEXT: lui a3, 21845 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi t0, a3, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, t0 +; LMULMAX1-RV64-NEXT: sub a1, a1, a4 +; LMULMAX1-RV64-NEXT: lui a4, 13107 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 819 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 819 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 819 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 819 +; LMULMAX1-RV64-NEXT: and a5, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: lui a5, 3855 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 241 +; LMULMAX1-RV64-NEXT: slli a5, a5, 12 +; LMULMAX1-RV64-NEXT: addi a5, a5, -241 +; LMULMAX1-RV64-NEXT: slli a5, a5, 12 +; LMULMAX1-RV64-NEXT: addi a5, a5, 241 +; LMULMAX1-RV64-NEXT: slli a5, a5, 12 +; LMULMAX1-RV64-NEXT: addi a5, a5, -241 +; LMULMAX1-RV64-NEXT: and a2, a1, a5 +; LMULMAX1-RV64-NEXT: lui a1, 4112 +; LMULMAX1-RV64-NEXT: addiw a1, a1, 257 +; LMULMAX1-RV64-NEXT: slli a1, a1, 16 +; LMULMAX1-RV64-NEXT: addi a1, a1, 257 +; LMULMAX1-RV64-NEXT: slli a1, a1, 16 +; LMULMAX1-RV64-NEXT: addi a1, a1, 257 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 32(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 46(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 44(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 42(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 40(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 38(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 36(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 34(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 16(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a2, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a2, 56 +; LMULMAX1-RV64-NEXT: addiw a2, a2, -48 +; LMULMAX1-RV64-NEXT: sh a2, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, t0 +; LMULMAX1-RV64-NEXT: sub a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a3, a2, a4 +; LMULMAX1-RV64-NEXT: srli a2, a2, 2 +; LMULMAX1-RV64-NEXT: and a2, a2, a4 +; LMULMAX1-RV64-NEXT: add a2, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: add a2, a2, a3 +; LMULMAX1-RV64-NEXT: and a2, a2, a5 +; LMULMAX1-RV64-NEXT: mul a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -48 +; LMULMAX1-RV64-NEXT: sh a1, 18(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64-NEXT: addi a1, sp, 32 +; LMULMAX1-RV64-NEXT: vle16.v v26, (a1) +; LMULMAX1-RV64-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV64-NEXT: vse16.v v26, (a6) +; LMULMAX1-RV64-NEXT: addi sp, sp, 48 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV32D-NEXT: vrsub.vx v28, v25, a1 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV32D-NEXT: vrsub.vx v26, v25, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v28, 8 +; LMULMAX2-RV32D-NEXT: vse16.v v30, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX2-RV64D-NEXT: vrsub.vx v28, v25, a1 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV64D-NEXT: vrsub.vx v26, v25, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v28, 8 +; LMULMAX2-RV64D-NEXT: vse16.v v30, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 142 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v27, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v25, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v25, 4 +; LMULMAX1-RV32D-NEXT: vse16.v v28, (a0) +; LMULMAX1-RV32D-NEXT: vse16.v v29, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 142 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v27, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v25, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v25, 4 +; LMULMAX1-RV64D-NEXT: vse16.v v28, (a0) +; LMULMAX1-RV64D-NEXT: vse16.v v29, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v16i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 142 +; LMULMAX8-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <16 x i16>, <16 x i16>* %x + %b = load <16 x i16>, <16 x i16>* %y + %c = call <16 x i16> @llvm.ctlz.v16i16(<16 x i16> %a, i1 true) + store <16 x i16> %c, <16 x i16>* %x + ret void +} + +define void @ctlz_zero_undef_v8i32(<8 x i32>* %x, <8 x i32>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a2 +; LMULMAX2-RV32-NEXT: not a2, a1 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: lui a4, 4112 +; LMULMAX2-RV32-NEXT: addi a4, a4, 257 +; LMULMAX2-RV32-NEXT: mul a5, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a5, 24 +; LMULMAX2-RV32-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32-NEXT: or a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 60(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 56(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 52(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 48(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 44(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 36(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a2, a1 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: addiw a5, a5, -32 +; LMULMAX2-RV64-NEXT: sw a5, 32(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e32, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV64-NEXT: srliw a1, a5, 1 +; LMULMAX2-RV64-NEXT: slli a5, a5, 32 +; LMULMAX2-RV64-NEXT: srli a5, a5, 32 +; LMULMAX2-RV64-NEXT: or a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 60(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 52(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 44(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 40(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: srliw a5, a1, 1 +; LMULMAX2-RV64-NEXT: slli a1, a1, 32 +; LMULMAX2-RV64-NEXT: srli a1, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX2-RV64-NEXT: sw a1, 36(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32-NEXT: vle32.v v26, (a6) +; LMULMAX1-RV32-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 2 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 4 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 8 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: srli a3, a2, 16 +; LMULMAX1-RV32-NEXT: or a2, a2, a3 +; LMULMAX1-RV32-NEXT: not a3, a2 +; LMULMAX1-RV32-NEXT: srli a4, a3, 1 +; LMULMAX1-RV32-NEXT: lui a2, 349525 +; LMULMAX1-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV32-NEXT: and a4, a4, a7 +; LMULMAX1-RV32-NEXT: sub a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a3, 819 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a4, 2 +; LMULMAX1-RV32-NEXT: and a4, a4, a3 +; LMULMAX1-RV32-NEXT: add a4, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a4, 4 +; LMULMAX1-RV32-NEXT: add a5, a4, a5 +; LMULMAX1-RV32-NEXT: lui a4, 61681 +; LMULMAX1-RV32-NEXT: addi a4, a4, -241 +; LMULMAX1-RV32-NEXT: and a1, a5, a4 +; LMULMAX1-RV32-NEXT: lui a5, 4112 +; LMULMAX1-RV32-NEXT: addi a5, a5, 257 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 44(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 36(sp) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 20(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse32.v v26, (a6) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -48 +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle32.v v26, (a6) +; LMULMAX1-RV64-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: srliw a3, a2, 1 +; LMULMAX1-RV64-NEXT: slli a2, a2, 32 +; LMULMAX1-RV64-NEXT: srli a2, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a3, a2 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 32(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 44(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 40(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 36(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 16(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: srliw a2, a1, 1 +; LMULMAX1-RV64-NEXT: slli a1, a1, 32 +; LMULMAX1-RV64-NEXT: srli a1, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: addiw a1, a1, -32 +; LMULMAX1-RV64-NEXT: sw a1, 20(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64-NEXT: addi a1, sp, 32 +; LMULMAX1-RV64-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV64-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV64-NEXT: vse32.v v26, (a6) +; LMULMAX1-RV64-NEXT: addi sp, sp, 48 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 1054 +; LMULMAX2-RV32D-NEXT: vrsub.vx v28, v25, a2 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV32D-NEXT: vrsub.vx v26, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v28, 4 +; LMULMAX2-RV32D-NEXT: vse32.v v30, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 1054 +; LMULMAX2-RV64D-NEXT: vrsub.vx v28, v25, a2 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v26 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV64D-NEXT: vrsub.vx v26, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v28, 4 +; LMULMAX2-RV64D-NEXT: vse32.v v30, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: addi a3, zero, 1054 +; LMULMAX1-RV32D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v25, v27, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v25, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v26, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v25, v26, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vx v25, v25, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v25, 2 +; LMULMAX1-RV32D-NEXT: vse32.v v28, (a0) +; LMULMAX1-RV32D-NEXT: vse32.v v29, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: addi a3, zero, 1054 +; LMULMAX1-RV64D-NEXT: vrsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v25, v27, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v25, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v26, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v25, v26, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vx v25, v25, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v25, 2 +; LMULMAX1-RV64D-NEXT: vse32.v v28, (a0) +; LMULMAX1-RV64D-NEXT: vse32.v v29, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV32D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v8i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1054 +; LMULMAX8-RV64D-NEXT: vrsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <8 x i32>, <8 x i32>* %x + %b = load <8 x i32>, <8 x i32>* %y + %c = call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %a, i1 true) + store <8 x i32> %c, <8 x i32>* %x + ret void +} + +define void @ctlz_zero_undef_v4i64(<4 x i64>* %x, <4 x i64>* %y) nounwind { +; LMULMAX2-RV32-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV32-NEXT: sw zero, 60(sp) +; LMULMAX2-RV32-NEXT: sw zero, 52(sp) +; LMULMAX2-RV32-NEXT: sw zero, 44(sp) +; LMULMAX2-RV32-NEXT: sw zero, 36(sp) +; LMULMAX2-RV32-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32-NEXT: lui a1, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32-NEXT: lui a1, 61681 +; LMULMAX2-RV32-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32-NEXT: lui a1, 4112 +; LMULMAX2-RV32-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32-NEXT: bnez a5, .LBB15_2 +; LMULMAX2-RV32-NEXT: # %bb.1: +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_3 +; LMULMAX2-RV32-NEXT: .LBB15_2: +; LMULMAX2-RV32-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32-NEXT: or a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_3: +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v30 +; LMULMAX2-RV32-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32-NEXT: bnez a1, .LBB15_5 +; LMULMAX2-RV32-NEXT: # %bb.4: +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_6 +; LMULMAX2-RV32-NEXT: .LBB15_5: +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_6: +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v30 +; LMULMAX2-RV32-NEXT: sw a5, 56(sp) +; LMULMAX2-RV32-NEXT: bnez a1, .LBB15_8 +; LMULMAX2-RV32-NEXT: # %bb.7: +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_9 +; LMULMAX2-RV32-NEXT: .LBB15_8: +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_9: +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: sw a5, 48(sp) +; LMULMAX2-RV32-NEXT: bnez a1, .LBB15_11 +; LMULMAX2-RV32-NEXT: # %bb.10: +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_12 +; LMULMAX2-RV32-NEXT: .LBB15_11: +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32-NEXT: or a1, a1, a5 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_12: +; LMULMAX2-RV32-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a2 +; LMULMAX2-RV64-NEXT: not a2, a1 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: sd a5, 32(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV64-NEXT: srli a1, a5, 1 +; LMULMAX2-RV64-NEXT: or a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sd a1, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sd a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64-NEXT: or a1, a1, a5 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sd a1, 40(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle64.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32-NEXT: vle64.v v26, (a6) +; LMULMAX1-RV32-NEXT: sw zero, 44(sp) +; LMULMAX1-RV32-NEXT: sw zero, 36(sp) +; LMULMAX1-RV32-NEXT: addi a7, zero, 32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vsrl.vx v27, v26, a7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: lui a2, 349525 +; LMULMAX1-RV32-NEXT: addi a5, a2, 1365 +; LMULMAX1-RV32-NEXT: lui a2, 209715 +; LMULMAX1-RV32-NEXT: addi a4, a2, 819 +; LMULMAX1-RV32-NEXT: lui a2, 61681 +; LMULMAX1-RV32-NEXT: addi t0, a2, -241 +; LMULMAX1-RV32-NEXT: lui a2, 4112 +; LMULMAX1-RV32-NEXT: addi a3, a2, 257 +; LMULMAX1-RV32-NEXT: bnez a1, .LBB15_2 +; LMULMAX1-RV32-NEXT: # %bb.1: +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_3 +; LMULMAX1-RV32-NEXT: .LBB15_2: +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_3: +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vsrl.vx v27, v26, a7 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32-NEXT: bnez a2, .LBB15_5 +; LMULMAX1-RV32-NEXT: # %bb.4: +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_6 +; LMULMAX1-RV32-NEXT: .LBB15_5: +; LMULMAX1-RV32-NEXT: srli a1, a2, 1 +; LMULMAX1-RV32-NEXT: or a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_6: +; LMULMAX1-RV32-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32-NEXT: vsrl.vx v26, v25, a7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32-NEXT: bnez a1, .LBB15_8 +; LMULMAX1-RV32-NEXT: # %bb.7: +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_9 +; LMULMAX1-RV32-NEXT: .LBB15_8: +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_9: +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vsrl.vx v26, v25, a7 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32-NEXT: bnez a2, .LBB15_11 +; LMULMAX1-RV32-NEXT: # %bb.10: +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_12 +; LMULMAX1-RV32-NEXT: .LBB15_11: +; LMULMAX1-RV32-NEXT: srli a1, a2, 1 +; LMULMAX1-RV32-NEXT: or a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32-NEXT: or a1, a1, a2 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_12: +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse64.v v26, (a6) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle64.v v27, (a6) +; LMULMAX1-RV64-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v27, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64-NEXT: or a2, a2, a3 +; LMULMAX1-RV64-NEXT: not a3, a2 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vmv.v.x v27, a1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64-NEXT: or a1, a1, a2 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64-NEXT: vmv.s.x v27, a1 +; LMULMAX1-RV64-NEXT: vse64.v v27, (a0) +; LMULMAX1-RV64-NEXT: vse64.v v26, (a6) +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a1, 4112 +; LMULMAX2-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB15_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_3 +; LMULMAX2-RV32D-NEXT: .LBB15_2: +; LMULMAX2-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX2-RV32D-NEXT: or a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_3: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX2-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB15_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_6 +; LMULMAX2-RV32D-NEXT: .LBB15_5: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_6: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX2-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB15_8 +; LMULMAX2-RV32D-NEXT: # %bb.7: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_9 +; LMULMAX2-RV32D-NEXT: .LBB15_8: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_9: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB15_11 +; LMULMAX2-RV32D-NEXT: # %bb.10: +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_12 +; LMULMAX2-RV32D-NEXT: .LBB15_11: +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV32D-NEXT: or a1, a1, a5 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_12: +; LMULMAX2-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a2 +; LMULMAX2-RV64D-NEXT: not a2, a1 +; LMULMAX2-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64D-NEXT: lui a1, 21845 +; LMULMAX2-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a3, a2 +; LMULMAX2-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64D-NEXT: and a3, a3, a2 +; LMULMAX2-RV64D-NEXT: add a3, a4, a3 +; LMULMAX2-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64D-NEXT: add a4, a3, a4 +; LMULMAX2-RV64D-NEXT: lui a3, 3855 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: and a5, a4, a3 +; LMULMAX2-RV64D-NEXT: lui a4, 4112 +; LMULMAX2-RV64D-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64D-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64D-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64D-NEXT: sd a5, 32(sp) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64D-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV64D-NEXT: srli a1, a5, 1 +; LMULMAX2-RV64D-NEXT: or a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: and a5, a5, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a5, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 56(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: and a5, a5, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a5, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX2-RV64D-NEXT: or a1, a1, a5 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64D-NEXT: and a5, a5, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64D-NEXT: and a5, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a5, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32D-NEXT: vle64.v v26, (a6) +; LMULMAX1-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX1-RV32D-NEXT: addi a7, zero, 32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v27, v26, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32D-NEXT: lui a2, 349525 +; LMULMAX1-RV32D-NEXT: addi a5, a2, 1365 +; LMULMAX1-RV32D-NEXT: lui a2, 209715 +; LMULMAX1-RV32D-NEXT: addi a4, a2, 819 +; LMULMAX1-RV32D-NEXT: lui a2, 61681 +; LMULMAX1-RV32D-NEXT: addi t0, a2, -241 +; LMULMAX1-RV32D-NEXT: lui a2, 4112 +; LMULMAX1-RV32D-NEXT: addi a3, a2, 257 +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB15_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_3 +; LMULMAX1-RV32D-NEXT: .LBB15_2: +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_3: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32D-NEXT: vsrl.vx v27, v26, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV32D-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32D-NEXT: bnez a2, .LBB15_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_6 +; LMULMAX1-RV32D-NEXT: .LBB15_5: +; LMULMAX1-RV32D-NEXT: srli a1, a2, 1 +; LMULMAX1-RV32D-NEXT: or a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_6: +; LMULMAX1-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB15_8 +; LMULMAX1-RV32D-NEXT: # %bb.7: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_9 +; LMULMAX1-RV32D-NEXT: .LBB15_8: +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_9: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a7 +; LMULMAX1-RV32D-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32D-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32D-NEXT: bnez a2, .LBB15_11 +; LMULMAX1-RV32D-NEXT: # %bb.10: +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_12 +; LMULMAX1-RV32D-NEXT: .LBB15_11: +; LMULMAX1-RV32D-NEXT: srli a1, a2, 1 +; LMULMAX1-RV32D-NEXT: or a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV32D-NEXT: or a1, a1, a2 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_12: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vse64.v v26, (a6) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64D-NEXT: vle64.v v27, (a6) +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v27, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 2 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 4 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 8 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 16 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a2, 32 +; LMULMAX1-RV64D-NEXT: or a2, a2, a3 +; LMULMAX1-RV64D-NEXT: not a3, a2 +; LMULMAX1-RV64D-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64D-NEXT: lui a2, 21845 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64D-NEXT: and a4, a4, a7 +; LMULMAX1-RV64D-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64D-NEXT: lui a3, 13107 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: and a5, a4, a3 +; LMULMAX1-RV64D-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64D-NEXT: and a4, a4, a3 +; LMULMAX1-RV64D-NEXT: add a4, a5, a4 +; LMULMAX1-RV64D-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64D-NEXT: add a5, a4, a5 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a5, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v27, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX1-RV64D-NEXT: or a1, a1, a2 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v27, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v27, (a0) +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a6) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a1, 4112 +; LMULMAX8-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB15_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_3 +; LMULMAX8-RV32D-NEXT: .LBB15_2: +; LMULMAX8-RV32D-NEXT: srli a1, a5, 1 +; LMULMAX8-RV32D-NEXT: or a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_3: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX8-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB15_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_6 +; LMULMAX8-RV32D-NEXT: .LBB15_5: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_6: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV32D-NEXT: vsrl.vx v30, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v30 +; LMULMAX8-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB15_8 +; LMULMAX8-RV32D-NEXT: # %bb.7: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_9 +; LMULMAX8-RV32D-NEXT: .LBB15_8: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_9: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB15_11 +; LMULMAX8-RV32D-NEXT: # %bb.10: +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_12 +; LMULMAX8-RV32D-NEXT: .LBB15_11: +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV32D-NEXT: or a1, a1, a5 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_12: +; LMULMAX8-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: ctlz_zero_undef_v4i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a2 +; LMULMAX8-RV64D-NEXT: not a2, a1 +; LMULMAX8-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX8-RV64D-NEXT: lui a1, 21845 +; LMULMAX8-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a3, a2 +; LMULMAX8-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX8-RV64D-NEXT: and a3, a3, a2 +; LMULMAX8-RV64D-NEXT: add a3, a4, a3 +; LMULMAX8-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX8-RV64D-NEXT: add a4, a3, a4 +; LMULMAX8-RV64D-NEXT: lui a3, 3855 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: and a5, a4, a3 +; LMULMAX8-RV64D-NEXT: lui a4, 4112 +; LMULMAX8-RV64D-NEXT: addiw a4, a4, 257 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 16 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 257 +; LMULMAX8-RV64D-NEXT: mul a5, a5, a4 +; LMULMAX8-RV64D-NEXT: srli a5, a5, 56 +; LMULMAX8-RV64D-NEXT: sd a5, 32(sp) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV64D-NEXT: vmv.x.s a5, v28 +; LMULMAX8-RV64D-NEXT: srli a1, a5, 1 +; LMULMAX8-RV64D-NEXT: or a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: and a5, a5, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a5, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 56(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: and a5, a5, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a5, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 2 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 8 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 16 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 32 +; LMULMAX8-RV64D-NEXT: or a1, a1, a5 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV64D-NEXT: and a5, a5, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV64D-NEXT: and a5, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a5, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV64D-NEXT: ret + %a = load <4 x i64>, <4 x i64>* %x + %b = load <4 x i64>, <4 x i64>* %y + %c = call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %a, i1 true) + store <4 x i64> %c, <4 x i64>* %x + ret void +} diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-cttz.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-cttz.ll --- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-cttz.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-cttz.ll @@ -3,12 +3,17 @@ ; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV64 ; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV32 ; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV64 +; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV32D +; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=2 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX2-RV64D +; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV32D +; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=1 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX1-RV64D +; RUN: llc -mtriple=riscv32 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=8 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX8-RV32D +; RUN: llc -mtriple=riscv64 -mattr=+m,+experimental-v,+d -riscv-v-vector-bits-min=128 -riscv-v-fixed-length-vector-lmul-max=8 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=LMULMAX8-RV64D -define void @cttz_v16i8(<16 x i8>* %x, <16 x i8>* %y) { +define void @cttz_v16i8(<16 x i8>* %x, <16 x i8>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v16i8: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle8.v v25, (a0) ; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 @@ -333,7 +338,6 @@ ; LMULMAX2-RV64-LABEL: cttz_v16i8: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -32 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX2-RV64-NEXT: vle8.v v25, (a0) ; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu @@ -680,7 +684,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v16i8: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle8.v v25, (a0) ; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 @@ -1005,7 +1008,6 @@ ; LMULMAX1-RV64-LABEL: cttz_v16i8: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -32 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV64-NEXT: vle8.v v25, (a0) ; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu @@ -1348,6 +1350,280 @@ ; LMULMAX1-RV64-NEXT: vse8.v v25, (a0) ; LMULMAX1-RV64-NEXT: addi sp, sp, 32 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v16i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v26 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v26, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v27, v25, v27 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v27 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV32D-NEXT: vmerge.vim v25, v28, 8, v0 +; LMULMAX2-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v16i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v26 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v26, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v27, v25, v27 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v27 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV64D-NEXT: vmerge.vim v25, v28, 8, v0 +; LMULMAX2-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v16i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v28, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v28 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v25, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v29, 8 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vim v25, v26, 8, v0 +; LMULMAX1-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v16i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v28, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v28 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v25, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v29, 8 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vim v25, v26, 8, v0 +; LMULMAX1-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v16i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v26, v25, v26 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v28, v26 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV32D-NEXT: vsub.vx v25, v28, a1 +; LMULMAX8-RV32D-NEXT: vmerge.vim v25, v25, 8, v0 +; LMULMAX8-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v16i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v26, v25, v26 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v28, v26 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV64D-NEXT: vsub.vx v25, v28, a1 +; LMULMAX8-RV64D-NEXT: vmerge.vim v25, v25, 8, v0 +; LMULMAX8-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <16 x i8>, <16 x i8>* %x %b = load <16 x i8>, <16 x i8>* %y %c = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %a, i1 false) @@ -1356,11 +1632,10 @@ } declare <16 x i8> @llvm.cttz.v16i8(<16 x i8>, i1) -define void @cttz_v8i16(<8 x i16>* %x, <8 x i16>* %y) { +define void @cttz_v8i16(<8 x i16>* %x, <8 x i16>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v8i16: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle16.v v25, (a0) ; LMULMAX2-RV32-NEXT: vmv.x.s a2, v25 @@ -1534,7 +1809,6 @@ ; LMULMAX2-RV64-LABEL: cttz_v8i16: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -32 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX2-RV64-NEXT: vle16.v v25, (a0) ; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu @@ -1730,7 +2004,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v8i16: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle16.v v25, (a0) ; LMULMAX1-RV32-NEXT: vmv.x.s a2, v25 @@ -1904,7 +2177,6 @@ ; LMULMAX1-RV64-LABEL: cttz_v8i16: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -32 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV64-NEXT: vle16.v v25, (a0) ; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu @@ -2096,6 +2368,132 @@ ; LMULMAX1-RV64-NEXT: vse16.v v25, (a0) ; LMULMAX1-RV64-NEXT: addi sp, sp, 32 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v8i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v26, v25, v26 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v8i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v26, v25, v26 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v8i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v27, 23 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v25, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v28, a1, v0 +; LMULMAX1-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v8i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v27, 23 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v25, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v28, a1, v0 +; LMULMAX1-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v8i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v26, v25, v26 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v8i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v26, v25, v26 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <8 x i16>, <8 x i16>* %x %b = load <8 x i16>, <8 x i16>* %y %c = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %a, i1 false) @@ -2104,11 +2502,10 @@ } declare <8 x i16> @llvm.cttz.v8i16(<8 x i16>, i1) -define void @cttz_v4i32(<4 x i32>* %x, <4 x i32>* %y) { +define void @cttz_v4i32(<4 x i32>* %x, <4 x i32>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v4i32: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle32.v v25, (a0) ; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 @@ -2201,7 +2598,6 @@ ; LMULMAX2-RV64-LABEL: cttz_v4i32: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -32 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX2-RV64-NEXT: vle32.v v25, (a0) ; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu @@ -2322,7 +2718,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v4i32: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle32.v v25, (a0) ; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 @@ -2415,7 +2810,6 @@ ; LMULMAX1-RV64-LABEL: cttz_v4i32: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -32 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV64-NEXT: vle32.v v25, (a0) ; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu @@ -2532,6 +2926,138 @@ ; LMULMAX1-RV64-NEXT: vse32.v v25, (a0) ; LMULMAX1-RV64-NEXT: addi sp, sp, 32 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v4i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v26, v25, v26 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 1023 +; LMULMAX2-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v4i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v26, v25, v26 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 1023 +; LMULMAX2-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX2-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v4i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v26, v27, a1 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 1023 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v25, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v28, a1 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 2 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v28, a1, v0 +; LMULMAX1-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v4i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v26, v27, a1 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 1023 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v25, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v28, a1 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 2 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v28, a1, v0 +; LMULMAX1-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v4i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v26, v25, v26 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v4i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v26, v25, v26 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v25, v26, a1, v0 +; LMULMAX8-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <4 x i32>, <4 x i32>* %x %b = load <4 x i32>, <4 x i32>* %y %c = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a, i1 false) @@ -2540,11 +3066,10 @@ } declare <4 x i32> @llvm.cttz.v4i32(<4 x i32>, i1) -define void @cttz_v2i64(<2 x i64>* %x, <2 x i64>* %y) { +define void @cttz_v2i64(<2 x i64>* %x, <2 x i64>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v2i64: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -32 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu ; LMULMAX2-RV32-NEXT: vle64.v v25, (a0) ; LMULMAX2-RV32-NEXT: sw zero, 28(sp) @@ -2727,7 +3252,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v2i64: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -32 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 32 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) ; LMULMAX1-RV32-NEXT: sw zero, 28(sp) @@ -2906,6 +3430,552 @@ ; LMULMAX1-RV64-NEXT: vmv.s.x v26, a1 ; LMULMAX1-RV64-NEXT: vse64.v v26, (a0) ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v2i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a2, 4112 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX2-RV32D-NEXT: addi a2, a2, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB3_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB3_3 +; LMULMAX2-RV32D-NEXT: .LBB3_2: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB3_3: +; LMULMAX2-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB3_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB3_6 +; LMULMAX2-RV32D-NEXT: .LBB3_5: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB3_6: +; LMULMAX2-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v2i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: lui a3, 21845 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX2-RV64D-NEXT: and a2, a2, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a4, 3855 +; LMULMAX2-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a5, 4112 +; LMULMAX2-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64D-NEXT: addi a3, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX2-RV64D-NEXT: and a3, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a3, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v2i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32D-NEXT: lui a1, 349525 +; LMULMAX1-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX1-RV32D-NEXT: lui a1, 209715 +; LMULMAX1-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX1-RV32D-NEXT: lui a1, 61681 +; LMULMAX1-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX1-RV32D-NEXT: lui a2, 4112 +; LMULMAX1-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX1-RV32D-NEXT: addi a2, a2, 257 +; LMULMAX1-RV32D-NEXT: bnez a5, .LBB3_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB3_3 +; LMULMAX1-RV32D-NEXT: .LBB3_2: +; LMULMAX1-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32D-NEXT: not a5, a5 +; LMULMAX1-RV32D-NEXT: and a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB3_3: +; LMULMAX1-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX1-RV32D-NEXT: bnez a5, .LBB3_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB3_6 +; LMULMAX1-RV32D-NEXT: .LBB3_5: +; LMULMAX1-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32D-NEXT: not a5, a5 +; LMULMAX1-RV32D-NEXT: and a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB3_6: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v2i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: lui a3, 21845 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX1-RV64D-NEXT: and a2, a2, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: lui a2, 13107 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: and a4, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a4, a1 +; LMULMAX1-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: addi a3, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64D-NEXT: and a3, a3, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX1-RV64D-NEXT: and a3, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a3, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v2i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a2, 4112 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX8-RV32D-NEXT: addi a2, a2, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB3_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB3_3 +; LMULMAX8-RV32D-NEXT: .LBB3_2: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB3_3: +; LMULMAX8-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB3_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB3_6 +; LMULMAX8-RV32D-NEXT: .LBB3_5: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB3_6: +; LMULMAX8-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v2i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: lui a3, 21845 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX8-RV64D-NEXT: and a2, a2, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a4, 3855 +; LMULMAX8-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a5, 4112 +; LMULMAX8-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV64D-NEXT: addi a3, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX8-RV64D-NEXT: and a3, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a3, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX8-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <2 x i64>, <2 x i64>* %x %b = load <2 x i64>, <2 x i64>* %y %c = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %a, i1 false) @@ -2914,17 +3984,13 @@ } declare <2 x i64> @llvm.cttz.v2i64(<2 x i64>, i1) -define void @cttz_v32i8(<32 x i8>* %x, <32 x i8>* %y) { +define void @cttz_v32i8(<32 x i8>* %x, <32 x i8>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v32i8: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: addi a6, zero, 32 ; LMULMAX2-RV32-NEXT: vsetvli zero, a6, e8, m2, ta, mu @@ -3558,13 +4624,9 @@ ; LMULMAX2-RV64-LABEL: cttz_v32i8: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: addi a6, zero, 32 ; LMULMAX2-RV64-NEXT: vsetvli zero, a6, e8, m2, ta, mu @@ -4220,7 +5282,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v32i8: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV32-NEXT: addi a6, a0, 16 ; LMULMAX1-RV32-NEXT: vle8.v v26, (a6) @@ -4853,7 +5914,6 @@ ; LMULMAX1-RV64-LABEL: cttz_v32i8: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -48 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu ; LMULMAX1-RV64-NEXT: addi a6, a0, 16 ; LMULMAX1-RV64-NEXT: vle8.v v26, (a6) @@ -5504,6 +6564,500 @@ ; LMULMAX1-RV64-NEXT: vse8.v v26, (a6) ; LMULMAX1-RV64-NEXT: addi sp, sp, 48 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v32i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v8, v26, 16 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v8, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v8, v25 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vmv1r.v v28, v30 +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v8, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v25, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v8, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v25, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v28, 16 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV32D-NEXT: vmerge.vim v26, v8, 8, v0 +; LMULMAX2-RV32D-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v32i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v8, v26, 16 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v8, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v8, v25 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv1r.v v28, v30 +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v8, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v25, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v8, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v25, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v28, 16 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV64D-NEXT: vmerge.vim v26, v8, 8, v0 +; LMULMAX2-RV64D-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v32i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle8.v v28, (a1) +; LMULMAX1-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v28, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v26, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v27, v26 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v29, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v28, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v29, v28, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v29, v28, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v31, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v27 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v31, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v30, 8 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v28, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vim v28, v29, 8, v0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v25, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v30, v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v31, v30 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v30, v31 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v30, v30, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v31, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v30, v25, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v8, v30 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v30, v8 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v30, v30, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v31, 8 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vim v25, v27, 8, v0 +; LMULMAX1-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v32i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle8.v v28, (a1) +; LMULMAX1-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v28, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v26, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v27, v26 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v29, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v28, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v29, v28, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v29, v28, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v31, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v31 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v31, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v27 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v31, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v30, 8 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v28, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vim v28, v29, 8, v0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v25, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v30, v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v31, v30 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v30, v31 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v30, v30, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v31, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v30, v25, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v8, v30 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v30, v8 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v30, v30, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v31, 8 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vim v25, v27, 8, v0 +; LMULMAX1-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v32i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v28, v26, v28 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v8, v28 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v8, v28, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV32D-NEXT: vsub.vx v26, v8, a1 +; LMULMAX8-RV32D-NEXT: vmerge.vim v26, v26, 8, v0 +; LMULMAX8-RV32D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v32i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v28, v26, v28 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v8, v28 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v8, v28, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV64D-NEXT: vsub.vx v26, v8, a1 +; LMULMAX8-RV64D-NEXT: vmerge.vim v26, v26, 8, v0 +; LMULMAX8-RV64D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <32 x i8>, <32 x i8>* %x %b = load <32 x i8>, <32 x i8>* %y %c = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %a, i1 false) @@ -5512,17 +7066,13 @@ } declare <32 x i8> @llvm.cttz.v32i8(<32 x i8>, i1) -define void @cttz_v16i16(<16 x i16>* %x, <16 x i16>* %y) { +define void @cttz_v16i16(<16 x i16>* %x, <16 x i16>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v16i16: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, mu ; LMULMAX2-RV32-NEXT: vle16.v v26, (a0) @@ -5852,13 +7402,9 @@ ; LMULMAX2-RV64-LABEL: cttz_v16i16: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, mu ; LMULMAX2-RV64-NEXT: vle16.v v26, (a0) @@ -6210,7 +7756,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v16i16: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV32-NEXT: addi a6, a0, 16 ; LMULMAX1-RV32-NEXT: vle16.v v26, (a6) @@ -6540,7 +8085,6 @@ ; LMULMAX1-RV64-LABEL: cttz_v16i16: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -48 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu ; LMULMAX1-RV64-NEXT: addi a6, a0, 16 ; LMULMAX1-RV64-NEXT: vle16.v v26, (a6) @@ -6888,6 +8432,210 @@ ; LMULMAX1-RV64-NEXT: vse16.v v26, (a6) ; LMULMAX1-RV64-NEXT: addi sp, sp, 48 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v16i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v28, v25, a1 +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV32D-NEXT: vsub.vx v30, v25, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v28, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v16i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v28, v25, a1 +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV64D-NEXT: vsub.vx v30, v25, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v28, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v16i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v28, v25, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v29, v28 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v29, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v29, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v29 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a3, zero, 16 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v30, a3, v0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v28, v26, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v30, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v26, v29, a3, v0 +; LMULMAX1-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vse16.v v25, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v16i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v28, v25, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v29, v28 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v29, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v29, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v29 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a3, zero, 16 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v30, a3, v0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v28, v26, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v30, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v26, v29, a3, v0 +; LMULMAX1-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vse16.v v25, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v16i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v28, v26, v28 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v8, v28 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vsub.vx v28, v28, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v16i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v28, v26, v28 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v8, v28 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vsub.vx v28, v28, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 16 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <16 x i16>, <16 x i16>* %x %b = load <16 x i16>, <16 x i16>* %y %c = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %a, i1 false) @@ -6896,17 +8644,13 @@ } declare <16 x i16> @llvm.cttz.v16i16(<16 x i16>, i1) -define void @cttz_v8i32(<8 x i32>* %x, <8 x i32>* %y) { +define void @cttz_v8i32(<8 x i32>* %x, <8 x i32>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v8i32: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu ; LMULMAX2-RV32-NEXT: vle32.v v26, (a0) @@ -7075,13 +8819,9 @@ ; LMULMAX2-RV64-LABEL: cttz_v8i32: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, mu ; LMULMAX2-RV64-NEXT: vle32.v v26, (a0) @@ -7282,7 +9022,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v8i32: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV32-NEXT: addi a6, a0, 16 ; LMULMAX1-RV32-NEXT: vle32.v v26, (a6) @@ -7451,7 +9190,6 @@ ; LMULMAX1-RV64-LABEL: cttz_v8i32: ; LMULMAX1-RV64: # %bb.0: ; LMULMAX1-RV64-NEXT: addi sp, sp, -48 -; LMULMAX1-RV64-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu ; LMULMAX1-RV64-NEXT: addi a6, a0, 16 ; LMULMAX1-RV64-NEXT: vle32.v v26, (a6) @@ -7648,6 +9386,216 @@ ; LMULMAX1-RV64-NEXT: vse32.v v26, (a6) ; LMULMAX1-RV64-NEXT: addi sp, sp, 48 ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v8i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v28, a1 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 1023 +; LMULMAX2-RV32D-NEXT: vsub.vx v28, v25, a2 +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v30, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV32D-NEXT: vsub.vx v30, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v8, v28, 4 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v8i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v28, a1 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 1023 +; LMULMAX2-RV64D-NEXT: vsub.vx v28, v25, a2 +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v30, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v30, a1 +; LMULMAX2-RV64D-NEXT: vsub.vx v30, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v8, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v8, v28, 4 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vmerge.vxm v26, v8, a1, v0 +; LMULMAX2-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v8i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v28, a2 +; LMULMAX1-RV32D-NEXT: addi a3, zero, 1023 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v28, v25, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v29, v28 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v28, v29, a2 +; LMULMAX1-RV32D-NEXT: vsub.vx v28, v28, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v29, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v29 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v27, 2 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV32D-NEXT: addi a4, zero, 32 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v25, v30, a4, v0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v28, a2 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v28, v26, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v28, v30, a2 +; LMULMAX1-RV32D-NEXT: vsub.vx v28, v28, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 2 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV32D-NEXT: vmerge.vxm v26, v29, a4, v0 +; LMULMAX1-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vse32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v8i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v28, a2 +; LMULMAX1-RV64D-NEXT: addi a3, zero, 1023 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v28, v25, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v29, v28 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v28, v29, a2 +; LMULMAX1-RV64D-NEXT: vsub.vx v28, v28, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v29, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v29 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v27, 2 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v25, 0 +; LMULMAX1-RV64D-NEXT: addi a4, zero, 32 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v25, v30, a4, v0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v28, a2 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v28, v26, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v30, v28 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v28, v30, a2 +; LMULMAX1-RV64D-NEXT: vsub.vx v28, v28, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 2 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX1-RV64D-NEXT: vmerge.vxm v26, v29, a4, v0 +; LMULMAX1-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vse32.v v25, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v8i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v28, v26, v28 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v8, v28 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v28, v8, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV32D-NEXT: vsub.vx v28, v28, a1 +; LMULMAX8-RV32D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v8i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v28, v26, v28 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v8, v28 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v28, v8, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV64D-NEXT: vsub.vx v28, v28, a1 +; LMULMAX8-RV64D-NEXT: vmseq.vi v0, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vmerge.vxm v26, v28, a1, v0 +; LMULMAX8-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret %a = load <8 x i32>, <8 x i32>* %x %b = load <8 x i32>, <8 x i32>* %y %c = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %a, i1 false) @@ -7656,17 +9604,13 @@ } declare <8 x i32> @llvm.cttz.v8i32(<8 x i32>, i1) -define void @cttz_v4i64(<4 x i64>* %x, <4 x i64>* %y) { +define void @cttz_v4i64(<4 x i64>* %x, <4 x i64>* %y) nounwind { ; LMULMAX2-RV32-LABEL: cttz_v4i64: ; LMULMAX2-RV32: # %bb.0: ; LMULMAX2-RV32-NEXT: addi sp, sp, -96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill ; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill -; LMULMAX2-RV32-NEXT: .cfi_offset ra, -4 -; LMULMAX2-RV32-NEXT: .cfi_offset s0, -8 ; LMULMAX2-RV32-NEXT: addi s0, sp, 96 -; LMULMAX2-RV32-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV32-NEXT: andi sp, sp, -32 ; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu ; LMULMAX2-RV32-NEXT: vle64.v v26, (a0) @@ -7862,13 +9806,9 @@ ; LMULMAX2-RV64-LABEL: cttz_v4i64: ; LMULMAX2-RV64: # %bb.0: ; LMULMAX2-RV64-NEXT: addi sp, sp, -96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa_offset 96 ; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill ; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill -; LMULMAX2-RV64-NEXT: .cfi_offset ra, -8 -; LMULMAX2-RV64-NEXT: .cfi_offset s0, -16 ; LMULMAX2-RV64-NEXT: addi s0, sp, 96 -; LMULMAX2-RV64-NEXT: .cfi_def_cfa s0, 0 ; LMULMAX2-RV64-NEXT: andi sp, sp, -32 ; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, mu ; LMULMAX2-RV64-NEXT: vle64.v v26, (a0) @@ -7987,7 +9927,6 @@ ; LMULMAX1-RV32-LABEL: cttz_v4i64: ; LMULMAX1-RV32: # %bb.0: ; LMULMAX1-RV32-NEXT: addi sp, sp, -48 -; LMULMAX1-RV32-NEXT: .cfi_def_cfa_offset 48 ; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu ; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) ; LMULMAX1-RV32-NEXT: addi a7, a0, 16 @@ -8295,6 +10234,955 @@ ; LMULMAX1-RV64-NEXT: vse64.v v26, (a0) ; LMULMAX1-RV64-NEXT: vse64.v v27, (a6) ; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_v4i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a1, 4112 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB7_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_3 +; LMULMAX2-RV32D-NEXT: .LBB7_2: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_3: +; LMULMAX2-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB7_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_6 +; LMULMAX2-RV32D-NEXT: .LBB7_5: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_6: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB7_8 +; LMULMAX2-RV32D-NEXT: # %bb.7: +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_9 +; LMULMAX2-RV32D-NEXT: .LBB7_8: +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_9: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB7_11 +; LMULMAX2-RV32D-NEXT: # %bb.10: +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB7_12 +; LMULMAX2-RV32D-NEXT: .LBB7_11: +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB7_12: +; LMULMAX2-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_v4i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a2, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64D-NEXT: lui a1, 21845 +; LMULMAX2-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a3, a2 +; LMULMAX2-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64D-NEXT: and a3, a3, a2 +; LMULMAX2-RV64D-NEXT: add a3, a4, a3 +; LMULMAX2-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64D-NEXT: add a4, a3, a4 +; LMULMAX2-RV64D-NEXT: lui a3, 3855 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: and a4, a4, a3 +; LMULMAX2-RV64D-NEXT: lui a5, 4112 +; LMULMAX2-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: mul a4, a4, a5 +; LMULMAX2-RV64D-NEXT: srli a4, a4, 56 +; LMULMAX2-RV64D-NEXT: sd a4, 56(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64D-NEXT: vmv.x.s a4, v28 +; LMULMAX2-RV64D-NEXT: addi a1, a4, -1 +; LMULMAX2-RV64D-NEXT: not a4, a4 +; LMULMAX2-RV64D-NEXT: and a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64D-NEXT: and a4, a4, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64D-NEXT: and a4, a4, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64D-NEXT: and a4, a4, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 32(sp) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_v4i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi a7, a0, 16 +; LMULMAX1-RV32D-NEXT: vle64.v v26, (a7) +; LMULMAX1-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX1-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32D-NEXT: lui a1, 349525 +; LMULMAX1-RV32D-NEXT: addi a5, a1, 1365 +; LMULMAX1-RV32D-NEXT: lui a1, 209715 +; LMULMAX1-RV32D-NEXT: addi a4, a1, 819 +; LMULMAX1-RV32D-NEXT: lui a1, 61681 +; LMULMAX1-RV32D-NEXT: addi t0, a1, -241 +; LMULMAX1-RV32D-NEXT: lui a2, 4112 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a3, a2, 257 +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB7_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v27, v26, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_3 +; LMULMAX1-RV32D-NEXT: .LBB7_2: +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_3: +; LMULMAX1-RV32D-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB7_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_6 +; LMULMAX1-RV32D-NEXT: .LBB7_5: +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_6: +; LMULMAX1-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB7_8 +; LMULMAX1-RV32D-NEXT: # %bb.7: +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_9 +; LMULMAX1-RV32D-NEXT: .LBB7_8: +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_9: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV32D-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32D-NEXT: bnez a2, .LBB7_11 +; LMULMAX1-RV32D-NEXT: # %bb.10: +; LMULMAX1-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB7_12 +; LMULMAX1-RV32D-NEXT: .LBB7_11: +; LMULMAX1-RV32D-NEXT: addi a1, a2, -1 +; LMULMAX1-RV32D-NEXT: not a2, a2 +; LMULMAX1-RV32D-NEXT: and a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB7_12: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vse64.v v26, (a7) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_v4i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64D-NEXT: vle64.v v26, (a6) +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v26, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64D-NEXT: addi a3, a2, -1 +; LMULMAX1-RV64D-NEXT: not a2, a2 +; LMULMAX1-RV64D-NEXT: and a3, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64D-NEXT: lui a2, 21845 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64D-NEXT: and a4, a4, a7 +; LMULMAX1-RV64D-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64D-NEXT: lui a3, 13107 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: and a5, a4, a3 +; LMULMAX1-RV64D-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64D-NEXT: and a4, a4, a3 +; LMULMAX1-RV64D-NEXT: add a4, a5, a4 +; LMULMAX1-RV64D-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64D-NEXT: add a5, a4, a5 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a5, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v27, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v27, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vse64.v v27, (a6) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_v4i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a1, 4112 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX8-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB7_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_3 +; LMULMAX8-RV32D-NEXT: .LBB7_2: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_3: +; LMULMAX8-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB7_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_6 +; LMULMAX8-RV32D-NEXT: .LBB7_5: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_6: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB7_8 +; LMULMAX8-RV32D-NEXT: # %bb.7: +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_9 +; LMULMAX8-RV32D-NEXT: .LBB7_8: +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_9: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB7_11 +; LMULMAX8-RV32D-NEXT: # %bb.10: +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB7_12 +; LMULMAX8-RV32D-NEXT: .LBB7_11: +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB7_12: +; LMULMAX8-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_v4i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a2, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX8-RV64D-NEXT: lui a1, 21845 +; LMULMAX8-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a3, a2 +; LMULMAX8-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX8-RV64D-NEXT: and a3, a3, a2 +; LMULMAX8-RV64D-NEXT: add a3, a4, a3 +; LMULMAX8-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX8-RV64D-NEXT: add a4, a3, a4 +; LMULMAX8-RV64D-NEXT: lui a3, 3855 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: and a4, a4, a3 +; LMULMAX8-RV64D-NEXT: lui a5, 4112 +; LMULMAX8-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: mul a4, a4, a5 +; LMULMAX8-RV64D-NEXT: srli a4, a4, 56 +; LMULMAX8-RV64D-NEXT: sd a4, 56(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV64D-NEXT: vmv.x.s a4, v28 +; LMULMAX8-RV64D-NEXT: addi a1, a4, -1 +; LMULMAX8-RV64D-NEXT: not a4, a4 +; LMULMAX8-RV64D-NEXT: and a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX8-RV64D-NEXT: and a4, a4, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX8-RV64D-NEXT: and a4, a4, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX8-RV64D-NEXT: and a4, a4, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 32(sp) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV64D-NEXT: ret %a = load <4 x i64>, <4 x i64>* %x %b = load <4 x i64>, <4 x i64>* %y %c = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %a, i1 false) @@ -8302,3 +11190,10714 @@ ret void } declare <4 x i64> @llvm.cttz.v4i64(<4 x i64>, i1) + +define void @cttz_zero_undef_v16i8(<16 x i8>* %x, <16 x i8>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v16i8: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a2, a1, a2 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: lui a4, 4112 +; LMULMAX2-RV32-NEXT: addi a4, a4, 257 +; LMULMAX2-RV32-NEXT: mul a5, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a5, 24 +; LMULMAX2-RV32-NEXT: sb a5, 16(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 31(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 30(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 29(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 28(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 27(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 26(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 25(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 24(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 23(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 22(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 21(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 20(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 19(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 18(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 17(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle8.v v25, (a1) +; LMULMAX2-RV32-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v16i8: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a2, a1, a2 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: sb a5, 31(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV64-NEXT: addi a1, a5, -1 +; LMULMAX2-RV64-NEXT: not a5, a5 +; LMULMAX2-RV64-NEXT: and a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 30(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 29(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 28(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 27(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 26(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 25(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 24(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 23(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 22(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 21(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 20(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 19(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 18(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 17(sp) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 16(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 16 +; LMULMAX2-RV64-NEXT: vle8.v v25, (a1) +; LMULMAX2-RV64-NEXT: vse8.v v25, (a0) +; LMULMAX2-RV64-NEXT: addi sp, sp, 32 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v16i8: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a2, a1, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV32-NEXT: and a3, a3, a6 +; LMULMAX1-RV32-NEXT: sub a3, a2, a3 +; LMULMAX1-RV32-NEXT: lui a2, 209715 +; LMULMAX1-RV32-NEXT: addi a2, a2, 819 +; LMULMAX1-RV32-NEXT: and a4, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a3, 2 +; LMULMAX1-RV32-NEXT: and a3, a3, a2 +; LMULMAX1-RV32-NEXT: add a3, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 4 +; LMULMAX1-RV32-NEXT: add a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 61681 +; LMULMAX1-RV32-NEXT: addi a3, a3, -241 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: lui a4, 4112 +; LMULMAX1-RV32-NEXT: addi a4, a4, 257 +; LMULMAX1-RV32-NEXT: mul a5, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a5, 24 +; LMULMAX1-RV32-NEXT: sb a5, 16(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV32-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32-NEXT: not a5, a5 +; LMULMAX1-RV32-NEXT: and a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 31(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 29(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 27(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 25(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 23(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 21(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 19(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 18(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 17(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV32-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v16i8: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -32 +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a2, a1, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: lui a1, 21845 +; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV64-NEXT: and a3, a3, a6 +; LMULMAX1-RV64-NEXT: sub a3, a2, a3 +; LMULMAX1-RV64-NEXT: lui a2, 13107 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: and a4, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a3, 2 +; LMULMAX1-RV64-NEXT: and a3, a3, a2 +; LMULMAX1-RV64-NEXT: add a3, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 4 +; LMULMAX1-RV64-NEXT: add a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 3855 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: lui a4, 4112 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: mul a5, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a5, 56 +; LMULMAX1-RV64-NEXT: sb a5, 31(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV64-NEXT: addi a1, a5, -1 +; LMULMAX1-RV64-NEXT: not a5, a5 +; LMULMAX1-RV64-NEXT: and a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 29(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 27(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 25(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 23(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 21(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 19(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 18(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 17(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV64-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64-NEXT: addi sp, sp, 32 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v16i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v26 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v26, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v25, v27 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v27, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v27, v26, 8 +; LMULMAX2-RV32D-NEXT: vse8.v v27, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v16i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v26 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v26, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v28, v26, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX2-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v25, v27 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v27, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v27, v26, 8 +; LMULMAX2-RV64D-NEXT: vse8.v v27, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v16i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v28, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v28 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v27, v25 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v25, v27 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v25, v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v25, v29, 8 +; LMULMAX1-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v16i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v28, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v28 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v27, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v27, v25 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v25, v27 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v25, v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v25, v29, 8 +; LMULMAX1-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v16i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v25, v25, v26 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v28, v25 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v25, v26, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX8-RV32D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v16i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v25, v25, v26 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v28, v25 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v28, v28 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v25, v26, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX8-RV64D-NEXT: vse8.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <16 x i8>, <16 x i8>* %x + %b = load <16 x i8>, <16 x i8>* %y + %c = call <16 x i8> @llvm.cttz.v16i8(<16 x i8> %a, i1 true) + store <16 x i8> %c, <16 x i8>* %x + ret void +} + +define void @cttz_zero_undef_v8i16(<8 x i16>* %x, <8 x i16>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v8i16: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a2, a1, a2 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: lui a4, 4112 +; LMULMAX2-RV32-NEXT: addi a4, a4, 257 +; LMULMAX2-RV32-NEXT: mul a5, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a5, 24 +; LMULMAX2-RV32-NEXT: sh a5, 16(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 30(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 28(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 26(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 24(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 22(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 20(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 18(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle16.v v25, (a1) +; LMULMAX2-RV32-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v8i16: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a2, a1, a2 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: sh a5, 30(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV64-NEXT: addi a1, a5, -1 +; LMULMAX2-RV64-NEXT: not a5, a5 +; LMULMAX2-RV64-NEXT: and a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 28(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 26(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 24(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 22(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 20(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 18(sp) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 16(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 16 +; LMULMAX2-RV64-NEXT: vle16.v v25, (a1) +; LMULMAX2-RV64-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV64-NEXT: addi sp, sp, 32 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v8i16: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a2, a1, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV32-NEXT: and a3, a3, a6 +; LMULMAX1-RV32-NEXT: sub a3, a2, a3 +; LMULMAX1-RV32-NEXT: lui a2, 209715 +; LMULMAX1-RV32-NEXT: addi a2, a2, 819 +; LMULMAX1-RV32-NEXT: and a4, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a3, 2 +; LMULMAX1-RV32-NEXT: and a3, a3, a2 +; LMULMAX1-RV32-NEXT: add a3, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 4 +; LMULMAX1-RV32-NEXT: add a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 61681 +; LMULMAX1-RV32-NEXT: addi a3, a3, -241 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: lui a4, 4112 +; LMULMAX1-RV32-NEXT: addi a4, a4, 257 +; LMULMAX1-RV32-NEXT: mul a5, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a5, 24 +; LMULMAX1-RV32-NEXT: sh a5, 16(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV32-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32-NEXT: not a5, a5 +; LMULMAX1-RV32-NEXT: and a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 18(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v8i16: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -32 +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a2, a1, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: lui a1, 21845 +; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV64-NEXT: and a3, a3, a6 +; LMULMAX1-RV64-NEXT: sub a3, a2, a3 +; LMULMAX1-RV64-NEXT: lui a2, 13107 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: and a4, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a3, 2 +; LMULMAX1-RV64-NEXT: and a3, a3, a2 +; LMULMAX1-RV64-NEXT: add a3, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 4 +; LMULMAX1-RV64-NEXT: add a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 3855 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: lui a4, 4112 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: slli a4, a4, 16 +; LMULMAX1-RV64-NEXT: addi a4, a4, 257 +; LMULMAX1-RV64-NEXT: mul a5, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a5, 56 +; LMULMAX1-RV64-NEXT: sh a5, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a5, v26 +; LMULMAX1-RV64-NEXT: addi a1, a5, -1 +; LMULMAX1-RV64-NEXT: not a5, a5 +; LMULMAX1-RV64-NEXT: and a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a5, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 18(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a5, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a5, a1, 1 +; LMULMAX1-RV64-NEXT: and a5, a5, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a5 +; LMULMAX1-RV64-NEXT: and a5, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a5, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV64-NEXT: addi sp, sp, 32 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v8i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v25, v26 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX2-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v8i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v25, v26 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX2-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v8i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v27, 23 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v27, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 4 +; LMULMAX1-RV32D-NEXT: vse16.v v27, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v8i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v27, 23 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v27, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 4 +; LMULMAX1-RV64D-NEXT: vse16.v v27, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v8i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v25, v25, v26 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX8-RV32D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v8i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v25, v25, v26 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX8-RV64D-NEXT: vse16.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <8 x i16>, <8 x i16>* %x + %b = load <8 x i16>, <8 x i16>* %y + %c = call <8 x i16> @llvm.cttz.v8i16(<8 x i16> %a, i1 true) + store <8 x i16> %c, <8 x i16>* %x + ret void +} + +define void @cttz_zero_undef_v4i32(<4 x i32>* %x, <4 x i32>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v4i32: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a2, a1, a2 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a4, a4, a3 +; LMULMAX2-RV32-NEXT: lui a5, 4112 +; LMULMAX2-RV32-NEXT: addi a5, a5, 257 +; LMULMAX2-RV32-NEXT: mul a4, a4, a5 +; LMULMAX2-RV32-NEXT: srli a4, a4, 24 +; LMULMAX2-RV32-NEXT: sw a4, 16(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a4, v26 +; LMULMAX2-RV32-NEXT: addi a1, a4, -1 +; LMULMAX2-RV32-NEXT: not a4, a4 +; LMULMAX2-RV32-NEXT: and a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a4, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a4, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a4, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 28(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a4, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a4, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a4, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a4, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: addi a4, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a4, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a4, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 20(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v4i32: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a2, a1, a2 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a4, a4, a3 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a4, a4, a5 +; LMULMAX2-RV64-NEXT: srli a4, a4, 56 +; LMULMAX2-RV64-NEXT: sw a4, 28(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a4, v26 +; LMULMAX2-RV64-NEXT: addi a1, a4, -1 +; LMULMAX2-RV64-NEXT: not a4, a4 +; LMULMAX2-RV64-NEXT: and a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64-NEXT: and a4, a4, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 24(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64-NEXT: and a4, a4, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 20(sp) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64-NEXT: and a4, a4, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 16(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 16 +; LMULMAX2-RV64-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV64-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV64-NEXT: addi sp, sp, 32 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v4i32: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a2, a1, a2 +; LMULMAX1-RV32-NEXT: srli a3, a2, 1 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV32-NEXT: and a3, a3, a6 +; LMULMAX1-RV32-NEXT: sub a3, a2, a3 +; LMULMAX1-RV32-NEXT: lui a2, 209715 +; LMULMAX1-RV32-NEXT: addi a2, a2, 819 +; LMULMAX1-RV32-NEXT: and a4, a3, a2 +; LMULMAX1-RV32-NEXT: srli a3, a3, 2 +; LMULMAX1-RV32-NEXT: and a3, a3, a2 +; LMULMAX1-RV32-NEXT: add a3, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 4 +; LMULMAX1-RV32-NEXT: add a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 61681 +; LMULMAX1-RV32-NEXT: addi a3, a3, -241 +; LMULMAX1-RV32-NEXT: and a4, a4, a3 +; LMULMAX1-RV32-NEXT: lui a5, 4112 +; LMULMAX1-RV32-NEXT: addi a5, a5, 257 +; LMULMAX1-RV32-NEXT: mul a4, a4, a5 +; LMULMAX1-RV32-NEXT: srli a4, a4, 24 +; LMULMAX1-RV32-NEXT: sw a4, 16(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a4, v26 +; LMULMAX1-RV32-NEXT: addi a1, a4, -1 +; LMULMAX1-RV32-NEXT: not a4, a4 +; LMULMAX1-RV32-NEXT: and a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a4, a1, 1 +; LMULMAX1-RV32-NEXT: and a4, a4, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a4, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a4, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a4, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a4, a1, 1 +; LMULMAX1-RV32-NEXT: and a4, a4, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a4, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a4, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a4, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: srli a4, a1, 1 +; LMULMAX1-RV32-NEXT: and a4, a4, a6 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a4, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: add a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 20(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v4i32: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -32 +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a2, a1, a2 +; LMULMAX1-RV64-NEXT: srli a3, a2, 1 +; LMULMAX1-RV64-NEXT: lui a1, 21845 +; LMULMAX1-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX1-RV64-NEXT: slli a1, a1, 12 +; LMULMAX1-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX1-RV64-NEXT: and a3, a3, a6 +; LMULMAX1-RV64-NEXT: sub a3, a2, a3 +; LMULMAX1-RV64-NEXT: lui a2, 13107 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: and a4, a3, a2 +; LMULMAX1-RV64-NEXT: srli a3, a3, 2 +; LMULMAX1-RV64-NEXT: and a3, a3, a2 +; LMULMAX1-RV64-NEXT: add a3, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 4 +; LMULMAX1-RV64-NEXT: add a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 3855 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 241 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, -241 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a4, a4, a5 +; LMULMAX1-RV64-NEXT: srli a4, a4, 56 +; LMULMAX1-RV64-NEXT: sw a4, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a4, v26 +; LMULMAX1-RV64-NEXT: addi a1, a4, -1 +; LMULMAX1-RV64-NEXT: not a4, a4 +; LMULMAX1-RV64-NEXT: and a1, a4, a1 +; LMULMAX1-RV64-NEXT: srli a4, a1, 1 +; LMULMAX1-RV64-NEXT: and a4, a4, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a4 +; LMULMAX1-RV64-NEXT: and a4, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a4, a1 +; LMULMAX1-RV64-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a4 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a4, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a4, a1, 1 +; LMULMAX1-RV64-NEXT: and a4, a4, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a4 +; LMULMAX1-RV64-NEXT: and a4, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a4, a1 +; LMULMAX1-RV64-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a4 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 20(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a4, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: srli a4, a1, 1 +; LMULMAX1-RV64-NEXT: and a4, a4, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a4 +; LMULMAX1-RV64-NEXT: and a4, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a4, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV64-NEXT: addi sp, sp, 32 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v4i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v25, v26 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 1023 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX2-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v4i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v25, v26 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 1023 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX2-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v4i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v26, v27, a1 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 1023 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v25, v27, a1 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 2 +; LMULMAX1-RV32D-NEXT: vse32.v v27, (a0) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v4i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v26, v27, a1 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 1023 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v25, v27, a1 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 2 +; LMULMAX1-RV64D-NEXT: vse32.v v27, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v4i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v25, v25, v26 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV32D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX8-RV32D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v4i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v26, v25, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v25, v25, v26 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV64D-NEXT: vsub.vx v25, v25, a1 +; LMULMAX8-RV64D-NEXT: vse32.v v25, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <4 x i32>, <4 x i32>* %x + %b = load <4 x i32>, <4 x i32>* %y + %c = call <4 x i32> @llvm.cttz.v4i32(<4 x i32> %a, i1 true) + store <4 x i32> %c, <4 x i32>* %x + ret void +} + +define void @cttz_zero_undef_v2i64(<2 x i64>* %x, <2 x i64>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v2i64: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV32-NEXT: sw zero, 28(sp) +; LMULMAX2-RV32-NEXT: sw zero, 20(sp) +; LMULMAX2-RV32-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32-NEXT: lui a1, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32-NEXT: lui a1, 61681 +; LMULMAX2-RV32-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32-NEXT: lui a2, 4112 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v25 +; LMULMAX2-RV32-NEXT: addi a2, a2, 257 +; LMULMAX2-RV32-NEXT: bnez a5, .LBB11_2 +; LMULMAX2-RV32-NEXT: # %bb.1: +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB11_3 +; LMULMAX2-RV32-NEXT: .LBB11_2: +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB11_3: +; LMULMAX2-RV32-NEXT: sw a5, 16(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v25 +; LMULMAX2-RV32-NEXT: bnez a5, .LBB11_5 +; LMULMAX2-RV32-NEXT: # %bb.4: +; LMULMAX2-RV32-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB11_6 +; LMULMAX2-RV32-NEXT: .LBB11_5: +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB11_6: +; LMULMAX2-RV32-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32-NEXT: vse64.v v25, (a0) +; LMULMAX2-RV32-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v2i64: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: lui a3, 21845 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 1365 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a6, a3, 1365 +; LMULMAX2-RV64-NEXT: and a2, a2, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a4 +; LMULMAX2-RV64-NEXT: lui a4, 3855 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64-NEXT: vmv.v.x v26, a1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64-NEXT: addi a3, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a3 +; LMULMAX2-RV64-NEXT: and a3, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a3, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX2-RV64-NEXT: vmv.s.x v26, a1 +; LMULMAX2-RV64-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v2i64: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a4, a1, 1365 +; LMULMAX1-RV32-NEXT: lui a1, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a1, 819 +; LMULMAX1-RV32-NEXT: lui a1, 61681 +; LMULMAX1-RV32-NEXT: addi a7, a1, -241 +; LMULMAX1-RV32-NEXT: lui a2, 4112 +; LMULMAX1-RV32-NEXT: vmv.x.s a5, v25 +; LMULMAX1-RV32-NEXT: addi a2, a2, 257 +; LMULMAX1-RV32-NEXT: bnez a5, .LBB11_2 +; LMULMAX1-RV32-NEXT: # %bb.1: +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a5, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB11_3 +; LMULMAX1-RV32-NEXT: .LBB11_2: +; LMULMAX1-RV32-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32-NEXT: not a5, a5 +; LMULMAX1-RV32-NEXT: and a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a5, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a5, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a5 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a5, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB11_3: +; LMULMAX1-RV32-NEXT: sw a5, 16(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a5, v25 +; LMULMAX1-RV32-NEXT: bnez a5, .LBB11_5 +; LMULMAX1-RV32-NEXT: # %bb.4: +; LMULMAX1-RV32-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a4, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a4, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a3 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB11_6 +; LMULMAX1-RV32-NEXT: .LBB11_5: +; LMULMAX1-RV32-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32-NEXT: not a5, a5 +; LMULMAX1-RV32-NEXT: and a1, a5, a1 +; LMULMAX1-RV32-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32-NEXT: and a4, a5, a4 +; LMULMAX1-RV32-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32-NEXT: and a4, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a4, a1 +; LMULMAX1-RV32-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a3 +; LMULMAX1-RV32-NEXT: and a1, a1, a7 +; LMULMAX1-RV32-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB11_6: +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v2i64: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: lui a3, 21845 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a6, a3, 1365 +; LMULMAX1-RV64-NEXT: and a2, a2, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: lui a2, 13107 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64-NEXT: and a4, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a4, a1 +; LMULMAX1-RV64-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a4 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a3, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64-NEXT: and a3, a3, a6 +; LMULMAX1-RV64-NEXT: sub a1, a1, a3 +; LMULMAX1-RV64-NEXT: and a3, a1, a2 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: add a1, a3, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v2i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a2, 4112 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX2-RV32D-NEXT: addi a2, a2, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB11_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB11_3 +; LMULMAX2-RV32D-NEXT: .LBB11_2: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB11_3: +; LMULMAX2-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB11_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB11_6 +; LMULMAX2-RV32D-NEXT: .LBB11_5: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB11_6: +; LMULMAX2-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX2-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v2i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64D-NEXT: lui a3, 21845 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX2-RV64D-NEXT: and a2, a2, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a4, 3855 +; LMULMAX2-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: lui a5, 4112 +; LMULMAX2-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX2-RV64D-NEXT: addi a3, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX2-RV64D-NEXT: and a3, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a3, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v2i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32D-NEXT: lui a1, 349525 +; LMULMAX1-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX1-RV32D-NEXT: lui a1, 209715 +; LMULMAX1-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX1-RV32D-NEXT: lui a1, 61681 +; LMULMAX1-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX1-RV32D-NEXT: lui a2, 4112 +; LMULMAX1-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX1-RV32D-NEXT: addi a2, a2, 257 +; LMULMAX1-RV32D-NEXT: bnez a5, .LBB11_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB11_3 +; LMULMAX1-RV32D-NEXT: .LBB11_2: +; LMULMAX1-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32D-NEXT: not a5, a5 +; LMULMAX1-RV32D-NEXT: and a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a5, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a5, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a5 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB11_3: +; LMULMAX1-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX1-RV32D-NEXT: bnez a5, .LBB11_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a5 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB11_6 +; LMULMAX1-RV32D-NEXT: .LBB11_5: +; LMULMAX1-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX1-RV32D-NEXT: not a5, a5 +; LMULMAX1-RV32D-NEXT: and a1, a5, a1 +; LMULMAX1-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX1-RV32D-NEXT: and a4, a5, a4 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX1-RV32D-NEXT: and a4, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a3 +; LMULMAX1-RV32D-NEXT: add a1, a4, a1 +; LMULMAX1-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a3 +; LMULMAX1-RV32D-NEXT: and a1, a1, a7 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB11_6: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v2i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: lui a3, 21845 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX1-RV64D-NEXT: and a2, a2, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: lui a2, 13107 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX1-RV64D-NEXT: and a4, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a4, a1 +; LMULMAX1-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: addi a3, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX1-RV64D-NEXT: and a3, a3, a6 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX1-RV64D-NEXT: and a3, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: add a1, a3, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v2i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a2, 4112 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX8-RV32D-NEXT: addi a2, a2, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB11_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB11_3 +; LMULMAX8-RV32D-NEXT: .LBB11_2: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB11_3: +; LMULMAX8-RV32D-NEXT: sw a5, 16(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v25 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB11_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB11_6 +; LMULMAX8-RV32D-NEXT: .LBB11_5: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB11_6: +; LMULMAX8-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX8-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, sp, 32 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v2i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX8-RV64D-NEXT: lui a3, 21845 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 1365 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a3, 1365 +; LMULMAX8-RV64D-NEXT: and a2, a2, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a4, 3855 +; LMULMAX8-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX8-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX8-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: lui a5, 4112 +; LMULMAX8-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX8-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX8-RV64D-NEXT: addi a3, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: srli a3, a1, 1 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a3 +; LMULMAX8-RV64D-NEXT: and a3, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a3, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX8-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <2 x i64>, <2 x i64>* %x + %b = load <2 x i64>, <2 x i64>* %y + %c = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %a, i1 true) + store <2 x i64> %c, <2 x i64>* %x + ret void +} + +define void @cttz_zero_undef_v32i8(<32 x i8>* %x, <32 x i8>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v32i8: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX2-RV32-NEXT: addi a3, a2, -1 +; LMULMAX2-RV32-NEXT: not a2, a2 +; LMULMAX2-RV32-NEXT: and a3, a2, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 1 +; LMULMAX2-RV32-NEXT: lui a2, 349525 +; LMULMAX2-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV32-NEXT: and a4, a4, a7 +; LMULMAX2-RV32-NEXT: sub a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a3, 819 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a4, 2 +; LMULMAX2-RV32-NEXT: and a4, a4, a3 +; LMULMAX2-RV32-NEXT: add a4, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a4, 4 +; LMULMAX2-RV32-NEXT: add a5, a4, a5 +; LMULMAX2-RV32-NEXT: lui a4, 61681 +; LMULMAX2-RV32-NEXT: addi a4, a4, -241 +; LMULMAX2-RV32-NEXT: and a1, a5, a4 +; LMULMAX2-RV32-NEXT: lui a5, 4112 +; LMULMAX2-RV32-NEXT: addi a5, a5, 257 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 32(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e8, m2, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 31 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 63(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 30 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 62(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 29 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 61(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 28 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 60(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 27 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 59(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 26 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 58(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 25 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 57(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 24 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 56(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 23 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 55(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 22 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 54(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 21 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 53(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 20 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 52(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 19 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 51(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 18 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 50(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 17 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 49(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 16 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 48(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 47(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 46(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 45(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 44(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 43(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 42(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 41(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 40(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 39(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 38(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 37(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 36(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 35(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 34(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a2, a1, 1 +; LMULMAX2-RV32-NEXT: and a2, a2, a7 +; LMULMAX2-RV32-NEXT: sub a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a2, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a2, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a4 +; LMULMAX2-RV32-NEXT: mul a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sb a1, 33(sp) +; LMULMAX2-RV32-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle8.v v26, (a1) +; LMULMAX2-RV32-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v32i8: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: addi a6, zero, 32 +; LMULMAX2-RV64-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle8.v v26, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e8, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 31 +; LMULMAX2-RV64-NEXT: vmv.x.s a2, v28 +; LMULMAX2-RV64-NEXT: addi a3, a2, -1 +; LMULMAX2-RV64-NEXT: not a2, a2 +; LMULMAX2-RV64-NEXT: and a3, a2, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 1 +; LMULMAX2-RV64-NEXT: lui a2, 21845 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX2-RV64-NEXT: and a4, a4, a7 +; LMULMAX2-RV64-NEXT: sub a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 13107 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 819 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a4, 2 +; LMULMAX2-RV64-NEXT: and a4, a4, a3 +; LMULMAX2-RV64-NEXT: add a4, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a4, 4 +; LMULMAX2-RV64-NEXT: add a5, a4, a5 +; LMULMAX2-RV64-NEXT: lui a4, 3855 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, 241 +; LMULMAX2-RV64-NEXT: slli a4, a4, 12 +; LMULMAX2-RV64-NEXT: addi a4, a4, -241 +; LMULMAX2-RV64-NEXT: and a1, a5, a4 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 63(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 30 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 62(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 29 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 61(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 28 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 60(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 27 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 59(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 26 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 58(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 25 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 57(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 24 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 23 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 55(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 22 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 54(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 21 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 53(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 20 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 52(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 19 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 51(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 18 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 50(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 17 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 49(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 16 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 47(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 46(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 45(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 44(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 43(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 42(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 41(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 40(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 39(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 38(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 37(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 36(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 35(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 34(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 33(sp) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: srli a2, a1, 1 +; LMULMAX2-RV64-NEXT: and a2, a2, a7 +; LMULMAX2-RV64-NEXT: sub a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a2, a1, a3 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: add a1, a2, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sb a1, 32(sp) +; LMULMAX2-RV64-NEXT: vsetvli zero, a6, e8, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle8.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse8.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v32i8: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32-NEXT: vle8.v v26, (a6) +; LMULMAX1-RV32-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: addi a3, a2, -1 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: and a3, a2, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 1 +; LMULMAX1-RV32-NEXT: lui a2, 349525 +; LMULMAX1-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV32-NEXT: and a4, a4, a7 +; LMULMAX1-RV32-NEXT: sub a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a3, 819 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a4, 2 +; LMULMAX1-RV32-NEXT: and a4, a4, a3 +; LMULMAX1-RV32-NEXT: add a4, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a4, 4 +; LMULMAX1-RV32-NEXT: add a5, a4, a5 +; LMULMAX1-RV32-NEXT: lui a4, 61681 +; LMULMAX1-RV32-NEXT: addi a4, a4, -241 +; LMULMAX1-RV32-NEXT: and a1, a5, a4 +; LMULMAX1-RV32-NEXT: lui a5, 4112 +; LMULMAX1-RV32-NEXT: addi a5, a5, 257 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 32(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 15 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 47(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 14 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 46(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 13 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 45(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 12 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 44(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 11 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 43(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 10 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 42(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 9 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 41(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 8 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 40(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 39(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 38(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 37(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 36(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 35(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 34(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 33(sp) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 16(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 31(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 29(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 27(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 25(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 23(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 21(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 19(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 18(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sb a1, 17(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle8.v v26, (a1) +; LMULMAX1-RV32-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse8.v v26, (a6) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v32i8: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -48 +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle8.v v26, (a6) +; LMULMAX1-RV64-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 15 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: addi a3, a2, -1 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: and a3, a2, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 47(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 14 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 46(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 13 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 45(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 12 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 44(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 11 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 43(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 10 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 42(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 9 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 41(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 8 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 40(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 39(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 38(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 37(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 36(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 35(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 34(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 33(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 32(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 15 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 31(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 14 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 13 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 29(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 12 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 11 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 27(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 10 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 9 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 25(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 8 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 23(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 21(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 19(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 18(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 17(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sb a1, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle8.v v25, (a1) +; LMULMAX1-RV64-NEXT: addi a1, sp, 32 +; LMULMAX1-RV64-NEXT: vle8.v v26, (a1) +; LMULMAX1-RV64-NEXT: vse8.v v25, (a0) +; LMULMAX1-RV64-NEXT: vse8.v v26, (a6) +; LMULMAX1-RV64-NEXT: addi sp, sp, 48 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v32i8: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle8.v v30, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v8, v30, 16 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v8, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v8, v25 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v26, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vmv1r.v v26, v28 +; LMULMAX2-RV32D-NEXT: vslideup.vi v26, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v8, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v25, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v26, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v30, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v30, v25 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v25, v30, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v30, v25, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v25, v30 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vzext.vf4 v30, v25 +; LMULMAX2-RV32D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX2-RV32D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v26, 16 +; LMULMAX2-RV32D-NEXT: vse8.v v30, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v32i8: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle8.v v30, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v8, v30, 16 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v8, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v8, v25 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v26, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v26, v26 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vmv1r.v v26, v28 +; LMULMAX2-RV64D-NEXT: vslideup.vi v26, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v8, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v8, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v25, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v26, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v30, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v30, v25 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v8, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v8, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v25, v30, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v30, v25, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v25, v30 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vzext.vf4 v30, v25 +; LMULMAX2-RV64D-NEXT: vfcvt.f.xu.v v30, v30 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v30, 23 +; LMULMAX2-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX2-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v28, v25, 8 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v28, 0 +; LMULMAX2-RV64D-NEXT: vsetvli zero, a1, e8, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v26, 16 +; LMULMAX2-RV64D-NEXT: vse8.v v30, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v32i8: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle8.v v27, (a1) +; LMULMAX1-RV32D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v28, v27, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v26, v28, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v28, v26 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v29, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v30, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v28, v28, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v29, v28, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v28, v28, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v28, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v30, v28, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v28, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v29, v28, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v28, v28, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v28, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v29, v27 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v27, v29 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v28, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v29, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v30, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v25, 8 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v30, v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v31, v30 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v30, v31 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v30, v30, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v31, v26 +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v30, 0 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v31, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v29, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v30, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vzext.vf4 v30, v25 +; LMULMAX1-RV32D-NEXT: vfcvt.f.xu.v v25, v30 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV32D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v26, v29, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v27, v31, 8 +; LMULMAX1-RV32D-NEXT: vse8.v v27, (a0) +; LMULMAX1-RV32D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v32i8: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle8.v v27, (a1) +; LMULMAX1-RV64D-NEXT: vle8.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v28, v27, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v26, v28, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v28, v26 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v26 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v26, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v26, 0 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v29, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v30, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v28, v28, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v29, v28, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v28, v28, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v28, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v30, v28, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v28, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v29, v28, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v28, v28, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v28 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v28, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v28, v28, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v28, v28, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v29, v27 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v27, v29 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v27, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v28, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v27, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v28, v27 +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v29, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v30, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v25, 8 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v30, v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v31, v30 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v30, v31 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v30, v30, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v30, v30, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v31, v26 +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v30, 0 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v31, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v29, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v29, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v29, v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v29 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v29, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v29, v29, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v29, v29, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v30, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vzext.vf4 v30, v25 +; LMULMAX1-RV64D-NEXT: vfcvt.f.xu.v v25, v30 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 23 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e8, mf4, ta, mu +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v25, 0 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, mf2, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v26, v29, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 16, e8, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v27, v31, 8 +; LMULMAX1-RV64D-NEXT: vse8.v v27, (a0) +; LMULMAX1-RV64D-NEXT: vse8.v v28, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v32i8: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV32D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v26, v26, v28 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV32D-NEXT: vzext.vf4 v8, v26 +; LMULMAX8-RV32D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV32D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v32i8: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi a1, zero, 32 +; LMULMAX8-RV64D-NEXT: vsetvli zero, a1, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v26, v26, v28 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e32, m8, ta, mu +; LMULMAX8-RV64D-NEXT: vzext.vf4 v8, v26 +; LMULMAX8-RV64D-NEXT: vfcvt.f.xu.v v8, v8 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e16, m4, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v28, v8, 23 +; LMULMAX8-RV64D-NEXT: vsetvli zero, zero, e8, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 0 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vse8.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <32 x i8>, <32 x i8>* %x + %b = load <32 x i8>, <32 x i8>* %y + %c = call <32 x i8> @llvm.cttz.v32i8(<32 x i8> %a, i1 true) + store <32 x i8> %c, <32 x i8>* %x + ret void +} + +define void @cttz_zero_undef_v16i16(<16 x i16>* %x, <16 x i16>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v16i16: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a2, a1, a2 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: lui a4, 4112 +; LMULMAX2-RV32-NEXT: addi a4, a4, 257 +; LMULMAX2-RV32-NEXT: mul a5, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a5, 24 +; LMULMAX2-RV32-NEXT: sh a5, 32(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e16, m2, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 62(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 60(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 58(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 56(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 54(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 52(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 50(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 48(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 46(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 44(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 42(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 40(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 38(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 36(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sh a1, 34(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle16.v v26, (a1) +; LMULMAX2-RV32-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v16i16: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e16, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 15 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a2, a1, a2 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: sh a5, 62(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 14 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV64-NEXT: addi a1, a5, -1 +; LMULMAX2-RV64-NEXT: not a5, a5 +; LMULMAX2-RV64-NEXT: and a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 60(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 13 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 58(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 12 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 11 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 54(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 10 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 52(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 9 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 50(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 46(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 44(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 42(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 40(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 38(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 36(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 34(sp) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sh a1, 32(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle16.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse16.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v16i16: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32-NEXT: vle16.v v26, (a6) +; LMULMAX1-RV32-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: addi a3, a2, -1 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: and a3, a2, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 1 +; LMULMAX1-RV32-NEXT: lui a2, 349525 +; LMULMAX1-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV32-NEXT: and a4, a4, a7 +; LMULMAX1-RV32-NEXT: sub a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a3, 819 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a4, 2 +; LMULMAX1-RV32-NEXT: and a4, a4, a3 +; LMULMAX1-RV32-NEXT: add a4, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a4, 4 +; LMULMAX1-RV32-NEXT: add a5, a4, a5 +; LMULMAX1-RV32-NEXT: lui a4, 61681 +; LMULMAX1-RV32-NEXT: addi a4, a4, -241 +; LMULMAX1-RV32-NEXT: and a1, a5, a4 +; LMULMAX1-RV32-NEXT: lui a5, 4112 +; LMULMAX1-RV32-NEXT: addi a5, a5, 257 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 32(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 46(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 44(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 42(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 40(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 38(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 36(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 34(sp) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 16(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 30(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 26(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 22(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 20(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sh a1, 18(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle16.v v26, (a1) +; LMULMAX1-RV32-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse16.v v26, (a6) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v16i16: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -48 +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle16.v v26, (a6) +; LMULMAX1-RV64-NEXT: vle16.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: addi a3, a2, -1 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: and a3, a2, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 46(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 44(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 42(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 40(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 38(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 36(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 34(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 32(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 7 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 30(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 6 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 5 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 26(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 4 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 22(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 20(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 18(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sh a1, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64-NEXT: addi a1, sp, 32 +; LMULMAX1-RV64-NEXT: vle16.v v26, (a1) +; LMULMAX1-RV64-NEXT: vse16.v v25, (a0) +; LMULMAX1-RV64-NEXT: vse16.v v26, (a6) +; LMULMAX1-RV64-NEXT: addi sp, sp, 48 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v16i16: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV32D-NEXT: vsub.vx v28, v25, a1 +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV32D-NEXT: vsub.vx v26, v25, a1 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v28, 8 +; LMULMAX2-RV32D-NEXT: vse16.v v30, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v16i16: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 8 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX2-RV64D-NEXT: vsub.vx v28, v25, a1 +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wi v25, v26, 23 +; LMULMAX2-RV64D-NEXT: vsub.vx v26, v25, a1 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 16, e16, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v28, 8 +; LMULMAX2-RV64D-NEXT: vse16.v v30, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v16i16: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v25, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v26, 4 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v25, v27, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wi v26, v27, 23 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v25, 4 +; LMULMAX1-RV32D-NEXT: vse16.v v28, (a0) +; LMULMAX1-RV32D-NEXT: vse16.v v29, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v16i16: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle16.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v27, v28, 23 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 127 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v28, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v26, 4 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v25, v27, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a2 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wi v26, v27, 23 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 8, e16, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v25, 4 +; LMULMAX1-RV64D-NEXT: vse16.v v28, (a0) +; LMULMAX1-RV64D-NEXT: vse16.v v29, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v16i16: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v26, v26, v28 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v16i16: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 16, e16, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v26, v26, v28 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: vnsrl.wi v26, v28, 23 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 127 +; LMULMAX8-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vse16.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <16 x i16>, <16 x i16>* %x + %b = load <16 x i16>, <16 x i16>* %y + %c = call <16 x i16> @llvm.cttz.v16i16(<16 x i16> %a, i1 true) + store <16 x i16> %c, <16 x i16>* %x + ret void +} + +define void @cttz_zero_undef_v8i32(<8 x i32>* %x, <8 x i32>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v8i32: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a2, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a2, a1, a2 +; LMULMAX2-RV32-NEXT: srli a3, a2, 1 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV32-NEXT: and a3, a3, a6 +; LMULMAX2-RV32-NEXT: sub a3, a2, a3 +; LMULMAX2-RV32-NEXT: lui a2, 209715 +; LMULMAX2-RV32-NEXT: addi a2, a2, 819 +; LMULMAX2-RV32-NEXT: and a4, a3, a2 +; LMULMAX2-RV32-NEXT: srli a3, a3, 2 +; LMULMAX2-RV32-NEXT: and a3, a3, a2 +; LMULMAX2-RV32-NEXT: add a3, a4, a3 +; LMULMAX2-RV32-NEXT: srli a4, a3, 4 +; LMULMAX2-RV32-NEXT: add a4, a3, a4 +; LMULMAX2-RV32-NEXT: lui a3, 61681 +; LMULMAX2-RV32-NEXT: addi a3, a3, -241 +; LMULMAX2-RV32-NEXT: and a5, a4, a3 +; LMULMAX2-RV32-NEXT: lui a4, 4112 +; LMULMAX2-RV32-NEXT: addi a4, a4, 257 +; LMULMAX2-RV32-NEXT: mul a5, a5, a4 +; LMULMAX2-RV32-NEXT: srli a5, a5, 24 +; LMULMAX2-RV32-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 60(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 56(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 52(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 48(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 44(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a6 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a2 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a2, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: mul a1, a1, a4 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: sw a1, 36(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v8i32: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e32, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 7 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a2, a1, a2 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a5, a4, a3 +; LMULMAX2-RV64-NEXT: lui a4, 4112 +; LMULMAX2-RV64-NEXT: addiw a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: slli a4, a4, 16 +; LMULMAX2-RV64-NEXT: addi a4, a4, 257 +; LMULMAX2-RV64-NEXT: mul a5, a5, a4 +; LMULMAX2-RV64-NEXT: srli a5, a5, 56 +; LMULMAX2-RV64-NEXT: sw a5, 60(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 6 +; LMULMAX2-RV64-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV64-NEXT: addi a1, a5, -1 +; LMULMAX2-RV64-NEXT: not a5, a5 +; LMULMAX2-RV64-NEXT: and a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 5 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 52(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 44(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 40(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a5, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 36(sp) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a5, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a5, a1, 1 +; LMULMAX2-RV64-NEXT: and a5, a5, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a5 +; LMULMAX2-RV64-NEXT: and a5, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a5, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sw a1, 32(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse32.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v8i32: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a6, a0, 16 +; LMULMAX1-RV32-NEXT: vle32.v v26, (a6) +; LMULMAX1-RV32-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v26 +; LMULMAX1-RV32-NEXT: addi a3, a2, -1 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: and a3, a2, a3 +; LMULMAX1-RV32-NEXT: srli a4, a3, 1 +; LMULMAX1-RV32-NEXT: lui a2, 349525 +; LMULMAX1-RV32-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV32-NEXT: and a4, a4, a7 +; LMULMAX1-RV32-NEXT: sub a4, a3, a4 +; LMULMAX1-RV32-NEXT: lui a3, 209715 +; LMULMAX1-RV32-NEXT: addi a3, a3, 819 +; LMULMAX1-RV32-NEXT: and a5, a4, a3 +; LMULMAX1-RV32-NEXT: srli a4, a4, 2 +; LMULMAX1-RV32-NEXT: and a4, a4, a3 +; LMULMAX1-RV32-NEXT: add a4, a5, a4 +; LMULMAX1-RV32-NEXT: srli a5, a4, 4 +; LMULMAX1-RV32-NEXT: add a5, a4, a5 +; LMULMAX1-RV32-NEXT: lui a4, 61681 +; LMULMAX1-RV32-NEXT: addi a4, a4, -241 +; LMULMAX1-RV32-NEXT: and a1, a5, a4 +; LMULMAX1-RV32-NEXT: lui a5, 4112 +; LMULMAX1-RV32-NEXT: addi a5, a5, 257 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 44(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 36(sp) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 28(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a7 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a3 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: mul a1, a1, a5 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: sw a1, 20(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse32.v v26, (a6) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v8i32: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: addi sp, sp, -48 +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle32.v v26, (a6) +; LMULMAX1-RV64-NEXT: vle32.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: addi a3, a2, -1 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: and a3, a2, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 44(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 40(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 36(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 32(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 3 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 28(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 2 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 24(sp) +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 20(sp) +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: sw a1, 16(sp) +; LMULMAX1-RV64-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a1, sp, 16 +; LMULMAX1-RV64-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64-NEXT: addi a1, sp, 32 +; LMULMAX1-RV64-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV64-NEXT: vse32.v v25, (a0) +; LMULMAX1-RV64-NEXT: vse32.v v26, (a6) +; LMULMAX1-RV64-NEXT: addi sp, sp, 48 +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v8i32: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v28, a1 +; LMULMAX2-RV32D-NEXT: addi a2, zero, 1023 +; LMULMAX2-RV32D-NEXT: vsub.vx v28, v25, a2 +; LMULMAX2-RV32D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV32D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV32D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV32D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX2-RV32D-NEXT: vsub.vx v26, v25, a2 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV32D-NEXT: vslideup.vi v30, v28, 4 +; LMULMAX2-RV32D-NEXT: vse32.v v30, (a0) +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v8i32: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 4 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v28, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v28, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX2-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v28, a1 +; LMULMAX2-RV64D-NEXT: addi a2, zero, 1023 +; LMULMAX2-RV64D-NEXT: vsub.vx v28, v25, a2 +; LMULMAX2-RV64D-NEXT: vrsub.vi v25, v26, 0 +; LMULMAX2-RV64D-NEXT: vand.vv v25, v26, v25 +; LMULMAX2-RV64D-NEXT: vfwcvt.f.xu.v v26, v25 +; LMULMAX2-RV64D-NEXT: vnsrl.wx v25, v26, a1 +; LMULMAX2-RV64D-NEXT: vsub.vx v26, v25, a2 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vmv.v.i v30, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v26, 0 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 8, e32, m2, tu, mu +; LMULMAX2-RV64D-NEXT: vslideup.vi v30, v28, 4 +; LMULMAX2-RV64D-NEXT: vse32.v v30, (a0) +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v8i32: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v27, v25, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV32D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v27, v28, a2 +; LMULMAX1-RV32D-NEXT: addi a3, zero, 1023 +; LMULMAX1-RV32D-NEXT: vsub.vx v27, v27, a3 +; LMULMAX1-RV32D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v28 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v25, v28, a2 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v25, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v29, v27, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v26, 2 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v25, v27, a2 +; LMULMAX1-RV32D-NEXT: vsub.vx v25, v25, a3 +; LMULMAX1-RV32D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV32D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV32D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV32D-NEXT: vnsrl.wx v26, v27, a2 +; LMULMAX1-RV32D-NEXT: vsub.vx v26, v26, a3 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV32D-NEXT: vslideup.vi v28, v25, 2 +; LMULMAX1-RV32D-NEXT: vse32.v v28, (a0) +; LMULMAX1-RV32D-NEXT: vse32.v v29, (a1) +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v8i32: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a1, a0, 16 +; LMULMAX1-RV64D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v25, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v27, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v27, v27, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v27 +; LMULMAX1-RV64D-NEXT: addi a2, zero, 52 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v27, v28, a2 +; LMULMAX1-RV64D-NEXT: addi a3, zero, 1023 +; LMULMAX1-RV64D-NEXT: vsub.vx v27, v27, a3 +; LMULMAX1-RV64D-NEXT: vrsub.vi v28, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v28 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v28, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v25, v28, a2 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.i v28, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv1r.v v29, v28 +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v25, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v29, v27, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v25, v26, 2 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, mf2, ta, mu +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v25, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v25, v25, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v25 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v25, v27, a2 +; LMULMAX1-RV64D-NEXT: vsub.vx v25, v25, a3 +; LMULMAX1-RV64D-NEXT: vrsub.vi v27, v26, 0 +; LMULMAX1-RV64D-NEXT: vand.vv v26, v26, v27 +; LMULMAX1-RV64D-NEXT: vfwcvt.f.xu.v v27, v26 +; LMULMAX1-RV64D-NEXT: vnsrl.wx v26, v27, a2 +; LMULMAX1-RV64D-NEXT: vsub.vx v26, v26, a3 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v26, 0 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 4, e32, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vslideup.vi v28, v25, 2 +; LMULMAX1-RV64D-NEXT: vse32.v v28, (a0) +; LMULMAX1-RV64D-NEXT: vse32.v v29, (a1) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v8i32: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV32D-NEXT: vand.vv v26, v26, v28 +; LMULMAX8-RV32D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV32D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX8-RV32D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV32D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV32D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v8i32: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vrsub.vi v28, v26, 0 +; LMULMAX8-RV64D-NEXT: vand.vv v26, v26, v28 +; LMULMAX8-RV64D-NEXT: vfwcvt.f.xu.v v28, v26 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 52 +; LMULMAX8-RV64D-NEXT: vnsrl.wx v26, v28, a1 +; LMULMAX8-RV64D-NEXT: addi a1, zero, 1023 +; LMULMAX8-RV64D-NEXT: vsub.vx v26, v26, a1 +; LMULMAX8-RV64D-NEXT: vse32.v v26, (a0) +; LMULMAX8-RV64D-NEXT: ret + %a = load <8 x i32>, <8 x i32>* %x + %b = load <8 x i32>, <8 x i32>* %y + %c = call <8 x i32> @llvm.cttz.v8i32(<8 x i32> %a, i1 true) + store <8 x i32> %c, <8 x i32>* %x + ret void +} + +define void @cttz_zero_undef_v4i64(<4 x i64>* %x, <4 x i64>* %y) nounwind { +; LMULMAX2-RV32-LABEL: cttz_zero_undef_v4i64: +; LMULMAX2-RV32: # %bb.0: +; LMULMAX2-RV32-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV32-NEXT: sw zero, 60(sp) +; LMULMAX2-RV32-NEXT: sw zero, 52(sp) +; LMULMAX2-RV32-NEXT: sw zero, 44(sp) +; LMULMAX2-RV32-NEXT: sw zero, 36(sp) +; LMULMAX2-RV32-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32-NEXT: lui a1, 349525 +; LMULMAX2-RV32-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32-NEXT: lui a1, 209715 +; LMULMAX2-RV32-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32-NEXT: lui a1, 61681 +; LMULMAX2-RV32-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32-NEXT: lui a1, 4112 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32-NEXT: bnez a5, .LBB15_2 +; LMULMAX2-RV32-NEXT: # %bb.1: +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_3 +; LMULMAX2-RV32-NEXT: .LBB15_2: +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_3: +; LMULMAX2-RV32-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32-NEXT: bnez a5, .LBB15_5 +; LMULMAX2-RV32-NEXT: # %bb.4: +; LMULMAX2-RV32-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_6 +; LMULMAX2-RV32-NEXT: .LBB15_5: +; LMULMAX2-RV32-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32-NEXT: not a5, a5 +; LMULMAX2-RV32-NEXT: and a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_6: +; LMULMAX2-RV32-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: sw a5, 56(sp) +; LMULMAX2-RV32-NEXT: bnez a1, .LBB15_8 +; LMULMAX2-RV32-NEXT: # %bb.7: +; LMULMAX2-RV32-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_9 +; LMULMAX2-RV32-NEXT: .LBB15_8: +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a5, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a5, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a5, a1 +; LMULMAX2-RV32-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a5 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_9: +; LMULMAX2-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: sw a5, 48(sp) +; LMULMAX2-RV32-NEXT: bnez a1, .LBB15_11 +; LMULMAX2-RV32-NEXT: # %bb.10: +; LMULMAX2-RV32-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX2-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32-NEXT: j .LBB15_12 +; LMULMAX2-RV32-NEXT: .LBB15_11: +; LMULMAX2-RV32-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32-NEXT: not a1, a1 +; LMULMAX2-RV32-NEXT: and a1, a1, a5 +; LMULMAX2-RV32-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32-NEXT: and a4, a5, a4 +; LMULMAX2-RV32-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32-NEXT: and a4, a1, a3 +; LMULMAX2-RV32-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32-NEXT: and a1, a1, a3 +; LMULMAX2-RV32-NEXT: add a1, a4, a1 +; LMULMAX2-RV32-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32-NEXT: add a1, a1, a3 +; LMULMAX2-RV32-NEXT: and a1, a1, a7 +; LMULMAX2-RV32-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32-NEXT: .LBB15_12: +; LMULMAX2-RV32-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV32-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32-NEXT: ret +; +; LMULMAX2-RV64-LABEL: cttz_zero_undef_v4i64: +; LMULMAX2-RV64: # %bb.0: +; LMULMAX2-RV64-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV64-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a2, a1, a2 +; LMULMAX2-RV64-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64-NEXT: lui a1, 21845 +; LMULMAX2-RV64-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64-NEXT: and a3, a3, a6 +; LMULMAX2-RV64-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64-NEXT: lui a2, 13107 +; LMULMAX2-RV64-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64-NEXT: and a4, a3, a2 +; LMULMAX2-RV64-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64-NEXT: and a3, a3, a2 +; LMULMAX2-RV64-NEXT: add a3, a4, a3 +; LMULMAX2-RV64-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64-NEXT: add a4, a3, a4 +; LMULMAX2-RV64-NEXT: lui a3, 3855 +; LMULMAX2-RV64-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64-NEXT: and a4, a4, a3 +; LMULMAX2-RV64-NEXT: lui a5, 4112 +; LMULMAX2-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64-NEXT: mul a4, a4, a5 +; LMULMAX2-RV64-NEXT: srli a4, a4, 56 +; LMULMAX2-RV64-NEXT: sd a4, 56(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64-NEXT: vmv.x.s a4, v28 +; LMULMAX2-RV64-NEXT: addi a1, a4, -1 +; LMULMAX2-RV64-NEXT: not a4, a4 +; LMULMAX2-RV64-NEXT: and a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64-NEXT: and a4, a4, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sd a1, 48(sp) +; LMULMAX2-RV64-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64-NEXT: and a4, a4, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sd a1, 40(sp) +; LMULMAX2-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64-NEXT: not a1, a1 +; LMULMAX2-RV64-NEXT: and a1, a1, a4 +; LMULMAX2-RV64-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64-NEXT: and a4, a4, a6 +; LMULMAX2-RV64-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64-NEXT: and a4, a1, a2 +; LMULMAX2-RV64-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64-NEXT: and a1, a1, a2 +; LMULMAX2-RV64-NEXT: add a1, a4, a1 +; LMULMAX2-RV64-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64-NEXT: add a1, a1, a2 +; LMULMAX2-RV64-NEXT: and a1, a1, a3 +; LMULMAX2-RV64-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64-NEXT: sd a1, 32(sp) +; LMULMAX2-RV64-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64-NEXT: vle64.v v26, (a1) +; LMULMAX2-RV64-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64-NEXT: ret +; +; LMULMAX1-RV32-LABEL: cttz_zero_undef_v4i64: +; LMULMAX1-RV32: # %bb.0: +; LMULMAX1-RV32-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32-NEXT: addi a7, a0, 16 +; LMULMAX1-RV32-NEXT: vle64.v v26, (a7) +; LMULMAX1-RV32-NEXT: sw zero, 44(sp) +; LMULMAX1-RV32-NEXT: sw zero, 36(sp) +; LMULMAX1-RV32-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32-NEXT: lui a1, 349525 +; LMULMAX1-RV32-NEXT: addi a5, a1, 1365 +; LMULMAX1-RV32-NEXT: lui a1, 209715 +; LMULMAX1-RV32-NEXT: addi a4, a1, 819 +; LMULMAX1-RV32-NEXT: lui a1, 61681 +; LMULMAX1-RV32-NEXT: addi t0, a1, -241 +; LMULMAX1-RV32-NEXT: lui a2, 4112 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a3, a2, 257 +; LMULMAX1-RV32-NEXT: bnez a1, .LBB15_2 +; LMULMAX1-RV32-NEXT: # %bb.1: +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vsrl.vx v27, v26, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_3 +; LMULMAX1-RV32-NEXT: .LBB15_2: +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_3: +; LMULMAX1-RV32-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: bnez a1, .LBB15_5 +; LMULMAX1-RV32-NEXT: # %bb.4: +; LMULMAX1-RV32-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_6 +; LMULMAX1-RV32-NEXT: .LBB15_5: +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_6: +; LMULMAX1-RV32-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32-NEXT: bnez a1, .LBB15_8 +; LMULMAX1-RV32-NEXT: # %bb.7: +; LMULMAX1-RV32-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_9 +; LMULMAX1-RV32-NEXT: .LBB15_8: +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_9: +; LMULMAX1-RV32-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV32-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32-NEXT: bnez a2, .LBB15_11 +; LMULMAX1-RV32-NEXT: # %bb.10: +; LMULMAX1-RV32-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX1-RV32-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32-NEXT: not a1, a1 +; LMULMAX1-RV32-NEXT: and a1, a1, a2 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32-NEXT: j .LBB15_12 +; LMULMAX1-RV32-NEXT: .LBB15_11: +; LMULMAX1-RV32-NEXT: addi a1, a2, -1 +; LMULMAX1-RV32-NEXT: not a2, a2 +; LMULMAX1-RV32-NEXT: and a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32-NEXT: and a2, a2, a5 +; LMULMAX1-RV32-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a2, a1, a4 +; LMULMAX1-RV32-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32-NEXT: and a1, a1, a4 +; LMULMAX1-RV32-NEXT: add a1, a2, a1 +; LMULMAX1-RV32-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32-NEXT: add a1, a1, a2 +; LMULMAX1-RV32-NEXT: and a1, a1, t0 +; LMULMAX1-RV32-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32-NEXT: .LBB15_12: +; LMULMAX1-RV32-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32-NEXT: vse64.v v26, (a7) +; LMULMAX1-RV32-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32-NEXT: ret +; +; LMULMAX1-RV64-LABEL: cttz_zero_undef_v4i64: +; LMULMAX1-RV64: # %bb.0: +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64-NEXT: vle64.v v26, (a6) +; LMULMAX1-RV64-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v27, v26, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64-NEXT: addi a3, a2, -1 +; LMULMAX1-RV64-NEXT: not a2, a2 +; LMULMAX1-RV64-NEXT: and a3, a2, a3 +; LMULMAX1-RV64-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64-NEXT: lui a2, 21845 +; LMULMAX1-RV64-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64-NEXT: and a4, a4, a7 +; LMULMAX1-RV64-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64-NEXT: lui a3, 13107 +; LMULMAX1-RV64-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64-NEXT: and a5, a4, a3 +; LMULMAX1-RV64-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64-NEXT: and a4, a4, a3 +; LMULMAX1-RV64-NEXT: add a4, a5, a4 +; LMULMAX1-RV64-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64-NEXT: add a5, a4, a5 +; LMULMAX1-RV64-NEXT: lui a4, 3855 +; LMULMAX1-RV64-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64-NEXT: and a1, a5, a4 +; LMULMAX1-RV64-NEXT: lui a5, 4112 +; LMULMAX1-RV64-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vmv.v.x v27, a1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64-NEXT: vmv.s.x v27, a1 +; LMULMAX1-RV64-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64-NEXT: not a1, a1 +; LMULMAX1-RV64-NEXT: and a1, a1, a2 +; LMULMAX1-RV64-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64-NEXT: and a2, a2, a7 +; LMULMAX1-RV64-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a2, a1, a3 +; LMULMAX1-RV64-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64-NEXT: and a1, a1, a3 +; LMULMAX1-RV64-NEXT: add a1, a2, a1 +; LMULMAX1-RV64-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64-NEXT: add a1, a1, a2 +; LMULMAX1-RV64-NEXT: and a1, a1, a4 +; LMULMAX1-RV64-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64-NEXT: vse64.v v27, (a6) +; LMULMAX1-RV64-NEXT: ret +; +; LMULMAX2-RV32D-LABEL: cttz_zero_undef_v4i64: +; LMULMAX2-RV32D: # %bb.0: +; LMULMAX2-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX2-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX2-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX2-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX2-RV32D-NEXT: lui a1, 349525 +; LMULMAX2-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX2-RV32D-NEXT: lui a1, 209715 +; LMULMAX2-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX2-RV32D-NEXT: lui a1, 61681 +; LMULMAX2-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX2-RV32D-NEXT: lui a1, 4112 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX2-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB15_2 +; LMULMAX2-RV32D-NEXT: # %bb.1: +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_3 +; LMULMAX2-RV32D-NEXT: .LBB15_2: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_3: +; LMULMAX2-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX2-RV32D-NEXT: bnez a5, .LBB15_5 +; LMULMAX2-RV32D-NEXT: # %bb.4: +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_6 +; LMULMAX2-RV32D-NEXT: .LBB15_5: +; LMULMAX2-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX2-RV32D-NEXT: not a5, a5 +; LMULMAX2-RV32D-NEXT: and a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_6: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB15_8 +; LMULMAX2-RV32D-NEXT: # %bb.7: +; LMULMAX2-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_9 +; LMULMAX2-RV32D-NEXT: .LBB15_8: +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a5, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a5, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a5, a1 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a5 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_9: +; LMULMAX2-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX2-RV32D-NEXT: bnez a1, .LBB15_11 +; LMULMAX2-RV32D-NEXT: # %bb.10: +; LMULMAX2-RV32D-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX2-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX2-RV32D-NEXT: j .LBB15_12 +; LMULMAX2-RV32D-NEXT: .LBB15_11: +; LMULMAX2-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX2-RV32D-NEXT: not a1, a1 +; LMULMAX2-RV32D-NEXT: and a1, a1, a5 +; LMULMAX2-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX2-RV32D-NEXT: and a4, a5, a4 +; LMULMAX2-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV32D-NEXT: and a4, a1, a3 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV32D-NEXT: and a1, a1, a3 +; LMULMAX2-RV32D-NEXT: add a1, a4, a1 +; LMULMAX2-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX2-RV32D-NEXT: add a1, a1, a3 +; LMULMAX2-RV32D-NEXT: and a1, a1, a7 +; LMULMAX2-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX2-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX2-RV32D-NEXT: .LBB15_12: +; LMULMAX2-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX2-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX2-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX2-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV32D-NEXT: ret +; +; LMULMAX2-RV64D-LABEL: cttz_zero_undef_v4i64: +; LMULMAX2-RV64D: # %bb.0: +; LMULMAX2-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX2-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX2-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX2-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a2, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX2-RV64D-NEXT: lui a1, 21845 +; LMULMAX2-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX2-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX2-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX2-RV64D-NEXT: and a3, a3, a6 +; LMULMAX2-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX2-RV64D-NEXT: lui a2, 13107 +; LMULMAX2-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX2-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX2-RV64D-NEXT: and a4, a3, a2 +; LMULMAX2-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX2-RV64D-NEXT: and a3, a3, a2 +; LMULMAX2-RV64D-NEXT: add a3, a4, a3 +; LMULMAX2-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX2-RV64D-NEXT: add a4, a3, a4 +; LMULMAX2-RV64D-NEXT: lui a3, 3855 +; LMULMAX2-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX2-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX2-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX2-RV64D-NEXT: and a4, a4, a3 +; LMULMAX2-RV64D-NEXT: lui a5, 4112 +; LMULMAX2-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX2-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX2-RV64D-NEXT: mul a4, a4, a5 +; LMULMAX2-RV64D-NEXT: srli a4, a4, 56 +; LMULMAX2-RV64D-NEXT: sd a4, 56(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX2-RV64D-NEXT: vmv.x.s a4, v28 +; LMULMAX2-RV64D-NEXT: addi a1, a4, -1 +; LMULMAX2-RV64D-NEXT: not a4, a4 +; LMULMAX2-RV64D-NEXT: and a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64D-NEXT: and a4, a4, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX2-RV64D-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX2-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64D-NEXT: and a4, a4, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX2-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX2-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX2-RV64D-NEXT: not a1, a1 +; LMULMAX2-RV64D-NEXT: and a1, a1, a4 +; LMULMAX2-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX2-RV64D-NEXT: and a4, a4, a6 +; LMULMAX2-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX2-RV64D-NEXT: and a4, a1, a2 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a2 +; LMULMAX2-RV64D-NEXT: add a1, a4, a1 +; LMULMAX2-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX2-RV64D-NEXT: add a1, a1, a2 +; LMULMAX2-RV64D-NEXT: and a1, a1, a3 +; LMULMAX2-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX2-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX2-RV64D-NEXT: sd a1, 32(sp) +; LMULMAX2-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX2-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX2-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX2-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX2-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX2-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX2-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX2-RV64D-NEXT: ret +; +; LMULMAX1-RV32D-LABEL: cttz_zero_undef_v4i64: +; LMULMAX1-RV32D: # %bb.0: +; LMULMAX1-RV32D-NEXT: addi sp, sp, -48 +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: addi a7, a0, 16 +; LMULMAX1-RV32D-NEXT: vle64.v v26, (a7) +; LMULMAX1-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX1-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX1-RV32D-NEXT: lui a1, 349525 +; LMULMAX1-RV32D-NEXT: addi a5, a1, 1365 +; LMULMAX1-RV32D-NEXT: lui a1, 209715 +; LMULMAX1-RV32D-NEXT: addi a4, a1, 819 +; LMULMAX1-RV32D-NEXT: lui a1, 61681 +; LMULMAX1-RV32D-NEXT: addi t0, a1, -241 +; LMULMAX1-RV32D-NEXT: lui a2, 4112 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a3, a2, 257 +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB15_2 +; LMULMAX1-RV32D-NEXT: # %bb.1: +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vsrl.vx v27, v26, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v27 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_3 +; LMULMAX1-RV32D-NEXT: .LBB15_2: +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_3: +; LMULMAX1-RV32D-NEXT: sw a1, 32(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB15_5 +; LMULMAX1-RV32D-NEXT: # %bb.4: +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_6 +; LMULMAX1-RV32D-NEXT: .LBB15_5: +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_6: +; LMULMAX1-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX1-RV32D-NEXT: sw zero, 28(sp) +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: sw zero, 20(sp) +; LMULMAX1-RV32D-NEXT: bnez a1, .LBB15_8 +; LMULMAX1-RV32D-NEXT: # %bb.7: +; LMULMAX1-RV32D-NEXT: vsrl.vx v26, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_9 +; LMULMAX1-RV32D-NEXT: .LBB15_8: +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_9: +; LMULMAX1-RV32D-NEXT: vslidedown.vi v25, v25, 1 +; LMULMAX1-RV32D-NEXT: vmv.x.s a2, v25 +; LMULMAX1-RV32D-NEXT: sw a1, 16(sp) +; LMULMAX1-RV32D-NEXT: bnez a2, .LBB15_11 +; LMULMAX1-RV32D-NEXT: # %bb.10: +; LMULMAX1-RV32D-NEXT: vsrl.vx v25, v25, a6 +; LMULMAX1-RV32D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV32D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV32D-NEXT: not a1, a1 +; LMULMAX1-RV32D-NEXT: and a1, a1, a2 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX1-RV32D-NEXT: j .LBB15_12 +; LMULMAX1-RV32D-NEXT: .LBB15_11: +; LMULMAX1-RV32D-NEXT: addi a1, a2, -1 +; LMULMAX1-RV32D-NEXT: not a2, a2 +; LMULMAX1-RV32D-NEXT: and a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV32D-NEXT: and a2, a2, a5 +; LMULMAX1-RV32D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a2, a1, a4 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV32D-NEXT: and a1, a1, a4 +; LMULMAX1-RV32D-NEXT: add a1, a2, a1 +; LMULMAX1-RV32D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV32D-NEXT: add a1, a1, a2 +; LMULMAX1-RV32D-NEXT: and a1, a1, t0 +; LMULMAX1-RV32D-NEXT: mul a1, a1, a3 +; LMULMAX1-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX1-RV32D-NEXT: .LBB15_12: +; LMULMAX1-RV32D-NEXT: sw a1, 24(sp) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 4, e32, m1, ta, mu +; LMULMAX1-RV32D-NEXT: addi a1, sp, 16 +; LMULMAX1-RV32D-NEXT: vle32.v v25, (a1) +; LMULMAX1-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX1-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX1-RV32D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV32D-NEXT: vse64.v v25, (a0) +; LMULMAX1-RV32D-NEXT: vse64.v v26, (a7) +; LMULMAX1-RV32D-NEXT: addi sp, sp, 48 +; LMULMAX1-RV32D-NEXT: ret +; +; LMULMAX1-RV64D-LABEL: cttz_zero_undef_v4i64: +; LMULMAX1-RV64D: # %bb.0: +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: addi a6, a0, 16 +; LMULMAX1-RV64D-NEXT: vle64.v v26, (a6) +; LMULMAX1-RV64D-NEXT: vle64.v v25, (a0) +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v27, v26, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a2, v27 +; LMULMAX1-RV64D-NEXT: addi a3, a2, -1 +; LMULMAX1-RV64D-NEXT: not a2, a2 +; LMULMAX1-RV64D-NEXT: and a3, a2, a3 +; LMULMAX1-RV64D-NEXT: srli a4, a3, 1 +; LMULMAX1-RV64D-NEXT: lui a2, 21845 +; LMULMAX1-RV64D-NEXT: addiw a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a2, a2, 1365 +; LMULMAX1-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX1-RV64D-NEXT: addi a7, a2, 1365 +; LMULMAX1-RV64D-NEXT: and a4, a4, a7 +; LMULMAX1-RV64D-NEXT: sub a4, a3, a4 +; LMULMAX1-RV64D-NEXT: lui a3, 13107 +; LMULMAX1-RV64D-NEXT: addiw a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX1-RV64D-NEXT: addi a3, a3, 819 +; LMULMAX1-RV64D-NEXT: and a5, a4, a3 +; LMULMAX1-RV64D-NEXT: srli a4, a4, 2 +; LMULMAX1-RV64D-NEXT: and a4, a4, a3 +; LMULMAX1-RV64D-NEXT: add a4, a5, a4 +; LMULMAX1-RV64D-NEXT: srli a5, a4, 4 +; LMULMAX1-RV64D-NEXT: add a5, a4, a5 +; LMULMAX1-RV64D-NEXT: lui a4, 3855 +; LMULMAX1-RV64D-NEXT: addiw a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, 241 +; LMULMAX1-RV64D-NEXT: slli a4, a4, 12 +; LMULMAX1-RV64D-NEXT: addi a4, a4, -241 +; LMULMAX1-RV64D-NEXT: and a1, a5, a4 +; LMULMAX1-RV64D-NEXT: lui a5, 4112 +; LMULMAX1-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX1-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v27, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v27, a1 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 1, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vslidedown.vi v26, v25, 1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetivli zero, 2, e64, m1, ta, mu +; LMULMAX1-RV64D-NEXT: vmv.v.x v26, a1 +; LMULMAX1-RV64D-NEXT: vmv.x.s a1, v25 +; LMULMAX1-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX1-RV64D-NEXT: not a1, a1 +; LMULMAX1-RV64D-NEXT: and a1, a1, a2 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 1 +; LMULMAX1-RV64D-NEXT: and a2, a2, a7 +; LMULMAX1-RV64D-NEXT: sub a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a2, a1, a3 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a3 +; LMULMAX1-RV64D-NEXT: add a1, a2, a1 +; LMULMAX1-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX1-RV64D-NEXT: add a1, a1, a2 +; LMULMAX1-RV64D-NEXT: and a1, a1, a4 +; LMULMAX1-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX1-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX1-RV64D-NEXT: vsetvli zero, zero, e64, m1, tu, mu +; LMULMAX1-RV64D-NEXT: vmv.s.x v26, a1 +; LMULMAX1-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX1-RV64D-NEXT: vse64.v v27, (a6) +; LMULMAX1-RV64D-NEXT: ret +; +; LMULMAX8-RV32D-LABEL: cttz_zero_undef_v4i64: +; LMULMAX8-RV32D: # %bb.0: +; LMULMAX8-RV32D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV32D-NEXT: sw ra, 92(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: sw s0, 88(sp) # 4-byte Folded Spill +; LMULMAX8-RV32D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV32D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: sw zero, 60(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 52(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 44(sp) +; LMULMAX8-RV32D-NEXT: sw zero, 36(sp) +; LMULMAX8-RV32D-NEXT: addi a6, zero, 32 +; LMULMAX8-RV32D-NEXT: lui a1, 349525 +; LMULMAX8-RV32D-NEXT: addi a4, a1, 1365 +; LMULMAX8-RV32D-NEXT: lui a1, 209715 +; LMULMAX8-RV32D-NEXT: addi a3, a1, 819 +; LMULMAX8-RV32D-NEXT: lui a1, 61681 +; LMULMAX8-RV32D-NEXT: addi a7, a1, -241 +; LMULMAX8-RV32D-NEXT: lui a1, 4112 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v26 +; LMULMAX8-RV32D-NEXT: addi a2, a1, 257 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB15_2 +; LMULMAX8-RV32D-NEXT: # %bb.1: +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_3 +; LMULMAX8-RV32D-NEXT: .LBB15_2: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_3: +; LMULMAX8-RV32D-NEXT: sw a5, 32(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV32D-NEXT: vmv.x.s a5, v28 +; LMULMAX8-RV32D-NEXT: bnez a5, .LBB15_5 +; LMULMAX8-RV32D-NEXT: # %bb.4: +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_6 +; LMULMAX8-RV32D-NEXT: .LBB15_5: +; LMULMAX8-RV32D-NEXT: addi a1, a5, -1 +; LMULMAX8-RV32D-NEXT: not a5, a5 +; LMULMAX8-RV32D-NEXT: and a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_6: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: sw a5, 56(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB15_8 +; LMULMAX8-RV32D-NEXT: # %bb.7: +; LMULMAX8-RV32D-NEXT: vsrl.vx v28, v28, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a5, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_9 +; LMULMAX8-RV32D-NEXT: .LBB15_8: +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a5, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a5, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a5, a1 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a5 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_9: +; LMULMAX8-RV32D-NEXT: vslidedown.vi v26, v26, 1 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: sw a5, 48(sp) +; LMULMAX8-RV32D-NEXT: bnez a1, .LBB15_11 +; LMULMAX8-RV32D-NEXT: # %bb.10: +; LMULMAX8-RV32D-NEXT: vsrl.vx v26, v26, a6 +; LMULMAX8-RV32D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: addi a1, a1, 32 +; LMULMAX8-RV32D-NEXT: j .LBB15_12 +; LMULMAX8-RV32D-NEXT: .LBB15_11: +; LMULMAX8-RV32D-NEXT: addi a5, a1, -1 +; LMULMAX8-RV32D-NEXT: not a1, a1 +; LMULMAX8-RV32D-NEXT: and a1, a1, a5 +; LMULMAX8-RV32D-NEXT: srli a5, a1, 1 +; LMULMAX8-RV32D-NEXT: and a4, a5, a4 +; LMULMAX8-RV32D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV32D-NEXT: and a4, a1, a3 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV32D-NEXT: and a1, a1, a3 +; LMULMAX8-RV32D-NEXT: add a1, a4, a1 +; LMULMAX8-RV32D-NEXT: srli a3, a1, 4 +; LMULMAX8-RV32D-NEXT: add a1, a1, a3 +; LMULMAX8-RV32D-NEXT: and a1, a1, a7 +; LMULMAX8-RV32D-NEXT: mul a1, a1, a2 +; LMULMAX8-RV32D-NEXT: srli a1, a1, 24 +; LMULMAX8-RV32D-NEXT: .LBB15_12: +; LMULMAX8-RV32D-NEXT: sw a1, 40(sp) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 8, e32, m2, ta, mu +; LMULMAX8-RV32D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV32D-NEXT: vle32.v v26, (a1) +; LMULMAX8-RV32D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV32D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV32D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV32D-NEXT: lw s0, 88(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: lw ra, 92(sp) # 4-byte Folded Reload +; LMULMAX8-RV32D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV32D-NEXT: ret +; +; LMULMAX8-RV64D-LABEL: cttz_zero_undef_v4i64: +; LMULMAX8-RV64D: # %bb.0: +; LMULMAX8-RV64D-NEXT: addi sp, sp, -96 +; LMULMAX8-RV64D-NEXT: sd ra, 88(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: sd s0, 80(sp) # 8-byte Folded Spill +; LMULMAX8-RV64D-NEXT: addi s0, sp, 96 +; LMULMAX8-RV64D-NEXT: andi sp, sp, -32 +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 1, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 3 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV64D-NEXT: addi a2, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a2, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a3, a2, 1 +; LMULMAX8-RV64D-NEXT: lui a1, 21845 +; LMULMAX8-RV64D-NEXT: addiw a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a1, a1, 1365 +; LMULMAX8-RV64D-NEXT: slli a1, a1, 12 +; LMULMAX8-RV64D-NEXT: addi a6, a1, 1365 +; LMULMAX8-RV64D-NEXT: and a3, a3, a6 +; LMULMAX8-RV64D-NEXT: sub a3, a2, a3 +; LMULMAX8-RV64D-NEXT: lui a2, 13107 +; LMULMAX8-RV64D-NEXT: addiw a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: slli a2, a2, 12 +; LMULMAX8-RV64D-NEXT: addi a2, a2, 819 +; LMULMAX8-RV64D-NEXT: and a4, a3, a2 +; LMULMAX8-RV64D-NEXT: srli a3, a3, 2 +; LMULMAX8-RV64D-NEXT: and a3, a3, a2 +; LMULMAX8-RV64D-NEXT: add a3, a4, a3 +; LMULMAX8-RV64D-NEXT: srli a4, a3, 4 +; LMULMAX8-RV64D-NEXT: add a4, a3, a4 +; LMULMAX8-RV64D-NEXT: lui a3, 3855 +; LMULMAX8-RV64D-NEXT: addiw a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, 241 +; LMULMAX8-RV64D-NEXT: slli a3, a3, 12 +; LMULMAX8-RV64D-NEXT: addi a3, a3, -241 +; LMULMAX8-RV64D-NEXT: and a4, a4, a3 +; LMULMAX8-RV64D-NEXT: lui a5, 4112 +; LMULMAX8-RV64D-NEXT: addiw a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: slli a5, a5, 16 +; LMULMAX8-RV64D-NEXT: addi a5, a5, 257 +; LMULMAX8-RV64D-NEXT: mul a4, a4, a5 +; LMULMAX8-RV64D-NEXT: srli a4, a4, 56 +; LMULMAX8-RV64D-NEXT: sd a4, 56(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 2 +; LMULMAX8-RV64D-NEXT: vmv.x.s a4, v28 +; LMULMAX8-RV64D-NEXT: addi a1, a4, -1 +; LMULMAX8-RV64D-NEXT: not a4, a4 +; LMULMAX8-RV64D-NEXT: and a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX8-RV64D-NEXT: and a4, a4, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 48(sp) +; LMULMAX8-RV64D-NEXT: vslidedown.vi v28, v26, 1 +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v28 +; LMULMAX8-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX8-RV64D-NEXT: and a4, a4, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 40(sp) +; LMULMAX8-RV64D-NEXT: vmv.x.s a1, v26 +; LMULMAX8-RV64D-NEXT: addi a4, a1, -1 +; LMULMAX8-RV64D-NEXT: not a1, a1 +; LMULMAX8-RV64D-NEXT: and a1, a1, a4 +; LMULMAX8-RV64D-NEXT: srli a4, a1, 1 +; LMULMAX8-RV64D-NEXT: and a4, a4, a6 +; LMULMAX8-RV64D-NEXT: sub a1, a1, a4 +; LMULMAX8-RV64D-NEXT: and a4, a1, a2 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a2 +; LMULMAX8-RV64D-NEXT: add a1, a4, a1 +; LMULMAX8-RV64D-NEXT: srli a2, a1, 4 +; LMULMAX8-RV64D-NEXT: add a1, a1, a2 +; LMULMAX8-RV64D-NEXT: and a1, a1, a3 +; LMULMAX8-RV64D-NEXT: mul a1, a1, a5 +; LMULMAX8-RV64D-NEXT: srli a1, a1, 56 +; LMULMAX8-RV64D-NEXT: sd a1, 32(sp) +; LMULMAX8-RV64D-NEXT: vsetivli zero, 4, e64, m2, ta, mu +; LMULMAX8-RV64D-NEXT: addi a1, sp, 32 +; LMULMAX8-RV64D-NEXT: vle64.v v26, (a1) +; LMULMAX8-RV64D-NEXT: vse64.v v26, (a0) +; LMULMAX8-RV64D-NEXT: addi sp, s0, -96 +; LMULMAX8-RV64D-NEXT: ld s0, 80(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: ld ra, 88(sp) # 8-byte Folded Reload +; LMULMAX8-RV64D-NEXT: addi sp, sp, 96 +; LMULMAX8-RV64D-NEXT: ret + %a = load <4 x i64>, <4 x i64>* %x + %b = load <4 x i64>, <4 x i64>* %y + %c = call <4 x i64> @llvm.cttz.v4i64(<4 x i64> %a, i1 true) + store <4 x i64> %c, <4 x i64>* %x + ret void +}