diff options
author | Richard Osborne <richard@xmos.com> | 2014-03-06 16:37:48 +0000 |
---|---|---|
committer | Richard Osborne <richard@xmos.com> | 2014-03-06 16:37:48 +0000 |
commit | 47155af5eba79a0b23f46fb8da20fd34fd678723 (patch) | |
tree | a377d1a89b3d3c0dd2029e5d27c1debe42c9e79e /llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp | |
parent | 28bfb48fd09218420242f72fc9998adebefb70e2 (diff) | |
download | bcm5719-llvm-47155af5eba79a0b23f46fb8da20fd34fd678723.tar.gz bcm5719-llvm-47155af5eba79a0b23f46fb8da20fd34fd678723.zip |
[XCore] Add support for the "m" inline asm constraint.
Summary:
This provides support for CP and DP relative global accesses in inline
asm.
Reviewers: robertlytton
Reviewed By: robertlytton
Differential Revision: http://llvm-reviews.chandlerc.com/D2943
llvm-svn: 203129
Diffstat (limited to 'llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp')
-rw-r--r-- | llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp b/llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp index e28f84fec2a..5b0fcfa15e4 100644 --- a/llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp +++ b/llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp @@ -66,7 +66,10 @@ namespace { // Complex Pattern Selectors. bool SelectADDRspii(SDValue Addr, SDValue &Base, SDValue &Offset); - + + bool SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode, + std::vector<SDValue> &OutOps) override; + virtual const char *getPassName() const { return "XCore DAG->DAG Pattern Instruction Selection"; } @@ -106,6 +109,28 @@ bool XCoreDAGToDAGISel::SelectADDRspii(SDValue Addr, SDValue &Base, return false; } +bool XCoreDAGToDAGISel:: +SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode, + std::vector<SDValue> &OutOps) { + SDValue Reg; + switch (ConstraintCode) { + default: return true; + case 'm': // Memory. + switch (Op.getOpcode()) { + default: return true; + case XCoreISD::CPRelativeWrapper: + Reg = CurDAG->getRegister(XCore::CP, MVT::i32); + break; + case XCoreISD::DPRelativeWrapper: + Reg = CurDAG->getRegister(XCore::DP, MVT::i32); + break; + } + } + OutOps.push_back(Reg); + OutOps.push_back(Op.getOperand(0)); + return false; +} + SDNode *XCoreDAGToDAGISel::Select(SDNode *N) { SDLoc dl(N); switch (N->getOpcode()) { |