diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-07-26 17:31:02 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-07-26 17:31:02 +0000 |
| commit | 29c567a3f049427edea75ac799a20c6386813852 (patch) | |
| tree | cffd22c1e6b42862eb65ed133730d673426e9a22 /llvm/lib | |
| parent | 26e40bdb9b52318c7cb5506adcfcab580f7a02d0 (diff) | |
| download | bcm5719-llvm-29c567a3f049427edea75ac799a20c6386813852.tar.gz bcm5719-llvm-29c567a3f049427edea75ac799a20c6386813852.zip | |
[Hexagon] Add support for proper handling of H and L constraints
H -> High part of reg pair.
L -> Low part of reg pair.
Patch by Sundeep Kushwaha.
llvm-svn: 276773
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp b/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp index cd954a14610..1de30b36cce 100644 --- a/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp +++ b/llvm/lib/Target/Hexagon/HexagonAsmPrinter.cpp @@ -81,7 +81,7 @@ HexagonAsmPrinter::HexagonAsmPrinter(TargetMachine &TM, : AsmPrinter(TM, std::move(Streamer)), Subtarget(nullptr) {} void HexagonAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, - raw_ostream &O) { + raw_ostream &O) { const MachineOperand &MO = MI->getOperand(OpNo); switch (MO.getType()) { @@ -141,14 +141,22 @@ bool HexagonAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, // Hexagon never has a prefix. printOperand(MI, OpNo, OS); return false; - case 'L': // Write second word of DImode reference. - // Verify that this operand has two consecutive registers. - if (!MI->getOperand(OpNo).isReg() || - OpNo+1 == MI->getNumOperands() || - !MI->getOperand(OpNo+1).isReg()) + case 'L': + case 'H': { // The highest-numbered register of a pair. + const MachineOperand &MO = MI->getOperand(OpNo); + const MachineFunction &MF = *MI->getParent()->getParent(); + const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); + if (!MO.isReg()) return true; - ++OpNo; // Return the high-part. - break; + unsigned RegNumber = MO.getReg(); + // This should be an assert in the frontend. + if (Hexagon::DoubleRegsRegClass.contains(RegNumber)) + RegNumber = TRI->getSubReg(RegNumber, ExtraCode[0] == 'L' ? + Hexagon::subreg_loreg : + Hexagon::subreg_hireg); + OS << HexagonInstPrinter::getRegisterName(RegNumber); + return false; + } case 'I': // Write 'i' if an integer constant, otherwise nothing. Used to print // addi vs add, etc. |

