mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-07 12:30:44 +00:00
Add a PrintRegUnit helper similar to PrintReg.
Reg-units are named after their root registers, and most units have a single root, so they simply print as 'AL', 'XMM0', etc. The rare dual root reg-units print as FPSCR~FPSCR_NZCV, FP0~ST7, ... The printing piggybacks on the existing register name tables, so no extra const data space is required. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157754 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f5d4e5158f
commit
5ddc04caf2
@ -850,6 +850,29 @@ static inline raw_ostream &operator<<(raw_ostream &OS, const PrintReg &PR) {
|
|||||||
return OS;
|
return OS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// PrintRegUnit - Helper class for printing register units on a raw_ostream.
|
||||||
|
///
|
||||||
|
/// Register units are named after their root registers:
|
||||||
|
///
|
||||||
|
/// AL - Single root.
|
||||||
|
/// FP0~ST7 - Dual roots.
|
||||||
|
///
|
||||||
|
/// Usage: OS << PrintRegUnit(Unit, TRI) << '\n';
|
||||||
|
///
|
||||||
|
class PrintRegUnit {
|
||||||
|
const TargetRegisterInfo *TRI;
|
||||||
|
unsigned Unit;
|
||||||
|
public:
|
||||||
|
PrintRegUnit(unsigned unit, const TargetRegisterInfo *tri)
|
||||||
|
: TRI(tri), Unit(unit) {}
|
||||||
|
void print(raw_ostream&) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline raw_ostream &operator<<(raw_ostream &OS, const PrintRegUnit &PR) {
|
||||||
|
PR.print(OS);
|
||||||
|
return OS;
|
||||||
|
}
|
||||||
|
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -46,6 +46,27 @@ void PrintReg::print(raw_ostream &OS) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PrintRegUnit::print(raw_ostream &OS) const {
|
||||||
|
// Generic printout when TRI is missing.
|
||||||
|
if (!TRI) {
|
||||||
|
OS << "Unit~" << Unit;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for invalid register units.
|
||||||
|
if (Unit >= TRI->getNumRegUnits()) {
|
||||||
|
OS << "BadUnit~" << Unit;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal units have at least one root.
|
||||||
|
MCRegUnitRootIterator Roots(Unit, TRI);
|
||||||
|
assert(Roots.isValid() && "Unit has no roots.");
|
||||||
|
OS << TRI->getName(*Roots);
|
||||||
|
for (++Roots; Roots.isValid(); ++Roots)
|
||||||
|
OS << '~' << TRI->getName(*Roots);
|
||||||
|
}
|
||||||
|
|
||||||
/// getAllocatableClass - Return the maximal subclass of the given register
|
/// getAllocatableClass - Return the maximal subclass of the given register
|
||||||
/// class that is alloctable, or NULL.
|
/// class that is alloctable, or NULL.
|
||||||
const TargetRegisterClass *
|
const TargetRegisterClass *
|
||||||
|
Loading…
Reference in New Issue
Block a user