diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2011-03-24 21:04:58 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2011-03-24 21:04:58 +0000 |
commit | f170f8bff68556e14e3ab3ea51eef07fe90113ca (patch) | |
tree | ef6d898bf06543f7d3f1ca3ea631b92b3dbf75aa /llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | |
parent | 471f5aa23351b782c252050b4aa50ed9d79003c2 (diff) | |
download | bcm5719-llvm-f170f8bff68556e14e3ab3ea51eef07fe90113ca.tar.gz bcm5719-llvm-f170f8bff68556e14e3ab3ea51eef07fe90113ca.zip |
Add asm parsing support w/ testcases for strex/ldrex family of instructions
llvm-svn: 128236
Diffstat (limited to 'llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index bd5546dc0fb..755b9afa244 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -350,6 +350,23 @@ public: int64_t Value = CE->getValue(); return ((Value & 0x3) == 0 && Value <= 1020 && Value >= -1020); } + bool isMemMode7() const { + if (!isMemory() || + getMemPreindexed() || + getMemPostindexed() || + getMemOffsetIsReg() || + getMemNegative() || + getMemWriteback()) + return false; + + const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); + if (!CE) return false; + + if (CE->getValue()) + return false; + + return true; + } bool isMemModeRegThumb() const { if (!isMemory() || !getMemOffsetIsReg() || getMemWriteback()) return false; @@ -438,6 +455,15 @@ public: Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt()))); } + void addMemMode7Operands(MCInst &Inst, unsigned N) const { + assert(N == 1 && isMemMode7() && "Invalid number of operands!"); + Inst.addOperand(MCOperand::CreateReg(getMemBaseRegNum())); + + const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemOffset()); + assert((CE || CE->getValue() == 0) && + "No offset operand support in mode 7"); + } + void addMemMode5Operands(MCInst &Inst, unsigned N) const { assert(N == 2 && isMemMode5() && "Invalid number of operands!"); |