[llvm-branch-commits] [llvm] [LoongArch] Add support for vector FP_EXTEND from vxf32 to vxf64 (PR #164746)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Apr 23 06:02:41 PDT 2026
================
@@ -592,10 +594,74 @@ SDValue LoongArchTargetLowering::LowerOperation(SDValue Op,
return lowerVECREDUCE(Op, DAG);
case ISD::ConstantFP:
return lowerConstantFP(Op, DAG);
+ case ISD::FP_EXTEND:
+ return lowerFP_EXTEND(Op, DAG);
}
return SDValue();
}
+SDValue LoongArchTargetLowering::lowerFP_EXTEND(SDValue Op,
+ SelectionDAG &DAG) const {
+
+ SDLoc DL(Op);
+ EVT VT = Op.getValueType();
+ SDValue Src = Op->getOperand(0);
+ EVT SVT = Src.getValueType();
+
+ // Check if Op is the high part of vector.
+ auto CheckVecHighPart = [](SDValue Op) {
+ Op = peekThroughBitcasts(Op);
+ if (Op.getOpcode() == ISD::EXTRACT_SUBVECTOR) {
+ SDValue SOp = Op.getOperand(0);
+ EVT SVT = SOp.getValueType();
+ if (!SVT.isVector() || (SVT.getVectorNumElements() % 2 != 0))
+ return SDValue();
+
+ const uint64_t Imm = Op.getConstantOperandVal(1);
+ if (Imm == SVT.getVectorNumElements() / 2)
+ return SOp;
+ return SDValue();
+ }
+ return SDValue();
+ };
+
+ unsigned Opcode;
+ SDValue VFCVTOp;
+ EVT WideOpVT = SVT.getSimpleVT().getDoubleNumVectorElementsVT();
+ SDValue ZeroIdx = DAG.getVectorIdxConstant(0, DL);
+
+ // If the operand of ISD::FP_EXTEND comes from the high part of vector,
+ // generate LoongArchISD::VFCVTH, otherwise LoongArchISD::VFCVTL.
+ if (SDValue V = CheckVecHighPart(Src)) {
+ assert(V.getValueSizeInBits() == WideOpVT.getSizeInBits() &&
+ "Unexpected wide vector");
+ Opcode = LoongArchISD::VFCVTH;
+ VFCVTOp = DAG.getBitcast(WideOpVT, V);
+ } else {
+ Opcode = LoongArchISD::VFCVTL;
+ VFCVTOp = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, WideOpVT,
+ DAG.getUNDEF(WideOpVT), Src, ZeroIdx);
+ }
+
+ // v2f64 = fp_extend v2f32
+ if (VT == MVT::v2f64 && SVT == MVT::v2f32 && Subtarget.hasExtLSX()) {
+ return DAG.getNode(Opcode, DL, VT, VFCVTOp);
+ }
+
+ // v4f64 = fp_extend v4f32
+ if (VT == MVT::v4f64 && SVT == MVT::v4f32 && Subtarget.hasExtLASX()) {
+ // XVFCVT instruction operators on each 128-bit segament as a lane, so a
----------------
wangleiat wrote:
typo:
operators -> operates
segament -> segment
https://github.com/llvm/llvm-project/pull/164746
More information about the llvm-branch-commits
mailing list