@@ -47,19 +47,24 @@ using namespace llvm;
47
47
// CodeGenSubRegIndex
48
48
// ===----------------------------------------------------------------------===//
49
49
50
- CodeGenSubRegIndex::CodeGenSubRegIndex (Record *R, unsigned Enum)
50
+ CodeGenSubRegIndex::CodeGenSubRegIndex (Record *R, unsigned Enum,
51
+ const CodeGenHwModes &CGH)
51
52
: TheDef(R), EnumValue(Enum), AllSuperRegsCovered(true ), Artificial(true ) {
52
53
Name = std::string (R->getName ());
53
54
if (R->getValue (" Namespace" ))
54
55
Namespace = std::string (R->getValueAsString (" Namespace" ));
55
- Size = R->getValueAsInt (" Size" );
56
- Offset = R->getValueAsInt (" Offset" );
56
+
57
+ if (const RecordVal *RV = R->getValue (" SubRegRanges" ))
58
+ if (auto *DI = dyn_cast_or_null<DefInit>(RV->getValue ()))
59
+ Range = SubRegRangeByHwMode (DI->getDef (), CGH);
60
+ if (!Range.hasDefault ())
61
+ Range.insertSubRegRangeForMode (DefaultMode, SubRegRange (R));
57
62
}
58
63
59
64
CodeGenSubRegIndex::CodeGenSubRegIndex (StringRef N, StringRef Nspace,
60
65
unsigned Enum)
61
66
: TheDef(nullptr ), Name(std::string(N)), Namespace(std::string(Nspace)),
62
- Size(- 1 ), Offset(- 1 ), EnumValue(Enum), AllSuperRegsCovered(true ),
67
+ Range(SubRegRange(- 1 , - 1 ) ), EnumValue(Enum), AllSuperRegsCovered(true ),
63
68
Artificial(true ) {}
64
69
65
70
std::string CodeGenSubRegIndex::getQualifiedName () const {
@@ -81,7 +86,7 @@ void CodeGenSubRegIndex::updateComponents(CodeGenRegBank &RegBank) {
81
86
" ComposedOf must have exactly two entries" );
82
87
CodeGenSubRegIndex *A = RegBank.getSubRegIdx (Comps[0 ]);
83
88
CodeGenSubRegIndex *B = RegBank.getSubRegIdx (Comps[1 ]);
84
- CodeGenSubRegIndex *X = A->addComposite (B, this );
89
+ CodeGenSubRegIndex *X = A->addComposite (B, this , RegBank. getHwModes () );
85
90
if (X)
86
91
PrintFatalError (TheDef->getLoc (), " Ambiguous ComposedOf entries" );
87
92
}
@@ -518,7 +523,8 @@ void CodeGenRegister::computeSecondarySubRegs(CodeGenRegBank &RegBank) {
518
523
519
524
// Each part of Cand is a sub-register of this. Make the full Cand also
520
525
// a sub-register with a concatenated sub-register index.
521
- CodeGenSubRegIndex *Concat = RegBank.getConcatSubRegIndex (Parts);
526
+ CodeGenSubRegIndex *Concat =
527
+ RegBank.getConcatSubRegIndex (Parts, RegBank.getHwModes ());
522
528
std::pair<CodeGenSubRegIndex *, CodeGenRegister *> NewSubReg =
523
529
std::pair (Concat, Cand);
524
530
@@ -542,7 +548,7 @@ void CodeGenRegister::computeSecondarySubRegs(CodeGenRegBank &RegBank) {
542
548
PrintFatalError (TheDef->getLoc (), " No SubRegIndex for " +
543
549
SubReg.second ->getName () +
544
550
" in " + getName ());
545
- NewIdx->addComposite (SubReg.first , SubIdx);
551
+ NewIdx->addComposite (SubReg.first , SubIdx, RegBank. getHwModes () );
546
552
}
547
553
}
548
554
}
@@ -1315,7 +1321,7 @@ CodeGenSubRegIndex *CodeGenRegBank::getSubRegIdx(Record *Def) {
1315
1321
CodeGenSubRegIndex *&Idx = Def2SubRegIdx[Def];
1316
1322
if (Idx)
1317
1323
return Idx;
1318
- SubRegIndices.emplace_back (Def, SubRegIndices.size () + 1 );
1324
+ SubRegIndices.emplace_back (Def, SubRegIndices.size () + 1 , getHwModes () );
1319
1325
Idx = &SubRegIndices.back ();
1320
1326
return Idx;
1321
1327
}
@@ -1379,12 +1385,13 @@ CodeGenRegBank::getCompositeSubRegIndex(CodeGenSubRegIndex *A,
1379
1385
// None exists, synthesize one.
1380
1386
std::string Name = A->getName () + " _then_" + B->getName ();
1381
1387
Comp = createSubRegIndex (Name, A->getNamespace ());
1382
- A->addComposite (B, Comp);
1388
+ A->addComposite (B, Comp, getHwModes () );
1383
1389
return Comp;
1384
1390
}
1385
1391
1386
1392
CodeGenSubRegIndex *CodeGenRegBank::getConcatSubRegIndex (
1387
- const SmallVector<CodeGenSubRegIndex *, 8 > &Parts) {
1393
+ const SmallVector<CodeGenSubRegIndex *, 8 > &Parts,
1394
+ const CodeGenHwModes &CGH) {
1388
1395
assert (Parts.size () > 1 && " Need two parts to concatenate" );
1389
1396
#ifndef NDEBUG
1390
1397
for (CodeGenSubRegIndex *Idx : Parts) {
@@ -1399,28 +1406,47 @@ CodeGenSubRegIndex *CodeGenRegBank::getConcatSubRegIndex(
1399
1406
1400
1407
// None exists, synthesize one.
1401
1408
std::string Name = Parts.front ()->getName ();
1402
- // Determine whether all parts are contiguous.
1403
- bool IsContinuous = true ;
1404
- unsigned Size = Parts.front ()->Size ;
1405
- unsigned LastOffset = Parts.front ()->Offset ;
1406
- unsigned LastSize = Parts.front ()->Size ;
1407
1409
const unsigned UnknownSize = (uint16_t )-1 ;
1410
+
1408
1411
for (unsigned i = 1 , e = Parts.size (); i != e; ++i) {
1409
1412
Name += ' _' ;
1410
1413
Name += Parts[i]->getName ();
1411
- if (Size == UnknownSize || Parts[i]->Size == UnknownSize)
1412
- Size = UnknownSize;
1413
- else
1414
- Size += Parts[i]->Size ;
1415
- if (LastSize == UnknownSize || Parts[i]->Offset != (LastOffset + LastSize))
1416
- IsContinuous = false ;
1417
- LastOffset = Parts[i]->Offset ;
1418
- LastSize = Parts[i]->Size ;
1419
1414
}
1415
+
1420
1416
Idx = createSubRegIndex (Name, Parts.front ()->getNamespace ());
1421
- Idx->Size = Size ;
1422
- Idx->Offset = IsContinuous ? Parts.front ()->Offset : -1 ;
1423
1417
Idx->ConcatenationOf .assign (Parts.begin (), Parts.end ());
1418
+
1419
+ unsigned NumModes = CGH.getNumModeIds ();
1420
+ for (unsigned M = 0 ; M < NumModes; ++M) {
1421
+ const CodeGenSubRegIndex *Part = Parts.front ();
1422
+
1423
+ // Determine whether all parts are contiguous.
1424
+ bool IsContinuous = true ;
1425
+ const SubRegRange &FirstPartRange = Part->Range .get (M);
1426
+ unsigned Size = FirstPartRange.Size ;
1427
+ unsigned LastOffset = FirstPartRange.Offset ;
1428
+ unsigned LastSize = FirstPartRange.Size ;
1429
+
1430
+ for (unsigned i = 1 , e = Parts.size (); i != e; ++i) {
1431
+ Part = Parts[i];
1432
+ Name += ' _' ;
1433
+ Name += Part->getName ();
1434
+
1435
+ const SubRegRange &PartRange = Part->Range .get (M);
1436
+ if (Size == UnknownSize || PartRange.Size == UnknownSize)
1437
+ Size = UnknownSize;
1438
+ else
1439
+ Size += PartRange.Size ;
1440
+ if (LastSize == UnknownSize ||
1441
+ PartRange.Offset != (LastOffset + LastSize))
1442
+ IsContinuous = false ;
1443
+ LastOffset = PartRange.Offset ;
1444
+ LastSize = PartRange.Size ;
1445
+ }
1446
+ unsigned Offset = IsContinuous ? FirstPartRange.Offset : -1 ;
1447
+ Idx->Range .get (M) = SubRegRange (Size , Offset);
1448
+ }
1449
+
1424
1450
return Idx;
1425
1451
}
1426
1452
@@ -1504,7 +1530,8 @@ void CodeGenRegBank::computeComposites() {
1504
1530
assert (Idx3 && " Sub-register doesn't have an index" );
1505
1531
1506
1532
// Conflicting composition? Emit a warning but allow it.
1507
- if (CodeGenSubRegIndex *Prev = Idx1->addComposite (Idx2, Idx3)) {
1533
+ if (CodeGenSubRegIndex *Prev =
1534
+ Idx1->addComposite (Idx2, Idx3, getHwModes ())) {
1508
1535
// If the composition was not user-defined, always emit a warning.
1509
1536
if (!UserDefined.count ({Idx1, Idx2}) ||
1510
1537
agree (compose (Idx1, Idx2), SubRegAction.at (Idx3)))
0 commit comments