diff options
| author | Sid Manning <sidneym@codeaurora.org> | 2014-10-15 18:27:40 +0000 |
|---|---|---|
| committer | Sid Manning <sidneym@codeaurora.org> | 2014-10-15 18:27:40 +0000 |
| commit | 12cd21aacd916b7c41a84c56eac545f1c27da3d5 (patch) | |
| tree | 5e80c987e770a318edcdedf1b796772a16b86fe5 /llvm/lib | |
| parent | 76c875579ae6be728cc5e8b9cede2d74de349183 (diff) | |
| download | bcm5719-llvm-12cd21aacd916b7c41a84c56eac545f1c27da3d5.tar.gz bcm5719-llvm-12cd21aacd916b7c41a84c56eac545f1c27da3d5.zip | |
Enable the instruction printer in HexagonMCTargetDesc
This adds the MCInstPrinter to the LLVMHexagonDesc library and removes
the dependency LLVMHexagonAsmPrinter had on LLVMHexagonDesc. This is
a prerequisite needed by the disassembler.
Phabricator Revision: http://reviews.llvm.org/D5734
llvm-svn: 219826
Diffstat (limited to 'llvm/lib')
4 files changed, 64 insertions, 4 deletions
diff --git a/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp b/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp index 9942a6067d1..9cf54b41c2f 100644 --- a/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp +++ b/llvm/lib/Target/Hexagon/InstPrinter/HexagonInstPrinter.cpp @@ -29,6 +29,43 @@ using namespace llvm; #include "HexagonGenAsmWriter.inc" const char HexagonInstPrinter::PacketPadding = '\t'; +// Return the minimum value that a constant extendable operand can have +// without being extended. +static int getMinValue(uint64_t TSFlags) { + unsigned isSigned = + (TSFlags >> HexagonII::ExtentSignedPos) & HexagonII::ExtentSignedMask; + unsigned bits = + (TSFlags >> HexagonII::ExtentBitsPos) & HexagonII::ExtentBitsMask; + + if (isSigned) + return -1U << (bits - 1); + else + return 0; +} + +// Return the maximum value that a constant extendable operand can have +// without being extended. +static int getMaxValue(uint64_t TSFlags) { + unsigned isSigned = + (TSFlags >> HexagonII::ExtentSignedPos) & HexagonII::ExtentSignedMask; + unsigned bits = + (TSFlags >> HexagonII::ExtentBitsPos) & HexagonII::ExtentBitsMask; + + if (isSigned) + return ~(-1U << (bits - 1)); + else + return ~(-1U << bits); +} + +// Return true if the instruction must be extended. +static bool isExtended(uint64_t TSFlags) { + return (TSFlags >> HexagonII::ExtendedPos) & HexagonII::ExtendedMask; +} + +// Return true if the instruction may be extended based on the operand value. +static bool isExtendable(uint64_t TSFlags) { + return (TSFlags >> HexagonII::ExtendablePos) & HexagonII::ExtendableMask; +} StringRef HexagonInstPrinter::getOpcodeName(unsigned Opcode) const { return MII.getName(Opcode); @@ -116,9 +153,20 @@ void HexagonInstPrinter::printImmOperand(const MCInst *MI, unsigned OpNo, void HexagonInstPrinter::printExtOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) const { - const HexagonMCInst *HMCI = static_cast<const HexagonMCInst*>(MI); - if (HMCI->isConstExtended()) + const MCOperand &MO = MI->getOperand(OpNo); + const MCInstrDesc &MII = getMII().get(MI->getOpcode()); + + assert((isExtendable(MII.TSFlags) || isExtended(MII.TSFlags)) && + "Expecting an extendable operand"); + + if (MO.isExpr() || isExtended(MII.TSFlags)) { O << "#"; + } else if (MO.isImm()) { + int ImmValue = MO.getImm(); + if (ImmValue < getMinValue(MII.TSFlags) || + ImmValue > getMaxValue(MII.TSFlags)) + O << "#"; + } printOperand(MI, OpNo, O); } diff --git a/llvm/lib/Target/Hexagon/InstPrinter/LLVMBuild.txt b/llvm/lib/Target/Hexagon/InstPrinter/LLVMBuild.txt index 59849aa7e1c..8678401feee 100644 --- a/llvm/lib/Target/Hexagon/InstPrinter/LLVMBuild.txt +++ b/llvm/lib/Target/Hexagon/InstPrinter/LLVMBuild.txt @@ -19,5 +19,5 @@ type = Library name = HexagonAsmPrinter parent = Hexagon -required_libraries = HexagonDesc MC Support +required_libraries = MC Support add_to_library_groups = Hexagon diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp index 96b2ab63f9b..65cf42ae648 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.cpp @@ -74,6 +74,14 @@ static MCCodeGenInfo *createHexagonMCCodeGenInfo(StringRef TT, Reloc::Model RM, X->InitMCCodeGenInfo(Reloc::Static, CM, OL); return X; } +static MCInstPrinter *createHexagonMCInstPrinter(const Target &T, + unsigned SyntaxVariant, + const MCAsmInfo &MAI, + const MCInstrInfo &MII, + const MCRegisterInfo &MRI, + const MCSubtargetInfo &STI) { + return new HexagonInstPrinter(MAI, MII, MRI); +} // Force static initialization. extern "C" void LLVMInitializeHexagonTargetMC() { @@ -99,4 +107,8 @@ extern "C" void LLVMInitializeHexagonTargetMC() { // Register the MC Code Emitter TargetRegistry::RegisterMCCodeEmitter(TheHexagonTarget, createHexagonMCCodeEmitter); + + // Register the MC Inst Printer + TargetRegistry::RegisterMCInstPrinter(TheHexagonTarget, + createHexagonMCInstPrinter); } diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/LLVMBuild.txt b/llvm/lib/Target/Hexagon/MCTargetDesc/LLVMBuild.txt index f559a21e3f9..5ecdd504e8c 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/LLVMBuild.txt +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/LLVMBuild.txt @@ -19,5 +19,5 @@ type = Library name = HexagonDesc parent = Hexagon -required_libraries = HexagonInfo MC Support +required_libraries = HexagonAsmPrinter HexagonInfo MC Support add_to_library_groups = Hexagon |

