summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-07-26 17:31:02 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-07-26 17:31:02 +0000
commit29c567a3f049427edea75ac799a20c6386813852 (patch)
treecffd22c1e6b42862eb65ed133730d673426e9a22 /llvm/lib
parent26e40bdb9b52318c7cb5506adcfcab580f7a02d0 (diff)
downloadbcm5719-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.cpp24
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.
OpenPOWER on IntegriCloud