diff options
Diffstat (limited to 'llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp')
| -rw-r--r-- | llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp index cd1bfed9d40d..ee0870d9ef7a 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp @@ -1026,11 +1026,11 @@ void AArch64InstPrinter::printAddSubImm(const MCInst *MI, unsigned OpNum, unsigned Shift = AArch64_AM::getShiftValue(MI->getOperand(OpNum + 1).getImm()); O << '#' << formatImm(Val); - if (Shift != 0) + if (Shift != 0) { printShifter(MI, OpNum + 1, STI, O); - - if (CommentStream) - *CommentStream << '=' << formatImm(Val << Shift) << '\n'; + if (CommentStream) + *CommentStream << '=' << formatImm(Val << Shift) << '\n'; + } } else { assert(MO.isExpr() && "Unexpected operand type!"); MO.getExpr()->print(O, &MAI); @@ -1450,6 +1450,12 @@ void AArch64InstPrinter::printVectorIndex(const MCInst *MI, unsigned OpNum, O << "[" << MI->getOperand(OpNum).getImm() << "]"; } +void AArch64InstPrinter::printMatrixIndex(const MCInst *MI, unsigned OpNum, + const MCSubtargetInfo &STI, + raw_ostream &O) { + O << MI->getOperand(OpNum).getImm(); +} + void AArch64InstPrinter::printAlignedLabel(const MCInst *MI, uint64_t Address, unsigned OpNum, const MCSubtargetInfo &STI, @@ -1539,6 +1545,28 @@ void AArch64InstPrinter::printBarriernXSOption(const MCInst *MI, unsigned OpNo, O << "#" << Val; } +static bool isValidSysReg(const AArch64SysReg::SysReg *Reg, bool Read, + const MCSubtargetInfo &STI) { + return (Reg && (Read ? Reg->Readable : Reg->Writeable) && + Reg->haveFeatures(STI.getFeatureBits())); +} + +// Looks up a system register either by encoding or by name. Some system +// registers share the same encoding between different architectures, +// therefore a tablegen lookup by encoding will return an entry regardless +// of the register's predication on a specific subtarget feature. To work +// around this problem we keep an alternative name for such registers and +// look them up by that name if the first lookup was unsuccessful. +static const AArch64SysReg::SysReg *lookupSysReg(unsigned Val, bool Read, + const MCSubtargetInfo &STI) { + const AArch64SysReg::SysReg *Reg = AArch64SysReg::lookupSysRegByEncoding(Val); + + if (Reg && !isValidSysReg(Reg, Read, STI)) + Reg = AArch64SysReg::lookupSysRegByName(Reg->AltName); + + return Reg; +} + void AArch64InstPrinter::printMRSSystemRegister(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O) { @@ -1558,8 +1586,9 @@ void AArch64InstPrinter::printMRSSystemRegister(const MCInst *MI, unsigned OpNo, return; } - const AArch64SysReg::SysReg *Reg = AArch64SysReg::lookupSysRegByEncoding(Val); - if (Reg && Reg->Readable && Reg->haveFeatures(STI.getFeatureBits())) + const AArch64SysReg::SysReg *Reg = lookupSysReg(Val, true /*Read*/, STI); + + if (isValidSysReg(Reg, true /*Read*/, STI)) O << Reg->Name; else O << AArch64SysReg::genericRegisterString(Val); @@ -1584,8 +1613,9 @@ void AArch64InstPrinter::printMSRSystemRegister(const MCInst *MI, unsigned OpNo, return; } - const AArch64SysReg::SysReg *Reg = AArch64SysReg::lookupSysRegByEncoding(Val); - if (Reg && Reg->Writeable && Reg->haveFeatures(STI.getFeatureBits())) + const AArch64SysReg::SysReg *Reg = lookupSysReg(Val, false /*Read*/, STI); + + if (isValidSysReg(Reg, false /*Read*/, STI)) O << Reg->Name; else O << AArch64SysReg::genericRegisterString(Val); |
