diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -959,13 +959,13 @@ return false; } -// Determines if it is a constant integer or a build vector of constant +// Determines if it is a constant integer or a splat/build vector of constant // integers (and undefs). // Do not permit build vector implicit truncation. static bool isConstantOrConstantVector(SDValue N, bool NoOpaques = false) { if (ConstantSDNode *Const = dyn_cast(N)) return !(Const->isOpaque() && NoOpaques); - if (N.getOpcode() != ISD::BUILD_VECTOR) + if (N.getOpcode() != ISD::BUILD_VECTOR && N.getOpcode() != ISD::SPLAT_VECTOR) return false; unsigned BitWidth = N.getScalarValueSizeInBits(); for (const SDValue &Op : N->op_values()) { diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -306,7 +306,8 @@ return Match(Cst); // FIXME: Add support for vector UNDEF cases? - if (ISD::BUILD_VECTOR != Op.getOpcode()) + if (ISD::BUILD_VECTOR != Op.getOpcode() && + ISD::SPLAT_VECTOR != Op.getOpcode()) return false; EVT SVT = Op.getValueType().getScalarType(); 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 @@ -5028,9 +5028,12 @@ return SDValue(); SDValue Shift, Factor; - if (VT.isVector()) { + if (VT.isFixedLengthVector()) { Shift = DAG.getBuildVector(ShVT, dl, Shifts); Factor = DAG.getBuildVector(VT, dl, Factors); + } else if (VT.isScalableVector()) { + Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]); + Factor = DAG.getSplatVector(VT, dl, Factors[0]); } else { Shift = Shifts[0]; Factor = Factors[0]; @@ -5123,11 +5126,16 @@ return SDValue(); SDValue MagicFactor, Factor, Shift, ShiftMask; - if (VT.isVector()) { + if (VT.isFixedLengthVector()) { MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors); Factor = DAG.getBuildVector(VT, dl, Factors); Shift = DAG.getBuildVector(ShVT, dl, Shifts); ShiftMask = DAG.getBuildVector(VT, dl, ShiftMasks); + } else if (VT.isScalableVector()) { + MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]); + Factor = DAG.getSplatVector(VT, dl, Factors[0]); + Shift = DAG.getSplatVector(ShVT, dl, Shifts[0]); + ShiftMask = DAG.getSplatVector(VT, dl, ShiftMasks[0]); } else { MagicFactor = MagicFactors[0]; Factor = Factors[0]; @@ -5241,11 +5249,16 @@ return SDValue(); SDValue PreShift, PostShift, MagicFactor, NPQFactor; - if (VT.isVector()) { + if (VT.isFixedLengthVector()) { PreShift = DAG.getBuildVector(ShVT, dl, PreShifts); MagicFactor = DAG.getBuildVector(VT, dl, MagicFactors); NPQFactor = DAG.getBuildVector(VT, dl, NPQFactors); PostShift = DAG.getBuildVector(ShVT, dl, PostShifts); + } else if (VT.isScalableVector()) { + PreShift = DAG.getSplatVector(ShVT, dl, PreShifts[0]); + MagicFactor = DAG.getSplatVector(VT, dl, MagicFactors[0]); + NPQFactor = DAG.getSplatVector(VT, dl, NPQFactors[0]); + PostShift = DAG.getSplatVector(ShVT, dl, PostShifts[0]); } else { PreShift = PreShifts[0]; MagicFactor = MagicFactors[0]; @@ -5297,8 +5310,10 @@ Q = DAG.getNode(ISD::SRL, dl, VT, Q, PostShift); Created.push_back(Q.getNode()); + EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT); + SDValue One = DAG.getConstant(1, dl, VT); - SDValue IsOne = DAG.getSetCC(dl, VT, N1, One, ISD::SETEQ); + SDValue IsOne = DAG.getSetCC(dl, SetCCVT, N1, One, ISD::SETEQ); return DAG.getSelect(dl, VT, IsOne, N0, Q); } @@ -5725,7 +5740,7 @@ return SDValue(); SDValue PVal, AVal, KVal, QVal; - if (VT.isVector()) { + if (VT.isFixedLengthVector()) { if (HadOneDivisor) { // Try to turn PAmts into a splat, since we don't care about the values // that are currently '0'. If we can't, just keep '0'`s. @@ -5744,6 +5759,11 @@ AVal = DAG.getBuildVector(VT, DL, AAmts); KVal = DAG.getBuildVector(ShVT, DL, KAmts); QVal = DAG.getBuildVector(VT, DL, QAmts); + } else if (VT.isScalableVector()) { + PVal = DAG.getSplatVector(VT, DL, PAmts[0]); + AVal = DAG.getSplatVector(VT, DL, AAmts[0]); + KVal = DAG.getSplatVector(ShVT, DL, KAmts[0]); + QVal = DAG.getSplatVector(VT, DL, QAmts[0]); } else { PVal = PAmts[0]; AVal = AAmts[0]; 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 @@ -369,6 +369,9 @@ setOperationAction(ISD::SMAX, VT, Legal); setOperationAction(ISD::UMIN, VT, Legal); setOperationAction(ISD::UMAX, VT, Legal); + + setOperationAction(ISD::ROTL, VT, Expand); + setOperationAction(ISD::ROTR, VT, Expand); } // We must custom-lower SPLAT_VECTOR vXi64 on RV32 diff --git a/llvm/test/CodeGen/AArch64/sve-int-arith-imm.ll b/llvm/test/CodeGen/AArch64/sve-int-arith-imm.ll --- a/llvm/test/CodeGen/AArch64/sve-int-arith-imm.ll +++ b/llvm/test/CodeGen/AArch64/sve-int-arith-imm.ll @@ -593,7 +593,7 @@ define @asr_i8( %a){ ; CHECK-LABEL: @asr_i8 -; CHECK-DAG: asr z0.b, z0.b, #8 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i8 8, i32 0 %splat = shufflevector %elt, undef, zeroinitializer @@ -603,7 +603,7 @@ define @asr_i16( %a){ ; CHECK-LABEL: @asr_i16 -; CHECK-DAG: asr z0.h, z0.h, #16 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i16 16, i32 0 %splat = shufflevector %elt, undef, zeroinitializer @@ -613,7 +613,7 @@ define @asr_i32( %a){ ; CHECK-LABEL: @asr_i32 -; CHECK-DAG: asr z0.s, z0.s, #32 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i32 32, i32 0 %splat = shufflevector %elt, undef, zeroinitializer @@ -623,7 +623,7 @@ define @asr_i64( %a){ ; CHECK-LABEL: @asr_i64 -; CHECK-DAG: asr z0.d, z0.d, #64 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i64 64, i32 0 %splat = shufflevector %elt, undef, zeroinitializer @@ -677,7 +677,7 @@ define @lsr_i8( %a){ ; CHECK-LABEL: @lsr_i8 -; CHECK-DAG: lsr z0.b, z0.b, #8 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i8 8, i32 0 %splat = shufflevector %elt, undef, zeroinitializer @@ -687,7 +687,7 @@ define @lsr_i16( %a){ ; CHECK-LABEL: @lsr_i16 -; CHECK-DAG: lsr z0.h, z0.h, #16 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i16 16, i32 0 %splat = shufflevector %elt, undef, zeroinitializer @@ -697,7 +697,7 @@ define @lsr_i32( %a){ ; CHECK-LABEL: @lsr_i32 -; CHECK-DAG: lsr z0.s, z0.s, #32 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i32 32, i32 0 %splat = shufflevector %elt, undef, zeroinitializer @@ -707,7 +707,7 @@ define @lsr_i64( %a){ ; CHECK-LABEL: @lsr_i64 -; CHECK-DAG: lsr z0.d, z0.d, #64 +; CHECK: // %bb.0: ; CHECK-NEXT: ret %elt = insertelement undef, i64 64, i32 0 %splat = shufflevector %elt, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv32.ll @@ -26,9 +26,15 @@ define @vdiv_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -85,9 +91,15 @@ define @vdiv_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -120,9 +132,15 @@ define @vdiv_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -155,9 +173,15 @@ define @vdiv_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -190,9 +214,15 @@ define @vdiv_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vrsub.vi v28, v16, 0 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: vsra.vi v26, v26, 2 +; CHECK-NEXT: vsrl.vi v28, v26, 7 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v26, v28 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -225,9 +255,15 @@ define @vdiv_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vrsub.vi v8, v16, 0 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: vsra.vi v28, v28, 2 +; CHECK-NEXT: vsrl.vi v8, v28, 7 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v28, v8 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -261,9 +297,15 @@ define @vdiv_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vrsub.vi v16, v16, 0 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: vsra.vi v8, v8, 2 +; CHECK-NEXT: vsrl.vi v16, v8, 7 +; CHECK-NEXT: vand.vi v16, v16, -1 +; CHECK-NEXT: vadd.vv v16, v8, v16 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -296,9 +338,15 @@ define @vdiv_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -331,9 +379,15 @@ define @vdiv_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -366,9 +420,15 @@ define @vdiv_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -401,9 +461,15 @@ define @vdiv_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v26, v26, 1 +; CHECK-NEXT: vsrl.vi v28, v26, 15 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v26, v28 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -436,9 +502,15 @@ define @vdiv_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v28, v28, 1 +; CHECK-NEXT: vsrl.vi v8, v28, 15 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v28, v8 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -472,9 +544,15 @@ define @vdiv_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v8, v8, 1 +; CHECK-NEXT: vsrl.vi v16, v8, 15 +; CHECK-NEXT: vand.vi v16, v16, -1 +; CHECK-NEXT: vadd.vv v16, v8, v16 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -507,9 +585,15 @@ define @vdiv_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vsub.vv v25, v25, v16 +; CHECK-NEXT: vsra.vi v26, v25, 2 +; CHECK-NEXT: vsrl.vi v25, v25, 31 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v16, v26, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -542,9 +626,15 @@ define @vdiv_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vsub.vv v25, v25, v16 +; CHECK-NEXT: vsra.vi v26, v25, 2 +; CHECK-NEXT: vsrl.vi v25, v25, 31 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v16, v26, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -577,9 +667,15 @@ define @vdiv_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vsub.vv v26, v26, v16 +; CHECK-NEXT: vsra.vi v28, v26, 2 +; CHECK-NEXT: vsrl.vi v26, v26, 31 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v28, v26 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -612,9 +708,15 @@ define @vdiv_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vsub.vv v28, v28, v16 +; CHECK-NEXT: vsra.vi v8, v28, 2 +; CHECK-NEXT: vsrl.vi v28, v28, 31 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v8, v28 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -648,9 +750,15 @@ define @vdiv_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv16i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: vsra.vi v16, v8, 2 +; CHECK-NEXT: vsrl.vi v8, v8, 31 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -690,9 +798,25 @@ define @vdiv_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v25, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v25, v25, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v26, a1 +; CHECK-NEXT: vsll.vx v26, v26, a0 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vor.vv v25, v26, v25 +; CHECK-NEXT: vmulh.vv v25, v16, v25 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v26, v25, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v25, v25, a0 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v16, v26, v25 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -732,9 +856,25 @@ define @vdiv_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v26, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v26, v26, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v28, a1 +; CHECK-NEXT: vsll.vx v28, v28, a0 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vor.vv v26, v28, v26 +; CHECK-NEXT: vmulh.vv v26, v16, v26 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v28, v26, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v28, v26 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -774,9 +914,25 @@ define @vdiv_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v28, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v28, v28, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v8, a1 +; CHECK-NEXT: vsll.vx v8, v8, a0 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vor.vv v28, v8, v28 +; CHECK-NEXT: vmulh.vv v28, v16, v28 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v8, v28, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v8, v28 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -817,9 +973,25 @@ define @vdiv_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v8, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v8, v8, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v24, a1 +; CHECK-NEXT: vsll.vx v24, v24, a0 +; CHECK-NEXT: vsrl.vx v24, v24, a0 +; CHECK-NEXT: vor.vv v8, v24, v8 +; CHECK-NEXT: vmulh.vv v8, v16, v8 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v16, v8, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdiv-sdnode-rv64.ll @@ -26,9 +26,15 @@ define @vdiv_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -61,9 +67,15 @@ define @vdiv_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -96,9 +108,15 @@ define @vdiv_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -131,9 +149,15 @@ define @vdiv_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -166,9 +190,15 @@ define @vdiv_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vrsub.vi v28, v16, 0 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: vsra.vi v26, v26, 2 +; CHECK-NEXT: vsrl.vi v28, v26, 7 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v26, v28 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -201,9 +231,15 @@ define @vdiv_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vrsub.vi v8, v16, 0 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: vsra.vi v28, v28, 2 +; CHECK-NEXT: vsrl.vi v8, v28, 7 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v28, v8 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -237,9 +273,15 @@ define @vdiv_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vrsub.vi v16, v16, 0 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: vsra.vi v8, v8, 2 +; CHECK-NEXT: vsrl.vi v16, v8, 7 +; CHECK-NEXT: vand.vi v16, v16, -1 +; CHECK-NEXT: vadd.vv v16, v8, v16 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -272,9 +314,15 @@ define @vdiv_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -307,9 +355,15 @@ define @vdiv_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -342,9 +396,15 @@ define @vdiv_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -377,9 +437,15 @@ define @vdiv_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v26, v26, 1 +; CHECK-NEXT: vsrl.vi v28, v26, 15 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v26, v28 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -412,9 +478,15 @@ define @vdiv_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v28, v28, 1 +; CHECK-NEXT: vsrl.vi v8, v28, 15 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v28, v8 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -448,9 +520,15 @@ define @vdiv_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v8, v8, 1 +; CHECK-NEXT: vsrl.vi v16, v8, 15 +; CHECK-NEXT: vand.vi v16, v16, -1 +; CHECK-NEXT: vadd.vv v16, v8, v16 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -483,9 +561,16 @@ define @vdiv_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 31 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -518,9 +603,16 @@ define @vdiv_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 31 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v25, v26 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -553,9 +645,16 @@ define @vdiv_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vrsub.vi v28, v16, 0 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: vsra.vi v26, v26, 2 +; CHECK-NEXT: vsrl.vi v28, v26, 31 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v26, v28 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -588,9 +687,16 @@ define @vdiv_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vrsub.vi v8, v16, 0 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: vsra.vi v28, v28, 2 +; CHECK-NEXT: vsrl.vi v8, v28, 31 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v28, v8 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -624,9 +730,16 @@ define @vdiv_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv16i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vrsub.vi v16, v16, 0 +; CHECK-NEXT: vadd.vv v8, v8, v16 +; CHECK-NEXT: vsra.vi v8, v8, 2 +; CHECK-NEXT: vsrl.vi v16, v8, 31 +; CHECK-NEXT: vand.vi v16, v16, -1 +; CHECK-NEXT: vadd.vv v16, v8, v16 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -659,9 +772,22 @@ define @vdiv_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv1i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v26, v25, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v25, v25, a0 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v16, v26, v25 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -694,9 +820,22 @@ define @vdiv_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv2i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v28, v26, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v16, v28, v26 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -729,9 +868,22 @@ define @vdiv_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv4i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v8, v28, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v16, v8, v28 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -765,9 +917,22 @@ define @vdiv_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vdiv_vi_nxv8i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vdivu.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v16, v8, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv32.ll @@ -26,9 +26,13 @@ define @vdivu_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -85,9 +89,13 @@ define @vdivu_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -120,9 +128,13 @@ define @vdivu_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -155,9 +167,13 @@ define @vdivu_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -190,9 +206,13 @@ define @vdivu_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 5 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -225,9 +245,13 @@ define @vdivu_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 5 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -261,9 +285,13 @@ define @vdivu_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 5 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -296,9 +324,14 @@ define @vdivu_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -331,9 +364,14 @@ define @vdivu_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -366,9 +404,14 @@ define @vdivu_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -401,9 +444,14 @@ define @vdivu_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 13 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -436,9 +484,14 @@ define @vdivu_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 13 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -472,9 +525,14 @@ define @vdivu_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 13 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -507,9 +565,14 @@ define @vdivu_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e32,mf2,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 29 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -542,9 +605,14 @@ define @vdivu_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e32,m1,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 29 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -577,9 +645,14 @@ define @vdivu_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e32,m2,ta,mu +; CHECK-NEXT: vmv.v.i v26, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 29 +; CHECK-NEXT: vmseq.vi v0, v26, 1 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -612,9 +685,14 @@ define @vdivu_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e32,m4,ta,mu +; CHECK-NEXT: vmv.v.i v28, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 29 +; CHECK-NEXT: vmseq.vi v0, v28, 1 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -648,9 +726,14 @@ define @vdivu_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv16i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e32,m8,ta,mu +; CHECK-NEXT: vmv.v.i v8, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v24, v16, a0 +; CHECK-NEXT: vsrl.vi v24, v24, 29 +; CHECK-NEXT: vmseq.vi v0, v8, 1 +; CHECK-NEXT: vmerge.vvm v16, v24, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -690,9 +773,21 @@ define @vdivu_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m1,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v26, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v26, v26, a0 +; CHECK-NEXT: vmv.v.i v27, 1 +; CHECK-NEXT: vsll.vx v27, v27, a0 +; CHECK-NEXT: vsrl.vx v27, v27, a0 +; CHECK-NEXT: vor.vv v26, v27, v26 +; CHECK-NEXT: vmulhu.vv v26, v16, v26 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -732,9 +827,21 @@ define @vdivu_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m2,ta,mu +; CHECK-NEXT: vmv.v.i v26, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v28, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v28, v28, a0 +; CHECK-NEXT: vmv.v.i v30, 1 +; CHECK-NEXT: vsll.vx v30, v30, a0 +; CHECK-NEXT: vsrl.vx v30, v30, a0 +; CHECK-NEXT: vor.vv v28, v30, v28 +; CHECK-NEXT: vmulhu.vv v28, v16, v28 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vmseq.vi v0, v26, 1 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -774,9 +881,21 @@ define @vdivu_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m4,ta,mu +; CHECK-NEXT: vmv.v.i v28, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v8, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v8, v8, a0 +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vsll.vx v12, v12, a0 +; CHECK-NEXT: vsrl.vx v12, v12, a0 +; CHECK-NEXT: vor.vv v8, v12, v8 +; CHECK-NEXT: vmulhu.vv v8, v16, v8 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vmseq.vi v0, v28, 1 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -817,9 +936,21 @@ define @vdivu_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m8,ta,mu +; CHECK-NEXT: vmv.v.i v8, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v24, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v24, v24, a0 +; CHECK-NEXT: vmv.v.i v0, 1 +; CHECK-NEXT: vsll.vx v0, v0, a0 +; CHECK-NEXT: vsrl.vx v0, v0, a0 +; CHECK-NEXT: vor.vv v24, v0, v24 +; CHECK-NEXT: vmulhu.vv v24, v16, v24 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v24, v24, a0 +; CHECK-NEXT: vmseq.vi v0, v8, 1 +; CHECK-NEXT: vmerge.vvm v16, v24, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vdivu-sdnode-rv64.ll @@ -26,9 +26,13 @@ define @vdivu_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -61,9 +65,13 @@ define @vdivu_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -96,9 +104,13 @@ define @vdivu_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -131,9 +143,13 @@ define @vdivu_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -166,9 +182,13 @@ define @vdivu_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 5 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -201,9 +221,13 @@ define @vdivu_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 5 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -237,9 +261,13 @@ define @vdivu_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 5 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -272,9 +300,14 @@ define @vdivu_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -307,9 +340,14 @@ define @vdivu_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -342,9 +380,14 @@ define @vdivu_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -377,9 +420,14 @@ define @vdivu_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 13 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -412,9 +460,14 @@ define @vdivu_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 13 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -448,9 +501,14 @@ define @vdivu_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 13 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -483,9 +541,14 @@ define @vdivu_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 29 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -518,9 +581,14 @@ define @vdivu_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 29 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v16, v25, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -553,9 +621,14 @@ define @vdivu_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 29 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -588,9 +661,14 @@ define @vdivu_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 29 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -624,9 +702,14 @@ define @vdivu_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv16i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 29 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -659,9 +742,16 @@ define @vdivu_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv1i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m1,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v16, v26, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -694,9 +784,16 @@ define @vdivu_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv2i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m2,ta,mu +; CHECK-NEXT: vmv.v.i v26, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vmseq.vi v0, v26, 1 +; CHECK-NEXT: vmerge.vvm v16, v28, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -729,9 +826,16 @@ define @vdivu_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv4i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m4,ta,mu +; CHECK-NEXT: vmv.v.i v28, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vmseq.vi v0, v28, 1 +; CHECK-NEXT: vmerge.vvm v16, v8, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -765,9 +869,16 @@ define @vdivu_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vdivu_vi_nxv8i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vdiv.vx v16, v16, a0 +; CHECK-NEXT: vsetvli a0, zero, e64,m8,ta,mu +; CHECK-NEXT: vmv.v.i v8, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v24, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v24, v24, a0 +; CHECK-NEXT: vmseq.vi v0, v8, 1 +; CHECK-NEXT: vmerge.vvm v16, v24, v16, v0 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vmulh-sdnode-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vmulh-sdnode-rv32.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/rvv/vmulh-sdnode-rv32.ll @@ -0,0 +1,28 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=riscv32 -mattr=+experimental-v -verify-machineinstrs < %s | FileCheck %s + +; Test that the prepareSREMEqFold optimization doesn't crash on scalable +; vector types. RVV doesn't have ROTR or ROTL operations so the optimization +; itself doesn't kick in. +define @srem_eq_fold_nxv4i8( %va) { +; CHECK-LABEL: srem_eq_fold_nxv4i8: +; CHECK: # %bb.0: +; CHECK-NEXT: addi a0, zero, 43 +; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, 6 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v25, v16, v25 +; CHECK-NEXT: vmseq.vi v0, v25, 0 +; CHECK-NEXT: ret + %head_six = insertelement undef, i8 6, i32 0 + %splat_six = shufflevector %head_six, undef, zeroinitializer + %rem = srem %va, %splat_six + + %cc = icmp eq %rem, zeroinitializer + ret %cc +} diff --git a/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv32.ll @@ -26,9 +26,18 @@ define @vrem_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -61,9 +70,18 @@ define @vrem_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -96,9 +114,18 @@ define @vrem_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -131,9 +158,18 @@ define @vrem_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -166,9 +202,18 @@ define @vrem_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vrsub.vi v28, v16, 0 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: vsra.vi v26, v26, 2 +; CHECK-NEXT: vsrl.vi v28, v26, 7 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -201,9 +246,18 @@ define @vrem_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vrsub.vi v8, v16, 0 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: vsra.vi v28, v28, 2 +; CHECK-NEXT: vsrl.vi v8, v28, 7 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -237,9 +291,18 @@ define @vrem_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vrsub.vi v24, v16, 0 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: vsra.vi v8, v8, 2 +; CHECK-NEXT: vsrl.vi v24, v8, 7 +; CHECK-NEXT: vand.vi v24, v24, -1 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -272,9 +335,18 @@ define @vrem_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -307,9 +379,18 @@ define @vrem_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -342,9 +423,18 @@ define @vrem_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -377,9 +467,18 @@ define @vrem_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v26, v26, 1 +; CHECK-NEXT: vsrl.vi v28, v26, 15 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -412,9 +511,18 @@ define @vrem_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v28, v28, 1 +; CHECK-NEXT: vsrl.vi v8, v28, 15 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -448,9 +556,18 @@ define @vrem_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v8, v8, 1 +; CHECK-NEXT: vsrl.vi v24, v8, 15 +; CHECK-NEXT: vand.vi v24, v24, -1 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -483,9 +600,18 @@ define @vrem_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vsub.vv v25, v25, v16 +; CHECK-NEXT: vsra.vi v26, v25, 2 +; CHECK-NEXT: vsrl.vi v25, v25, 31 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v25, v26, v25 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -518,9 +644,18 @@ define @vrem_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vsub.vv v25, v25, v16 +; CHECK-NEXT: vsra.vi v26, v25, 2 +; CHECK-NEXT: vsrl.vi v25, v25, 31 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v25, v26, v25 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -553,9 +688,18 @@ define @vrem_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vsub.vv v26, v26, v16 +; CHECK-NEXT: vsra.vi v28, v26, 2 +; CHECK-NEXT: vsrl.vi v26, v26, 31 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v26, v28, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -588,9 +732,18 @@ define @vrem_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vsub.vv v28, v28, v16 +; CHECK-NEXT: vsra.vi v8, v28, 2 +; CHECK-NEXT: vsrl.vi v28, v28, 31 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v28, v8, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -624,9 +777,18 @@ define @vrem_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv16i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addi a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vsub.vv v8, v8, v16 +; CHECK-NEXT: vsra.vi v24, v8, 2 +; CHECK-NEXT: vsrl.vi v8, v8, 31 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v8, v24, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -666,9 +828,28 @@ define @vrem_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v25, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v25, v25, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v26, a1 +; CHECK-NEXT: vsll.vx v26, v26, a0 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vor.vv v25, v26, v25 +; CHECK-NEXT: vmulh.vv v25, v16, v25 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v26, v25, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v25, v25, a0 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v25, v26, v25 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -708,9 +889,28 @@ define @vrem_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v26, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v26, v26, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v28, a1 +; CHECK-NEXT: vsll.vx v28, v28, a0 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vor.vv v26, v28, v26 +; CHECK-NEXT: vmulh.vv v26, v16, v26 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v28, v26, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v26, v28, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -750,9 +950,28 @@ define @vrem_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v28, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v28, v28, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v8, a1 +; CHECK-NEXT: vsll.vx v8, v8, a0 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vor.vv v28, v8, v28 +; CHECK-NEXT: vmulh.vv v28, v16, v28 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v8, v28, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v28, v8, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -793,9 +1012,28 @@ define @vrem_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 748983 +; CHECK-NEXT: addi a0, a0, -586 ; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmv.v.x v8, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v8, v8, a0 +; CHECK-NEXT: lui a1, 898779 +; CHECK-NEXT: addi a1, a1, 1755 +; CHECK-NEXT: vmv.v.x v24, a1 +; CHECK-NEXT: vsll.vx v24, v24, a0 +; CHECK-NEXT: vsrl.vx v24, v24, a0 +; CHECK-NEXT: vor.vv v8, v24, v8 +; CHECK-NEXT: vmulh.vv v8, v16, v8 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v24, v8, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v8, v24, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vrem-sdnode-rv64.ll @@ -26,9 +26,18 @@ define @vrem_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -61,9 +70,18 @@ define @vrem_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -96,9 +114,18 @@ define @vrem_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -131,9 +158,18 @@ define @vrem_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 7 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -166,9 +202,18 @@ define @vrem_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vrsub.vi v28, v16, 0 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: vsra.vi v26, v26, 2 +; CHECK-NEXT: vsrl.vi v28, v26, 7 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -201,9 +246,18 @@ define @vrem_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vrsub.vi v8, v16, 0 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: vsra.vi v28, v28, 2 +; CHECK-NEXT: vsrl.vi v8, v28, 7 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -237,9 +291,18 @@ define @vrem_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vrem_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 109 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vrsub.vi v24, v16, 0 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: vsra.vi v8, v8, 2 +; CHECK-NEXT: vsrl.vi v24, v8, 7 +; CHECK-NEXT: vand.vi v24, v24, -1 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -272,9 +335,18 @@ define @vrem_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -307,9 +379,18 @@ define @vrem_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -342,9 +423,18 @@ define @vrem_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v25, v25, 1 +; CHECK-NEXT: vsrl.vi v26, v25, 15 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -377,9 +467,18 @@ define @vrem_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v26, v26, 1 +; CHECK-NEXT: vsrl.vi v28, v26, 15 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -412,9 +511,18 @@ define @vrem_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v28, v28, 1 +; CHECK-NEXT: vsrl.vi v8, v28, 15 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -448,9 +556,18 @@ define @vrem_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vrem_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1048571 +; CHECK-NEXT: addiw a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v8, v8, 1 +; CHECK-NEXT: vsrl.vi v24, v8, 15 +; CHECK-NEXT: vand.vi v24, v24, -1 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -483,9 +600,19 @@ define @vrem_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 31 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -518,9 +645,19 @@ define @vrem_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vrsub.vi v26, v16, 0 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: vsra.vi v25, v25, 2 +; CHECK-NEXT: vsrl.vi v26, v25, 31 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v25, v25, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -553,9 +690,19 @@ define @vrem_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vrsub.vi v28, v16, 0 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: vsra.vi v26, v26, 2 +; CHECK-NEXT: vsrl.vi v28, v26, 31 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v26, v26, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -588,9 +735,19 @@ define @vrem_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vrsub.vi v8, v16, 0 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: vsra.vi v28, v28, 2 +; CHECK-NEXT: vsrl.vi v8, v28, 31 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v28, v28, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -624,9 +781,19 @@ define @vrem_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vrem_vi_nxv16i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 449390 +; CHECK-NEXT: addiw a0, a0, -1171 ; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vrsub.vi v24, v16, 0 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: vsra.vi v8, v8, 2 +; CHECK-NEXT: vsrl.vi v24, v8, 31 +; CHECK-NEXT: vand.vi v24, v24, -1 +; CHECK-NEXT: vadd.vv v8, v8, v24 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -659,9 +826,25 @@ define @vrem_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv1i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v25, v16, a0 +; CHECK-NEXT: vadd.vi v25, v25, 0 +; CHECK-NEXT: vsra.vi v26, v25, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v25, v25, a0 +; CHECK-NEXT: vand.vi v25, v25, -1 +; CHECK-NEXT: vadd.vv v25, v26, v25 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -694,9 +877,25 @@ define @vrem_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv2i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v26, v16, a0 +; CHECK-NEXT: vadd.vi v26, v26, 0 +; CHECK-NEXT: vsra.vi v28, v26, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vand.vi v26, v26, -1 +; CHECK-NEXT: vadd.vv v26, v28, v26 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -729,9 +928,25 @@ define @vrem_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv4i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v28, v16, a0 +; CHECK-NEXT: vadd.vi v28, v28, 0 +; CHECK-NEXT: vsra.vi v8, v28, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vand.vi v28, v28, -1 +; CHECK-NEXT: vadd.vv v28, v8, v28 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -765,9 +980,25 @@ define @vrem_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vrem_vi_nxv8i64_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 1029851 +; CHECK-NEXT: addiw a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 +; CHECK-NEXT: slli a0, a0, 12 +; CHECK-NEXT: addi a0, a0, 1755 ; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vrem.vx v16, v16, a0 +; CHECK-NEXT: vmulh.vx v8, v16, a0 +; CHECK-NEXT: vadd.vi v8, v8, 0 +; CHECK-NEXT: vsra.vi v24, v8, 1 +; CHECK-NEXT: addi a0, zero, 63 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vand.vi v8, v8, -1 +; CHECK-NEXT: vadd.vv v8, v24, v8 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv32.ll b/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv32.ll --- a/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv32.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv32.ll @@ -26,9 +26,16 @@ define @vremu_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -61,9 +68,16 @@ define @vremu_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -96,9 +110,16 @@ define @vremu_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -131,9 +152,16 @@ define @vremu_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -166,9 +194,16 @@ define @vremu_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 5 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v26, v26, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -201,9 +236,16 @@ define @vremu_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 5 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v28, v28, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -237,9 +279,16 @@ define @vremu_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 5 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -272,9 +321,17 @@ define @vremu_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -307,9 +364,17 @@ define @vremu_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -342,9 +407,17 @@ define @vremu_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -377,9 +450,17 @@ define @vremu_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 13 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v26, v26, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -412,9 +493,17 @@ define @vremu_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 13 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v28, v28, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -448,9 +537,17 @@ define @vremu_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addi a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 13 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -483,9 +580,17 @@ define @vremu_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i32_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32,mf2,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 29 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v25, v26, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -518,9 +623,17 @@ define @vremu_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i32_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32,m1,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 29 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v25, v26, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -553,9 +666,17 @@ define @vremu_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i32_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32,m2,ta,mu +; CHECK-NEXT: vmv.v.i v26, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 29 +; CHECK-NEXT: vmseq.vi v0, v26, 1 +; CHECK-NEXT: vmerge.vvm v26, v28, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -588,9 +709,17 @@ define @vremu_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i32_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32,m4,ta,mu +; CHECK-NEXT: vmv.v.i v28, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 29 +; CHECK-NEXT: vmseq.vi v0, v28, 1 +; CHECK-NEXT: vmerge.vvm v28, v8, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -624,9 +753,17 @@ define @vremu_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv16i32_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e32,m8,ta,mu +; CHECK-NEXT: vmv.v.i v8, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v24, v16, a0 +; CHECK-NEXT: vsrl.vi v24, v24, 29 +; CHECK-NEXT: vmseq.vi v0, v8, 1 +; CHECK-NEXT: vmerge.vvm v8, v24, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -666,9 +803,24 @@ define @vremu_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m1,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v26, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v26, v26, a0 +; CHECK-NEXT: vmv.v.i v27, 1 +; CHECK-NEXT: vsll.vx v27, v27, a0 +; CHECK-NEXT: vsrl.vx v27, v27, a0 +; CHECK-NEXT: vor.vv v26, v27, v26 +; CHECK-NEXT: vmulhu.vv v26, v16, v26 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v25, v26, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -708,9 +860,24 @@ define @vremu_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m2,ta,mu +; CHECK-NEXT: vmv.v.i v26, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v28, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v28, v28, a0 +; CHECK-NEXT: vmv.v.i v30, 1 +; CHECK-NEXT: vsll.vx v30, v30, a0 +; CHECK-NEXT: vsrl.vx v30, v30, a0 +; CHECK-NEXT: vor.vv v28, v30, v28 +; CHECK-NEXT: vmulhu.vv v28, v16, v28 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vmseq.vi v0, v26, 1 +; CHECK-NEXT: vmerge.vvm v26, v28, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -750,9 +917,24 @@ define @vremu_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m4,ta,mu +; CHECK-NEXT: vmv.v.i v28, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v8, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v8, v8, a0 +; CHECK-NEXT: vmv.v.i v12, 1 +; CHECK-NEXT: vsll.vx v12, v12, a0 +; CHECK-NEXT: vsrl.vx v12, v12, a0 +; CHECK-NEXT: vor.vv v8, v12, v8 +; CHECK-NEXT: vmulhu.vv v8, v16, v8 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vmseq.vi v0, v28, 1 +; CHECK-NEXT: vmerge.vvm v28, v8, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -793,9 +975,24 @@ define @vremu_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m8,ta,mu +; CHECK-NEXT: vmv.v.i v8, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: vmv.v.x v24, a0 +; CHECK-NEXT: addi a0, zero, 32 +; CHECK-NEXT: vsll.vx v24, v24, a0 +; CHECK-NEXT: vmv.v.i v0, 1 +; CHECK-NEXT: vsll.vx v0, v0, a0 +; CHECK-NEXT: vsrl.vx v0, v0, a0 +; CHECK-NEXT: vor.vv v24, v0, v24 +; CHECK-NEXT: vmulhu.vv v24, v16, v24 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v24, v24, a0 +; CHECK-NEXT: vmseq.vi v0, v8, 1 +; CHECK-NEXT: vmerge.vvm v8, v24, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv64.ll b/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv64.ll --- a/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv64.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vremu-sdnode-rv64.ll @@ -26,9 +26,16 @@ define @vremu_vi_nxv1i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -61,9 +68,16 @@ define @vremu_vi_nxv2i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -96,9 +110,16 @@ define @vremu_vi_nxv4i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,mf2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -131,9 +152,16 @@ define @vremu_vi_nxv8i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 5 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -166,9 +194,16 @@ define @vremu_vi_nxv16i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv16i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 5 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v26, v26, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -201,9 +236,16 @@ define @vremu_vi_nxv32i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv32i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 5 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v28, v28, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -237,9 +279,16 @@ define @vremu_vi_nxv64i8_0( %va) { ; CHECK-LABEL: vremu_vi_nxv64i8_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: addi a0, zero, 33 ; CHECK-NEXT: vsetvli a1, zero, e8,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 5 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i8 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -272,9 +321,17 @@ define @vremu_vi_nxv1i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -307,9 +364,17 @@ define @vremu_vi_nxv2i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,mf2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -342,9 +407,17 @@ define @vremu_vi_nxv4i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 13 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -377,9 +450,17 @@ define @vremu_vi_nxv8i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 13 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v26, v26, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -412,9 +493,17 @@ define @vremu_vi_nxv16i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv16i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 13 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v28, v28, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -448,9 +537,17 @@ define @vremu_vi_nxv32i16_0( %va) { ; CHECK-LABEL: vremu_vi_nxv32i16_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 2 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e16,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 13 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i16 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -483,9 +580,17 @@ define @vremu_vi_nxv1i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,mf2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 29 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -518,9 +623,17 @@ define @vremu_vi_nxv2i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v25, v16, a0 +; CHECK-NEXT: vsrl.vi v25, v25, 29 +; CHECK-NEXT: vmv.v.i v26, 1 +; CHECK-NEXT: vmseq.vi v0, v26, -7 +; CHECK-NEXT: vmerge.vvm v25, v25, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -553,9 +666,17 @@ define @vremu_vi_nxv4i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: vsrl.vi v26, v26, 29 +; CHECK-NEXT: vmv.v.i v28, 1 +; CHECK-NEXT: vmseq.vi v0, v28, -7 +; CHECK-NEXT: vmerge.vvm v26, v26, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -588,9 +709,17 @@ define @vremu_vi_nxv8i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: vsrl.vi v28, v28, 29 +; CHECK-NEXT: vmv.v.i v8, 1 +; CHECK-NEXT: vmseq.vi v0, v8, -7 +; CHECK-NEXT: vmerge.vvm v28, v28, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -624,9 +753,17 @@ define @vremu_vi_nxv16i32_0( %va) { ; CHECK-LABEL: vremu_vi_nxv16i32_0: ; CHECK: # %bb.0: -; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: lui a0, 131072 +; CHECK-NEXT: addiw a0, a0, 1 ; CHECK-NEXT: vsetvli a1, zero, e32,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: vsrl.vi v8, v8, 29 +; CHECK-NEXT: vmv.v.i v24, 1 +; CHECK-NEXT: vmseq.vi v0, v24, -7 +; CHECK-NEXT: vmerge.vvm v8, v8, v16, v0 +; CHECK-NEXT: addi a0, zero, -7 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i32 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -659,9 +796,19 @@ define @vremu_vi_nxv1i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv1i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m1,ta,mu +; CHECK-NEXT: vmv.v.i v25, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v26, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v26, v26, a0 +; CHECK-NEXT: vmseq.vi v0, v25, 1 +; CHECK-NEXT: vmerge.vvm v25, v26, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m1,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v25, v25, a0 +; CHECK-NEXT: vsub.vv v16, v16, v25 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -694,9 +841,19 @@ define @vremu_vi_nxv2i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv2i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m2,ta,mu +; CHECK-NEXT: vmv.v.i v26, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v28, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v28, v28, a0 +; CHECK-NEXT: vmseq.vi v0, v26, 1 +; CHECK-NEXT: vmerge.vvm v26, v28, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m2,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v26, v26, a0 +; CHECK-NEXT: vsub.vv v16, v16, v26 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -729,9 +886,19 @@ define @vremu_vi_nxv4i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv4i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m4,ta,mu +; CHECK-NEXT: vmv.v.i v28, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v8, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v8, v8, a0 +; CHECK-NEXT: vmseq.vi v0, v28, 1 +; CHECK-NEXT: vmerge.vvm v28, v8, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m4,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v28, v28, a0 +; CHECK-NEXT: vsub.vv v16, v16, v28 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer @@ -765,9 +932,19 @@ define @vremu_vi_nxv8i64_0( %va) { ; CHECK-LABEL: vremu_vi_nxv8i64_0: ; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a0, zero, e64,m8,ta,mu +; CHECK-NEXT: vmv.v.i v8, -7 +; CHECK-NEXT: addi a0, zero, 1 +; CHECK-NEXT: slli a0, a0, 61 +; CHECK-NEXT: addi a0, a0, 1 +; CHECK-NEXT: vmulhu.vx v24, v16, a0 +; CHECK-NEXT: addi a0, zero, 61 +; CHECK-NEXT: vsrl.vx v24, v24, a0 +; CHECK-NEXT: vmseq.vi v0, v8, 1 +; CHECK-NEXT: vmerge.vvm v8, v24, v16, v0 ; CHECK-NEXT: addi a0, zero, -7 -; CHECK-NEXT: vsetvli a1, zero, e64,m8,ta,mu -; CHECK-NEXT: vremu.vx v16, v16, a0 +; CHECK-NEXT: vmul.vx v8, v8, a0 +; CHECK-NEXT: vsub.vv v16, v16, v8 ; CHECK-NEXT: ret %head = insertelement undef, i64 -7, i32 0 %splat = shufflevector %head, undef, zeroinitializer