@@ -23408,6 +23408,12 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2340823408 &RISCV::VRN2M4RegClass}) {
2340923409 if (TRI->isTypeLegalForClass(*RC, VT.SimpleTy))
2341023410 return std::make_pair(0U, RC);
23411+
23412+ if (VT.isFixedLengthVector() && useRVVForFixedLengthVectorVT(VT)) {
23413+ MVT ContainerVT = getContainerForFixedLengthVector(VT);
23414+ if (TRI->isTypeLegalForClass(*RC, ContainerVT))
23415+ return std::make_pair(0U, RC);
23416+ }
2341123417 }
2341223418 } else if (Constraint == "vd") {
2341323419 for (const auto *RC :
@@ -23421,10 +23427,24 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2342123427 &RISCV::VRN2M4NoV0RegClass}) {
2342223428 if (TRI->isTypeLegalForClass(*RC, VT.SimpleTy))
2342323429 return std::make_pair(0U, RC);
23430+
23431+ if (VT.isFixedLengthVector() && useRVVForFixedLengthVectorVT(VT)) {
23432+ MVT ContainerVT = getContainerForFixedLengthVector(VT);
23433+ if (TRI->isTypeLegalForClass(*RC, ContainerVT))
23434+ return std::make_pair(0U, RC);
23435+ }
2342423436 }
2342523437 } else if (Constraint == "vm") {
2342623438 if (TRI->isTypeLegalForClass(RISCV::VMV0RegClass, VT.SimpleTy))
2342723439 return std::make_pair(0U, &RISCV::VMV0RegClass);
23440+
23441+ if (VT.isFixedLengthVector() && useRVVForFixedLengthVectorVT(VT)) {
23442+ MVT ContainerVT = getContainerForFixedLengthVector(VT);
23443+ // VT here might be coerced to vector with i8 elements, so we need to
23444+ // check if this is a M1 register here instead of checking VMV0RegClass.
23445+ if (TRI->isTypeLegalForClass(RISCV::VRRegClass, ContainerVT))
23446+ return std::make_pair(0U, &RISCV::VMV0RegClass);
23447+ }
2342823448 } else if (Constraint == "cr") {
2342923449 if (VT == MVT::f16 && Subtarget.hasStdExtZhinxmin())
2343023450 return std::make_pair(0U, &RISCV::GPRF16CRegClass);
@@ -24302,7 +24322,12 @@ bool RISCVTargetLowering::splitValueIntoRegisterParts(
2430224322 return true;
2430324323 }
2430424324
24305- if (ValueVT.isScalableVector() && PartVT.isScalableVector()) {
24325+ if ((ValueVT.isScalableVector() || ValueVT.isFixedLengthVector()) &&
24326+ PartVT.isScalableVector()) {
24327+ if (ValueVT.isFixedLengthVector()) {
24328+ ValueVT = getContainerForFixedLengthVector(ValueVT.getSimpleVT());
24329+ Val = convertToScalableVector(ValueVT, Val, DAG, Subtarget);
24330+ }
2430624331 LLVMContext &Context = *DAG.getContext();
2430724332 EVT ValueEltVT = ValueVT.getVectorElementType();
2430824333 EVT PartEltVT = PartVT.getVectorElementType();
@@ -24372,12 +24397,17 @@ SDValue RISCVTargetLowering::joinRegisterPartsIntoValue(
2437224397 return Val;
2437324398 }
2437424399
24375- if (ValueVT.isScalableVector() && PartVT.isScalableVector()) {
24400+ if ((ValueVT.isScalableVector() || ValueVT.isFixedLengthVector()) &&
24401+ PartVT.isScalableVector()) {
2437624402 LLVMContext &Context = *DAG.getContext();
2437724403 SDValue Val = Parts[0];
2437824404 EVT ValueEltVT = ValueVT.getVectorElementType();
2437924405 EVT PartEltVT = PartVT.getVectorElementType();
2438024406 unsigned ValueVTBitSize = ValueVT.getSizeInBits().getKnownMinValue();
24407+ if (ValueVT.isFixedLengthVector())
24408+ ValueVTBitSize = getContainerForFixedLengthVector(ValueVT.getSimpleVT())
24409+ .getSizeInBits()
24410+ .getKnownMinValue();
2438124411 unsigned PartVTBitSize = PartVT.getSizeInBits().getKnownMinValue();
2438224412 if (PartVTBitSize % ValueVTBitSize == 0) {
2438324413 assert(PartVTBitSize >= ValueVTBitSize);
@@ -24395,7 +24425,10 @@ SDValue RISCVTargetLowering::joinRegisterPartsIntoValue(
2439524425 EVT::getVectorVT(Context, ValueEltVT, Count, /*IsScalable=*/true);
2439624426 Val = DAG.getNode(ISD::BITCAST, DL, SameEltTypeVT, Val);
2439724427 }
24398- Val = DAG.getExtractSubvector(DL, ValueVT, Val, 0);
24428+ if (ValueVT.isFixedLengthVector())
24429+ Val = convertFromScalableVector(ValueVT, Val, DAG, Subtarget);
24430+ else
24431+ Val = DAG.getExtractSubvector(DL, ValueVT, Val, 0);
2439924432 return Val;
2440024433 }
2440124434 }
0 commit comments