@@ -23408,6 +23408,12 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
23408
23408
&RISCV::VRN2M4RegClass}) {
23409
23409
if (TRI->isTypeLegalForClass(*RC, VT.SimpleTy))
23410
23410
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
+ }
23411
23417
}
23412
23418
} else if (Constraint == "vd") {
23413
23419
for (const auto *RC :
@@ -23421,10 +23427,24 @@ RISCVTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
23421
23427
&RISCV::VRN2M4NoV0RegClass}) {
23422
23428
if (TRI->isTypeLegalForClass(*RC, VT.SimpleTy))
23423
23429
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
+ }
23424
23436
}
23425
23437
} else if (Constraint == "vm") {
23426
23438
if (TRI->isTypeLegalForClass(RISCV::VMV0RegClass, VT.SimpleTy))
23427
23439
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
+ }
23428
23448
} else if (Constraint == "cr") {
23429
23449
if (VT == MVT::f16 && Subtarget.hasStdExtZhinxmin())
23430
23450
return std::make_pair(0U, &RISCV::GPRF16CRegClass);
@@ -24302,7 +24322,12 @@ bool RISCVTargetLowering::splitValueIntoRegisterParts(
24302
24322
return true;
24303
24323
}
24304
24324
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
+ }
24306
24331
LLVMContext &Context = *DAG.getContext();
24307
24332
EVT ValueEltVT = ValueVT.getVectorElementType();
24308
24333
EVT PartEltVT = PartVT.getVectorElementType();
@@ -24372,12 +24397,17 @@ SDValue RISCVTargetLowering::joinRegisterPartsIntoValue(
24372
24397
return Val;
24373
24398
}
24374
24399
24375
- if (ValueVT.isScalableVector() && PartVT.isScalableVector()) {
24400
+ if ((ValueVT.isScalableVector() || ValueVT.isFixedLengthVector()) &&
24401
+ PartVT.isScalableVector()) {
24376
24402
LLVMContext &Context = *DAG.getContext();
24377
24403
SDValue Val = Parts[0];
24378
24404
EVT ValueEltVT = ValueVT.getVectorElementType();
24379
24405
EVT PartEltVT = PartVT.getVectorElementType();
24380
24406
unsigned ValueVTBitSize = ValueVT.getSizeInBits().getKnownMinValue();
24407
+ if (ValueVT.isFixedLengthVector())
24408
+ ValueVTBitSize = getContainerForFixedLengthVector(ValueVT.getSimpleVT())
24409
+ .getSizeInBits()
24410
+ .getKnownMinValue();
24381
24411
unsigned PartVTBitSize = PartVT.getSizeInBits().getKnownMinValue();
24382
24412
if (PartVTBitSize % ValueVTBitSize == 0) {
24383
24413
assert(PartVTBitSize >= ValueVTBitSize);
@@ -24395,7 +24425,10 @@ SDValue RISCVTargetLowering::joinRegisterPartsIntoValue(
24395
24425
EVT::getVectorVT(Context, ValueEltVT, Count, /*IsScalable=*/true);
24396
24426
Val = DAG.getNode(ISD::BITCAST, DL, SameEltTypeVT, Val);
24397
24427
}
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);
24399
24432
return Val;
24400
24433
}
24401
24434
}
0 commit comments