diff options
| author | Bob Wilson <bob.wilson@apple.com> | 2009-05-19 05:53:42 +0000 |
|---|---|---|
| committer | Bob Wilson <bob.wilson@apple.com> | 2009-05-19 05:53:42 +0000 |
| commit | a2c462bbe901c59c1aa49afef54ce29017c271fa (patch) | |
| tree | cb86a6df2d7733a654b0bd21518564cb15e2ec8a /llvm | |
| parent | 69329a52cf9187878209ea380fdcb255c0966097 (diff) | |
| download | bcm5719-llvm-a2c462bbe901c59c1aa49afef54ce29017c271fa.tar.gz bcm5719-llvm-a2c462bbe901c59c1aa49afef54ce29017c271fa.zip | |
Fix pr4091: Add support for "m" constraint in ARM inline assembly.
llvm-svn: 72105
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp | 22 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp | 12 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/2009-05-18-InlineAsmMem.ll | 7 |
3 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp index 3bc5ae91467..ca3a9cb4032 100644 --- a/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -89,6 +89,13 @@ public: // Include the pieces autogenerated from the target description. #include "ARMGenDAGISel.inc" + +private: + /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for + /// inline asm expressions. + virtual bool SelectInlineAsmMemoryOperand(const SDValue &Op, + char ConstraintCode, + std::vector<SDValue> &OutOps); }; } @@ -881,6 +888,21 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) { return SelectCode(Op); } +bool ARMDAGToDAGISel:: +SelectInlineAsmMemoryOperand(const SDValue &Op, char ConstraintCode, + std::vector<SDValue> &OutOps) { + assert(ConstraintCode == 'm' && "unexpected asm memory constraint"); + + SDValue Base, Offset, Opc; + if (!SelectAddrMode2(Op, Op, Base, Offset, Opc)) + return true; + + OutOps.push_back(Base); + OutOps.push_back(Offset); + OutOps.push_back(Opc); + return false; +} + /// createARMISelDag - This pass converts a legalized DAG into a /// ARM-specific DAG, ready for instruction scheduling. /// diff --git a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp index 062423a04e6..bfe9a011719 100644 --- a/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp @@ -124,6 +124,9 @@ namespace { virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode); + virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, + unsigned AsmVariant, + const char *ExtraCode); void printModuleLevelGV(const GlobalVariable* GVar); bool printInstruction(const MachineInstr *MI); // autogenerated. @@ -769,6 +772,15 @@ bool ARMAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, return false; } +bool ARMAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, + unsigned OpNo, unsigned AsmVariant, + const char *ExtraCode) { + if (ExtraCode && ExtraCode[0]) + return true; // Unknown modifier. + printAddrMode2Operand(MI, OpNo); + return false; +} + void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) { ++EmittedInsts; diff --git a/llvm/test/CodeGen/ARM/2009-05-18-InlineAsmMem.ll b/llvm/test/CodeGen/ARM/2009-05-18-InlineAsmMem.ll new file mode 100644 index 00000000000..f942c9fc221 --- /dev/null +++ b/llvm/test/CodeGen/ARM/2009-05-18-InlineAsmMem.ll @@ -0,0 +1,7 @@ +; RUN: llvm-as < %s | llc -march=arm | grep swp +; PR4091 + +define void @foo(i32 %i, i32* %p) nounwind { + %asmtmp = call i32 asm sideeffect "swp $0, $2, $3", "=&r,=*m,r,*m,~{memory}"(i32* %p, i32 %i, i32* %p) nounwind + ret void +} |

